Merge "Explicitly make building tzcode single threaded"
diff --git a/README.version b/README.version
index 9e6a412..ba0641e 100644
--- a/README.version
+++ b/README.version
@@ -1,3 +1,3 @@
 URL: http://source.icu-project.org/repos/icu/
-Version: 60.2
+Version: 61.1
 BugComponent: 23970
diff --git a/android_icu4j/src/main/java/android/icu/impl/CaseMapImpl.java b/android_icu4j/src/main/java/android/icu/impl/CaseMapImpl.java
index 38d1444..b12ba55 100644
--- a/android_icu4j/src/main/java/android/icu/impl/CaseMapImpl.java
+++ b/android_icu4j/src/main/java/android/icu/impl/CaseMapImpl.java
@@ -35,6 +35,21 @@
         }
 
         /**
+         * Constructor.
+         * @param src String to iterate over.
+         * @param cpStart Start index of the current code point.
+         * @param cpLimit Limit index of the current code point.
+         */
+        public StringContextIterator(CharSequence src, int cpStart, int cpLimit) {
+            s = src;
+            index = 0;
+            limit = src.length();
+            this.cpStart = cpStart;
+            this.cpLimit = cpLimit;
+            dir = 0;
+        }
+
+        /**
          * Set the iteration limit for nextCaseMapCP() to an index within the string.
          * If the limit parameter is negative or past the string, then the
          * string length is restored as the iteration limit.
@@ -81,6 +96,11 @@
             }
         }
 
+        public void setCPStartAndLimit(int s, int l) {
+            cpStart = s;
+            cpLimit = l;
+            dir = 0;
+        }
         /**
          * Returns the start of the code point that was last returned
          * by nextCaseMapCP().
@@ -404,13 +424,162 @@
         return result.toString();
     }
 
-    private static void internalToLower(int caseLocale, int options, StringContextIterator iter,
+    private static final Trie2_16 CASE_TRIE = UCaseProps.getTrie();
+
+    /**
+     * caseLocale >= 0: Lowercases [srcStart..srcLimit[ but takes context [0..srcLength[ into account.
+     * caseLocale < 0: Case-folds [srcStart..srcLimit[.
+     */
+    private static void internalToLower(int caseLocale, int options,
+            CharSequence src, int srcStart, int srcLimit, StringContextIterator iter,
             Appendable dest, Edits edits) throws IOException {
-        int c;
-        while ((c = iter.nextCaseMapCP()) >= 0) {
-            c = UCaseProps.INSTANCE.toFullLower(c, iter, dest, caseLocale);
-            appendResult(c, dest, iter.getCPLength(), options, edits);
+        byte[] latinToLower;
+        if (caseLocale == UCaseProps.LOC_ROOT ||
+                (caseLocale >= 0 ?
+                    !(caseLocale == UCaseProps.LOC_TURKISH || caseLocale == UCaseProps.LOC_LITHUANIAN) :
+                    (options & UCaseProps.FOLD_CASE_OPTIONS_MASK) == UCharacter.FOLD_CASE_DEFAULT)) {
+            latinToLower = UCaseProps.LatinCase.TO_LOWER_NORMAL;
+        } else {
+            latinToLower = UCaseProps.LatinCase.TO_LOWER_TR_LT;
         }
+        int prev = srcStart;
+        int srcIndex = srcStart;
+        outerLoop:
+        for (;;) {
+            // fast path for simple cases
+            char lead;
+            for (;;) {
+                if (srcIndex >= srcLimit) {
+                    break outerLoop;
+                }
+                lead = src.charAt(srcIndex);
+                int delta;
+                if (lead < UCaseProps.LatinCase.LONG_S) {
+                    byte d = latinToLower[lead];
+                    if (d == UCaseProps.LatinCase.EXC) { break; }
+                    ++srcIndex;
+                    if (d == 0) { continue; }
+                    delta = d;
+                } else if (lead >= 0xd800) {
+                    break;  // surrogate or higher
+                } else {
+                    int props = CASE_TRIE.getFromU16SingleLead(lead);
+                    if (UCaseProps.propsHasException(props)) { break; }
+                    ++srcIndex;
+                    if (!UCaseProps.isUpperOrTitleFromProps(props) ||
+                            (delta = UCaseProps.getDelta(props)) == 0) {
+                        continue;
+                    }
+                }
+                lead += delta;
+                appendUnchanged(src, prev, srcIndex - 1 - prev, dest, options, edits);
+                dest.append(lead);
+                if (edits != null) {
+                    edits.addReplace(1, 1);
+                }
+                prev = srcIndex;
+            }
+            // slow path
+            int cpStart = srcIndex++;
+            char trail;
+            int c;
+            if (Character.isHighSurrogate(lead) && srcIndex < srcLimit &&
+                    Character.isLowSurrogate(trail = src.charAt(srcIndex))) {
+                c = Character.toCodePoint(lead, trail);
+                ++srcIndex;
+            } else {
+                c = lead;
+            }
+            if (caseLocale >= 0) {
+                if (iter == null) {
+                    iter = new StringContextIterator(src, cpStart, srcIndex);
+                } else {
+                    iter.setCPStartAndLimit(cpStart, srcIndex);
+                }
+                c = UCaseProps.INSTANCE.toFullLower(c, iter, dest, caseLocale);
+            } else {
+                c = UCaseProps.INSTANCE.toFullFolding(c, dest, options);
+            }
+            if (c >= 0) {
+                appendUnchanged(src, prev, cpStart - prev, dest, options, edits);
+                appendResult(c, dest, srcIndex - cpStart, options, edits);
+                prev = srcIndex;
+            }
+        }
+        appendUnchanged(src, prev, srcIndex - prev, dest, options, edits);
+    }
+
+    private static void internalToUpper(int caseLocale, int options,
+            CharSequence src, Appendable dest, Edits edits) throws IOException {
+        StringContextIterator iter = null;
+        byte[] latinToUpper;
+        if (caseLocale == UCaseProps.LOC_TURKISH) {
+            latinToUpper = UCaseProps.LatinCase.TO_UPPER_TR;
+        } else {
+            latinToUpper = UCaseProps.LatinCase.TO_UPPER_NORMAL;
+        }
+        int prev = 0;
+        int srcIndex = 0;
+        int srcLength = src.length();
+        outerLoop:
+        for (;;) {
+            // fast path for simple cases
+            char lead;
+            for (;;) {
+                if (srcIndex >= srcLength) {
+                    break outerLoop;
+                }
+                lead = src.charAt(srcIndex);
+                int delta;
+                if (lead < UCaseProps.LatinCase.LONG_S) {
+                    byte d = latinToUpper[lead];
+                    if (d == UCaseProps.LatinCase.EXC) { break; }
+                    ++srcIndex;
+                    if (d == 0) { continue; }
+                    delta = d;
+                } else if (lead >= 0xd800) {
+                    break;  // surrogate or higher
+                } else {
+                    int props = CASE_TRIE.getFromU16SingleLead(lead);
+                    if (UCaseProps.propsHasException(props)) { break; }
+                    ++srcIndex;
+                    if (UCaseProps.getTypeFromProps(props) != UCaseProps.LOWER ||
+                            (delta = UCaseProps.getDelta(props)) == 0) {
+                        continue;
+                    }
+                }
+                lead += delta;
+                appendUnchanged(src, prev, srcIndex - 1 - prev, dest, options, edits);
+                dest.append(lead);
+                if (edits != null) {
+                    edits.addReplace(1, 1);
+                }
+                prev = srcIndex;
+            }
+            // slow path
+            int cpStart = srcIndex++;
+            char trail;
+            int c;
+            if (Character.isHighSurrogate(lead) && srcIndex < srcLength &&
+                    Character.isLowSurrogate(trail = src.charAt(srcIndex))) {
+                c = Character.toCodePoint(lead, trail);
+                ++srcIndex;
+            } else {
+                c = lead;
+            }
+            if (iter == null) {
+                iter = new StringContextIterator(src, cpStart, srcIndex);
+            } else {
+                iter.setCPStartAndLimit(cpStart, srcIndex);
+            }
+            c = UCaseProps.INSTANCE.toFullUpper(c, iter, dest, caseLocale);
+            if (c >= 0) {
+                appendUnchanged(src, prev, cpStart - prev, dest, options, edits);
+                appendResult(c, dest, srcIndex - cpStart, options, edits);
+                prev = srcIndex;
+            }
+        }
+        appendUnchanged(src, prev, srcIndex - prev, dest, options, edits);
     }
 
     public static String toLower(int caseLocale, int options, CharSequence src) {
@@ -436,8 +605,7 @@
             if (edits != null) {
                 edits.reset();
             }
-            StringContextIterator iter = new StringContextIterator(src);
-            internalToLower(caseLocale, options, iter, dest, edits);
+            internalToLower(caseLocale, options, src, 0, src.length(), null, dest, edits);
             return dest;
         } catch (IOException e) {
             throw new ICUUncheckedIOException(e);
@@ -470,12 +638,7 @@
             if (caseLocale == UCaseProps.LOC_GREEK) {
                 return GreekUpper.toUpper(options, src, dest, edits);
             }
-            StringContextIterator iter = new StringContextIterator(src);
-            int c;
-            while ((c = iter.nextCaseMapCP()) >= 0) {
-                c = UCaseProps.INSTANCE.toFullUpper(c, iter, dest, caseLocale);
-                appendResult(c, dest, iter.getCPLength(), options, edits);
-            }
+            internalToUpper(caseLocale, options, src, dest, edits);
             return dest;
         } catch (IOException e) {
             throw new ICUUncheckedIOException(e);
@@ -593,12 +756,13 @@
                         if(titleLimit<index) {
                             if((options&UCharacter.TITLECASE_NO_LOWERCASE)==0) {
                                 // Normal operation: Lowercase the rest of the word.
-                                internalToLower(caseLocale, options, iter, dest, edits);
+                                internalToLower(caseLocale, options,
+                                        src, titleLimit, index, iter, dest, edits);
                             } else {
                                 // Optionally just copy the rest of the word unchanged.
                                 appendUnchanged(src, titleLimit, index-titleLimit, dest, options, edits);
-                                iter.moveToLimit();
                             }
+                            iter.moveToLimit();
                         }
                     }
                 }
@@ -633,14 +797,7 @@
             if (edits != null) {
                 edits.reset();
             }
-            int length = src.length();
-            for (int i = 0; i < length;) {
-                int c = Character.codePointAt(src, i);
-                int cpLength = Character.charCount(c);
-                i += cpLength;
-                c = UCaseProps.INSTANCE.toFullFolding(c, dest, options);
-                appendResult(c, dest, cpLength, options, edits);
-            }
+            internalToLower(-1, options, src, 0, src.length(), null, dest, edits);
             return dest;
         } catch (IOException e) {
             throw new ICUUncheckedIOException(e);
diff --git a/android_icu4j/src/main/java/android/icu/impl/CurrencyData.java b/android_icu4j/src/main/java/android/icu/impl/CurrencyData.java
index dec1015..3bbf269 100644
--- a/android_icu4j/src/main/java/android/icu/impl/CurrencyData.java
+++ b/android_icu4j/src/main/java/android/icu/impl/CurrencyData.java
@@ -33,7 +33,6 @@
         public abstract Map<String, String> getUnitPatterns();
         public abstract CurrencyFormatInfo getFormatInfo(String isoCode);
         public abstract CurrencySpacingInfo getSpacingInfo();
-        public abstract String getNarrowSymbol(String isoCode);
     }
 
     public static final class CurrencyFormatInfo {
diff --git a/android_icu4j/src/main/java/android/icu/impl/LocaleDisplayNamesImpl.java b/android_icu4j/src/main/java/android/icu/impl/LocaleDisplayNamesImpl.java
index a85999e..62f2f77 100644
--- a/android_icu4j/src/main/java/android/icu/impl/LocaleDisplayNamesImpl.java
+++ b/android_icu4j/src/main/java/android/icu/impl/LocaleDisplayNamesImpl.java
@@ -95,8 +95,7 @@
             CaseMap.toTitle().wholeString().noLowercase();
 
     private static String toTitleWholeStringNoLowercase(ULocale locale, String s) {
-        return TO_TITLE_WHOLE_STRING_NO_LOWERCASE.apply(
-                locale.toLocale(), null, s, new StringBuilder(), null).toString();
+        return TO_TITLE_WHOLE_STRING_NO_LOWERCASE.apply(locale.toLocale(), null, s);
     }
 
     public static LocaleDisplayNames getInstance(ULocale locale, DialectHandling dialectHandling) {
diff --git a/android_icu4j/src/main/java/android/icu/impl/StringSegment.java b/android_icu4j/src/main/java/android/icu/impl/StringSegment.java
new file mode 100644
index 0000000..53c489e
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/StringSegment.java
@@ -0,0 +1,205 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl;
+
+import android.icu.lang.UCharacter;
+import android.icu.text.UnicodeSet;
+
+/**
+ * A mutable String wrapper with a variable offset and length and support for case folding.
+ * <p>
+ * The charAt, length, and subSequence methods all operate relative to the fixed offset into the String.
+ * <p>
+ * CAUTION: Since this class is mutable, it must not be used anywhere that an immutable object is
+ * required, like in a cache or as the key of a hash map.
+ *
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class StringSegment implements CharSequence {
+    private final String str;
+    private int start;
+    private int end;
+    private boolean foldCase;
+
+    public StringSegment(String str, boolean foldCase) {
+        this.str = str;
+        this.start = 0;
+        this.end = str.length();
+        this.foldCase = foldCase;
+    }
+
+    public int getOffset() {
+        return start;
+    }
+
+    public void setOffset(int start) {
+        assert start <= end;
+        this.start = start;
+    }
+
+    /**
+     * Equivalent to <code>setOffset(getOffset()+delta)</code>.
+     *
+     * <p>
+     * Number parsing note: This method is usually called by a Matcher to register that a char was
+     * consumed. If the char is strong (it usually is, except for things like whitespace), follow this
+     * with a call to ParsedNumber#setCharsConsumed(). For more information on strong chars, see that
+     * method.
+     */
+    public void adjustOffset(int delta) {
+        assert start + delta >= 0;
+        assert start + delta <= end;
+        start += delta;
+    }
+
+    /**
+     * Adjusts the offset by the width of the current lead code point, either 1 or 2 chars.
+     */
+    public void adjustOffsetByCodePoint() {
+        start += Character.charCount(getCodePoint());
+    }
+
+    public void setLength(int length) {
+        assert length >= 0;
+        assert start + length <= str.length();
+        end = start + length;
+    }
+
+    public void resetLength() {
+        end = str.length();
+    }
+
+    @Override
+    public int length() {
+        return end - start;
+    }
+
+    @Override
+    public char charAt(int index) {
+        return str.charAt(index + start);
+    }
+
+    @Override
+    public CharSequence subSequence(int start, int end) {
+        throw new AssertionError(); // Never used
+        // Possible implementation:
+        // return str.subSequence(start + this.start, end + this.start);
+    }
+
+    /**
+     * Returns the first code point in the string segment.
+     *
+     * <p>
+     * <strong>Important:</strong> Most of the time, you should use {@link #startsWith}, which handles
+     * case folding logic, instead of this method.
+     */
+    public int getCodePoint() {
+        assert start < end;
+        char lead = str.charAt(start);
+        char trail;
+        if (Character.isHighSurrogate(lead)
+                && start + 1 < end
+                && Character.isLowSurrogate(trail = str.charAt(start + 1))) {
+            return Character.toCodePoint(lead, trail);
+        }
+        return lead;
+    }
+
+    /**
+     * Returns true if the first code point of this StringSegment equals the given code point.
+     *
+     * <p>
+     * This method will perform case folding if case folding is enabled for the parser.
+     */
+    public boolean startsWith(int otherCp) {
+        return codePointsEqual(getCodePoint(), otherCp, foldCase);
+    }
+
+    /**
+     * Returns true if the first code point of this StringSegment is in the given UnicodeSet.
+     */
+    public boolean startsWith(UnicodeSet uniset) {
+        // TODO: Move UnicodeSet case-folding logic here.
+        // TODO: Handle string matches here instead of separately.
+        int cp = getCodePoint();
+        if (cp == -1) {
+            return false;
+        }
+        return uniset.contains(cp);
+    }
+
+    /**
+     * Returns the length of the prefix shared by this StringSegment and the given CharSequence. For
+     * example, if this string segment is "aab", and the char sequence is "aac", this method returns 2,
+     * since the first 2 characters are the same.
+     *
+     * <p>
+     * This method only returns offsets along code point boundaries.
+     *
+     * <p>
+     * This method will perform case folding if case folding was enabled in the constructor.
+     */
+    public int getCommonPrefixLength(CharSequence other) {
+        return getPrefixLengthInternal(other, foldCase);
+    }
+
+    /**
+     * Like {@link #getCommonPrefixLength}, but never performs case folding, even if case folding was
+     * enabled in the constructor.
+     */
+    public int getCaseSensitivePrefixLength(CharSequence other) {
+        return getPrefixLengthInternal(other, false);
+    }
+
+    private int getPrefixLengthInternal(CharSequence other, boolean foldCase) {
+        int offset = 0;
+        for (; offset < Math.min(length(), other.length());) {
+            int cp1 = Character.codePointAt(this, offset);
+            int cp2 = Character.codePointAt(other, offset);
+            if (!codePointsEqual(cp1, cp2, foldCase)) {
+                break;
+            }
+            offset += Character.charCount(cp1);
+        }
+        return offset;
+    }
+
+    private static final boolean codePointsEqual(int cp1, int cp2, boolean foldCase) {
+        if (cp1 == cp2) {
+            return true;
+        }
+        if (!foldCase) {
+            return false;
+        }
+        cp1 = UCharacter.foldCase(cp1, true);
+        cp2 = UCharacter.foldCase(cp2, true);
+        return cp1 == cp2;
+    }
+
+    /**
+     * Equals any CharSequence with the same chars as this segment.
+     *
+     * <p>
+     * This method does not perform case folding; if you want case-insensitive equality, use
+     * {@link #getCommonPrefixLength}.
+     */
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof CharSequence))
+            return false;
+        return Utility.charSequenceEquals(this, (CharSequence) other);
+    }
+
+    /** Returns a hash code equivalent to calling .toString().hashCode() */
+    @Override
+    public int hashCode() {
+        return Utility.charSequenceHashCode(this);
+    }
+
+    @Override
+    public String toString() {
+        return str.substring(0, start) + "[" + str.substring(start, end) + "]" + str.substring(end);
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/TextTrieMap.java b/android_icu4j/src/main/java/android/icu/impl/TextTrieMap.java
index 68b65b9..27b59b7 100644
--- a/android_icu4j/src/main/java/android/icu/impl/TextTrieMap.java
+++ b/android_icu4j/src/main/java/android/icu/impl/TextTrieMap.java
@@ -15,7 +15,7 @@
 import java.util.ListIterator;
 
 import android.icu.lang.UCharacter;
-import android.icu.text.UTF16;
+import android.icu.text.UnicodeSet;
 
 /**
  * TextTrieMap is a trie implementation for supporting
@@ -27,6 +27,11 @@
     private Node _root = new Node();
     boolean _ignoreCase;
 
+    public static class Output {
+        public int matchLength;
+        public boolean partialMatch;
+    }
+
     /**
      * Constructs a TextTrieMap object.
      *
@@ -76,25 +81,29 @@
         return get(text, start, null);
     }
 
-    public Iterator<V> get(CharSequence text, int start, int[] matchLen) {
+    public Iterator<V> get(CharSequence text, int start, Output output) {
         LongestMatchHandler<V> handler = new LongestMatchHandler<V>();
-        find(text, start, handler);
-        if (matchLen != null && matchLen.length > 0) {
-            matchLen[0] = handler.getMatchLength();
+        find(text, start, handler, output);
+        if (output != null) {
+            output.matchLength = handler.getMatchLength();
         }
         return handler.getMatches();
     }
 
     public void find(CharSequence text, ResultHandler<V> handler) {
-        find(text, 0, handler);
+        find(text, 0, handler, null);
     }
 
     public void find(CharSequence text, int offset, ResultHandler<V> handler) {
-        CharIterator chitr = new CharIterator(text, offset, _ignoreCase);
-        find(_root, chitr, handler);
+        find(text, offset, handler, null);
     }
 
-    private synchronized void find(Node node, CharIterator chitr, ResultHandler<V> handler) {
+    private void find(CharSequence text, int offset, ResultHandler<V> handler, Output output) {
+        CharIterator chitr = new CharIterator(text, offset, _ignoreCase);
+        find(_root, chitr, handler, output);
+    }
+
+    private synchronized void find(Node node, CharIterator chitr, ResultHandler<V> handler, Output output) {
         Iterator<V> values = node.values();
         if (values != null) {
             if (!handler.handlePrefixMatch(chitr.processedLength(), values)) {
@@ -102,89 +111,14 @@
             }
         }
 
-        Node nextMatch = node.findMatch(chitr);
+        Node nextMatch = node.findMatch(chitr, output);
         if (nextMatch != null) {
-            find(nextMatch, chitr, handler);
+            find(nextMatch, chitr, handler, output);
         }
     }
 
-    /**
-     * Creates an object that consumes code points one at a time and returns intermediate prefix
-     * matches.  Returns null if no match exists.
-     *
-     * @return An instance of {@link ParseState}, or null if the starting code point is not a
-     * prefix for any entry in the trie.
-     */
-    public ParseState openParseState(int startingCp) {
-      // Check to see whether this is a valid starting character.  If not, return null.
-      if (_ignoreCase) {
-        startingCp = UCharacter.foldCase(startingCp, true);
-      }
-      int count = Character.charCount(startingCp);
-      char ch1 = (count == 1) ? (char) startingCp : UTF16.getLeadSurrogate(startingCp);
-      if (!_root.hasChildFor(ch1)) {
-        return null;
-      }
-
-      return new ParseState(_root);
-    }
-
-    /**
-     * ParseState is mutable, not thread-safe, and intended to be used internally by parsers for
-     * consuming values from this trie.
-     */
-    public class ParseState {
-      private Node node;
-      private int offset;
-      private Node.StepResult result;
-
-      ParseState(Node start) {
-        node = start;
-        offset = 0;
-        result = start.new StepResult();
-      }
-
-      /**
-       * Consumes a code point and walk to the next node in the trie.
-       *
-       * @param cp The code point to consume.
-       */
-      public void accept(int cp) {
-        assert node != null;
-        if (_ignoreCase) {
-          cp = UCharacter.foldCase(cp, true);
-        }
-        int count = Character.charCount(cp);
-        char ch1 = (count == 1) ? (char) cp : UTF16.getLeadSurrogate(cp);
-        node.takeStep(ch1, offset, result);
-        if (count == 2 && result.node != null) {
-          char ch2 = UTF16.getTrailSurrogate(cp);
-          result.node.takeStep(ch2, result.offset, result);
-        }
-        node = result.node;
-        offset = result.offset;
-      }
-
-      /**
-       * Gets the exact prefix matches for all code points that have been consumed so far.
-       *
-       * @return The matches.
-       */
-      public Iterator<V> getCurrentMatches() {
-        if (node != null && offset == node.charCount()) {
-          return node.values();
-        }
-        return null;
-      }
-
-      /**
-       * Checks whether any more code points can be consumed.
-       *
-       * @return true if no more code points can be consumed; false otherwise.
-       */
-      public boolean atEnd() {
-        return node == null || (node.charCount() == offset && node._children == null);
-      }
+    public void putLeadCodePoints(UnicodeSet output) {
+        _root.putLeadCodePoints(output);
     }
 
     public static class CharIterator implements Iterator<Character> {
@@ -320,17 +254,6 @@
           return _text == null ? 0 : _text.length;
         }
 
-        public boolean hasChildFor(char ch) {
-          for (int i=0; _children != null && i < _children.size(); i++) {
-            Node child = _children.get(i);
-            if (ch < child._text[0]) break;
-            if (ch == child._text[0]) {
-              return true;
-            }
-          }
-          return false;
-        }
-
         public Iterator<V> values() {
             if (_values == null) {
                 return null;
@@ -346,11 +269,14 @@
             add(toCharArray(buf), 0, value);
         }
 
-        public Node findMatch(CharIterator chitr) {
+        public Node findMatch(CharIterator chitr, Output output) {
             if (_children == null) {
                 return null;
             }
             if (!chitr.hasNext()) {
+                if (output != null) {
+                    output.partialMatch = true;
+                }
                 return null;
             }
             Node match = null;
@@ -360,7 +286,7 @@
                     break;
                 }
                 if (ch == child._text[0]) {
-                    if (child.matchFollowing(chitr)) {
+                    if (child.matchFollowing(chitr, output)) {
                         match = child;
                     }
                     break;
@@ -369,35 +295,25 @@
             return match;
         }
 
-        public class StepResult {
-          public Node node;
-          public int offset;
-        }
-        public void takeStep(char ch, int offset, StepResult result) {
-          assert offset <= charCount();
-          if (offset == charCount()) {
-            // Go to a child node
-            for (int i=0; _children != null && i < _children.size(); i++) {
-              Node child = _children.get(i);
-              if (ch < child._text[0]) break;
-              if (ch == child._text[0]) {
-                // Found a matching child node
-                result.node = child;
-                result.offset = 1;
+        public void putLeadCodePoints(UnicodeSet output) {
+            if (_children == null) {
                 return;
-              }
             }
-            // No matching children; fall through
-          } else if (_text[offset] == ch) {
-            // Return to this node; increase offset
-            result.node = this;
-            result.offset = offset + 1;
-            return;
-          }
-          // No matches
-          result.node = null;
-          result.offset = -1;
-          return;
+            for (Node child : _children) {
+                char c0 = child._text[0];
+                if (!UCharacter.isHighSurrogate(c0)) {
+                    output.add(c0);
+                } else if (child.charCount() >= 2) {
+                    output.add(Character.codePointAt(child._text, 0));
+                } else if (child._children != null) {
+                    // Construct all possible code points from grandchildren.
+                    for (Node grandchild : child._children) {
+                        char c1 = grandchild._text[0];
+                        int cp = Character.toCodePoint(c0, c1);
+                        output.add(cp);
+                    }
+                }
+            }
         }
 
         private void add(char[] text, int offset, V value) {
@@ -438,11 +354,14 @@
             litr.add(new Node(subArray(text, offset), addValue(null, value), null));
         }
 
-        private boolean matchFollowing(CharIterator chitr) {
+        private boolean matchFollowing(CharIterator chitr, Output output) {
             boolean matched = true;
             int idx = 1;
             while (idx < _text.length) {
                 if(!chitr.hasNext()) {
+                    if (output != null) {
+                        output.partialMatch = true;
+                    }
                     matched = false;
                     break;
                 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/TimeZoneAdapter.java b/android_icu4j/src/main/java/android/icu/impl/TimeZoneAdapter.java
index 7322653..db92b88 100644
--- a/android_icu4j/src/main/java/android/icu/impl/TimeZoneAdapter.java
+++ b/android_icu4j/src/main/java/android/icu/impl/TimeZoneAdapter.java
@@ -144,10 +144,14 @@
      */
     @Override
     public boolean equals(Object obj) {
-        if (obj instanceof TimeZoneAdapter) {
-            obj = ((TimeZoneAdapter) obj).zone;
+        if (this == obj) {
+            return true;
         }
-        return zone.equals(obj);
+        if (obj instanceof TimeZoneAdapter) {
+            TimeZone anotherZone = ((TimeZoneAdapter) obj).zone;
+            return zone.equals(anotherZone);
+        }
+        return false;
     }
 
     /**
diff --git a/android_icu4j/src/main/java/android/icu/impl/UCaseProps.java b/android_icu4j/src/main/java/android/icu/impl/UCaseProps.java
index f23577d..66ce729 100644
--- a/android_icu4j/src/main/java/android/icu/impl/UCaseProps.java
+++ b/android_icu4j/src/main/java/android/icu/impl/UCaseProps.java
@@ -119,7 +119,7 @@
         return props>>EXC_SHIFT;
     }
 
-    private static final boolean propsHasException(int props) {
+    static final boolean propsHasException(int props) {
         return (props&EXCEPTION)!=0;
     }
 
@@ -191,7 +191,7 @@
     public final int tolower(int c) {
         int props=trie.get(c);
         if(!propsHasException(props)) {
-            if(getTypeFromProps(props)>=UPPER) {
+            if(isUpperOrTitleFromProps(props)) {
                 c+=getDelta(props);
             }
         } else {
@@ -596,6 +596,153 @@
     }
 
     /**
+     * Fast case mapping data for ASCII/Latin.
+     * Linear arrays of delta bytes: 0=no mapping; EXC=exception.
+     * Deltas must not cross the ASCII boundary, or else they cannot be easily used
+     * in simple UTF-8 code.
+     */
+    static final class LatinCase {
+        /** Case mapping/folding data for code points up to U+017F. */
+        static final char LIMIT = 0x180;
+        /** U+017F case-folds and uppercases crossing the ASCII boundary. */
+        static final char LONG_S = 0x17f;
+        /** Exception: Complex mapping, or too-large delta. */
+        static final byte EXC = -0x80;
+
+        /** Deltas for lowercasing for most locales, and default case folding. */
+        static final byte[] TO_LOWER_NORMAL = {
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+            32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+            32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, EXC,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            EXC, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
+
+            0, 1, 0, 1, 0, 1, 0, 1, 0, EXC, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, -121, 1, 0, 1, 0, 1, 0, EXC
+        };
+
+        /** Deltas for lowercasing for tr/az/lt, and Turkic case folding. */
+        static final byte[] TO_LOWER_TR_LT = {
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 32, 32, 32, 32, 32, 32, 32, 32, EXC, EXC, 32, 32, 32, 32, 32,
+            32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, EXC, EXC, 32, 32,
+            32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, EXC,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, EXC, 0, 1, 0, 1, 0, EXC, 0,
+            EXC, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
+
+            0, 1, 0, 1, 0, 1, 0, 1, 0, EXC, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, -121, 1, 0, 1, 0, 1, 0, EXC
+        };
+
+        /** Deltas for uppercasing for most locales. */
+        static final byte[] TO_UPPER_NORMAL = {
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+            -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EXC,
+            -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+            -32, -32, -32, -32, -32, -32, -32, 0, -32, -32, -32, -32, -32, -32, -32, 121,
+
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, EXC, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0,
+
+            -1, 0, -1, 0, -1, 0, -1, 0, -1, EXC, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, EXC
+        };
+
+        /** Deltas for uppercasing for tr/az. */
+        static final byte[] TO_UPPER_TR = {
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, -32, -32, -32, -32, -32, -32, -32, -32, EXC, -32, -32, -32, -32, -32, -32,
+            -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EXC,
+            -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+            -32, -32, -32, -32, -32, -32, -32, 0, -32, -32, -32, -32, -32, -32, -32, 121,
+
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, EXC, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0,
+
+            -1, 0, -1, 0, -1, 0, -1, 0, -1, EXC, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, EXC
+        };
+    }
+
+    /**
      * For string case mappings, a single character (a code point) is mapped
      * either to itself (in which case in-place mapping functions do nothing),
      * or to another single code point, or to a string.
@@ -613,8 +760,8 @@
 
     //ivate static final int LOC_UNKNOWN=0;
     public static final int LOC_ROOT=1;
-    private static final int LOC_TURKISH=2;
-    private static final int LOC_LITHUANIAN=3;
+    static final int LOC_TURKISH=2;
+    static final int LOC_LITHUANIAN=3;
     static final int LOC_GREEK=4;
     public static final int LOC_DUTCH=5;
 
@@ -827,7 +974,7 @@
         result=c;
         props=trie.get(c);
         if(!propsHasException(props)) {
-            if(getTypeFromProps(props)>=UPPER) {
+            if(isUpperOrTitleFromProps(props)) {
                 result=c+getDelta(props);
             }
         } else {
@@ -1136,13 +1283,13 @@
      *
      * @hide draft / provisional / internal are hidden on Android
      */
-    private static final int FOLD_CASE_OPTIONS_MASK = 7;
+    static final int FOLD_CASE_OPTIONS_MASK = 7;
 
     /* return the simple case folding mapping for c */
     public final int fold(int c, int options) {
         int props=trie.get(c);
         if(!propsHasException(props)) {
-            if(getTypeFromProps(props)>=UPPER) {
+            if(isUpperOrTitleFromProps(props)) {
                 c+=getDelta(props);
             }
         } else {
@@ -1205,7 +1352,7 @@
         result=c;
         props=trie.get(c);
         if(!propsHasException(props)) {
-            if(getTypeFromProps(props)>=UPPER) {
+            if(isUpperOrTitleFromProps(props)) {
                 result=c+getDelta(props);
             }
         } else {
@@ -1365,6 +1512,10 @@
 
     // definitions for 16-bit case properties word ------------------------- ***
 
+    static Trie2_16 getTrie() {
+        return INSTANCE.trie;
+    }
+
     /* 2-bit constants for types of cased characters */
     public static final int TYPE_MASK=3;
     public static final int NONE=0;
@@ -1373,7 +1524,7 @@
     public static final int TITLE=3;
 
     /** @return NONE, LOWER, UPPER, TITLE */
-    private static final int getTypeFromProps(int props) {
+    static final int getTypeFromProps(int props) {
         return props&TYPE_MASK;
     }
 
@@ -1382,6 +1533,10 @@
         return props&7;
     }
 
+    static final boolean isUpperOrTitleFromProps(int props) {
+        return (props & 2) != 0;
+    }
+
     static final int IGNORABLE=4;
     private static final int SENSITIVE=     8;
     private static final int EXCEPTION=     0x10;
@@ -1398,7 +1553,7 @@
     //private static final int MAX_DELTA=     0xff;
     //private static final int MIN_DELTA=     (-MAX_DELTA-1);
 
-    private static final int getDelta(int props) {
+    static final int getDelta(int props) {
         return (short)props>>DELTA_SHIFT;
     }
 
diff --git a/android_icu4j/src/main/java/android/icu/impl/Utility.java b/android_icu4j/src/main/java/android/icu/impl/Utility.java
index cdb6a78..05054cd 100644
--- a/android_icu4j/src/main/java/android/icu/impl/Utility.java
+++ b/android_icu4j/src/main/java/android/icu/impl/Utility.java
@@ -1852,4 +1852,51 @@
     public static String toString(Object o) {
         return o == null ? "null" : o.toString();
     }
+
+    /**
+     * This implementation is equivalent to Java 8+ Math#addExact(int, int)
+     * @param x the first value
+     * @param y the second value
+     * @return the result
+     */
+    public static int addExact(int x, int y) {
+        int r = x + y;
+        // HD 2-12 Overflow iff both arguments have the opposite sign of the result
+        if (((x ^ r) & (y ^ r)) < 0) {
+            throw new ArithmeticException("integer overflow");
+        }
+        return r;
+    }
+
+    /**
+     * Returns whether the chars in the two CharSequences are equal.
+     */
+    public static boolean charSequenceEquals(CharSequence a, CharSequence b) {
+        if (a == b) {
+            return true;
+        }
+        if (a == null || b == null) {
+            return false;
+        }
+        if (a.length() != b.length()) {
+            return false;
+        }
+        for (int i = 0; i < a.length(); i++) {
+            if (a.charAt(i) != b.charAt(i))
+                return false;
+        }
+        return true;
+    }
+
+    /**
+     * Returns a hash code for a CharSequence that is equivalent to calling
+     * charSequence.toString().hashCode()
+     */
+    public static int charSequenceHashCode(CharSequence value) {
+        int hash = 0;
+        for (int i = 0; i < value.length(); i++) {
+            hash = hash * 31 + value.charAt(i);
+        }
+        return hash;
+    }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/AffixPatternProvider.java b/android_icu4j/src/main/java/android/icu/impl/number/AffixPatternProvider.java
index 68076df..1f08c37 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/AffixPatternProvider.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/AffixPatternProvider.java
@@ -7,24 +7,39 @@
  * @hide Only a subset of ICU is exposed in Android
  */
 public interface AffixPatternProvider {
-  public static final class Flags {
-    public static final int PLURAL_MASK = 0xff;
-    public static final int PREFIX = 0x100;
-    public static final int NEGATIVE_SUBPATTERN = 0x200;
-    public static final int PADDING = 0x400;
-  }
+    public static final class Flags {
+        public static final int PLURAL_MASK = 0xff;
+        public static final int PREFIX = 0x100;
+        public static final int NEGATIVE_SUBPATTERN = 0x200;
+        public static final int PADDING = 0x400;
+    }
 
-  public char charAt(int flags, int i);
+    // Convenience compound flags
+    public static final int FLAG_POS_PREFIX = Flags.PREFIX;
+    public static final int FLAG_POS_SUFFIX = 0;
+    public static final int FLAG_NEG_PREFIX = Flags.PREFIX | Flags.NEGATIVE_SUBPATTERN;
+    public static final int FLAG_NEG_SUFFIX = Flags.NEGATIVE_SUBPATTERN;
 
-  public int length(int flags);
+    public char charAt(int flags, int i);
 
-  public boolean hasCurrencySign();
+    public int length(int flags);
 
-  public boolean positiveHasPlusSign();
+    public String getString(int flags);
 
-  public boolean hasNegativeSubpattern();
+    public boolean hasCurrencySign();
 
-  public boolean negativeHasMinusSign();
+    public boolean positiveHasPlusSign();
 
-  public boolean containsSymbolType(int type);
+    public boolean hasNegativeSubpattern();
+
+    public boolean negativeHasMinusSign();
+
+    public boolean containsSymbolType(int type);
+
+    /**
+     * True if the pattern has a number placeholder like "0" or "#,##0.00"; false if the pattern does not
+     * have one. This is used in cases like compact notation, where the pattern replaces the entire
+     * number instead of rendering the number.
+     */
+    public boolean hasBody();
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/AffixUtils.java b/android_icu4j/src/main/java/android/icu/impl/number/AffixUtils.java
index a89cecc..c69b5d6 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/AffixUtils.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/AffixUtils.java
@@ -4,615 +4,704 @@
 package android.icu.impl.number;
 
 import android.icu.text.NumberFormat;
+import android.icu.text.UnicodeSet;
 
 /**
  * Performs manipulations on affix patterns: the prefix and suffix strings associated with a decimal
  * format pattern. For example:
  *
  * <table>
- * <tr><th>Affix Pattern</th><th>Example Unescaped (Formatted) String</th></tr>
- * <tr><td>abc</td><td>abc</td></tr>
- * <tr><td>ab-</td><td>ab−</td></tr>
- * <tr><td>ab'-'</td><td>ab-</td></tr>
- * <tr><td>ab''</td><td>ab'</td></tr>
+ * <tr>
+ * <th>Affix Pattern</th>
+ * <th>Example Unescaped (Formatted) String</th>
+ * </tr>
+ * <tr>
+ * <td>abc</td>
+ * <td>abc</td>
+ * </tr>
+ * <tr>
+ * <td>ab-</td>
+ * <td>ab−</td>
+ * </tr>
+ * <tr>
+ * <td>ab'-'</td>
+ * <td>ab-</td>
+ * </tr>
+ * <tr>
+ * <td>ab''</td>
+ * <td>ab'</td>
+ * </tr>
  * </table>
  *
- * To manually iterate over tokens in a literal string, use the following pattern, which is designed
- * to be efficient.
+ * To manually iterate over tokens in a literal string, use the following pattern, which is designed to
+ * be efficient.
  *
  * <pre>
  * long tag = 0L;
  * while (AffixPatternUtils.hasNext(tag, patternString)) {
- *   tag = AffixPatternUtils.nextToken(tag, patternString);
- *   int typeOrCp = AffixPatternUtils.getTypeOrCp(tag);
- *   switch (typeOrCp) {
+ *     tag = AffixPatternUtils.nextToken(tag, patternString);
+ *     int typeOrCp = AffixPatternUtils.getTypeOrCp(tag);
+ *     switch (typeOrCp) {
  *     case AffixPatternUtils.TYPE_MINUS_SIGN:
- *       // Current token is a minus sign.
- *       break;
+ *         // Current token is a minus sign.
+ *         break;
  *     case AffixPatternUtils.TYPE_PLUS_SIGN:
- *       // Current token is a plus sign.
- *       break;
+ *         // Current token is a plus sign.
+ *         break;
  *     case AffixPatternUtils.TYPE_PERCENT:
- *       // Current token is a percent sign.
- *       break;
+ *         // Current token is a percent sign.
+ *         break;
  *     // ... other types ...
  *     default:
- *       // Current token is an arbitrary code point.
- *       // The variable typeOrCp is the code point.
- *       break;
- *   }
+ *         // Current token is an arbitrary code point.
+ *         // The variable typeOrCp is the code point.
+ *         break;
+ *     }
  * }
  * </pre>
  * @hide Only a subset of ICU is exposed in Android
  */
 public class AffixUtils {
 
-  private static final int STATE_BASE = 0;
-  private static final int STATE_FIRST_QUOTE = 1;
-  private static final int STATE_INSIDE_QUOTE = 2;
-  private static final int STATE_AFTER_QUOTE = 3;
-  private static final int STATE_FIRST_CURR = 4;
-  private static final int STATE_SECOND_CURR = 5;
-  private static final int STATE_THIRD_CURR = 6;
-  private static final int STATE_FOURTH_CURR = 7;
-  private static final int STATE_FIFTH_CURR = 8;
-  private static final int STATE_OVERFLOW_CURR = 9;
+    private static final int STATE_BASE = 0;
+    private static final int STATE_FIRST_QUOTE = 1;
+    private static final int STATE_INSIDE_QUOTE = 2;
+    private static final int STATE_AFTER_QUOTE = 3;
+    private static final int STATE_FIRST_CURR = 4;
+    private static final int STATE_SECOND_CURR = 5;
+    private static final int STATE_THIRD_CURR = 6;
+    private static final int STATE_FOURTH_CURR = 7;
+    private static final int STATE_FIFTH_CURR = 8;
+    private static final int STATE_OVERFLOW_CURR = 9;
 
-  /** Represents a literal character; the value is stored in the code point field. */
-  private static final int TYPE_CODEPOINT = 0;
+    /** Represents a literal character; the value is stored in the code point field. */
+    private static final int TYPE_CODEPOINT = 0;
 
-  /** Represents a minus sign symbol '-'. */
-  public static final int TYPE_MINUS_SIGN = -1;
+    /** Represents a minus sign symbol '-'. */
+    public static final int TYPE_MINUS_SIGN = -1;
 
-  /** Represents a plus sign symbol '+'. */
-  public static final int TYPE_PLUS_SIGN = -2;
+    /** Represents a plus sign symbol '+'. */
+    public static final int TYPE_PLUS_SIGN = -2;
 
-  /** Represents a percent sign symbol '%'. */
-  public static final int TYPE_PERCENT = -3;
+    /** Represents a percent sign symbol '%'. */
+    public static final int TYPE_PERCENT = -3;
 
-  /** Represents a permille sign symbol '‰'. */
-  public static final int TYPE_PERMILLE = -4;
+    /** Represents a permille sign symbol '‰'. */
+    public static final int TYPE_PERMILLE = -4;
 
-  /** Represents a single currency symbol '¤'. */
-  public static final int TYPE_CURRENCY_SINGLE = -5;
+    /** Represents a single currency symbol '¤'. */
+    public static final int TYPE_CURRENCY_SINGLE = -5;
 
-  /** Represents a double currency symbol '¤¤'. */
-  public static final int TYPE_CURRENCY_DOUBLE = -6;
+    /** Represents a double currency symbol '¤¤'. */
+    public static final int TYPE_CURRENCY_DOUBLE = -6;
 
-  /** Represents a triple currency symbol '¤¤¤'. */
-  public static final int TYPE_CURRENCY_TRIPLE = -7;
+    /** Represents a triple currency symbol '¤¤¤'. */
+    public static final int TYPE_CURRENCY_TRIPLE = -7;
 
-  /** Represents a quadruple currency symbol '¤¤¤¤'. */
-  public static final int TYPE_CURRENCY_QUAD = -8;
+    /** Represents a quadruple currency symbol '¤¤¤¤'. */
+    public static final int TYPE_CURRENCY_QUAD = -8;
 
-  /** Represents a quintuple currency symbol '¤¤¤¤¤'. */
-  public static final int TYPE_CURRENCY_QUINT = -9;
+    /** Represents a quintuple currency symbol '¤¤¤¤¤'. */
+    public static final int TYPE_CURRENCY_QUINT = -9;
 
-  /** Represents a sequence of six or more currency symbols. */
-  public static final int TYPE_CURRENCY_OVERFLOW = -15;
+    /** Represents a sequence of six or more currency symbols. */
+    public static final int TYPE_CURRENCY_OVERFLOW = -15;
 
-  public static interface SymbolProvider {
-    public CharSequence getSymbol(int type);
-  }
+    public static interface SymbolProvider {
+        public CharSequence getSymbol(int type);
+    }
 
-  /**
-   * Estimates the number of code points present in an unescaped version of the affix pattern string
-   * (one that would be returned by {@link #unescape}), assuming that all interpolated symbols
-   * consume one code point and that currencies consume as many code points as their symbol width.
-   * Used for computing padding width.
-   *
-   * @param patternString The original string whose width will be estimated.
-   * @return The length of the unescaped string.
-   */
-  public static int estimateLength(CharSequence patternString) {
-    if (patternString == null) return 0;
-    int state = STATE_BASE;
-    int offset = 0;
-    int length = 0;
-    for (; offset < patternString.length(); ) {
-      int cp = Character.codePointAt(patternString, offset);
+    public static interface TokenConsumer {
+        public void consumeToken(int typeOrCp);
+    }
 
-      switch (state) {
-        case STATE_BASE:
-          if (cp == '\'') {
-            // First quote
-            state = STATE_FIRST_QUOTE;
-          } else {
-            // Unquoted symbol
-            length++;
-          }
-          break;
+    /**
+     * Estimates the number of code points present in an unescaped version of the affix pattern string
+     * (one that would be returned by {@link #unescape}), assuming that all interpolated symbols consume
+     * one code point and that currencies consume as many code points as their symbol width. Used for
+     * computing padding width.
+     *
+     * @param patternString
+     *            The original string whose width will be estimated.
+     * @return The length of the unescaped string.
+     */
+    public static int estimateLength(CharSequence patternString) {
+        if (patternString == null)
+            return 0;
+        int state = STATE_BASE;
+        int offset = 0;
+        int length = 0;
+        for (; offset < patternString.length();) {
+            int cp = Character.codePointAt(patternString, offset);
+
+            switch (state) {
+            case STATE_BASE:
+                if (cp == '\'') {
+                    // First quote
+                    state = STATE_FIRST_QUOTE;
+                } else {
+                    // Unquoted symbol
+                    length++;
+                }
+                break;
+            case STATE_FIRST_QUOTE:
+                if (cp == '\'') {
+                    // Repeated quote
+                    length++;
+                    state = STATE_BASE;
+                } else {
+                    // Quoted code point
+                    length++;
+                    state = STATE_INSIDE_QUOTE;
+                }
+                break;
+            case STATE_INSIDE_QUOTE:
+                if (cp == '\'') {
+                    // End of quoted sequence
+                    state = STATE_AFTER_QUOTE;
+                } else {
+                    // Quoted code point
+                    length++;
+                }
+                break;
+            case STATE_AFTER_QUOTE:
+                if (cp == '\'') {
+                    // Double quote inside of quoted sequence
+                    length++;
+                    state = STATE_INSIDE_QUOTE;
+                } else {
+                    // Unquoted symbol
+                    length++;
+                }
+                break;
+            default:
+                throw new AssertionError();
+            }
+
+            offset += Character.charCount(cp);
+        }
+
+        switch (state) {
         case STATE_FIRST_QUOTE:
-          if (cp == '\'') {
-            // Repeated quote
-            length++;
-            state = STATE_BASE;
-          } else {
-            // Quoted code point
-            length++;
-            state = STATE_INSIDE_QUOTE;
-          }
-          break;
         case STATE_INSIDE_QUOTE:
-          if (cp == '\'') {
-            // End of quoted sequence
-            state = STATE_AFTER_QUOTE;
-          } else {
-            // Quoted code point
-            length++;
-          }
-          break;
-        case STATE_AFTER_QUOTE:
-          if (cp == '\'') {
-            // Double quote inside of quoted sequence
-            length++;
-            state = STATE_INSIDE_QUOTE;
-          } else {
-            // Unquoted symbol
-            length++;
-          }
-          break;
+            throw new IllegalArgumentException("Unterminated quote: \"" + patternString + "\"");
         default:
-          throw new AssertionError();
-      }
+            break;
+        }
 
-      offset += Character.charCount(cp);
+        return length;
     }
 
-    switch (state) {
-      case STATE_FIRST_QUOTE:
-      case STATE_INSIDE_QUOTE:
-        throw new IllegalArgumentException("Unterminated quote: \"" + patternString + "\"");
-      default:
-        break;
-    }
+    /**
+     * Takes a string and escapes (quotes) characters that have special meaning in the affix pattern
+     * syntax. This function does not reverse-lookup symbols.
+     *
+     * <p>
+     * Example input: "-$x"; example output: "'-'$x"
+     *
+     * @param input
+     *            The string to be escaped.
+     * @param output
+     *            The string builder to which to append the escaped string.
+     * @return The number of chars (UTF-16 code units) appended to the output.
+     */
+    public static int escape(CharSequence input, StringBuilder output) {
+        if (input == null)
+            return 0;
+        int state = STATE_BASE;
+        int offset = 0;
+        int startLength = output.length();
+        for (; offset < input.length();) {
+            int cp = Character.codePointAt(input, offset);
 
-    return length;
-  }
+            switch (cp) {
+            case '\'':
+                output.append("''");
+                break;
 
-  /**
-   * Takes a string and escapes (quotes) characters that have special meaning in the affix pattern
-   * syntax. This function does not reverse-lookup symbols.
-   *
-   * <p>Example input: "-$x"; example output: "'-'$x"
-   *
-   * @param input The string to be escaped.
-   * @param output The string builder to which to append the escaped string.
-   * @return The number of chars (UTF-16 code units) appended to the output.
-   */
-  public static int escape(CharSequence input, StringBuilder output) {
-    if (input == null) return 0;
-    int state = STATE_BASE;
-    int offset = 0;
-    int startLength = output.length();
-    for (; offset < input.length(); ) {
-      int cp = Character.codePointAt(input, offset);
+            case '-':
+            case '+':
+            case '%':
+            case '‰':
+            case '¤':
+                if (state == STATE_BASE) {
+                    output.append('\'');
+                    output.appendCodePoint(cp);
+                    state = STATE_INSIDE_QUOTE;
+                } else {
+                    output.appendCodePoint(cp);
+                }
+                break;
 
-      switch (cp) {
-        case '\'':
-          output.append("''");
-          break;
+            default:
+                if (state == STATE_INSIDE_QUOTE) {
+                    output.append('\'');
+                    output.appendCodePoint(cp);
+                    state = STATE_BASE;
+                } else {
+                    output.appendCodePoint(cp);
+                }
+                break;
+            }
+            offset += Character.charCount(cp);
+        }
 
-        case '-':
-        case '+':
-        case '%':
-        case '‰':
-        case '¤':
-          if (state == STATE_BASE) {
+        if (state == STATE_INSIDE_QUOTE) {
             output.append('\'');
-            output.appendCodePoint(cp);
-            state = STATE_INSIDE_QUOTE;
-          } else {
-            output.appendCodePoint(cp);
-          }
-          break;
+        }
 
+        return output.length() - startLength;
+    }
+
+    /** Version of {@link #escape} that returns a String, or null if input is null. */
+    public static String escape(CharSequence input) {
+        if (input == null)
+            return null;
+        StringBuilder sb = new StringBuilder();
+        escape(input, sb);
+        return sb.toString();
+    }
+
+    public static final NumberFormat.Field getFieldForType(int type) {
+        switch (type) {
+        case TYPE_MINUS_SIGN:
+            return NumberFormat.Field.SIGN;
+        case TYPE_PLUS_SIGN:
+            return NumberFormat.Field.SIGN;
+        case TYPE_PERCENT:
+            return NumberFormat.Field.PERCENT;
+        case TYPE_PERMILLE:
+            return NumberFormat.Field.PERMILLE;
+        case TYPE_CURRENCY_SINGLE:
+            return NumberFormat.Field.CURRENCY;
+        case TYPE_CURRENCY_DOUBLE:
+            return NumberFormat.Field.CURRENCY;
+        case TYPE_CURRENCY_TRIPLE:
+            return NumberFormat.Field.CURRENCY;
+        case TYPE_CURRENCY_QUAD:
+            return NumberFormat.Field.CURRENCY;
+        case TYPE_CURRENCY_QUINT:
+            return NumberFormat.Field.CURRENCY;
+        case TYPE_CURRENCY_OVERFLOW:
+            return NumberFormat.Field.CURRENCY;
         default:
-          if (state == STATE_INSIDE_QUOTE) {
-            output.append('\'');
-            output.appendCodePoint(cp);
-            state = STATE_BASE;
-          } else {
-            output.appendCodePoint(cp);
-          }
-          break;
-      }
-      offset += Character.charCount(cp);
+            throw new AssertionError();
+        }
     }
 
-    if (state == STATE_INSIDE_QUOTE) {
-      output.append('\'');
+    /**
+     * Executes the unescape state machine. Replaces the unquoted characters "-", "+", "%", "‰", and "¤"
+     * with the corresponding symbols provided by the {@link SymbolProvider}, and inserts the result into
+     * the NumberStringBuilder at the requested location.
+     *
+     * <p>
+     * Example input: "'-'¤x"; example output: "-$x"
+     *
+     * @param affixPattern
+     *            The original string to be unescaped.
+     * @param output
+     *            The NumberStringBuilder to mutate with the result.
+     * @param position
+     *            The index into the NumberStringBuilder to insert the the string.
+     * @param provider
+     *            An object to generate locale symbols.
+     * @return The length of the string added to affixPattern.
+     */
+    public static int unescape(
+            CharSequence affixPattern,
+            NumberStringBuilder output,
+            int position,
+            SymbolProvider provider) {
+        assert affixPattern != null;
+        int length = 0;
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            int typeOrCp = getTypeOrCp(tag);
+            if (typeOrCp == TYPE_CURRENCY_OVERFLOW) {
+                // Don't go to the provider for this special case
+                length += output.insertCodePoint(position + length, 0xFFFD, NumberFormat.Field.CURRENCY);
+            } else if (typeOrCp < 0) {
+                length += output.insert(position + length,
+                        provider.getSymbol(typeOrCp),
+                        getFieldForType(typeOrCp));
+            } else {
+                length += output.insertCodePoint(position + length, typeOrCp, null);
+            }
+        }
+        return length;
     }
 
-    return output.length() - startLength;
-  }
-
-  /** Version of {@link #escape} that returns a String, or null if input is null. */
-  public static String escape(CharSequence input) {
-    if (input == null) return null;
-    StringBuilder sb = new StringBuilder();
-    escape(input, sb);
-    return sb.toString();
-  }
-
-  public static final NumberFormat.Field getFieldForType(int type) {
-    switch (type) {
-      case TYPE_MINUS_SIGN:
-        return NumberFormat.Field.SIGN;
-      case TYPE_PLUS_SIGN:
-        return NumberFormat.Field.SIGN;
-      case TYPE_PERCENT:
-        return NumberFormat.Field.PERCENT;
-      case TYPE_PERMILLE:
-        return NumberFormat.Field.PERMILLE;
-      case TYPE_CURRENCY_SINGLE:
-        return NumberFormat.Field.CURRENCY;
-      case TYPE_CURRENCY_DOUBLE:
-        return NumberFormat.Field.CURRENCY;
-      case TYPE_CURRENCY_TRIPLE:
-        return NumberFormat.Field.CURRENCY;
-      case TYPE_CURRENCY_QUAD:
-        return NumberFormat.Field.CURRENCY;
-      case TYPE_CURRENCY_QUINT:
-        return NumberFormat.Field.CURRENCY;
-      case TYPE_CURRENCY_OVERFLOW:
-        return NumberFormat.Field.CURRENCY;
-      default:
-        throw new AssertionError();
+    /**
+     * Sames as {@link #unescape}, but only calculates the length or code point count. More efficient
+     * than {@link #unescape} if you only need the length but not the string itself.
+     *
+     * @param affixPattern
+     *            The original string to be unescaped.
+     * @param lengthOrCount
+     *            true to count length (UTF-16 code units); false to count code points
+     * @param provider
+     *            An object to generate locale symbols.
+     * @return The number of code points in the unescaped string.
+     */
+    public static int unescapedCount(
+            CharSequence affixPattern,
+            boolean lengthOrCount,
+            SymbolProvider provider) {
+        int length = 0;
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            int typeOrCp = getTypeOrCp(tag);
+            if (typeOrCp == TYPE_CURRENCY_OVERFLOW) {
+                // U+FFFD is one char
+                length += 1;
+            } else if (typeOrCp < 0) {
+                CharSequence symbol = provider.getSymbol(typeOrCp);
+                length += lengthOrCount ? symbol.length()
+                        : Character.codePointCount(symbol, 0, symbol.length());
+            } else {
+                length += lengthOrCount ? Character.charCount(typeOrCp) : 1;
+            }
+        }
+        return length;
     }
-  }
 
-  /**
-   * Executes the unescape state machine. Replaces the unquoted characters "-", "+", "%", "‰", and
-   * "¤" with the corresponding symbols provided by the {@link SymbolProvider}, and inserts the
-   * result into the NumberStringBuilder at the requested location.
-   *
-   * <p>Example input: "'-'¤x"; example output: "-$x"
-   *
-   * @param affixPattern The original string to be unescaped.
-   * @param output The NumberStringBuilder to mutate with the result.
-   * @param position The index into the NumberStringBuilder to insert the the string.
-   * @param provider An object to generate locale symbols.
-   * @return The length of the string added to affixPattern.
-   */
-  public static int unescape(
-      CharSequence affixPattern,
-      NumberStringBuilder output,
-      int position,
-      SymbolProvider provider) {
-    assert affixPattern != null;
-    int length = 0;
-    long tag = 0L;
-    while (hasNext(tag, affixPattern)) {
-      tag = nextToken(tag, affixPattern);
-      int typeOrCp = getTypeOrCp(tag);
-      if (typeOrCp == TYPE_CURRENCY_OVERFLOW) {
-        // Don't go to the provider for this special case
-        length += output.insertCodePoint(position + length, 0xFFFD, NumberFormat.Field.CURRENCY);
-      } else if (typeOrCp < 0) {
-        length += output.insert(position + length, provider.getSymbol(typeOrCp), getFieldForType(typeOrCp));
-      } else {
-        length += output.insertCodePoint(position + length, typeOrCp, null);
-      }
-    }
-    return length;
-  }
-
-  /**
-   * Sames as {@link #unescape}, but only calculates the code point count.  More efficient than {@link #unescape}
-   * if you only need the length but not the string itself.
-   *
-   * @param affixPattern The original string to be unescaped.
-   * @param provider An object to generate locale symbols.
-   * @return The number of code points in the unescaped string.
-   */
-  public static int unescapedCodePointCount(CharSequence affixPattern, SymbolProvider provider) {
-    int length = 0;
-    long tag = 0L;
-    while (hasNext(tag, affixPattern)) {
-      tag = nextToken(tag, affixPattern);
-      int typeOrCp = getTypeOrCp(tag);
-      if (typeOrCp == TYPE_CURRENCY_OVERFLOW) {
-        length += 1;
-      } else if (typeOrCp < 0) {
-        CharSequence symbol = provider.getSymbol(typeOrCp);
-        length += Character.codePointCount(symbol, 0, symbol.length());
-      } else {
-        length += 1;
-      }
-    }
-    return length;
-  }
-
-  /**
-   * Checks whether the given affix pattern contains at least one token of the given type, which is
-   * one of the constants "TYPE_" in {@link AffixUtils}.
-   *
-   * @param affixPattern The affix pattern to check.
-   * @param type The token type.
-   * @return true if the affix pattern contains the given token type; false otherwise.
-   */
-  public static boolean containsType(CharSequence affixPattern, int type) {
-    if (affixPattern == null || affixPattern.length() == 0) {
+    /**
+     * Checks whether the given affix pattern contains at least one token of the given type, which is one
+     * of the constants "TYPE_" in {@link AffixUtils}.
+     *
+     * @param affixPattern
+     *            The affix pattern to check.
+     * @param type
+     *            The token type.
+     * @return true if the affix pattern contains the given token type; false otherwise.
+     */
+    public static boolean containsType(CharSequence affixPattern, int type) {
+        if (affixPattern == null || affixPattern.length() == 0) {
+            return false;
+        }
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            if (getTypeOrCp(tag) == type) {
+                return true;
+            }
+        }
         return false;
     }
-    long tag = 0L;
-    while (hasNext(tag, affixPattern)) {
-      tag = nextToken(tag, affixPattern);
-      if (getTypeOrCp(tag) == type) {
-        return true;
-      }
-    }
-    return false;
-  }
 
-  /**
-   * Checks whether the specified affix pattern has any unquoted currency symbols ("¤").
-   *
-   * @param affixPattern The string to check for currency symbols.
-   * @return true if the literal has at least one unquoted currency symbol; false otherwise.
-   */
-  public static boolean hasCurrencySymbols(CharSequence affixPattern) {
-    if (affixPattern == null || affixPattern.length() == 0) return false;
-    long tag = 0L;
-    while (hasNext(tag, affixPattern)) {
-      tag = nextToken(tag, affixPattern);
-      int typeOrCp = getTypeOrCp(tag);
-      if (typeOrCp < 0 && getFieldForType(typeOrCp) == NumberFormat.Field.CURRENCY) {
-        return true;
-      }
+    /**
+     * Checks whether the specified affix pattern has any unquoted currency symbols ("¤").
+     *
+     * @param affixPattern
+     *            The string to check for currency symbols.
+     * @return true if the literal has at least one unquoted currency symbol; false otherwise.
+     */
+    public static boolean hasCurrencySymbols(CharSequence affixPattern) {
+        if (affixPattern == null || affixPattern.length() == 0)
+            return false;
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            int typeOrCp = getTypeOrCp(tag);
+            if (typeOrCp < 0 && getFieldForType(typeOrCp) == NumberFormat.Field.CURRENCY) {
+                return true;
+            }
+        }
+        return false;
     }
-    return false;
-  }
 
-  /**
-   * Replaces all occurrences of tokens with the given type with the given replacement char.
-   *
-   * @param affixPattern The source affix pattern (does not get modified).
-   * @param type The token type.
-   * @param replacementChar The char to substitute in place of chars of the given token type.
-   * @return A string containing the new affix pattern.
-   */
-  public static String replaceType(CharSequence affixPattern, int type, char replacementChar) {
-    if (affixPattern == null || affixPattern.length() == 0) return "";
-    char[] chars = affixPattern.toString().toCharArray();
-    long tag = 0L;
-    while (hasNext(tag, affixPattern)) {
-      tag = nextToken(tag, affixPattern);
-      if (getTypeOrCp(tag) == type) {
+    /**
+     * Replaces all occurrences of tokens with the given type with the given replacement char.
+     *
+     * @param affixPattern
+     *            The source affix pattern (does not get modified).
+     * @param type
+     *            The token type.
+     * @param replacementChar
+     *            The char to substitute in place of chars of the given token type.
+     * @return A string containing the new affix pattern.
+     */
+    public static String replaceType(CharSequence affixPattern, int type, char replacementChar) {
+        if (affixPattern == null || affixPattern.length() == 0)
+            return "";
+        char[] chars = affixPattern.toString().toCharArray();
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            if (getTypeOrCp(tag) == type) {
+                int offset = getOffset(tag);
+                chars[offset - 1] = replacementChar;
+            }
+        }
+        return new String(chars);
+    }
+
+    /**
+     * Returns whether the given affix pattern contains only symbols and ignorables as defined by the
+     * given ignorables set.
+     */
+    public static boolean containsOnlySymbolsAndIgnorables(
+            CharSequence affixPattern,
+            UnicodeSet ignorables) {
+        if (affixPattern == null) {
+            return true;
+        }
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            int typeOrCp = getTypeOrCp(tag);
+            if (typeOrCp >= 0 && !ignorables.contains(typeOrCp)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Iterates over the affix pattern, calling the TokenConsumer for each token.
+     */
+    public static void iterateWithConsumer(CharSequence affixPattern, TokenConsumer consumer) {
+        assert affixPattern != null;
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            int typeOrCp = getTypeOrCp(tag);
+            consumer.consumeToken(typeOrCp);
+        }
+    }
+
+    /**
+     * Returns the next token from the affix pattern.
+     *
+     * @param tag
+     *            A bitmask used for keeping track of state from token to token. The initial value should
+     *            be 0L.
+     * @param patternString
+     *            The affix pattern.
+     * @return The bitmask tag to pass to the next call of this method to retrieve the following token
+     *         (never negative), or -1 if there were no more tokens in the affix pattern.
+     * @see #hasNext
+     */
+    private static long nextToken(long tag, CharSequence patternString) {
         int offset = getOffset(tag);
-        chars[offset - 1] = replacementChar;
-      }
-    }
-    return new String(chars);
-  }
+        int state = getState(tag);
+        for (; offset < patternString.length();) {
+            int cp = Character.codePointAt(patternString, offset);
+            int count = Character.charCount(cp);
 
-  /**
-   * Returns the next token from the affix pattern.
-   *
-   * @param tag A bitmask used for keeping track of state from token to token. The initial value
-   *     should be 0L.
-   * @param patternString The affix pattern.
-   * @return The bitmask tag to pass to the next call of this method to retrieve the following token
-   *     (never negative), or -1 if there were no more tokens in the affix pattern.
-   * @see #hasNext
-   */
-  public static long nextToken(long tag, CharSequence patternString) {
-    int offset = getOffset(tag);
-    int state = getState(tag);
-    for (; offset < patternString.length(); ) {
-      int cp = Character.codePointAt(patternString, offset);
-      int count = Character.charCount(cp);
-
-      switch (state) {
-        case STATE_BASE:
-          switch (cp) {
-            case '\'':
-              state = STATE_FIRST_QUOTE;
-              offset += count;
-              // continue to the next code point
-              break;
-            case '-':
-              return makeTag(offset + count, TYPE_MINUS_SIGN, STATE_BASE, 0);
-            case '+':
-              return makeTag(offset + count, TYPE_PLUS_SIGN, STATE_BASE, 0);
-            case '%':
-              return makeTag(offset + count, TYPE_PERCENT, STATE_BASE, 0);
-            case '‰':
-              return makeTag(offset + count, TYPE_PERMILLE, STATE_BASE, 0);
-            case '¤':
-              state = STATE_FIRST_CURR;
-              offset += count;
-              // continue to the next code point
-              break;
+            switch (state) {
+            case STATE_BASE:
+                switch (cp) {
+                case '\'':
+                    state = STATE_FIRST_QUOTE;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                case '-':
+                    return makeTag(offset + count, TYPE_MINUS_SIGN, STATE_BASE, 0);
+                case '+':
+                    return makeTag(offset + count, TYPE_PLUS_SIGN, STATE_BASE, 0);
+                case '%':
+                    return makeTag(offset + count, TYPE_PERCENT, STATE_BASE, 0);
+                case '‰':
+                    return makeTag(offset + count, TYPE_PERMILLE, STATE_BASE, 0);
+                case '¤':
+                    state = STATE_FIRST_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                default:
+                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
+                }
+                break;
+            case STATE_FIRST_QUOTE:
+                if (cp == '\'') {
+                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
+                } else {
+                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
+                }
+            case STATE_INSIDE_QUOTE:
+                if (cp == '\'') {
+                    state = STATE_AFTER_QUOTE;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
+                }
+            case STATE_AFTER_QUOTE:
+                if (cp == '\'') {
+                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
+                } else {
+                    state = STATE_BASE;
+                    // re-evaluate this code point
+                    break;
+                }
+            case STATE_FIRST_CURR:
+                if (cp == '¤') {
+                    state = STATE_SECOND_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
+                }
+            case STATE_SECOND_CURR:
+                if (cp == '¤') {
+                    state = STATE_THIRD_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
+                }
+            case STATE_THIRD_CURR:
+                if (cp == '¤') {
+                    state = STATE_FOURTH_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
+                }
+            case STATE_FOURTH_CURR:
+                if (cp == '¤') {
+                    state = STATE_FIFTH_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
+                }
+            case STATE_FIFTH_CURR:
+                if (cp == '¤') {
+                    state = STATE_OVERFLOW_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
+                }
+            case STATE_OVERFLOW_CURR:
+                if (cp == '¤') {
+                    offset += count;
+                    // continue to the next code point and loop back to this state
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
+                }
             default:
-              return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
-          }
-          break;
+                throw new AssertionError();
+            }
+        }
+        // End of string
+        switch (state) {
+        case STATE_BASE:
+            // No more tokens in string.
+            return -1L;
         case STATE_FIRST_QUOTE:
-          if (cp == '\'') {
-            return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
-          } else {
-            return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
-          }
         case STATE_INSIDE_QUOTE:
-          if (cp == '\'') {
-            state = STATE_AFTER_QUOTE;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
-            return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
-          }
+            // For consistent behavior with the JDK and ICU 58, throw an exception here.
+            throw new IllegalArgumentException(
+                    "Unterminated quote in pattern affix: \"" + patternString + "\"");
         case STATE_AFTER_QUOTE:
-          if (cp == '\'') {
-            return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
-          } else {
-            state = STATE_BASE;
-            // re-evaluate this code point
-            break;
-          }
+            // No more tokens in string.
+            return -1L;
         case STATE_FIRST_CURR:
-          if (cp == '¤') {
-            state = STATE_SECOND_CURR;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
-          }
         case STATE_SECOND_CURR:
-          if (cp == '¤') {
-            state = STATE_THIRD_CURR;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
-          }
         case STATE_THIRD_CURR:
-          if (cp == '¤') {
-            state = STATE_FOURTH_CURR;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
-          }
         case STATE_FOURTH_CURR:
-          if (cp == '¤') {
-            state = STATE_FIFTH_CURR;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
-          }
         case STATE_FIFTH_CURR:
-          if (cp == '¤') {
-            state = STATE_OVERFLOW_CURR;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
-          }
         case STATE_OVERFLOW_CURR:
-          if (cp == '¤') {
-            offset += count;
-            // continue to the next code point and loop back to this state
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
-          }
         default:
-          throw new AssertionError();
-      }
+            throw new AssertionError();
+        }
     }
-    // End of string
-    switch (state) {
-      case STATE_BASE:
-        // No more tokens in string.
-        return -1L;
-      case STATE_FIRST_QUOTE:
-      case STATE_INSIDE_QUOTE:
-        // For consistent behavior with the JDK and ICU 58, throw an exception here.
-        throw new IllegalArgumentException(
-            "Unterminated quote in pattern affix: \"" + patternString + "\"");
-      case STATE_AFTER_QUOTE:
-        // No more tokens in string.
-        return -1L;
-      case STATE_FIRST_CURR:
-        return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
-      case STATE_SECOND_CURR:
-        return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
-      case STATE_THIRD_CURR:
-        return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
-      case STATE_FOURTH_CURR:
-        return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
-      case STATE_FIFTH_CURR:
-        return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
-      case STATE_OVERFLOW_CURR:
-        return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
-      default:
-        throw new AssertionError();
+
+    /**
+     * Returns whether the affix pattern string has any more tokens to be retrieved from a call to
+     * {@link #nextToken}.
+     *
+     * @param tag
+     *            The bitmask tag of the previous token, as returned by {@link #nextToken}.
+     * @param string
+     *            The affix pattern.
+     * @return true if there are more tokens to consume; false otherwise.
+     */
+    private static boolean hasNext(long tag, CharSequence string) {
+        assert tag >= 0;
+        int state = getState(tag);
+        int offset = getOffset(tag);
+        // Special case: the last character in string is an end quote.
+        if (state == STATE_INSIDE_QUOTE
+                && offset == string.length() - 1
+                && string.charAt(offset) == '\'') {
+            return false;
+        } else if (state != STATE_BASE) {
+            return true;
+        } else {
+            return offset < string.length();
+        }
     }
-  }
 
-  /**
-   * Returns whether the affix pattern string has any more tokens to be retrieved from a call to
-   * {@link #nextToken}.
-   *
-   * @param tag The bitmask tag of the previous token, as returned by {@link #nextToken}.
-   * @param string The affix pattern.
-   * @return true if there are more tokens to consume; false otherwise.
-   */
-  public static boolean hasNext(long tag, CharSequence string) {
-    assert tag >= 0;
-    int state = getState(tag);
-    int offset = getOffset(tag);
-    // Special case: the last character in string is an end quote.
-    if (state == STATE_INSIDE_QUOTE
-        && offset == string.length() - 1
-        && string.charAt(offset) == '\'') {
-      return false;
-    } else if (state != STATE_BASE) {
-      return true;
-    } else {
-      return offset < string.length();
+    /**
+     * This function helps determine the identity of the token consumed by {@link #nextToken}. Converts
+     * from a bitmask tag, based on a call to {@link #nextToken}, to its corresponding symbol type or
+     * code point.
+     *
+     * @param tag
+     *            The bitmask tag of the current token, as returned by {@link #nextToken}.
+     * @return If less than zero, a symbol type corresponding to one of the <code>TYPE_</code> constants,
+     *         such as {@link #TYPE_MINUS_SIGN}. If greater than or equal to zero, a literal code point.
+     */
+    private static int getTypeOrCp(long tag) {
+        assert tag >= 0;
+        int type = getType(tag);
+        return (type == TYPE_CODEPOINT) ? getCodePoint(tag) : -type;
     }
-  }
 
-  /**
-   * This function helps determine the identity of the token consumed by {@link #nextToken}.
-   * Converts from a bitmask tag, based on a call to {@link #nextToken}, to its corresponding symbol
-   * type or code point.
-   *
-   * @param tag The bitmask tag of the current token, as returned by {@link #nextToken}.
-   * @return If less than zero, a symbol type corresponding to one of the <code>TYPE_</code>
-   *     constants, such as {@link #TYPE_MINUS_SIGN}. If greater than or equal to zero, a literal
-   *     code point.
-   */
-  public static int getTypeOrCp(long tag) {
-    assert tag >= 0;
-    int type = getType(tag);
-    return (type == TYPE_CODEPOINT) ? getCodePoint(tag) : -type;
-  }
+    /**
+     * Encodes the given values into a 64-bit tag.
+     *
+     * <ul>
+     * <li>Bits 0-31 => offset (int32)
+     * <li>Bits 32-35 => type (uint4)
+     * <li>Bits 36-39 => state (uint4)
+     * <li>Bits 40-60 => code point (uint21)
+     * <li>Bits 61-63 => unused
+     * </ul>
+     */
+    private static long makeTag(int offset, int type, int state, int cp) {
+        long tag = 0L;
+        tag |= offset;
+        tag |= (-(long) type) << 32;
+        tag |= ((long) state) << 36;
+        tag |= ((long) cp) << 40;
+        assert tag >= 0;
+        return tag;
+    }
 
-  /**
-   * Encodes the given values into a 64-bit tag.
-   *
-   * <ul>
-   *   <li>Bits 0-31 => offset (int32)
-   *   <li>Bits 32-35 => type (uint4)
-   *   <li>Bits 36-39 => state (uint4)
-   *   <li>Bits 40-60 => code point (uint21)
-   *   <li>Bits 61-63 => unused
-   * </ul>
-   */
-  private static long makeTag(int offset, int type, int state, int cp) {
-    long tag = 0L;
-    tag |= offset;
-    tag |= (-(long) type) << 32;
-    tag |= ((long) state) << 36;
-    tag |= ((long) cp) << 40;
-    assert tag >= 0;
-    return tag;
-  }
+    private static int getOffset(long tag) {
+        return (int) (tag & 0xffffffff);
+    }
 
-  static int getOffset(long tag) {
-    return (int) (tag & 0xffffffff);
-  }
+    private static int getType(long tag) {
+        return (int) ((tag >>> 32) & 0xf);
+    }
 
-  static int getType(long tag) {
-    return (int) ((tag >>> 32) & 0xf);
-  }
+    private static int getState(long tag) {
+        return (int) ((tag >>> 36) & 0xf);
+    }
 
-  static int getState(long tag) {
-    return (int) ((tag >>> 36) & 0xf);
-  }
-
-  static int getCodePoint(long tag) {
-    return (int) (tag >>> 40);
-  }
+    private static int getCodePoint(long tag) {
+        return (int) (tag >>> 40);
+    }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/CompactData.java b/android_icu4j/src/main/java/android/icu/impl/number/CompactData.java
index 730cb68..5aac7d2 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/CompactData.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/CompactData.java
@@ -43,10 +43,15 @@
         isEmpty = true;
     }
 
-    public void populate(ULocale locale, String nsName, CompactStyle compactStyle, CompactType compactType) {
+    public void populate(
+            ULocale locale,
+            String nsName,
+            CompactStyle compactStyle,
+            CompactType compactType) {
         assert isEmpty;
         CompactDataSink sink = new CompactDataSink(this);
-        ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle.getBundleInstance(ICUData.ICU_BASE_NAME, locale);
+        ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle
+                .getBundleInstance(ICUData.ICU_BASE_NAME, locale);
 
         boolean nsIsLatn = nsName.equals("latn");
         boolean compactIsShort = compactStyle == CompactStyle.SHORT;
@@ -75,7 +80,11 @@
     }
 
     /** Produces a string like "NumberElements/latn/patternsShort/decimalFormat". */
-    private static void getResourceBundleKey(String nsName, CompactStyle compactStyle, CompactType compactType, StringBuilder sb) {
+    private static void getResourceBundleKey(
+            String nsName,
+            CompactStyle compactStyle,
+            CompactType compactType,
+            StringBuilder sb) {
         sb.setLength(0);
         sb.append("NumberElements/");
         sb.append(nsName);
@@ -86,7 +95,8 @@
     /** Java-only method used by CLDR tooling. */
     public void populate(Map<String, Map<String, String>> powersToPluralsToPatterns) {
         assert isEmpty;
-        for (Map.Entry<String, Map<String, String>> magnitudeEntry : powersToPluralsToPatterns.entrySet()) {
+        for (Map.Entry<String, Map<String, String>> magnitudeEntry : powersToPluralsToPatterns
+                .entrySet()) {
             byte magnitude = (byte) (magnitudeEntry.getKey().length() - 1);
             for (Map.Entry<String, String> pluralEntry : magnitudeEntry.getValue().entrySet()) {
                 StandardPlural plural = StandardPlural.fromString(pluralEntry.getKey().toString());
@@ -159,7 +169,7 @@
             for (int i3 = 0; powersOfTenTable.getKeyAndValue(i3, key, value); ++i3) {
 
                 // Assumes that the keys are always of the form "10000" where the magnitude is the
-                // length of the key minus one.  We expect magnitudes to be less than MAX_DIGITS.
+                // length of the key minus one. We expect magnitudes to be less than MAX_DIGITS.
                 byte magnitude = (byte) (key.length() - 1);
                 byte multiplier = data.multipliers[magnitude];
                 assert magnitude < COMPACT_MAX_DIGITS;
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/ConstantAffixModifier.java b/android_icu4j/src/main/java/android/icu/impl/number/ConstantAffixModifier.java
index 4e2867f..b7a66ec 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/ConstantAffixModifier.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/ConstantAffixModifier.java
@@ -23,7 +23,8 @@
      * Constructs an instance with the given strings.
      *
      * <p>
-     * The arguments need to be Strings, not CharSequences, because Strings are immutable but CharSequences are not.
+     * The arguments need to be Strings, not CharSequences, because Strings are immutable but
+     * CharSequences are not.
      *
      * @param prefix
      *            The prefix string.
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/ConstantMultiFieldModifier.java b/android_icu4j/src/main/java/android/icu/impl/number/ConstantMultiFieldModifier.java
index f0bf8c4..f985748 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/ConstantMultiFieldModifier.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/ConstantMultiFieldModifier.java
@@ -6,8 +6,9 @@
 import android.icu.text.NumberFormat.Field;
 
 /**
- * An implementation of {@link Modifier} that allows for multiple types of fields in the same modifier. Constructed
- * based on the contents of two {@link NumberStringBuilder} instances (one for the prefix, one for the suffix).
+ * An implementation of {@link Modifier} that allows for multiple types of fields in the same modifier.
+ * Constructed based on the contents of two {@link NumberStringBuilder} instances (one for the prefix,
+ * one for the suffix).
  * @hide Only a subset of ICU is exposed in Android
  */
 public class ConstantMultiFieldModifier implements Modifier {
@@ -18,21 +19,29 @@
     protected final char[] suffixChars;
     protected final Field[] prefixFields;
     protected final Field[] suffixFields;
+    private final boolean overwrite;
     private final boolean strong;
 
-    public ConstantMultiFieldModifier(NumberStringBuilder prefix, NumberStringBuilder suffix, boolean strong) {
+    public ConstantMultiFieldModifier(
+            NumberStringBuilder prefix,
+            NumberStringBuilder suffix,
+            boolean overwrite,
+            boolean strong) {
         prefixChars = prefix.toCharArray();
         suffixChars = suffix.toCharArray();
         prefixFields = prefix.toFieldArray();
         suffixFields = suffix.toFieldArray();
+        this.overwrite = overwrite;
         this.strong = strong;
     }
 
     @Override
     public int apply(NumberStringBuilder output, int leftIndex, int rightIndex) {
-        // Insert the suffix first since inserting the prefix will change the rightIndex
-        int length = output.insert(rightIndex, suffixChars, suffixFields);
-        length += output.insert(leftIndex, prefixChars, prefixFields);
+        int length = output.insert(leftIndex, prefixChars, prefixFields);
+        if (overwrite) {
+            length += output.splice(leftIndex + length, rightIndex + length, "", 0, 0, null);
+        }
+        length += output.insert(rightIndex + length, suffixChars, suffixFields);
         return length;
     }
 
@@ -57,7 +66,8 @@
         NumberStringBuilder temp = new NumberStringBuilder();
         apply(temp, 0, 0);
         int prefixLength = getPrefixLength();
-        return String.format("<ConstantMultiFieldModifier prefix:'%s' suffix:'%s'>", temp.subSequence(0, prefixLength),
+        return String.format("<ConstantMultiFieldModifier prefix:'%s' suffix:'%s'>",
+                temp.subSequence(0, prefixLength),
                 temp.subSequence(prefixLength, temp.length()));
     }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/CurrencyPluralInfoAffixProvider.java b/android_icu4j/src/main/java/android/icu/impl/number/CurrencyPluralInfoAffixProvider.java
new file mode 100644
index 0000000..e5e84c7
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/CurrencyPluralInfoAffixProvider.java
@@ -0,0 +1,71 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number;
+
+import android.icu.impl.StandardPlural;
+import android.icu.impl.number.PatternStringParser.ParsedPatternInfo;
+import android.icu.text.CurrencyPluralInfo;
+
+/**
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class CurrencyPluralInfoAffixProvider implements AffixPatternProvider {
+    private final AffixPatternProvider[] affixesByPlural;
+
+    public CurrencyPluralInfoAffixProvider(CurrencyPluralInfo cpi) {
+        affixesByPlural = new ParsedPatternInfo[StandardPlural.COUNT];
+        for (StandardPlural plural : StandardPlural.VALUES) {
+            affixesByPlural[plural.ordinal()] = PatternStringParser
+                    .parseToPatternInfo(cpi.getCurrencyPluralPattern(plural.getKeyword()));
+        }
+    }
+
+    @Override
+    public char charAt(int flags, int i) {
+        int pluralOrdinal = (flags & Flags.PLURAL_MASK);
+        return affixesByPlural[pluralOrdinal].charAt(flags, i);
+    }
+
+    @Override
+    public int length(int flags) {
+        int pluralOrdinal = (flags & Flags.PLURAL_MASK);
+        return affixesByPlural[pluralOrdinal].length(flags);
+    }
+
+    @Override
+    public String getString(int flags) {
+        int pluralOrdinal = (flags & Flags.PLURAL_MASK);
+        return affixesByPlural[pluralOrdinal].getString(flags);
+    }
+
+    @Override
+    public boolean positiveHasPlusSign() {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].positiveHasPlusSign();
+    }
+
+    @Override
+    public boolean hasNegativeSubpattern() {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].hasNegativeSubpattern();
+    }
+
+    @Override
+    public boolean negativeHasMinusSign() {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].negativeHasMinusSign();
+    }
+
+    @Override
+    public boolean hasCurrencySign() {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].hasCurrencySign();
+    }
+
+    @Override
+    public boolean containsSymbolType(int type) {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].containsSymbolType(type);
+    }
+
+    @Override
+    public boolean hasBody() {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].hasBody();
+    }
+}
\ No newline at end of file
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/CurrencySpacingEnabledModifier.java b/android_icu4j/src/main/java/android/icu/impl/number/CurrencySpacingEnabledModifier.java
index eacc0ee..876f7dc 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/CurrencySpacingEnabledModifier.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/CurrencySpacingEnabledModifier.java
@@ -29,9 +29,13 @@
     private final String beforeSuffixInsert;
 
     /** Safe code path */
-    public CurrencySpacingEnabledModifier(NumberStringBuilder prefix, NumberStringBuilder suffix, boolean strong,
+    public CurrencySpacingEnabledModifier(
+            NumberStringBuilder prefix,
+            NumberStringBuilder suffix,
+            boolean overwrite,
+            boolean strong,
             DecimalFormatSymbols symbols) {
-        super(prefix, suffix, strong);
+        super(prefix, suffix, overwrite, strong);
 
         // Check for currency spacing. Do not build the UnicodeSets unless there is
         // a currency code point at a boundary.
@@ -72,12 +76,14 @@
     public int apply(NumberStringBuilder output, int leftIndex, int rightIndex) {
         // Currency spacing logic
         int length = 0;
-        if (rightIndex - leftIndex > 0 && afterPrefixUnicodeSet != null
+        if (rightIndex - leftIndex > 0
+                && afterPrefixUnicodeSet != null
                 && afterPrefixUnicodeSet.contains(output.codePointAt(leftIndex))) {
             // TODO: Should we use the CURRENCY field here?
             length += output.insert(leftIndex, afterPrefixInsert, null);
         }
-        if (rightIndex - leftIndex > 0 && beforeSuffixUnicodeSet != null
+        if (rightIndex - leftIndex > 0
+                && beforeSuffixUnicodeSet != null
                 && beforeSuffixUnicodeSet.contains(output.codePointBefore(rightIndex))) {
             // TODO: Should we use the CURRENCY field here?
             length += output.insert(rightIndex + length, beforeSuffixInsert, null);
@@ -89,8 +95,13 @@
     }
 
     /** Unsafe code path */
-    public static int applyCurrencySpacing(NumberStringBuilder output, int prefixStart, int prefixLen, int suffixStart,
-            int suffixLen, DecimalFormatSymbols symbols) {
+    public static int applyCurrencySpacing(
+            NumberStringBuilder output,
+            int prefixStart,
+            int prefixLen,
+            int suffixStart,
+            int suffixLen,
+            DecimalFormatSymbols symbols) {
         int length = 0;
         boolean hasPrefix = (prefixLen > 0);
         boolean hasSuffix = (suffixLen > 0);
@@ -105,12 +116,16 @@
     }
 
     /** Unsafe code path */
-    private static int applyCurrencySpacingAffix(NumberStringBuilder output, int index, byte affix,
+    private static int applyCurrencySpacingAffix(
+            NumberStringBuilder output,
+            int index,
+            byte affix,
             DecimalFormatSymbols symbols) {
         // NOTE: For prefix, output.fieldAt(index-1) gets the last field type in the prefix.
         // This works even if the last code point in the prefix is 2 code units because the
         // field value gets populated to both indices in the field array.
-        NumberFormat.Field affixField = (affix == PREFIX) ? output.fieldAt(index - 1) : output.fieldAt(index);
+        NumberFormat.Field affixField = (affix == PREFIX) ? output.fieldAt(index - 1)
+                : output.fieldAt(index);
         if (affixField != NumberFormat.Field.CURRENCY) {
             return 0;
         }
@@ -137,8 +152,10 @@
 
     private static UnicodeSet getUnicodeSet(DecimalFormatSymbols symbols, short position, byte affix) {
         String pattern = symbols
-                .getPatternForCurrencySpacing(position == IN_CURRENCY ? DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH
-                        : DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH, affix == SUFFIX);
+                .getPatternForCurrencySpacing(
+                        position == IN_CURRENCY ? DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH
+                                : DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH,
+                        affix == SUFFIX);
         if (pattern.equals("[:digit:]")) {
             return UNISET_DIGIT;
         } else if (pattern.equals("[:^S:]")) {
@@ -149,6 +166,7 @@
     }
 
     private static String getInsertString(DecimalFormatSymbols symbols, byte affix) {
-        return symbols.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_INSERT, affix == SUFFIX);
+        return symbols.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_INSERT,
+                affix == SUFFIX);
     }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/CustomSymbolCurrency.java b/android_icu4j/src/main/java/android/icu/impl/number/CustomSymbolCurrency.java
index c0dea4c..c6fe475 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/CustomSymbolCurrency.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/CustomSymbolCurrency.java
@@ -11,70 +11,69 @@
  * @hide Only a subset of ICU is exposed in Android
  */
 public class CustomSymbolCurrency extends Currency {
-  private static final long serialVersionUID = 2497493016770137670L;
-  // TODO: Serialization methods?
+    private static final long serialVersionUID = 2497493016770137670L;
+    // TODO: Serialization methods?
 
-  private String symbol1;
-  private String symbol2;
+    private String symbol1;
+    private String symbol2;
 
-  public static Currency resolve(Currency currency, ULocale locale, DecimalFormatSymbols symbols) {
-    if (currency == null) {
-      currency = symbols.getCurrency();
+    public static Currency resolve(Currency currency, ULocale locale, DecimalFormatSymbols symbols) {
+        if (currency == null) {
+            currency = symbols.getCurrency();
+        }
+        String currency1Sym = symbols.getCurrencySymbol();
+        String currency2Sym = symbols.getInternationalCurrencySymbol();
+        if (currency == null) {
+            return new CustomSymbolCurrency("XXX", currency1Sym, currency2Sym);
+        }
+        if (!currency.equals(symbols.getCurrency())) {
+            return currency;
+        }
+        String currency1 = currency.getName(symbols.getULocale(), Currency.SYMBOL_NAME, null);
+        String currency2 = currency.getCurrencyCode();
+        if (!currency1.equals(currency1Sym) || !currency2.equals(currency2Sym)) {
+            return new CustomSymbolCurrency(currency2, currency1Sym, currency2Sym);
+        }
+        return currency;
     }
-    String currency1Sym = symbols.getCurrencySymbol();
-    String currency2Sym = symbols.getInternationalCurrencySymbol();
-    if (currency == null) {
-      return new CustomSymbolCurrency("XXX", currency1Sym, currency2Sym);
+
+    public CustomSymbolCurrency(String isoCode, String currency1Sym, String currency2Sym) {
+        super(isoCode);
+        this.symbol1 = currency1Sym;
+        this.symbol2 = currency2Sym;
     }
-    if (!currency.equals(symbols.getCurrency())) {
-      return currency;
+
+    @Override
+    public String getName(ULocale locale, int nameStyle, boolean[] isChoiceFormat) {
+        if (nameStyle == SYMBOL_NAME) {
+            return symbol1;
+        }
+        return super.getName(locale, nameStyle, isChoiceFormat);
     }
-    String currency1 = currency.getName(symbols.getULocale(), Currency.SYMBOL_NAME, null);
-    String currency2 = currency.getCurrencyCode();
-    if (!currency1.equals(currency1Sym) || !currency2.equals(currency2Sym)) {
-      return new CustomSymbolCurrency(currency2, currency1Sym, currency2Sym);
+
+    @Override
+    public String getName(ULocale locale, int nameStyle, String pluralCount, boolean[] isChoiceFormat) {
+        if (nameStyle == PLURAL_LONG_NAME && subType.equals("XXX")) {
+            // Plural in absence of a currency should return the symbol
+            return symbol1;
+        }
+        return super.getName(locale, nameStyle, pluralCount, isChoiceFormat);
     }
-    return currency;
-  }
 
-  public CustomSymbolCurrency(String isoCode, String currency1Sym, String currency2Sym) {
-    super(isoCode);
-    this.symbol1 = currency1Sym;
-    this.symbol2 = currency2Sym;
-  }
-
-  @Override
-  public String getName(ULocale locale, int nameStyle, boolean[] isChoiceFormat) {
-    if (nameStyle == SYMBOL_NAME) {
-      return symbol1;
+    @Override
+    public String getCurrencyCode() {
+        return symbol2;
     }
-    return super.getName(locale, nameStyle, isChoiceFormat);
-  }
 
-  @Override
-  public String getName(
-      ULocale locale, int nameStyle, String pluralCount, boolean[] isChoiceFormat) {
-    if (nameStyle == PLURAL_LONG_NAME && subType.equals("XXX")) {
-      // Plural in absence of a currency should return the symbol
-      return symbol1;
+    @Override
+    public int hashCode() {
+        return super.hashCode() ^ symbol1.hashCode() ^ symbol2.hashCode();
     }
-    return super.getName(locale, nameStyle, pluralCount, isChoiceFormat);
-  }
 
-  @Override
-  public String getCurrencyCode() {
-    return symbol2;
-  }
-
-  @Override
-  public int hashCode() {
-    return super.hashCode() ^ symbol1.hashCode() ^ symbol2.hashCode();
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    return super.equals(other)
-            && ((CustomSymbolCurrency)other).symbol1.equals(symbol1)
-            && ((CustomSymbolCurrency)other).symbol2.equals(symbol2);
-  }
+    @Override
+    public boolean equals(Object other) {
+        return super.equals(other)
+                && ((CustomSymbolCurrency) other).symbol1.equals(symbol1)
+                && ((CustomSymbolCurrency) other).symbol2.equals(symbol2);
+    }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/DecimalFormatProperties.java b/android_icu4j/src/main/java/android/icu/impl/number/DecimalFormatProperties.java
index fc9894f..f34e784 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/DecimalFormatProperties.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/DecimalFormatProperties.java
@@ -17,8 +17,7 @@
 import java.util.Map;
 
 import android.icu.impl.number.Padder.PadPosition;
-import android.icu.impl.number.Parse.GroupingMode;
-import android.icu.impl.number.Parse.ParseMode;
+import android.icu.impl.number.parse.NumberParserImpl.ParseMode;
 import android.icu.text.CompactDecimalFormat.CompactStyle;
 import android.icu.text.CurrencyPluralInfo;
 import android.icu.text.PluralRules;
@@ -77,7 +76,6 @@
     private transient PadPosition padPosition;
     private transient String padString;
     private transient boolean parseCaseSensitive;
-    private transient GroupingMode parseGroupingMode;
     private transient boolean parseIntegerOnly;
     private transient ParseMode parseMode;
     private transient boolean parseNoExponent;
@@ -109,8 +107,8 @@
      * Sets all properties to their defaults (unset).
      *
      * <p>
-     * All integers default to -1 EXCEPT FOR MAGNITUDE MULTIPLIER which has a default of 0 (since negative numbers are
-     * important).
+     * All integers default to -1 EXCEPT FOR MAGNITUDE MULTIPLIER which has a default of 0 (since
+     * negative numbers are important).
      *
      * <p>
      * All booleans default to false.
@@ -149,7 +147,6 @@
         padPosition = null;
         padString = null;
         parseCaseSensitive = false;
-        parseGroupingMode = null;
         parseIntegerOnly = false;
         parseMode = null;
         parseNoExponent = false;
@@ -195,7 +192,6 @@
         padPosition = other.padPosition;
         padString = other.padString;
         parseCaseSensitive = other.parseCaseSensitive;
-        parseGroupingMode = other.parseGroupingMode;
         parseIntegerOnly = other.parseIntegerOnly;
         parseMode = other.parseMode;
         parseNoExponent = other.parseNoExponent;
@@ -242,7 +238,6 @@
         eq = eq && _equalsHelper(padPosition, other.padPosition);
         eq = eq && _equalsHelper(padString, other.padString);
         eq = eq && _equalsHelper(parseCaseSensitive, other.parseCaseSensitive);
-        eq = eq && _equalsHelper(parseGroupingMode, other.parseGroupingMode);
         eq = eq && _equalsHelper(parseIntegerOnly, other.parseIntegerOnly);
         eq = eq && _equalsHelper(parseMode, other.parseMode);
         eq = eq && _equalsHelper(parseNoExponent, other.parseNoExponent);
@@ -305,7 +300,6 @@
         hashCode ^= _hashCodeHelper(padPosition);
         hashCode ^= _hashCodeHelper(padString);
         hashCode ^= _hashCodeHelper(parseCaseSensitive);
-        hashCode ^= _hashCodeHelper(parseGroupingMode);
         hashCode ^= _hashCodeHelper(parseIntegerOnly);
         hashCode ^= _hashCodeHelper(parseMode);
         hashCode ^= _hashCodeHelper(parseNoExponent);
@@ -488,10 +482,6 @@
         return parseCaseSensitive;
     }
 
-    public GroupingMode getParseGroupingMode() {
-        return parseGroupingMode;
-    }
-
     public boolean getParseIntegerOnly() {
         return parseIntegerOnly;
     }
@@ -554,7 +544,8 @@
         readObjectImpl(ois);
     }
 
-    /* package-private */ void readObjectImpl(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+    /* package-private */ void readObjectImpl(ObjectInputStream ois)
+            throws IOException, ClassNotFoundException {
         ois.defaultReadObject();
 
         // Initialize to empty
@@ -600,8 +591,8 @@
     }
 
     /**
-     * Specifies custom data to be used instead of CLDR data when constructing a CompactDecimalFormat. The argument
-     * should be a map with the following structure:
+     * Specifies custom data to be used instead of CLDR data when constructing a CompactDecimalFormat.
+     * The argument should be a map with the following structure:
      *
      * <pre>
      * {
@@ -623,15 +614,17 @@
      *            A map with the above structure.
      * @return The property bag, for chaining.
      */
-    public DecimalFormatProperties setCompactCustomData(Map<String, Map<String, String>> compactCustomData) {
+    public DecimalFormatProperties setCompactCustomData(
+            Map<String, Map<String, String>> compactCustomData) {
         // TODO: compactCustomData is not immutable.
         this.compactCustomData = compactCustomData;
         return this;
     }
 
     /**
-     * Use compact decimal formatting with the specified {@link CompactStyle}. CompactStyle.SHORT produces output like
-     * "10K" in locale <em>en-US</em>, whereas CompactStyle.LONG produces output like "10 thousand" in that locale.
+     * Use compact decimal formatting with the specified {@link CompactStyle}. CompactStyle.SHORT
+     * produces output like "10K" in locale <em>en-US</em>, whereas CompactStyle.LONG produces output
+     * like "10 thousand" in that locale.
      *
      * @param compactStyle
      *            The style of prefixes/suffixes to append.
@@ -672,11 +665,12 @@
     }
 
     /**
-     * Use the specified {@link CurrencyUsage} instance, which provides default rounding rules for the currency in two
-     * styles, CurrencyUsage.CASH and CurrencyUsage.STANDARD.
+     * Use the specified {@link CurrencyUsage} instance, which provides default rounding rules for the
+     * currency in two styles, CurrencyUsage.CASH and CurrencyUsage.STANDARD.
      *
      * <p>
-     * The CurrencyUsage specified here will not be used unless there is a currency placeholder in the pattern.
+     * The CurrencyUsage specified here will not be used unless there is a currency placeholder in the
+     * pattern.
      *
      * @param currencyUsage
      *            The currency usage. Defaults to CurrencyUsage.STANDARD.
@@ -688,9 +682,10 @@
     }
 
     /**
-     * PARSING: Whether to require that the presence of decimal point matches the pattern. If a decimal point is not
-     * present, but the pattern contained a decimal point, parse will not succeed: null will be returned from
-     * <code>parse()</code>, and an error index will be set in the {@link ParsePosition}.
+     * PARSING: Whether to require that the presence of decimal point matches the pattern. If a decimal
+     * point is not present, but the pattern contained a decimal point, parse will not succeed: null will
+     * be returned from <code>parse()</code>, and an error index will be set in the
+     * {@link ParsePosition}.
      *
      * @param decimalPatternMatchRequired
      *            true to set an error if decimal is not present
@@ -702,8 +697,9 @@
     }
 
     /**
-     * Sets whether to always show the decimal point, even if the number doesn't require one. For example, if always
-     * show decimal is true, the number 123 would be formatted as "123." in locale <em>en-US</em>.
+     * Sets whether to always show the decimal point, even if the number doesn't require one. For
+     * example, if always show decimal is true, the number 123 would be formatted as "123." in locale
+     * <em>en-US</em>.
      *
      * @param alwaysShowDecimal
      *            Whether to show the decimal point when it is optional.
@@ -715,8 +711,9 @@
     }
 
     /**
-     * Sets whether to show the plus sign in the exponent part of numbers with a zero or positive exponent. For example,
-     * the number "1200" with the pattern "0.0E0" would be formatted as "1.2E+3" instead of "1.2E3" in <em>en-US</em>.
+     * Sets whether to show the plus sign in the exponent part of numbers with a zero or positive
+     * exponent. For example, the number "1200" with the pattern "0.0E0" would be formatted as "1.2E+3"
+     * instead of "1.2E3" in <em>en-US</em>.
      *
      * @param exponentSignAlwaysShown
      *            Whether to show the plus sign in positive exponents.
@@ -728,13 +725,13 @@
     }
 
     /**
-     * Sets the minimum width of the string output by the formatting pipeline. For example, if padding is enabled and
-     * paddingWidth is set to 6, formatting the number "3.14159" with the pattern "0.00" will result in "··3.14" if '·'
-     * is your padding string.
+     * Sets the minimum width of the string output by the formatting pipeline. For example, if padding is
+     * enabled and paddingWidth is set to 6, formatting the number "3.14159" with the pattern "0.00" will
+     * result in "··3.14" if '·' is your padding string.
      *
      * <p>
-     * If the number is longer than your padding width, the number will display as if no padding width had been
-     * specified, which may result in strings longer than the padding width.
+     * If the number is longer than your padding width, the number will display as if no padding width
+     * had been specified, which may result in strings longer than the padding width.
      *
      * <p>
      * Width is counted in UTF-16 code units.
@@ -751,9 +748,9 @@
     }
 
     /**
-     * Sets the number of digits between grouping separators. For example, the <em>en-US</em> locale uses a grouping
-     * size of 3, so the number 1234567 would be formatted as "1,234,567". For locales whose grouping sizes vary with
-     * magnitude, see {@link #setSecondaryGroupingSize(int)}.
+     * Sets the number of digits between grouping separators. For example, the <em>en-US</em> locale uses
+     * a grouping size of 3, so the number 1234567 would be formatted as "1,234,567". For locales whose
+     * grouping sizes vary with magnitude, see {@link #setSecondaryGroupingSize(int)}.
      *
      * @param groupingSize
      *            The primary grouping size.
@@ -765,8 +762,8 @@
     }
 
     /**
-     * Multiply all numbers by this power of ten before formatting. Negative multipliers reduce the magnitude and make
-     * numbers smaller (closer to zero).
+     * Multiply all numbers by this power of ten before formatting. Negative multipliers reduce the
+     * magnitude and make numbers smaller (closer to zero).
      *
      * @param magnitudeMultiplier
      *            The number of powers of ten to scale.
@@ -779,8 +776,8 @@
     }
 
     /**
-     * Sets the {@link MathContext} to be used during math and rounding operations. A MathContext encapsulates a
-     * RoundingMode and the number of significant digits in the output.
+     * Sets the {@link MathContext} to be used during math and rounding operations. A MathContext
+     * encapsulates a RoundingMode and the number of significant digits in the output.
      *
      * @param mathContext
      *            The math context to use when rounding is required.
@@ -794,11 +791,12 @@
     }
 
     /**
-     * Sets the maximum number of digits to display after the decimal point. If the number has fewer than this number of
-     * digits, the number will be rounded off using the rounding mode specified by
-     * {@link #setRoundingMode(RoundingMode)}. The pattern "#00.0#", for example, corresponds to 2 maximum fraction
-     * digits, and the number 456.789 would be formatted as "456.79" in locale <em>en-US</em> with the default rounding
-     * mode. Note that the number 456.999 would be formatted as "457.0" given the same configurations.
+     * Sets the maximum number of digits to display after the decimal point. If the number has fewer than
+     * this number of digits, the number will be rounded off using the rounding mode specified by
+     * {@link #setRoundingMode(RoundingMode)}. The pattern "#00.0#", for example, corresponds to 2
+     * maximum fraction digits, and the number 456.789 would be formatted as "456.79" in locale
+     * <em>en-US</em> with the default rounding mode. Note that the number 456.999 would be formatted as
+     * "457.0" given the same configurations.
      *
      * @param maximumFractionDigits
      *            The maximum number of fraction digits to output.
@@ -810,10 +808,11 @@
     }
 
     /**
-     * Sets the maximum number of digits to display before the decimal point. If the number has more than this number of
-     * digits, the extra digits will be truncated. For example, if maximum integer digits is 2, and you attempt to
-     * format the number 1970, you will get "70" in locale <em>en-US</em>. It is not possible to specify the maximum
-     * integer digits using a pattern string, except in the special case of a scientific format pattern.
+     * Sets the maximum number of digits to display before the decimal point. If the number has more than
+     * this number of digits, the extra digits will be truncated. For example, if maximum integer digits
+     * is 2, and you attempt to format the number 1970, you will get "70" in locale <em>en-US</em>. It is
+     * not possible to specify the maximum integer digits using a pattern string, except in the special
+     * case of a scientific format pattern.
      *
      * @param maximumIntegerDigits
      *            The maximum number of integer digits to output.
@@ -825,20 +824,21 @@
     }
 
     /**
-     * Sets the maximum number of significant digits to display. The number of significant digits is equal to the number
-     * of digits counted from the leftmost nonzero digit through the rightmost nonzero digit; for example, the number
-     * "2010" has 3 significant digits. If the number has more significant digits than specified here, the extra
-     * significant digits will be rounded off using the rounding mode specified by
-     * {@link #setRoundingMode(RoundingMode)}. For example, if maximum significant digits is 3, the number 1234.56 will
-     * be formatted as "1230" in locale <em>en-US</em> with the default rounding mode.
+     * Sets the maximum number of significant digits to display. The number of significant digits is
+     * equal to the number of digits counted from the leftmost nonzero digit through the rightmost
+     * nonzero digit; for example, the number "2010" has 3 significant digits. If the number has more
+     * significant digits than specified here, the extra significant digits will be rounded off using the
+     * rounding mode specified by {@link #setRoundingMode(RoundingMode)}. For example, if maximum
+     * significant digits is 3, the number 1234.56 will be formatted as "1230" in locale <em>en-US</em>
+     * with the default rounding mode.
      *
      * <p>
-     * If both maximum significant digits and maximum integer/fraction digits are set at the same time, the behavior is
-     * undefined.
+     * If both maximum significant digits and maximum integer/fraction digits are set at the same time,
+     * the behavior is undefined.
      *
      * <p>
-     * The number of significant digits can be specified in a pattern string using the '@' character. For example, the
-     * pattern "@@#" corresponds to a minimum of 2 and a maximum of 3 significant digits.
+     * The number of significant digits can be specified in a pattern string using the '@' character. For
+     * example, the pattern "@@#" corresponds to a minimum of 2 and a maximum of 3 significant digits.
      *
      * @param maximumSignificantDigits
      *            The maximum number of significant digits to display.
@@ -850,8 +850,9 @@
     }
 
     /**
-     * Sets the minimum number of digits to display in the exponent. For example, the number "1200" with the pattern
-     * "0.0E00", which has 2 exponent digits, would be formatted as "1.2E03" in <em>en-US</em>.
+     * Sets the minimum number of digits to display in the exponent. For example, the number "1200" with
+     * the pattern "0.0E00", which has 2 exponent digits, would be formatted as "1.2E03" in
+     * <em>en-US</em>.
      *
      * @param minimumExponentDigits
      *            The minimum number of digits to display in the exponent field.
@@ -863,9 +864,10 @@
     }
 
     /**
-     * Sets the minimum number of digits to display after the decimal point. If the number has fewer than this number of
-     * digits, the number will be padded with zeros. The pattern "#00.0#", for example, corresponds to 1 minimum
-     * fraction digit, and the number 456 would be formatted as "456.0" in locale <em>en-US</em>.
+     * Sets the minimum number of digits to display after the decimal point. If the number has fewer than
+     * this number of digits, the number will be padded with zeros. The pattern "#00.0#", for example,
+     * corresponds to 1 minimum fraction digit, and the number 456 would be formatted as "456.0" in
+     * locale <em>en-US</em>.
      *
      * @param minimumFractionDigits
      *            The minimum number of fraction digits to output.
@@ -877,10 +879,10 @@
     }
 
     /**
-     * Sets the minimum number of digits required to be beyond the first grouping separator in order to enable grouping.
-     * For example, if the minimum grouping digits is 2, then 1234 would be formatted as "1234" but 12345 would be
-     * formatted as "12,345" in <em>en-US</em>. Note that 1234567 would still be formatted as "1,234,567", not
-     * "1234,567".
+     * Sets the minimum number of digits required to be beyond the first grouping separator in order to
+     * enable grouping. For example, if the minimum grouping digits is 2, then 1234 would be formatted as
+     * "1234" but 12345 would be formatted as "12,345" in <em>en-US</em>. Note that 1234567 would still
+     * be formatted as "1,234,567", not "1234,567".
      *
      * @param minimumGroupingDigits
      *            How many digits must appear before a grouping separator before enabling grouping.
@@ -892,9 +894,10 @@
     }
 
     /**
-     * Sets the minimum number of digits to display before the decimal point. If the number has fewer than this number
-     * of digits, the number will be padded with zeros. The pattern "#00.0#", for example, corresponds to 2 minimum
-     * integer digits, and the number 5.3 would be formatted as "05.3" in locale <em>en-US</em>.
+     * Sets the minimum number of digits to display before the decimal point. If the number has fewer
+     * than this number of digits, the number will be padded with zeros. The pattern "#00.0#", for
+     * example, corresponds to 2 minimum integer digits, and the number 5.3 would be formatted as "05.3"
+     * in locale <em>en-US</em>.
      *
      * @param minimumIntegerDigits
      *            The minimum number of integer digits to output.
@@ -906,20 +909,22 @@
     }
 
     /**
-     * Sets the minimum number of significant digits to display. If, after rounding to the number of significant digits
-     * specified by {@link #setMaximumSignificantDigits}, the number of remaining significant digits is less than the
-     * minimum, the number will be padded with zeros. For example, if minimum significant digits is 3, the number 5.8
-     * will be formatted as "5.80" in locale <em>en-US</em>. Note that minimum significant digits is relevant only when
-     * numbers have digits after the decimal point.
+     * Sets the minimum number of significant digits to display. If, after rounding to the number of
+     * significant digits specified by {@link #setMaximumSignificantDigits}, the number of remaining
+     * significant digits is less than the minimum, the number will be padded with zeros. For example, if
+     * minimum significant digits is 3, the number 5.8 will be formatted as "5.80" in locale
+     * <em>en-US</em>. Note that minimum significant digits is relevant only when numbers have digits
+     * after the decimal point.
      *
      * <p>
-     * If both minimum significant digits and minimum integer/fraction digits are set at the same time, both values will
-     * be respected, and the one that results in the greater number of padding zeros will be used. For example,
-     * formatting the number 73 with 3 minimum significant digits and 2 minimum fraction digits will produce "73.00".
+     * If both minimum significant digits and minimum integer/fraction digits are set at the same time,
+     * both values will be respected, and the one that results in the greater number of padding zeros
+     * will be used. For example, formatting the number 73 with 3 minimum significant digits and 2
+     * minimum fraction digits will produce "73.00".
      *
      * <p>
-     * The number of significant digits can be specified in a pattern string using the '@' character. For example, the
-     * pattern "@@#" corresponds to a minimum of 2 and a maximum of 3 significant digits.
+     * The number of significant digits can be specified in a pattern string using the '@' character. For
+     * example, the pattern "@@#" corresponds to a minimum of 2 and a maximum of 3 significant digits.
      *
      * @param minimumSignificantDigits
      *            The minimum number of significant digits to display.
@@ -944,9 +949,10 @@
     }
 
     /**
-     * Sets the prefix to prepend to negative numbers. The prefix will be interpreted literally. For example, if you set
-     * a negative prefix of <code>n</code>, then the number -123 will be formatted as "n123" in the locale
-     * <em>en-US</em>. Note that if the negative prefix is left unset, the locale's minus sign is used.
+     * Sets the prefix to prepend to negative numbers. The prefix will be interpreted literally. For
+     * example, if you set a negative prefix of <code>n</code>, then the number -123 will be formatted as
+     * "n123" in the locale <em>en-US</em>. Note that if the negative prefix is left unset, the locale's
+     * minus sign is used.
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
@@ -962,14 +968,15 @@
     }
 
     /**
-     * Sets the prefix to prepend to negative numbers. Locale-specific symbols will be substituted into the string
-     * according to Unicode Technical Standard #35 (LDML).
+     * Sets the prefix to prepend to negative numbers. Locale-specific symbols will be substituted into
+     * the string according to Unicode Technical Standard #35 (LDML).
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
      *
      * @param negativePrefixPattern
-     *            The CharSequence to prepend to negative numbers after locale symbol substitutions take place.
+     *            The CharSequence to prepend to negative numbers after locale symbol substitutions take
+     *            place.
      * @return The property bag, for chaining.
      * @see #setNegativePrefix
      */
@@ -979,10 +986,11 @@
     }
 
     /**
-     * Sets the suffix to append to negative numbers. The suffix will be interpreted literally. For example, if you set
-     * a suffix prefix of <code>n</code>, then the number -123 will be formatted as "-123n" in the locale
-     * <em>en-US</em>. Note that the minus sign is prepended by default unless otherwise specified in either the pattern
-     * string or in one of the {@link #setNegativePrefix} methods.
+     * Sets the suffix to append to negative numbers. The suffix will be interpreted literally. For
+     * example, if you set a suffix prefix of <code>n</code>, then the number -123 will be formatted as
+     * "-123n" in the locale <em>en-US</em>. Note that the minus sign is prepended by default unless
+     * otherwise specified in either the pattern string or in one of the {@link #setNegativePrefix}
+     * methods.
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
@@ -998,14 +1006,15 @@
     }
 
     /**
-     * Sets the suffix to append to negative numbers. Locale-specific symbols will be substituted into the string
-     * according to Unicode Technical Standard #35 (LDML).
+     * Sets the suffix to append to negative numbers. Locale-specific symbols will be substituted into
+     * the string according to Unicode Technical Standard #35 (LDML).
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
      *
      * @param negativeSuffixPattern
-     *            The CharSequence to append to negative numbers after locale symbol substitutions take place.
+     *            The CharSequence to append to negative numbers after locale symbol substitutions take
+     *            place.
      * @return The property bag, for chaining.
      * @see #setNegativeSuffix
      */
@@ -1015,8 +1024,8 @@
     }
 
     /**
-     * Sets the location where the padding string is to be inserted to maintain the padding width: one of BEFORE_PREFIX,
-     * AFTER_PREFIX, BEFORE_SUFFIX, or AFTER_SUFFIX.
+     * Sets the location where the padding string is to be inserted to maintain the padding width: one of
+     * BEFORE_PREFIX, AFTER_PREFIX, BEFORE_SUFFIX, or AFTER_SUFFIX.
      *
      * <p>
      * Must be used in conjunction with {@link #setFormatWidth}.
@@ -1032,7 +1041,8 @@
     }
 
     /**
-     * Sets the string used for padding. The string should contain a single character or grapheme cluster.
+     * Sets the string used for padding. The string should contain a single character or grapheme
+     * cluster.
      *
      * <p>
      * Must be used in conjunction with {@link #setFormatWidth}.
@@ -1048,12 +1058,14 @@
     }
 
     /**
-     * Whether to require cases to match when parsing strings; default is true. Case sensitivity applies to prefixes,
-     * suffixes, the exponent separator, the symbol "NaN", and the infinity symbol. Grouping separators, decimal
-     * separators, and padding are always case-sensitive. Currencies are always case-insensitive.
+     * Whether to require cases to match when parsing strings; default is true. Case sensitivity applies
+     * to prefixes, suffixes, the exponent separator, the symbol "NaN", and the infinity symbol. Grouping
+     * separators, decimal separators, and padding are always case-sensitive. Currencies are always
+     * case-insensitive.
      *
      * <p>
-     * This setting is ignored in fast mode. In fast mode, strings are always compared in a case-sensitive way.
+     * This setting is ignored in fast mode. In fast mode, strings are always compared in a
+     * case-sensitive way.
      *
      * @param parseCaseSensitive
      *            true to be case-sensitive when parsing; false to allow any case.
@@ -1065,35 +1077,8 @@
     }
 
     /**
-     * Sets the strategy used during parsing when a code point needs to be interpreted as either a decimal separator or
-     * a grouping separator.
-     *
-     * <p>
-     * The comma, period, space, and apostrophe have different meanings in different locales. For example, in
-     * <em>en-US</em> and most American locales, the period is used as a decimal separator, but in <em>es-PY</em> and
-     * most European locales, it is used as a grouping separator.
-     *
-     * <p>
-     * Suppose you are in <em>fr-FR</em> the parser encounters the string "1.234". In <em>fr-FR</em>, the grouping is a
-     * space and the decimal is a comma. The <em>grouping mode</em> is a mechanism to let you specify whether to accept
-     * the string as 1234 (GroupingMode.DEFAULT) or whether to reject it since the separators don't match
-     * (GroupingMode.RESTRICTED).
-     *
-     * <p>
-     * When resolving grouping separators, it is the <em>equivalence class</em> of separators that is considered. For
-     * example, a period is seen as equal to a fixed set of other period-like characters.
-     *
-     * @param parseGroupingMode
-     *            The {@link GroupingMode} to use; either DEFAULT or RESTRICTED.
-     * @return The property bag, for chaining.
-     */
-    public DecimalFormatProperties setParseGroupingMode(GroupingMode parseGroupingMode) {
-        this.parseGroupingMode = parseGroupingMode;
-        return this;
-    }
-
-    /**
-     * Whether to ignore the fractional part of numbers. For example, parses "123.4" to "123" instead of "123.4".
+     * Whether to ignore the fractional part of numbers. For example, parses "123.4" to "123" instead of
+     * "123.4".
      *
      * @param parseIntegerOnly
      *            true to parse integers only; false to parse integers with their fraction parts
@@ -1105,8 +1090,8 @@
     }
 
     /**
-     * Controls certain rules for how strict this parser is when reading strings. See {@link ParseMode#LENIENT} and
-     * {@link ParseMode#STRICT}.
+     * Controls certain rules for how strict this parser is when reading strings. See
+     * {@link ParseMode#LENIENT} and {@link ParseMode#STRICT}.
      *
      * @param parseMode
      *            Either {@link ParseMode#LENIENT} or {@link ParseMode#STRICT}.
@@ -1118,7 +1103,8 @@
     }
 
     /**
-     * Whether to ignore the exponential part of numbers. For example, parses "123E4" to "123" instead of "1230000".
+     * Whether to ignore the exponential part of numbers. For example, parses "123E4" to "123" instead of
+     * "1230000".
      *
      * @param parseNoExponent
      *            true to ignore exponents; false to parse them.
@@ -1130,11 +1116,12 @@
     }
 
     /**
-     * Whether to always return a BigDecimal from {@link Parse#parse} and all other parse methods. By default, a Long or
-     * a BigInteger are returned when possible.
+     * Whether to always return a BigDecimal from parse methods. By default, a Long or a BigInteger are
+     * returned when possible.
      *
      * @param parseToBigDecimal
-     *            true to always return a BigDecimal; false to return a Long or a BigInteger when possible.
+     *            true to always return a BigDecimal; false to return a Long or a BigInteger when
+     *            possible.
      * @return The property bag, for chaining.
      */
     public DecimalFormatProperties setParseToBigDecimal(boolean parseToBigDecimal) {
@@ -1155,9 +1142,9 @@
     }
 
     /**
-     * Sets the prefix to prepend to positive numbers. The prefix will be interpreted literally. For example, if you set
-     * a positive prefix of <code>p</code>, then the number 123 will be formatted as "p123" in the locale
-     * <em>en-US</em>.
+     * Sets the prefix to prepend to positive numbers. The prefix will be interpreted literally. For
+     * example, if you set a positive prefix of <code>p</code>, then the number 123 will be formatted as
+     * "p123" in the locale <em>en-US</em>.
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
@@ -1173,14 +1160,15 @@
     }
 
     /**
-     * Sets the prefix to prepend to positive numbers. Locale-specific symbols will be substituted into the string
-     * according to Unicode Technical Standard #35 (LDML).
+     * Sets the prefix to prepend to positive numbers. Locale-specific symbols will be substituted into
+     * the string according to Unicode Technical Standard #35 (LDML).
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
      *
      * @param positivePrefixPattern
-     *            The CharSequence to prepend to positive numbers after locale symbol substitutions take place.
+     *            The CharSequence to prepend to positive numbers after locale symbol substitutions take
+     *            place.
      * @return The property bag, for chaining.
      * @see #setPositivePrefix
      */
@@ -1190,9 +1178,9 @@
     }
 
     /**
-     * Sets the suffix to append to positive numbers. The suffix will be interpreted literally. For example, if you set
-     * a positive suffix of <code>p</code>, then the number 123 will be formatted as "123p" in the locale
-     * <em>en-US</em>.
+     * Sets the suffix to append to positive numbers. The suffix will be interpreted literally. For
+     * example, if you set a positive suffix of <code>p</code>, then the number 123 will be formatted as
+     * "123p" in the locale <em>en-US</em>.
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
@@ -1208,14 +1196,15 @@
     }
 
     /**
-     * Sets the suffix to append to positive numbers. Locale-specific symbols will be substituted into the string
-     * according to Unicode Technical Standard #35 (LDML).
+     * Sets the suffix to append to positive numbers. Locale-specific symbols will be substituted into
+     * the string according to Unicode Technical Standard #35 (LDML).
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
      *
      * @param positiveSuffixPattern
-     *            The CharSequence to append to positive numbers after locale symbol substitutions take place.
+     *            The CharSequence to append to positive numbers after locale symbol substitutions take
+     *            place.
      * @return The property bag, for chaining.
      * @see #setPositiveSuffix
      */
@@ -1225,15 +1214,16 @@
     }
 
     /**
-     * Sets the increment to which to round numbers. For example, with a rounding interval of 0.05, the number 11.17
-     * would be formatted as "11.15" in locale <em>en-US</em> with the default rounding mode.
+     * Sets the increment to which to round numbers. For example, with a rounding interval of 0.05, the
+     * number 11.17 would be formatted as "11.15" in locale <em>en-US</em> with the default rounding
+     * mode.
      *
      * <p>
      * You can use either a rounding increment or significant digits, but not both at the same time.
      *
      * <p>
-     * The rounding increment can be specified in a pattern string. For example, the pattern "#,##0.05" corresponds to a
-     * rounding interval of 0.05 with 1 minimum integer digit and a grouping size of 3.
+     * The rounding increment can be specified in a pattern string. For example, the pattern "#,##0.05"
+     * corresponds to a rounding interval of 0.05 with 1 minimum integer digit and a grouping size of 3.
      *
      * @param roundingIncrement
      *            The interval to which to round.
@@ -1245,9 +1235,9 @@
     }
 
     /**
-     * Sets the rounding mode, which determines under which conditions extra decimal places are rounded either up or
-     * down. See {@link RoundingMode} for details on the choices of rounding mode. The default if not set explicitly is
-     * {@link RoundingMode#HALF_EVEN}.
+     * Sets the rounding mode, which determines under which conditions extra decimal places are rounded
+     * either up or down. See {@link RoundingMode} for details on the choices of rounding mode. The
+     * default if not set explicitly is {@link RoundingMode#HALF_EVEN}.
      *
      * <p>
      * This setting is ignored if {@link #setMathContext} is used.
@@ -1264,13 +1254,13 @@
     }
 
     /**
-     * Sets the number of digits between grouping separators higher than the least-significant grouping separator. For
-     * example, the locale <em>hi</em> uses a primary grouping size of 3 and a secondary grouping size of 2, so the
-     * number 1234567 would be formatted as "12,34,567".
+     * Sets the number of digits between grouping separators higher than the least-significant grouping
+     * separator. For example, the locale <em>hi</em> uses a primary grouping size of 3 and a secondary
+     * grouping size of 2, so the number 1234567 would be formatted as "12,34,567".
      *
      * <p>
-     * The two levels of grouping separators can be specified in the pattern string. For example, the <em>hi</em>
-     * locale's default decimal format pattern is "#,##,##0.###".
+     * The two levels of grouping separators can be specified in the pattern string. For example, the
+     * <em>hi</em> locale's default decimal format pattern is "#,##,##0.###".
      *
      * @param secondaryGroupingSize
      *            The secondary grouping size.
@@ -1285,14 +1275,16 @@
      * Sets whether to always display of a plus sign on positive numbers.
      *
      * <p>
-     * If the location of the negative sign is specified by the decimal format pattern (or by the negative prefix/suffix
-     * pattern methods), a plus sign is substituted into that location, in accordance with Unicode Technical Standard
-     * #35 (LDML) section 3.2.1. Otherwise, the plus sign is prepended to the number. For example, if the decimal format
-     * pattern <code>#;#-</code> is used, then formatting 123 would result in "123+" in the locale <em>en-US</em>.
+     * If the location of the negative sign is specified by the decimal format pattern (or by the
+     * negative prefix/suffix pattern methods), a plus sign is substituted into that location, in
+     * accordance with Unicode Technical Standard #35 (LDML) section 3.2.1. Otherwise, the plus sign is
+     * prepended to the number. For example, if the decimal format pattern <code>#;#-</code> is used,
+     * then formatting 123 would result in "123+" in the locale <em>en-US</em>.
      *
      * <p>
-     * This method should be used <em>instead of</em> setting the positive prefix/suffix. The behavior is undefined if
-     * alwaysShowPlusSign is set but the positive prefix/suffix already contains a plus sign.
+     * This method should be used <em>instead of</em> setting the positive prefix/suffix. The behavior is
+     * undefined if alwaysShowPlusSign is set but the positive prefix/suffix already contains a plus
+     * sign.
      *
      * @param signAlwaysShown
      *            Whether positive numbers should display a plus sign.
@@ -1313,8 +1305,8 @@
     }
 
     /**
-     * Appends a string containing properties that differ from the default, but without being surrounded by
-     * &lt;Properties&gt;.
+     * Appends a string containing properties that differ from the default, but without being surrounded
+     * by &lt;Properties&gt;.
      */
     public void toStringBare(StringBuilder result) {
         Field[] fields = DecimalFormatProperties.class.getDeclaredFields();
@@ -1341,8 +1333,8 @@
     }
 
     /**
-     * Custom serialization: save fields along with their name, so that fields can be easily added in the future in any
-     * order. Only save fields that differ from their default value.
+     * Custom serialization: save fields along with their name, so that fields can be easily added in the
+     * future in any order. Only save fields that differ from their default value.
      */
     private void writeObject(ObjectOutputStream oos) throws IOException {
         writeObjectImpl(oos);
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity.java b/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity.java
index 254e6e2..4c3cc22 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity.java
@@ -15,168 +15,187 @@
  * An interface representing a number to be processed by the decimal formatting pipeline. Includes
  * methods for rounding, plural rules, and decimal digit extraction.
  *
- * <p>By design, this is NOT IMMUTABLE and NOT THREAD SAFE. It is intended to be an intermediate
- * object holding state during a pass through the decimal formatting pipeline.
+ * <p>
+ * By design, this is NOT IMMUTABLE and NOT THREAD SAFE. It is intended to be an intermediate object
+ * holding state during a pass through the decimal formatting pipeline.
  *
- * <p>Implementations of this interface are free to use any internal storage mechanism.
+ * <p>
+ * Implementations of this interface are free to use any internal storage mechanism.
  *
- * <p>TODO: Should I change this to an abstract class so that logic for min/max digits doesn't need
- * to be copied to every implementation?
+ * <p>
+ * TODO: Should I change this to an abstract class so that logic for min/max digits doesn't need to be
+ * copied to every implementation?
  * @hide Only a subset of ICU is exposed in Android
  */
 public interface DecimalQuantity extends PluralRules.IFixedDecimal {
-  /**
-   * Sets the minimum and maximum integer digits that this {@link DecimalQuantity} should generate.
-   * This method does not perform rounding.
-   *
-   * @param minInt The minimum number of integer digits.
-   * @param maxInt The maximum number of integer digits.
-   */
-  public void setIntegerLength(int minInt, int maxInt);
+    /**
+     * Sets the minimum and maximum integer digits that this {@link DecimalQuantity} should generate.
+     * This method does not perform rounding.
+     *
+     * @param minInt
+     *            The minimum number of integer digits.
+     * @param maxInt
+     *            The maximum number of integer digits.
+     */
+    public void setIntegerLength(int minInt, int maxInt);
 
-  /**
-   * Sets the minimum and maximum fraction digits that this {@link DecimalQuantity} should generate.
-   * This method does not perform rounding.
-   *
-   * @param minFrac The minimum number of fraction digits.
-   * @param maxFrac The maximum number of fraction digits.
-   */
-  public void setFractionLength(int minFrac, int maxFrac);
+    /**
+     * Sets the minimum and maximum fraction digits that this {@link DecimalQuantity} should generate.
+     * This method does not perform rounding.
+     *
+     * @param minFrac
+     *            The minimum number of fraction digits.
+     * @param maxFrac
+     *            The maximum number of fraction digits.
+     */
+    public void setFractionLength(int minFrac, int maxFrac);
 
-  /**
-   * Rounds the number to a specified interval, such as 0.05.
-   *
-   * <p>If rounding to a power of ten, use the more efficient {@link #roundToMagnitude} instead.
-   *
-   * @param roundingInterval The increment to which to round.
-   * @param mathContext The {@link MathContext} to use if rounding is necessary. Undefined behavior
-   *     if null.
-   */
-  public void roundToIncrement(BigDecimal roundingInterval, MathContext mathContext);
+    /**
+     * Rounds the number to a specified interval, such as 0.05.
+     *
+     * <p>
+     * If rounding to a power of ten, use the more efficient {@link #roundToMagnitude} instead.
+     *
+     * @param roundingInterval
+     *            The increment to which to round.
+     * @param mathContext
+     *            The {@link MathContext} to use if rounding is necessary. Undefined behavior if null.
+     */
+    public void roundToIncrement(BigDecimal roundingInterval, MathContext mathContext);
 
-  /**
-   * Rounds the number to a specified magnitude (power of ten).
-   *
-   * @param roundingMagnitude The power of ten to which to round. For example, a value of -2 will
-   *     round to 2 decimal places.
-   * @param mathContext The {@link MathContext} to use if rounding is necessary. Undefined behavior
-   *     if null.
-   */
-  public void roundToMagnitude(int roundingMagnitude, MathContext mathContext);
+    /**
+     * Rounds the number to a specified magnitude (power of ten).
+     *
+     * @param roundingMagnitude
+     *            The power of ten to which to round. For example, a value of -2 will round to 2 decimal
+     *            places.
+     * @param mathContext
+     *            The {@link MathContext} to use if rounding is necessary. Undefined behavior if null.
+     */
+    public void roundToMagnitude(int roundingMagnitude, MathContext mathContext);
 
-  /**
-   * Rounds the number to an infinite number of decimal points. This has no effect except for
-   * forcing the double in {@link DecimalQuantity_AbstractBCD} to adopt its exact representation.
-   */
-  public void roundToInfinity();
+    /**
+     * Rounds the number to an infinite number of decimal points. This has no effect except for forcing
+     * the double in {@link DecimalQuantity_AbstractBCD} to adopt its exact representation.
+     */
+    public void roundToInfinity();
 
-  /**
-   * Multiply the internal value.
-   *
-   * @param multiplicand The value by which to multiply.
-   */
-  public void multiplyBy(BigDecimal multiplicand);
+    /**
+     * Multiply the internal value.
+     *
+     * @param multiplicand
+     *            The value by which to multiply.
+     */
+    public void multiplyBy(BigDecimal multiplicand);
 
-  /**
-   * Scales the number by a power of ten. For example, if the value is currently "1234.56", calling
-   * this method with delta=-3 will change the value to "1.23456".
-   *
-   * @param delta The number of magnitudes of ten to change by.
-   */
-  public void adjustMagnitude(int delta);
+    /**
+     * Scales the number by a power of ten. For example, if the value is currently "1234.56", calling
+     * this method with delta=-3 will change the value to "1.23456".
+     *
+     * @param delta
+     *            The number of magnitudes of ten to change by.
+     */
+    public void adjustMagnitude(int delta);
 
-  /**
-   * @return The power of ten corresponding to the most significant nonzero digit.
-   * @throws ArithmeticException If the value represented is zero.
-   */
-  public int getMagnitude() throws ArithmeticException;
+    /**
+     * @return The power of ten corresponding to the most significant nonzero digit.
+     * @throws ArithmeticException
+     *             If the value represented is zero.
+     */
+    public int getMagnitude() throws ArithmeticException;
 
-  /** @return Whether the value represented by this {@link DecimalQuantity} is zero. */
-  public boolean isZero();
+    /** @return Whether the value represented by this {@link DecimalQuantity} is zero. */
+    public boolean isZero();
 
-  /** @return Whether the value represented by this {@link DecimalQuantity} is less than zero. */
-  public boolean isNegative();
+    /** @return Whether the value represented by this {@link DecimalQuantity} is less than zero. */
+    public boolean isNegative();
 
-  /** @return Whether the value represented by this {@link DecimalQuantity} is infinite. */
-  @Override
-  public boolean isInfinite();
+    /** @return -1 if the value is negative; 1 if positive; or 0 if zero. */
+    public int signum();
 
-  /** @return Whether the value represented by this {@link DecimalQuantity} is not a number. */
-  @Override
-  public boolean isNaN();
+    /** @return Whether the value represented by this {@link DecimalQuantity} is infinite. */
+    @Override
+    public boolean isInfinite();
 
-  /** @return The value contained in this {@link DecimalQuantity} approximated as a double. */
-  public double toDouble();
+    /** @return Whether the value represented by this {@link DecimalQuantity} is not a number. */
+    @Override
+    public boolean isNaN();
 
-  public BigDecimal toBigDecimal();
+    /** @return The value contained in this {@link DecimalQuantity} approximated as a double. */
+    public double toDouble();
 
-  public void setToBigDecimal(BigDecimal input);
+    public BigDecimal toBigDecimal();
 
-  public int maxRepresentableDigits();
+    public void setToBigDecimal(BigDecimal input);
 
-  // TODO: Should this method be removed, since DecimalQuantity implements IFixedDecimal now?
-  /**
-   * Computes the plural form for this number based on the specified set of rules.
-   *
-   * @param rules A {@link PluralRules} object representing the set of rules.
-   * @return The {@link StandardPlural} according to the PluralRules. If the plural form is not in
-   *     the set of standard plurals, {@link StandardPlural#OTHER} is returned instead.
-   */
-  public StandardPlural getStandardPlural(PluralRules rules);
+    public int maxRepresentableDigits();
 
-  /**
-   * Gets the digit at the specified magnitude. For example, if the represented number is 12.3,
-   * getDigit(-1) returns 3, since 3 is the digit corresponding to 10^-1.
-   *
-   * @param magnitude The magnitude of the digit.
-   * @return The digit at the specified magnitude.
-   */
-  public byte getDigit(int magnitude);
+    // TODO: Should this method be removed, since DecimalQuantity implements IFixedDecimal now?
+    /**
+     * Computes the plural form for this number based on the specified set of rules.
+     *
+     * @param rules
+     *            A {@link PluralRules} object representing the set of rules.
+     * @return The {@link StandardPlural} according to the PluralRules. If the plural form is not in the
+     *         set of standard plurals, {@link StandardPlural#OTHER} is returned instead.
+     */
+    public StandardPlural getStandardPlural(PluralRules rules);
 
-  /**
-   * Gets the largest power of ten that needs to be displayed. The value returned by this function
-   * will be bounded between minInt and maxInt.
-   *
-   * @return The highest-magnitude digit to be displayed.
-   */
-  public int getUpperDisplayMagnitude();
+    /**
+     * Gets the digit at the specified magnitude. For example, if the represented number is 12.3,
+     * getDigit(-1) returns 3, since 3 is the digit corresponding to 10^-1.
+     *
+     * @param magnitude
+     *            The magnitude of the digit.
+     * @return The digit at the specified magnitude.
+     */
+    public byte getDigit(int magnitude);
 
-  /**
-   * Gets the smallest power of ten that needs to be displayed. The value returned by this function
-   * will be bounded between -minFrac and -maxFrac.
-   *
-   * @return The lowest-magnitude digit to be displayed.
-   */
-  public int getLowerDisplayMagnitude();
+    /**
+     * Gets the largest power of ten that needs to be displayed. The value returned by this function will
+     * be bounded between minInt and maxInt.
+     *
+     * @return The highest-magnitude digit to be displayed.
+     */
+    public int getUpperDisplayMagnitude();
 
-  /**
-   * Returns the string in "plain" format (no exponential notation) using ASCII digits.
-   */
-  public String toPlainString();
+    /**
+     * Gets the smallest power of ten that needs to be displayed. The value returned by this function
+     * will be bounded between -minFrac and -maxFrac.
+     *
+     * @return The lowest-magnitude digit to be displayed.
+     */
+    public int getLowerDisplayMagnitude();
 
-  /**
-   * Like clone, but without the restrictions of the Cloneable interface clone.
-   *
-   * @return A copy of this instance which can be mutated without affecting this instance.
-   */
-  public DecimalQuantity createCopy();
+    /**
+     * Returns the string in "plain" format (no exponential notation) using ASCII digits.
+     */
+    public String toPlainString();
 
-  /**
-   * Sets this instance to be equal to another instance.
-   *
-   * @param other The instance to copy from.
-   */
-  public void copyFrom(DecimalQuantity other);
+    /**
+     * Like clone, but without the restrictions of the Cloneable interface clone.
+     *
+     * @return A copy of this instance which can be mutated without affecting this instance.
+     */
+    public DecimalQuantity createCopy();
 
-  /** This method is for internal testing only. */
-  public long getPositionFingerprint();
+    /**
+     * Sets this instance to be equal to another instance.
+     *
+     * @param other
+     *            The instance to copy from.
+     */
+    public void copyFrom(DecimalQuantity other);
 
-  /**
-   * If the given {@link FieldPosition} is a {@link UFieldPosition}, populates it with the fraction
-   * length and fraction long value. If the argument is not a {@link UFieldPosition}, nothing
-   * happens.
-   *
-   * @param fp The {@link UFieldPosition} to populate.
-   */
-  public void populateUFieldPosition(FieldPosition fp);
+    /** This method is for internal testing only. */
+    public long getPositionFingerprint();
+
+    /**
+     * If the given {@link FieldPosition} is a {@link UFieldPosition}, populates it with the fraction
+     * length and fraction long value. If the argument is not a {@link UFieldPosition}, nothing happens.
+     *
+     * @param fp
+     *            The {@link UFieldPosition} to populate.
+     */
+    public void populateUFieldPosition(FieldPosition fp);
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity_AbstractBCD.java b/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity_AbstractBCD.java
index e8ad439..e4b4cb0 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity_AbstractBCD.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity_AbstractBCD.java
@@ -9,6 +9,7 @@
 import java.text.FieldPosition;
 
 import android.icu.impl.StandardPlural;
+import android.icu.impl.Utility;
 import android.icu.text.PluralRules;
 import android.icu.text.PluralRules.Operand;
 import android.icu.text.UFieldPosition;
@@ -21,911 +22,1003 @@
  */
 public abstract class DecimalQuantity_AbstractBCD implements DecimalQuantity {
 
-  /**
-   * The power of ten corresponding to the least significant digit in the BCD. For example, if this
-   * object represents the number "3.14", the BCD will be "0x314" and the scale will be -2.
-   *
-   * <p>Note that in {@link java.math.BigDecimal}, the scale is defined differently: the number of
-   * digits after the decimal place, which is the negative of our definition of scale.
-   */
-  protected int scale;
+    /**
+     * The power of ten corresponding to the least significant digit in the BCD. For example, if this
+     * object represents the number "3.14", the BCD will be "0x314" and the scale will be -2.
+     *
+     * <p>
+     * Note that in {@link java.math.BigDecimal}, the scale is defined differently: the number of digits
+     * after the decimal place, which is the negative of our definition of scale.
+     */
+    protected int scale;
 
-  /**
-   * The number of digits in the BCD. For example, "1007" has BCD "0x1007" and precision 4. The
-   * maximum precision is 16 since a long can hold only 16 digits.
-   *
-   * <p>This value must be re-calculated whenever the value in bcd changes by using {@link
-   * #computePrecisionAndCompact()}.
-   */
-  protected int precision;
+    /**
+     * The number of digits in the BCD. For example, "1007" has BCD "0x1007" and precision 4. A long
+     * cannot represent precisions greater than 16.
+     *
+     * <p>
+     * This value must be re-calculated whenever the value in bcd changes by using
+     * {@link #computePrecisionAndCompact()}.
+     */
+    protected int precision;
 
-  /**
-   * A bitmask of properties relating to the number represented by this object.
-   *
-   * @see #NEGATIVE_FLAG
-   * @see #INFINITY_FLAG
-   * @see #NAN_FLAG
-   */
-  protected byte flags;
+    /**
+     * A bitmask of properties relating to the number represented by this object.
+     *
+     * @see #NEGATIVE_FLAG
+     * @see #INFINITY_FLAG
+     * @see #NAN_FLAG
+     */
+    protected byte flags;
 
-  protected static final int NEGATIVE_FLAG = 1;
-  protected static final int INFINITY_FLAG = 2;
-  protected static final int NAN_FLAG = 4;
+    protected static final int NEGATIVE_FLAG = 1;
+    protected static final int INFINITY_FLAG = 2;
+    protected static final int NAN_FLAG = 4;
 
-  // The following three fields relate to the double-to-ascii fast path algorithm.
-  // When a double is given to DecimalQuantityBCD, it is converted to using a fast algorithm. The
-  // fast algorithm guarantees correctness to only the first ~12 digits of the double. The process
-  // of rounding the number ensures that the converted digits are correct, falling back to a slow-
-  // path algorithm if required.  Therefore, if a DecimalQuantity is constructed from a double, it
-  // is *required* that roundToMagnitude(), roundToIncrement(), or roundToInfinity() is called. If
-  // you don't round, assertions will fail in certain other methods if you try calling them.
+    // The following three fields relate to the double-to-ascii fast path algorithm.
+    // When a double is given to DecimalQuantityBCD, it is converted to using a fast algorithm. The
+    // fast algorithm guarantees correctness to only the first ~12 digits of the double. The process
+    // of rounding the number ensures that the converted digits are correct, falling back to a slow-
+    // path algorithm if required. Therefore, if a DecimalQuantity is constructed from a double, it
+    // is *required* that roundToMagnitude(), roundToIncrement(), or roundToInfinity() is called. If
+    // you don't round, assertions will fail in certain other methods if you try calling them.
 
-  /**
-   * The original number provided by the user and which is represented in BCD. Used when we need to
-   * re-compute the BCD for an exact double representation.
-   */
-  protected double origDouble;
+    /**
+     * The original number provided by the user and which is represented in BCD. Used when we need to
+     * re-compute the BCD for an exact double representation.
+     */
+    protected double origDouble;
 
-  /**
-   * The change in magnitude relative to the original double. Used when we need to re-compute the
-   * BCD for an exact double representation.
-   */
-  protected int origDelta;
+    /**
+     * The change in magnitude relative to the original double. Used when we need to re-compute the BCD
+     * for an exact double representation.
+     */
+    protected int origDelta;
 
-  /**
-   * Whether the value in the BCD comes from the double fast path without having been rounded to
-   * ensure correctness
-   */
-  protected boolean isApproximate;
+    /**
+     * Whether the value in the BCD comes from the double fast path without having been rounded to ensure
+     * correctness
+     */
+    protected boolean isApproximate;
 
-  // Four positions: left optional '(', left required '[', right required ']', right optional ')'.
-  // These four positions determine which digits are displayed in the output string.  They do NOT
-  // affect rounding.  These positions are internal-only and can be specified only by the public
-  // endpoints like setFractionLength, setIntegerLength, and setSignificantDigits, among others.
-  //
-  //   * Digits between lReqPos and rReqPos are in the "required zone" and are always displayed.
-  //   * Digits between lOptPos and rOptPos but outside the required zone are in the "optional zone"
-  //     and are displayed unless they are trailing off the left or right edge of the number and
-  //     have a numerical value of zero.  In order to be "trailing", the digits need to be beyond
-  //     the decimal point in their respective directions.
-  //   * Digits outside of the "optional zone" are never displayed.
-  //
-  // See the table below for illustrative examples.
-  //
-  // +---------+---------+---------+---------+------------+------------------------+--------------+
-  // | lOptPos | lReqPos | rReqPos | rOptPos |   number   |        positions       | en-US string |
-  // +---------+---------+---------+---------+------------+------------------------+--------------+
-  // |    5    |    2    |   -1    |   -5    |   1234.567 |     ( 12[34.5]67  )    |   1,234.567  |
-  // |    3    |    2    |   -1    |   -5    |   1234.567 |      1(2[34.5]67  )    |     234.567  |
-  // |    3    |    2    |   -1    |   -2    |   1234.567 |      1(2[34.5]6)7      |     234.56   |
-  // |    6    |    4    |    2    |   -5    | 123456789. |  123(45[67]89.     )   | 456,789.     |
-  // |    6    |    4    |    2    |    1    | 123456789. |     123(45[67]8)9.     | 456,780.     |
-  // |   -1    |   -1    |   -3    |   -4    | 0.123456   |     0.1([23]4)56       |        .0234 |
-  // |    6    |    4    |   -2    |   -2    |     12.3   |     (  [  12.3 ])      |    0012.30   |
-  // +---------+---------+---------+---------+------------+------------------------+--------------+
-  //
-  protected int lOptPos = Integer.MAX_VALUE;
-  protected int lReqPos = 0;
-  protected int rReqPos = 0;
-  protected int rOptPos = Integer.MIN_VALUE;
+    // Four positions: left optional '(', left required '[', right required ']', right optional ')'.
+    // These four positions determine which digits are displayed in the output string. They do NOT
+    // affect rounding. These positions are internal-only and can be specified only by the public
+    // endpoints like setFractionLength, setIntegerLength, and setSignificantDigits, among others.
+    //
+    // * Digits between lReqPos and rReqPos are in the "required zone" and are always displayed.
+    // * Digits between lOptPos and rOptPos but outside the required zone are in the "optional zone"
+    // and are displayed unless they are trailing off the left or right edge of the number and
+    // have a numerical value of zero. In order to be "trailing", the digits need to be beyond
+    // the decimal point in their respective directions.
+    // * Digits outside of the "optional zone" are never displayed.
+    //
+    // See the table below for illustrative examples.
+    //
+    // +---------+---------+---------+---------+------------+------------------------+--------------+
+    // | lOptPos | lReqPos | rReqPos | rOptPos |   number   |        positions       | en-US string |
+    // +---------+---------+---------+---------+------------+------------------------+--------------+
+    // |    5    |    2    |   -1    |   -5    |   1234.567 |     ( 12[34.5]67  )    |   1,234.567  |
+    // |    3    |    2    |   -1    |   -5    |   1234.567 |      1(2[34.5]67  )    |     234.567  |
+    // |    3    |    2    |   -1    |   -2    |   1234.567 |      1(2[34.5]6)7      |     234.56   |
+    // |    6    |    4    |    2    |   -5    | 123456789. |  123(45[67]89.     )   | 456,789.     |
+    // |    6    |    4    |    2    |    1    | 123456789. |     123(45[67]8)9.     | 456,780.     |
+    // |   -1    |   -1    |   -3    |   -4    | 0.123456   |     0.1([23]4)56       |        .0234 |
+    // |    6    |    4    |   -2    |   -2    |     12.3   |     (  [  12.3 ])      |    0012.30   |
+    // +---------+---------+---------+---------+------------+------------------------+--------------+
+    //
+    protected int lOptPos = Integer.MAX_VALUE;
+    protected int lReqPos = 0;
+    protected int rReqPos = 0;
+    protected int rOptPos = Integer.MIN_VALUE;
 
-  @Override
-  public void copyFrom(DecimalQuantity _other) {
-    copyBcdFrom(_other);
-    DecimalQuantity_AbstractBCD other = (DecimalQuantity_AbstractBCD) _other;
-    lOptPos = other.lOptPos;
-    lReqPos = other.lReqPos;
-    rReqPos = other.rReqPos;
-    rOptPos = other.rOptPos;
-    scale = other.scale;
-    precision = other.precision;
-    flags = other.flags;
-    origDouble = other.origDouble;
-    origDelta = other.origDelta;
-    isApproximate = other.isApproximate;
-  }
-
-  public DecimalQuantity_AbstractBCD clear() {
-    lOptPos = Integer.MAX_VALUE;
-    lReqPos = 0;
-    rReqPos = 0;
-    rOptPos = Integer.MIN_VALUE;
-    flags = 0;
-    setBcdToZero(); // sets scale, precision, hasDouble, origDouble, origDelta, and BCD data
-    return this;
-  }
-
-  @Override
-  public void setIntegerLength(int minInt, int maxInt) {
-    // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class.
-    assert minInt >= 0;
-    assert maxInt >= minInt;
-
-    // Save values into internal state
-    // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
-    lOptPos = maxInt;
-    lReqPos = minInt;
-  }
-
-  @Override
-  public void setFractionLength(int minFrac, int maxFrac) {
-    // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class.
-    assert minFrac >= 0;
-    assert maxFrac >= minFrac;
-
-    // Save values into internal state
-    // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
-    rReqPos = -minFrac;
-    rOptPos = -maxFrac;
-  }
-
-  @Override
-  public long getPositionFingerprint() {
-    long fingerprint = 0;
-    fingerprint ^= lOptPos;
-    fingerprint ^= (lReqPos << 16);
-    fingerprint ^= ((long) rReqPos << 32);
-    fingerprint ^= ((long) rOptPos << 48);
-    return fingerprint;
-  }
-
-  @Override
-  public void roundToIncrement(BigDecimal roundingIncrement, MathContext mathContext) {
-    // TODO: Avoid converting back and forth to BigDecimal.
-    BigDecimal temp = toBigDecimal();
-    temp =
-        temp.divide(roundingIncrement, 0, mathContext.getRoundingMode())
-            .multiply(roundingIncrement)
-            .round(mathContext);
-    if (temp.signum() == 0) {
-      setBcdToZero(); // keeps negative flag for -0.0
-    } else {
-      setToBigDecimal(temp);
-    }
-  }
-
-  @Override
-  public void multiplyBy(BigDecimal multiplicand) {
-    if (isInfinite() || isZero() || isNaN()) {
-      return;
-    }
-    BigDecimal temp = toBigDecimal();
-    temp = temp.multiply(multiplicand);
-    setToBigDecimal(temp);
-  }
-
-  @Override
-  public int getMagnitude() throws ArithmeticException {
-    if (precision == 0) {
-      throw new ArithmeticException("Magnitude is not well-defined for zero");
-    } else {
-      return scale + precision - 1;
-    }
-  }
-
-  @Override
-  public void adjustMagnitude(int delta) {
-    if (precision != 0) {
-      scale += delta;
-      origDelta += delta;
-    }
-  }
-
-  @Override
-  public StandardPlural getStandardPlural(PluralRules rules) {
-    if (rules == null) {
-      // Fail gracefully if the user didn't provide a PluralRules
-      return StandardPlural.OTHER;
-    } else {
-      @SuppressWarnings("deprecation")
-      String ruleString = rules.select(this);
-      return StandardPlural.orOtherFromString(ruleString);
-    }
-  }
-
-  @Override
-  public double getPluralOperand(Operand operand) {
-    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
-    // See the comment at the top of this file explaining the "isApproximate" field.
-    assert !isApproximate;
-
-    switch (operand) {
-      case i:
-        return toLong();
-      case f:
-        return toFractionLong(true);
-      case t:
-        return toFractionLong(false);
-      case v:
-        return fractionCount();
-      case w:
-        return fractionCountWithoutTrailingZeros();
-      default:
-        return Math.abs(toDouble());
-    }
-  }
-
-  @Override
-  public void populateUFieldPosition(FieldPosition fp) {
-    if (fp instanceof UFieldPosition) {
-      ((UFieldPosition) fp)
-          .setFractionDigits((int) getPluralOperand(Operand.v), (long) getPluralOperand(Operand.f));
-    }
-  }
-
-  @Override
-  public int getUpperDisplayMagnitude() {
-    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
-    // See the comment at the top of this file explaining the "isApproximate" field.
-    assert !isApproximate;
-
-    int magnitude = scale + precision;
-    int result = (lReqPos > magnitude) ? lReqPos : (lOptPos < magnitude) ? lOptPos : magnitude;
-    return result - 1;
-  }
-
-  @Override
-  public int getLowerDisplayMagnitude() {
-    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
-    // See the comment at the top of this file explaining the "isApproximate" field.
-    assert !isApproximate;
-
-    int magnitude = scale;
-    int result = (rReqPos < magnitude) ? rReqPos : (rOptPos > magnitude) ? rOptPos : magnitude;
-    return result;
-  }
-
-  @Override
-  public byte getDigit(int magnitude) {
-    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
-    // See the comment at the top of this file explaining the "isApproximate" field.
-    assert !isApproximate;
-
-    return getDigitPos(magnitude - scale);
-  }
-
-  private int fractionCount() {
-    return -getLowerDisplayMagnitude();
-  }
-
-  private int fractionCountWithoutTrailingZeros() {
-    return Math.max(-scale, 0);
-  }
-
-  @Override
-  public boolean isNegative() {
-    return (flags & NEGATIVE_FLAG) != 0;
-  }
-
-  @Override
-  public boolean isInfinite() {
-    return (flags & INFINITY_FLAG) != 0;
-  }
-
-  @Override
-  public boolean isNaN() {
-    return (flags & NAN_FLAG) != 0;
-  }
-
-  @Override
-  public boolean isZero() {
-    return precision == 0;
-  }
-
-  public void setToInt(int n) {
-    setBcdToZero();
-    flags = 0;
-    if (n < 0) {
-      flags |= NEGATIVE_FLAG;
-      n = -n;
-    }
-    if (n != 0) {
-      _setToInt(n);
-      compact();
-    }
-  }
-
-  private void _setToInt(int n) {
-    if (n == Integer.MIN_VALUE) {
-      readLongToBcd(-(long) n);
-    } else {
-      readIntToBcd(n);
-    }
-  }
-
-  public void setToLong(long n) {
-    setBcdToZero();
-    flags = 0;
-    if (n < 0) {
-      flags |= NEGATIVE_FLAG;
-      n = -n;
-    }
-    if (n != 0) {
-      _setToLong(n);
-      compact();
-    }
-  }
-
-  private void _setToLong(long n) {
-    if (n == Long.MIN_VALUE) {
-      readBigIntegerToBcd(BigInteger.valueOf(n).negate());
-    } else if (n <= Integer.MAX_VALUE) {
-      readIntToBcd((int) n);
-    } else {
-      readLongToBcd(n);
-    }
-  }
-
-  public void setToBigInteger(BigInteger n) {
-    setBcdToZero();
-    flags = 0;
-    if (n.signum() == -1) {
-      flags |= NEGATIVE_FLAG;
-      n = n.negate();
-    }
-    if (n.signum() != 0) {
-      _setToBigInteger(n);
-      compact();
-    }
-  }
-
-  private void _setToBigInteger(BigInteger n) {
-    if (n.bitLength() < 32) {
-      readIntToBcd(n.intValue());
-    } else if (n.bitLength() < 64) {
-      readLongToBcd(n.longValue());
-    } else {
-      readBigIntegerToBcd(n);
-    }
-  }
-
-  /**
-   * Sets the internal BCD state to represent the value in the given double.
-   *
-   * @param n The value to consume.
-   */
-  public void setToDouble(double n) {
-    setBcdToZero();
-    flags = 0;
-    // Double.compare() handles +0.0 vs -0.0
-    if (Double.compare(n, 0.0) < 0) {
-      flags |= NEGATIVE_FLAG;
-      n = -n;
-    }
-    if (Double.isNaN(n)) {
-      flags |= NAN_FLAG;
-    } else if (Double.isInfinite(n)) {
-      flags |= INFINITY_FLAG;
-    } else if (n != 0) {
-      _setToDoubleFast(n);
-      compact();
-    }
-  }
-
-  private static final double[] DOUBLE_MULTIPLIERS = {
-    1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16,
-    1e17, 1e18, 1e19, 1e20, 1e21
-  };
-
-  /**
-   * Uses double multiplication and division to get the number into integer space before converting
-   * to digits. Since double arithmetic is inexact, the resulting digits may not be accurate.
-   */
-  private void _setToDoubleFast(double n) {
-    isApproximate = true;
-    origDouble = n;
-    origDelta = 0;
-
-    // NOTE: Unlike ICU4C, doubles are always IEEE 754 doubles.
-    long ieeeBits = Double.doubleToLongBits(n);
-    int exponent = (int) ((ieeeBits & 0x7ff0000000000000L) >> 52) - 0x3ff;
-
-    // Not all integers can be represented exactly for exponent > 52
-    if (exponent <= 52 && (long) n == n) {
-      _setToLong((long) n);
-      return;
+    @Override
+    public void copyFrom(DecimalQuantity _other) {
+        copyBcdFrom(_other);
+        DecimalQuantity_AbstractBCD other = (DecimalQuantity_AbstractBCD) _other;
+        lOptPos = other.lOptPos;
+        lReqPos = other.lReqPos;
+        rReqPos = other.rReqPos;
+        rOptPos = other.rOptPos;
+        scale = other.scale;
+        precision = other.precision;
+        flags = other.flags;
+        origDouble = other.origDouble;
+        origDelta = other.origDelta;
+        isApproximate = other.isApproximate;
     }
 
-    // 3.3219... is log2(10)
-    int fracLength = (int) ((52 - exponent) / 3.32192809489);
-    if (fracLength >= 0) {
-      int i = fracLength;
-      // 1e22 is the largest exact double.
-      for (; i >= 22; i -= 22) n *= 1e22;
-      n *= DOUBLE_MULTIPLIERS[i];
-    } else {
-      int i = fracLength;
-      // 1e22 is the largest exact double.
-      for (; i <= -22; i += 22) n /= 1e22;
-      n /= DOUBLE_MULTIPLIERS[-i];
-    }
-    long result = Math.round(n);
-    if (result != 0) {
-      _setToLong(result);
-      scale -= fracLength;
-    }
-  }
-
-  /**
-   * Uses Double.toString() to obtain an exact accurate representation of the double, overwriting it
-   * into the BCD. This method can be called at any point after {@link #_setToDoubleFast} while
-   * {@link #isApproximate} is still true.
-   */
-  private void convertToAccurateDouble() {
-    double n = origDouble;
-    assert n != 0;
-    int delta = origDelta;
-    setBcdToZero();
-
-    // Call the slow oracle function (Double.toString in Java, sprintf in C++).
-    String dstr = Double.toString(n);
-
-    if (dstr.indexOf('E') != -1) {
-      // Case 1: Exponential notation.
-      assert dstr.indexOf('.') == 1;
-      int expPos = dstr.indexOf('E');
-      _setToLong(Long.parseLong(dstr.charAt(0) + dstr.substring(2, expPos)));
-      scale += Integer.parseInt(dstr.substring(expPos + 1)) - (expPos - 1) + 1;
-    } else if (dstr.charAt(0) == '0') {
-      // Case 2: Fraction-only number.
-      assert dstr.indexOf('.') == 1;
-      _setToLong(Long.parseLong(dstr.substring(2)));
-      scale += 2 - dstr.length();
-    } else if (dstr.charAt(dstr.length() - 1) == '0') {
-      // Case 3: Integer-only number.
-      // Note: this path should not normally happen, because integer-only numbers are captured
-      // before the approximate double logic is performed.
-      assert dstr.indexOf('.') == dstr.length() - 2;
-      assert dstr.length() - 2 <= 18;
-      _setToLong(Long.parseLong(dstr.substring(0, dstr.length() - 2)));
-      // no need to adjust scale
-    } else {
-      // Case 4: Number with both a fraction and an integer.
-      int decimalPos = dstr.indexOf('.');
-      _setToLong(Long.parseLong(dstr.substring(0, decimalPos) + dstr.substring(decimalPos + 1)));
-      scale += decimalPos - dstr.length() + 1;
+    public DecimalQuantity_AbstractBCD clear() {
+        lOptPos = Integer.MAX_VALUE;
+        lReqPos = 0;
+        rReqPos = 0;
+        rOptPos = Integer.MIN_VALUE;
+        flags = 0;
+        setBcdToZero(); // sets scale, precision, hasDouble, origDouble, origDelta, and BCD data
+        return this;
     }
 
-    scale += delta;
-    compact();
-    explicitExactDouble = true;
-  }
+    @Override
+    public void setIntegerLength(int minInt, int maxInt) {
+        // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class.
+        assert minInt >= 0;
+        assert maxInt >= minInt;
 
-  /**
-   * Whether this {@link DecimalQuantity_DualStorageBCD} has been explicitly converted to an exact double. true if
-   * backed by a double that was explicitly converted via convertToAccurateDouble; false otherwise.
-   * Used for testing.
-   *
-   * @deprecated This API is ICU internal only.
- * @hide draft / provisional / internal are hidden on Android
-   */
-  @Deprecated public boolean explicitExactDouble = false;
-
-  /**
-   * Sets the internal BCD state to represent the value in the given BigDecimal.
-   *
-   * @param n The value to consume.
-   */
-  @Override
-  public void setToBigDecimal(BigDecimal n) {
-    setBcdToZero();
-    flags = 0;
-    if (n.signum() == -1) {
-      flags |= NEGATIVE_FLAG;
-      n = n.negate();
-    }
-    if (n.signum() != 0) {
-      _setToBigDecimal(n);
-      compact();
-    }
-  }
-
-  private void _setToBigDecimal(BigDecimal n) {
-    int fracLength = n.scale();
-    n = n.scaleByPowerOfTen(fracLength);
-    BigInteger bi = n.toBigInteger();
-    _setToBigInteger(bi);
-    scale -= fracLength;
-  }
-
-  /**
-   * Returns a long approximating the internal BCD. A long can only represent the integral part of
-   * the number.
-   *
-   * @return A double representation of the internal BCD.
-   */
-  protected long toLong() {
-    long result = 0L;
-    for (int magnitude = scale + precision - 1; magnitude >= 0; magnitude--) {
-      result = result * 10 + getDigitPos(magnitude - scale);
-    }
-    return result;
-  }
-
-  /**
-   * This returns a long representing the fraction digits of the number, as required by PluralRules.
-   * For example, if we represent the number "1.20" (including optional and required digits), then
-   * this function returns "20" if includeTrailingZeros is true or "2" if false.
-   */
-  protected long toFractionLong(boolean includeTrailingZeros) {
-    long result = 0L;
-    int magnitude = -1;
-    for (;
-        (magnitude >= scale || (includeTrailingZeros && magnitude >= rReqPos))
-            && magnitude >= rOptPos;
-        magnitude--) {
-      result = result * 10 + getDigitPos(magnitude - scale);
-    }
-    return result;
-  }
-
-  /**
-   * Returns a double approximating the internal BCD. The double may not retain all of the
-   * information encoded in the BCD if the BCD represents a number out of range of a double.
-   *
-   * @return A double representation of the internal BCD.
-   */
-  @Override
-  public double toDouble() {
-    if (isApproximate) {
-      return toDoubleFromOriginal();
+        // Save values into internal state
+        // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
+        lOptPos = maxInt;
+        lReqPos = minInt;
     }
 
-    if (isNaN()) {
-      return Double.NaN;
-    } else if (isInfinite()) {
-      return isNegative() ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
+    @Override
+    public void setFractionLength(int minFrac, int maxFrac) {
+        // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class.
+        assert minFrac >= 0;
+        assert maxFrac >= minFrac;
+
+        // Save values into internal state
+        // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
+        rReqPos = -minFrac;
+        rOptPos = -maxFrac;
     }
 
-    long tempLong = 0L;
-    int lostDigits = precision - Math.min(precision, 17);
-    for (int shift = precision - 1; shift >= lostDigits; shift--) {
-      tempLong = tempLong * 10 + getDigitPos(shift);
-    }
-    double result = tempLong;
-    int _scale = scale + lostDigits;
-    if (_scale >= 0) {
-      // 1e22 is the largest exact double.
-      int i = _scale;
-      for (; i >= 22; i -= 22) result *= 1e22;
-      result *= DOUBLE_MULTIPLIERS[i];
-    } else {
-      // 1e22 is the largest exact double.
-      int i = _scale;
-      for (; i <= -22; i += 22) result /= 1e22;
-      result /= DOUBLE_MULTIPLIERS[-i];
-    }
-    if (isNegative()) result = -result;
-    return result;
-  }
-
-  @Override
-  public BigDecimal toBigDecimal() {
-    if (isApproximate) {
-      // Converting to a BigDecimal requires Double.toString().
-      convertToAccurateDouble();
-    }
-    return bcdToBigDecimal();
-  }
-
-  protected double toDoubleFromOriginal() {
-    double result = origDouble;
-    int delta = origDelta;
-    if (delta >= 0) {
-      // 1e22 is the largest exact double.
-      for (; delta >= 22; delta -= 22) result *= 1e22;
-      result *= DOUBLE_MULTIPLIERS[delta];
-    } else {
-      // 1e22 is the largest exact double.
-      for (; delta <= -22; delta += 22) result /= 1e22;
-      result /= DOUBLE_MULTIPLIERS[-delta];
-    }
-    if (isNegative()) result *= -1;
-    return result;
-  }
-
-  private static int safeSubtract(int a, int b) {
-    int diff = a - b;
-    if (b < 0 && diff < a) return Integer.MAX_VALUE;
-    if (b > 0 && diff > a) return Integer.MIN_VALUE;
-    return diff;
-  }
-
-  private static final int SECTION_LOWER_EDGE = -1;
-  private static final int SECTION_UPPER_EDGE = -2;
-
-  @Override
-  public void roundToMagnitude(int magnitude, MathContext mathContext) {
-    // The position in the BCD at which rounding will be performed; digits to the right of position
-    // will be rounded away.
-    // TODO: Andy: There was a test failure because of integer overflow here. Should I do
-    // "safe subtraction" everywhere in the code?  What's the nicest way to do it?
-    int position = safeSubtract(magnitude, scale);
-
-    // Enforce the number of digits required by the MathContext.
-    int _mcPrecision = mathContext.getPrecision();
-    if (magnitude == Integer.MAX_VALUE
-        || (_mcPrecision > 0 && precision - position > _mcPrecision)) {
-      position = precision - _mcPrecision;
+    @Override
+    public long getPositionFingerprint() {
+        long fingerprint = 0;
+        fingerprint ^= lOptPos;
+        fingerprint ^= (lReqPos << 16);
+        fingerprint ^= ((long) rReqPos << 32);
+        fingerprint ^= ((long) rOptPos << 48);
+        return fingerprint;
     }
 
-    if (position <= 0 && !isApproximate) {
-      // All digits are to the left of the rounding magnitude.
-    } else if (precision == 0) {
-      // No rounding for zero.
-    } else {
-      // Perform rounding logic.
-      // "leading" = most significant digit to the right of rounding
-      // "trailing" = least significant digit to the left of rounding
-      byte leadingDigit = getDigitPos(safeSubtract(position, 1));
-      byte trailingDigit = getDigitPos(position);
-
-      // Compute which section of the number we are in.
-      // EDGE means we are at the bottom or top edge, like 1.000 or 1.999 (used by doubles)
-      // LOWER means we are between the bottom edge and the midpoint, like 1.391
-      // MIDPOINT means we are exactly in the middle, like 1.500
-      // UPPER means we are between the midpoint and the top edge, like 1.916
-      int section = RoundingUtils.SECTION_MIDPOINT;
-      if (!isApproximate) {
-        if (leadingDigit < 5) {
-          section = RoundingUtils.SECTION_LOWER;
-        } else if (leadingDigit > 5) {
-          section = RoundingUtils.SECTION_UPPER;
+    @Override
+    public void roundToIncrement(BigDecimal roundingIncrement, MathContext mathContext) {
+        // TODO: Avoid converting back and forth to BigDecimal.
+        BigDecimal temp = toBigDecimal();
+        temp = temp.divide(roundingIncrement, 0, mathContext.getRoundingMode())
+                .multiply(roundingIncrement).round(mathContext);
+        if (temp.signum() == 0) {
+            setBcdToZero(); // keeps negative flag for -0.0
         } else {
-          for (int p = safeSubtract(position, 2); p >= 0; p--) {
-            if (getDigitPos(p) != 0) {
-              section = RoundingUtils.SECTION_UPPER;
-              break;
-            }
-          }
+            setToBigDecimal(temp);
         }
-      } else {
-        int p = safeSubtract(position, 2);
-        int minP = Math.max(0, precision - 14);
-        if (leadingDigit == 0) {
-          section = SECTION_LOWER_EDGE;
-          for (; p >= minP; p--) {
-            if (getDigitPos(p) != 0) {
-              section = RoundingUtils.SECTION_LOWER;
-              break;
-            }
-          }
-        } else if (leadingDigit == 4) {
-          for (; p >= minP; p--) {
-            if (getDigitPos(p) != 9) {
-              section = RoundingUtils.SECTION_LOWER;
-              break;
-            }
-          }
-        } else if (leadingDigit == 5) {
-          for (; p >= minP; p--) {
-            if (getDigitPos(p) != 0) {
-              section = RoundingUtils.SECTION_UPPER;
-              break;
-            }
-          }
-        } else if (leadingDigit == 9) {
-          section = SECTION_UPPER_EDGE;
-          for (; p >= minP; p--) {
-            if (getDigitPos(p) != 9) {
-              section = RoundingUtils.SECTION_UPPER;
-              break;
-            }
-          }
-        } else if (leadingDigit < 5) {
-          section = RoundingUtils.SECTION_LOWER;
+    }
+
+    @Override
+    public void multiplyBy(BigDecimal multiplicand) {
+        if (isInfinite() || isZero() || isNaN()) {
+            return;
+        }
+        BigDecimal temp = toBigDecimal();
+        temp = temp.multiply(multiplicand);
+        setToBigDecimal(temp);
+    }
+
+    @Override
+    public int getMagnitude() throws ArithmeticException {
+        if (precision == 0) {
+            throw new ArithmeticException("Magnitude is not well-defined for zero");
         } else {
-          section = RoundingUtils.SECTION_UPPER;
+            return scale + precision - 1;
         }
+    }
 
-        boolean roundsAtMidpoint =
-            RoundingUtils.roundsAtMidpoint(mathContext.getRoundingMode().ordinal());
-        if (safeSubtract(position, 1) < precision - 14
-            || (roundsAtMidpoint && section == RoundingUtils.SECTION_MIDPOINT)
-            || (!roundsAtMidpoint && section < 0 /* i.e. at upper or lower edge */)) {
-          // Oops! This means that we have to get the exact representation of the double, because
-          // the zone of uncertainty is along the rounding boundary.
-          convertToAccurateDouble();
-          roundToMagnitude(magnitude, mathContext); // start over
-          return;
+    @Override
+    public void adjustMagnitude(int delta) {
+        if (precision != 0) {
+            scale = Utility.addExact(scale, delta);
+            origDelta = Utility.addExact(origDelta, delta);
         }
+    }
 
-        // Turn off the approximate double flag, since the value is now confirmed to be exact.
-        isApproximate = false;
-        origDouble = 0.0;
+    @Override
+    public StandardPlural getStandardPlural(PluralRules rules) {
+        if (rules == null) {
+            // Fail gracefully if the user didn't provide a PluralRules
+            return StandardPlural.OTHER;
+        } else {
+            @SuppressWarnings("deprecation")
+            String ruleString = rules.select(this);
+            return StandardPlural.orOtherFromString(ruleString);
+        }
+    }
+
+    @Override
+    public double getPluralOperand(Operand operand) {
+        // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
+        // See the comment at the top of this file explaining the "isApproximate" field.
+        assert !isApproximate;
+
+        switch (operand) {
+        case i:
+            return toLong();
+        case f:
+            return toFractionLong(true);
+        case t:
+            return toFractionLong(false);
+        case v:
+            return fractionCount();
+        case w:
+            return fractionCountWithoutTrailingZeros();
+        default:
+            return Math.abs(toDouble());
+        }
+    }
+
+    @Override
+    public void populateUFieldPosition(FieldPosition fp) {
+        if (fp instanceof UFieldPosition) {
+            ((UFieldPosition) fp).setFractionDigits((int) getPluralOperand(Operand.v),
+                    (long) getPluralOperand(Operand.f));
+        }
+    }
+
+    @Override
+    public int getUpperDisplayMagnitude() {
+        // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
+        // See the comment at the top of this file explaining the "isApproximate" field.
+        assert !isApproximate;
+
+        int magnitude = scale + precision;
+        int result = (lReqPos > magnitude) ? lReqPos : (lOptPos < magnitude) ? lOptPos : magnitude;
+        return result - 1;
+    }
+
+    @Override
+    public int getLowerDisplayMagnitude() {
+        // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
+        // See the comment at the top of this file explaining the "isApproximate" field.
+        assert !isApproximate;
+
+        int magnitude = scale;
+        int result = (rReqPos < magnitude) ? rReqPos : (rOptPos > magnitude) ? rOptPos : magnitude;
+        return result;
+    }
+
+    @Override
+    public byte getDigit(int magnitude) {
+        // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
+        // See the comment at the top of this file explaining the "isApproximate" field.
+        assert !isApproximate;
+
+        return getDigitPos(magnitude - scale);
+    }
+
+    private int fractionCount() {
+        return -getLowerDisplayMagnitude();
+    }
+
+    private int fractionCountWithoutTrailingZeros() {
+        return Math.max(-scale, 0);
+    }
+
+    @Override
+    public boolean isNegative() {
+        return (flags & NEGATIVE_FLAG) != 0;
+    }
+
+    @Override
+    public int signum() {
+        return isNegative() ? -1 : isZero() ? 0 : 1;
+    }
+
+    @Override
+    public boolean isInfinite() {
+        return (flags & INFINITY_FLAG) != 0;
+    }
+
+    @Override
+    public boolean isNaN() {
+        return (flags & NAN_FLAG) != 0;
+    }
+
+    @Override
+    public boolean isZero() {
+        return precision == 0;
+    }
+
+    public void setToInt(int n) {
+        setBcdToZero();
+        flags = 0;
+        if (n < 0) {
+            flags |= NEGATIVE_FLAG;
+            n = -n;
+        }
+        if (n != 0) {
+            _setToInt(n);
+            compact();
+        }
+    }
+
+    private void _setToInt(int n) {
+        if (n == Integer.MIN_VALUE) {
+            readLongToBcd(-(long) n);
+        } else {
+            readIntToBcd(n);
+        }
+    }
+
+    public void setToLong(long n) {
+        setBcdToZero();
+        flags = 0;
+        if (n < 0) {
+            flags |= NEGATIVE_FLAG;
+            n = -n;
+        }
+        if (n != 0) {
+            _setToLong(n);
+            compact();
+        }
+    }
+
+    private void _setToLong(long n) {
+        if (n == Long.MIN_VALUE) {
+            readBigIntegerToBcd(BigInteger.valueOf(n).negate());
+        } else if (n <= Integer.MAX_VALUE) {
+            readIntToBcd((int) n);
+        } else {
+            readLongToBcd(n);
+        }
+    }
+
+    public void setToBigInteger(BigInteger n) {
+        setBcdToZero();
+        flags = 0;
+        if (n.signum() == -1) {
+            flags |= NEGATIVE_FLAG;
+            n = n.negate();
+        }
+        if (n.signum() != 0) {
+            _setToBigInteger(n);
+            compact();
+        }
+    }
+
+    private void _setToBigInteger(BigInteger n) {
+        if (n.bitLength() < 32) {
+            readIntToBcd(n.intValue());
+        } else if (n.bitLength() < 64) {
+            readLongToBcd(n.longValue());
+        } else {
+            readBigIntegerToBcd(n);
+        }
+    }
+
+    /**
+     * Sets the internal BCD state to represent the value in the given double.
+     *
+     * @param n
+     *            The value to consume.
+     */
+    public void setToDouble(double n) {
+        setBcdToZero();
+        flags = 0;
+        // Double.compare() handles +0.0 vs -0.0
+        if (Double.compare(n, 0.0) < 0) {
+            flags |= NEGATIVE_FLAG;
+            n = -n;
+        }
+        if (Double.isNaN(n)) {
+            flags |= NAN_FLAG;
+        } else if (Double.isInfinite(n)) {
+            flags |= INFINITY_FLAG;
+        } else if (n != 0) {
+            _setToDoubleFast(n);
+            compact();
+        }
+    }
+
+    private static final double[] DOUBLE_MULTIPLIERS = {
+            1e0,
+            1e1,
+            1e2,
+            1e3,
+            1e4,
+            1e5,
+            1e6,
+            1e7,
+            1e8,
+            1e9,
+            1e10,
+            1e11,
+            1e12,
+            1e13,
+            1e14,
+            1e15,
+            1e16,
+            1e17,
+            1e18,
+            1e19,
+            1e20,
+            1e21 };
+
+    /**
+     * Uses double multiplication and division to get the number into integer space before converting to
+     * digits. Since double arithmetic is inexact, the resulting digits may not be accurate.
+     */
+    private void _setToDoubleFast(double n) {
+        isApproximate = true;
+        origDouble = n;
         origDelta = 0;
 
-        if (position <= 0) {
-          // All digits are to the left of the rounding magnitude.
-          return;
+        // NOTE: Unlike ICU4C, doubles are always IEEE 754 doubles.
+        long ieeeBits = Double.doubleToLongBits(n);
+        int exponent = (int) ((ieeeBits & 0x7ff0000000000000L) >> 52) - 0x3ff;
+
+        // Not all integers can be represented exactly for exponent > 52
+        if (exponent <= 52 && (long) n == n) {
+            _setToLong((long) n);
+            return;
         }
 
-        // Good to continue rounding.
-        if (section == SECTION_LOWER_EDGE) section = RoundingUtils.SECTION_LOWER;
-        if (section == SECTION_UPPER_EDGE) section = RoundingUtils.SECTION_UPPER;
-      }
+        // 3.3219... is log2(10)
+        int fracLength = (int) ((52 - exponent) / 3.32192809489);
+        if (fracLength >= 0) {
+            int i = fracLength;
+            // 1e22 is the largest exact double.
+            for (; i >= 22; i -= 22)
+                n *= 1e22;
+            n *= DOUBLE_MULTIPLIERS[i];
+        } else {
+            int i = fracLength;
+            // 1e22 is the largest exact double.
+            for (; i <= -22; i += 22)
+                n /= 1e22;
+            n /= DOUBLE_MULTIPLIERS[-i];
+        }
+        long result = Math.round(n);
+        if (result != 0) {
+            _setToLong(result);
+            scale -= fracLength;
+        }
+    }
 
-      boolean roundDown =
-          RoundingUtils.getRoundingDirection(
-              (trailingDigit % 2) == 0,
-              isNegative(),
-              section,
-              mathContext.getRoundingMode().ordinal(),
-              this);
-
-      // Perform truncation
-      if (position >= precision) {
+    /**
+     * Uses Double.toString() to obtain an exact accurate representation of the double, overwriting it
+     * into the BCD. This method can be called at any point after {@link #_setToDoubleFast} while
+     * {@link #isApproximate} is still true.
+     */
+    private void convertToAccurateDouble() {
+        double n = origDouble;
+        assert n != 0;
+        int delta = origDelta;
         setBcdToZero();
-        scale = magnitude;
-      } else {
-        shiftRight(position);
-      }
 
-      // Bubble the result to the higher digits
-      if (!roundDown) {
-        if (trailingDigit == 9) {
-          int bubblePos = 0;
-          // Note: in the long implementation, the most digits BCD can have at this point is 15,
-          // so bubblePos <= 15 and getDigitPos(bubblePos) is safe.
-          for (; getDigitPos(bubblePos) == 9; bubblePos++) {}
-          shiftRight(bubblePos); // shift off the trailing 9s
+        // Call the slow oracle function (Double.toString in Java, sprintf in C++).
+        String dstr = Double.toString(n);
+
+        if (dstr.indexOf('E') != -1) {
+            // Case 1: Exponential notation.
+            assert dstr.indexOf('.') == 1;
+            int expPos = dstr.indexOf('E');
+            _setToLong(Long.parseLong(dstr.charAt(0) + dstr.substring(2, expPos)));
+            scale += Integer.parseInt(dstr.substring(expPos + 1)) - (expPos - 1) + 1;
+        } else if (dstr.charAt(0) == '0') {
+            // Case 2: Fraction-only number.
+            assert dstr.indexOf('.') == 1;
+            _setToLong(Long.parseLong(dstr.substring(2)));
+            scale += 2 - dstr.length();
+        } else if (dstr.charAt(dstr.length() - 1) == '0') {
+            // Case 3: Integer-only number.
+            // Note: this path should not normally happen, because integer-only numbers are captured
+            // before the approximate double logic is performed.
+            assert dstr.indexOf('.') == dstr.length() - 2;
+            assert dstr.length() - 2 <= 18;
+            _setToLong(Long.parseLong(dstr.substring(0, dstr.length() - 2)));
+            // no need to adjust scale
+        } else {
+            // Case 4: Number with both a fraction and an integer.
+            int decimalPos = dstr.indexOf('.');
+            _setToLong(Long.parseLong(dstr.substring(0, decimalPos) + dstr.substring(decimalPos + 1)));
+            scale += decimalPos - dstr.length() + 1;
         }
-        byte digit0 = getDigitPos(0);
-        assert digit0 != 9;
-        setDigitPos(0, (byte) (digit0 + 1));
-        precision += 1; // in case an extra digit got added
-      }
 
-      compact();
-    }
-  }
-
-  @Override
-  public void roundToInfinity() {
-    if (isApproximate) {
-      convertToAccurateDouble();
-    }
-  }
-
-  /**
-   * Appends a digit, optionally with one or more leading zeros, to the end of the value represented
-   * by this DecimalQuantity.
-   *
-   * <p>The primary use of this method is to construct numbers during a parsing loop. It allows
-   * parsing to take advantage of the digit list infrastructure primarily designed for formatting.
-   *
-   * @param value The digit to append.
-   * @param leadingZeros The number of zeros to append before the digit. For example, if the value
-   *     in this instance starts as 12.3, and you append a 4 with 1 leading zero, the value becomes
-   *     12.304.
-   * @param appendAsInteger If true, increase the magnitude of existing digits to make room for the
-   *     new digit. If false, append to the end like a fraction digit. If true, there must not be
-   *     any fraction digits already in the number.
-   * @deprecated This API is ICU internal only.
- * @hide draft / provisional / internal are hidden on Android
-   */
-  @Deprecated
-  public void appendDigit(byte value, int leadingZeros, boolean appendAsInteger) {
-    assert leadingZeros >= 0;
-
-    // Zero requires special handling to maintain the invariant that the least-significant digit
-    // in the BCD is nonzero.
-    if (value == 0) {
-      if (appendAsInteger && precision != 0) {
-        scale += leadingZeros + 1;
-      }
-      return;
+        scale += delta;
+        compact();
+        explicitExactDouble = true;
     }
 
-    // Deal with trailing zeros
-    if (scale > 0) {
-      leadingZeros += scale;
-      if (appendAsInteger) {
-        scale = 0;
-      }
+    /**
+     * Whether this {@link DecimalQuantity_DualStorageBCD} has been explicitly converted to an exact
+     * double. true if backed by a double that was explicitly converted via convertToAccurateDouble;
+     * false otherwise. Used for testing.
+     *
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public boolean explicitExactDouble = false;
+
+    /**
+     * Sets the internal BCD state to represent the value in the given BigDecimal.
+     *
+     * @param n
+     *            The value to consume.
+     */
+    @Override
+    public void setToBigDecimal(BigDecimal n) {
+        setBcdToZero();
+        flags = 0;
+        if (n.signum() == -1) {
+            flags |= NEGATIVE_FLAG;
+            n = n.negate();
+        }
+        if (n.signum() != 0) {
+            _setToBigDecimal(n);
+            compact();
+        }
     }
 
-    // Append digit
-    shiftLeft(leadingZeros + 1);
-    setDigitPos(0, value);
-
-    // Fix scale if in integer mode
-    if (appendAsInteger) {
-      scale += leadingZeros + 1;
+    private void _setToBigDecimal(BigDecimal n) {
+        int fracLength = n.scale();
+        n = n.scaleByPowerOfTen(fracLength);
+        BigInteger bi = n.toBigInteger();
+        _setToBigInteger(bi);
+        scale -= fracLength;
     }
-  }
 
-  @Override
-  public String toPlainString() {
-      // NOTE: This logic is duplicated between here and DecimalQuantity_SimpleStorage.
-      StringBuilder sb = new StringBuilder();
-      if (isNegative()) {
-          sb.append('-');
-      }
-      for (int m = getUpperDisplayMagnitude(); m >= getLowerDisplayMagnitude(); m--) {
-        sb.append(getDigit(m));
-        if (m == 0) sb.append('.');
-      }
-      return sb.toString();
-  }
+    /**
+     * Returns a long approximating the internal BCD. A long can only represent the integral part of the
+     * number.
+     *
+     * @return A double representation of the internal BCD.
+     */
+    public long toLong() {
+        long result = 0L;
+        for (int magnitude = scale + precision - 1; magnitude >= 0; magnitude--) {
+            result = result * 10 + getDigitPos(magnitude - scale);
+        }
+        return result;
+    }
 
-  /**
-   * Returns a single digit from the BCD list. No internal state is changed by calling this method.
-   *
-   * @param position The position of the digit to pop, counted in BCD units from the least
-   *     significant digit. If outside the range supported by the implementation, zero is returned.
-   * @return The digit at the specified location.
-   */
-  protected abstract byte getDigitPos(int position);
+    /**
+     * This returns a long representing the fraction digits of the number, as required by PluralRules.
+     * For example, if we represent the number "1.20" (including optional and required digits), then this
+     * function returns "20" if includeTrailingZeros is true or "2" if false.
+     */
+    public long toFractionLong(boolean includeTrailingZeros) {
+        long result = 0L;
+        int magnitude = -1;
+        for (; (magnitude >= scale || (includeTrailingZeros && magnitude >= rReqPos))
+                && magnitude >= rOptPos; magnitude--) {
+            result = result * 10 + getDigitPos(magnitude - scale);
+        }
+        return result;
+    }
 
-  /**
-   * Sets the digit in the BCD list. This method only sets the digit; it is the caller's
-   * responsibility to call {@link #compact} after setting the digit.
-   *
-   * @param position The position of the digit to pop, counted in BCD units from the least
-   *     significant digit. If outside the range supported by the implementation, an AssertionError
-   *     is thrown.
-   * @param value The digit to set at the specified location.
-   */
-  protected abstract void setDigitPos(int position, byte value);
+    static final byte[] INT64_BCD = { 9, 2, 2, 3, 3, 7, 2, 0, 3, 6, 8, 5, 4, 7, 7, 5, 8, 0, 7 };
 
-  /**
-   * Adds zeros to the end of the BCD list. This will result in an invalid BCD representation; it is
-   * the caller's responsibility to do further manipulation and then call {@link #compact}.
-   *
-   * @param numDigits The number of zeros to add.
-   */
-  protected abstract void shiftLeft(int numDigits);
+    /**
+     * Returns whether or not a Long can fully represent the value stored in this DecimalQuantity.
+     * Assumes that the DecimalQuantity is positive.
+     */
+    public boolean fitsInLong() {
+        if (isZero()) {
+            return true;
+        }
+        if (scale < 0) {
+            return false;
+        }
+        int magnitude = getMagnitude();
+        if (magnitude < 18) {
+            return true;
+        }
+        if (magnitude > 18) {
+            return false;
+        }
+        // Hard case: the magnitude is 10^18.
+        // The largest int64 is: 9,223,372,036,854,775,807
+        for (int p = 0; p < precision; p++) {
+            byte digit = getDigit(18 - p);
+            if (digit < INT64_BCD[p]) {
+                return true;
+            } else if (digit > INT64_BCD[p]) {
+                return false;
+            }
+        }
+        // Exactly equal to max long.
+        return true;
+    }
 
-  protected abstract void shiftRight(int numDigits);
+    /**
+     * Returns a double approximating the internal BCD. The double may not retain all of the information
+     * encoded in the BCD if the BCD represents a number out of range of a double.
+     *
+     * @return A double representation of the internal BCD.
+     */
+    @Override
+    public double toDouble() {
+        if (isApproximate) {
+            return toDoubleFromOriginal();
+        }
 
-  /**
-   * Sets the internal representation to zero. Clears any values stored in scale, precision,
-   * hasDouble, origDouble, origDelta, and BCD data.
-   */
-  protected abstract void setBcdToZero();
+        if (isNaN()) {
+            return Double.NaN;
+        } else if (isInfinite()) {
+            return isNegative() ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
+        }
 
-  /**
-   * Sets the internal BCD state to represent the value in the given int. The int is guaranteed to
-   * be either positive. The internal state is guaranteed to be empty when this method is called.
-   *
-   * @param n The value to consume.
-   */
-  protected abstract void readIntToBcd(int input);
+        long tempLong = 0L;
+        int lostDigits = precision - Math.min(precision, 17);
+        for (int shift = precision - 1; shift >= lostDigits; shift--) {
+            tempLong = tempLong * 10 + getDigitPos(shift);
+        }
+        double result = tempLong;
+        int _scale = scale + lostDigits;
+        if (_scale >= 0) {
+            // 1e22 is the largest exact double.
+            int i = _scale;
+            for (; i >= 22; i -= 22)
+                result *= 1e22;
+            result *= DOUBLE_MULTIPLIERS[i];
+        } else {
+            // 1e22 is the largest exact double.
+            int i = _scale;
+            for (; i <= -22; i += 22)
+                result /= 1e22;
+            result /= DOUBLE_MULTIPLIERS[-i];
+        }
+        if (isNegative())
+            result = -result;
+        return result;
+    }
 
-  /**
-   * Sets the internal BCD state to represent the value in the given long. The long is guaranteed to
-   * be either positive. The internal state is guaranteed to be empty when this method is called.
-   *
-   * @param n The value to consume.
-   */
-  protected abstract void readLongToBcd(long input);
+    @Override
+    public BigDecimal toBigDecimal() {
+        if (isApproximate) {
+            // Converting to a BigDecimal requires Double.toString().
+            convertToAccurateDouble();
+        }
+        return bcdToBigDecimal();
+    }
 
-  /**
-   * Sets the internal BCD state to represent the value in the given BigInteger. The BigInteger is
-   * guaranteed to be positive, and it is guaranteed to be larger than Long.MAX_VALUE. The internal
-   * state is guaranteed to be empty when this method is called.
-   *
-   * @param n The value to consume.
-   */
-  protected abstract void readBigIntegerToBcd(BigInteger input);
+    protected double toDoubleFromOriginal() {
+        double result = origDouble;
+        int delta = origDelta;
+        if (delta >= 0) {
+            // 1e22 is the largest exact double.
+            for (; delta >= 22; delta -= 22)
+                result *= 1e22;
+            result *= DOUBLE_MULTIPLIERS[delta];
+        } else {
+            // 1e22 is the largest exact double.
+            for (; delta <= -22; delta += 22)
+                result /= 1e22;
+            result /= DOUBLE_MULTIPLIERS[-delta];
+        }
+        if (isNegative())
+            result *= -1;
+        return result;
+    }
 
-  /**
-   * Returns a BigDecimal encoding the internal BCD value.
-   *
-   * @return A BigDecimal representation of the internal BCD.
-   */
-  protected abstract BigDecimal bcdToBigDecimal();
+    private static int safeSubtract(int a, int b) {
+        int diff = a - b;
+        if (b < 0 && diff < a)
+            return Integer.MAX_VALUE;
+        if (b > 0 && diff > a)
+            return Integer.MIN_VALUE;
+        return diff;
+    }
 
-  protected abstract void copyBcdFrom(DecimalQuantity _other);
+    private static final int SECTION_LOWER_EDGE = -1;
+    private static final int SECTION_UPPER_EDGE = -2;
 
-  /**
-   * Removes trailing zeros from the BCD (adjusting the scale as required) and then computes the
-   * precision. The precision is the number of digits in the number up through the greatest nonzero
-   * digit.
-   *
-   * <p>This method must always be called when bcd changes in order for assumptions to be correct in
-   * methods like {@link #fractionCount()}.
-   */
-  protected abstract void compact();
+    @Override
+    public void roundToMagnitude(int magnitude, MathContext mathContext) {
+        // The position in the BCD at which rounding will be performed; digits to the right of position
+        // will be rounded away.
+        // TODO: Andy: There was a test failure because of integer overflow here. Should I do
+        // "safe subtraction" everywhere in the code? What's the nicest way to do it?
+        int position = safeSubtract(magnitude, scale);
+
+        // Enforce the number of digits required by the MathContext.
+        int _mcPrecision = mathContext.getPrecision();
+        if (magnitude == Integer.MAX_VALUE
+                || (_mcPrecision > 0 && precision - position > _mcPrecision)) {
+            position = precision - _mcPrecision;
+        }
+
+        if (position <= 0 && !isApproximate) {
+            // All digits are to the left of the rounding magnitude.
+        } else if (precision == 0) {
+            // No rounding for zero.
+        } else {
+            // Perform rounding logic.
+            // "leading" = most significant digit to the right of rounding
+            // "trailing" = least significant digit to the left of rounding
+            byte leadingDigit = getDigitPos(safeSubtract(position, 1));
+            byte trailingDigit = getDigitPos(position);
+
+            // Compute which section of the number we are in.
+            // EDGE means we are at the bottom or top edge, like 1.000 or 1.999 (used by doubles)
+            // LOWER means we are between the bottom edge and the midpoint, like 1.391
+            // MIDPOINT means we are exactly in the middle, like 1.500
+            // UPPER means we are between the midpoint and the top edge, like 1.916
+            int section = RoundingUtils.SECTION_MIDPOINT;
+            if (!isApproximate) {
+                if (leadingDigit < 5) {
+                    section = RoundingUtils.SECTION_LOWER;
+                } else if (leadingDigit > 5) {
+                    section = RoundingUtils.SECTION_UPPER;
+                } else {
+                    for (int p = safeSubtract(position, 2); p >= 0; p--) {
+                        if (getDigitPos(p) != 0) {
+                            section = RoundingUtils.SECTION_UPPER;
+                            break;
+                        }
+                    }
+                }
+            } else {
+                int p = safeSubtract(position, 2);
+                int minP = Math.max(0, precision - 14);
+                if (leadingDigit == 0) {
+                    section = SECTION_LOWER_EDGE;
+                    for (; p >= minP; p--) {
+                        if (getDigitPos(p) != 0) {
+                            section = RoundingUtils.SECTION_LOWER;
+                            break;
+                        }
+                    }
+                } else if (leadingDigit == 4) {
+                    for (; p >= minP; p--) {
+                        if (getDigitPos(p) != 9) {
+                            section = RoundingUtils.SECTION_LOWER;
+                            break;
+                        }
+                    }
+                } else if (leadingDigit == 5) {
+                    for (; p >= minP; p--) {
+                        if (getDigitPos(p) != 0) {
+                            section = RoundingUtils.SECTION_UPPER;
+                            break;
+                        }
+                    }
+                } else if (leadingDigit == 9) {
+                    section = SECTION_UPPER_EDGE;
+                    for (; p >= minP; p--) {
+                        if (getDigitPos(p) != 9) {
+                            section = RoundingUtils.SECTION_UPPER;
+                            break;
+                        }
+                    }
+                } else if (leadingDigit < 5) {
+                    section = RoundingUtils.SECTION_LOWER;
+                } else {
+                    section = RoundingUtils.SECTION_UPPER;
+                }
+
+                boolean roundsAtMidpoint = RoundingUtils
+                        .roundsAtMidpoint(mathContext.getRoundingMode().ordinal());
+                if (safeSubtract(position, 1) < precision - 14
+                        || (roundsAtMidpoint && section == RoundingUtils.SECTION_MIDPOINT)
+                        || (!roundsAtMidpoint && section < 0 /* i.e. at upper or lower edge */)) {
+                    // Oops! This means that we have to get the exact representation of the double,
+                    // because
+                    // the zone of uncertainty is along the rounding boundary.
+                    convertToAccurateDouble();
+                    roundToMagnitude(magnitude, mathContext); // start over
+                    return;
+                }
+
+                // Turn off the approximate double flag, since the value is now confirmed to be exact.
+                isApproximate = false;
+                origDouble = 0.0;
+                origDelta = 0;
+
+                if (position <= 0) {
+                    // All digits are to the left of the rounding magnitude.
+                    return;
+                }
+
+                // Good to continue rounding.
+                if (section == SECTION_LOWER_EDGE)
+                    section = RoundingUtils.SECTION_LOWER;
+                if (section == SECTION_UPPER_EDGE)
+                    section = RoundingUtils.SECTION_UPPER;
+            }
+
+            boolean roundDown = RoundingUtils.getRoundingDirection((trailingDigit % 2) == 0,
+                    isNegative(),
+                    section,
+                    mathContext.getRoundingMode().ordinal(),
+                    this);
+
+            // Perform truncation
+            if (position >= precision) {
+                setBcdToZero();
+                scale = magnitude;
+            } else {
+                shiftRight(position);
+            }
+
+            // Bubble the result to the higher digits
+            if (!roundDown) {
+                if (trailingDigit == 9) {
+                    int bubblePos = 0;
+                    // Note: in the long implementation, the most digits BCD can have at this point is
+                    // 15,
+                    // so bubblePos <= 15 and getDigitPos(bubblePos) is safe.
+                    for (; getDigitPos(bubblePos) == 9; bubblePos++) {
+                    }
+                    shiftRight(bubblePos); // shift off the trailing 9s
+                }
+                byte digit0 = getDigitPos(0);
+                assert digit0 != 9;
+                setDigitPos(0, (byte) (digit0 + 1));
+                precision += 1; // in case an extra digit got added
+            }
+
+            compact();
+        }
+    }
+
+    @Override
+    public void roundToInfinity() {
+        if (isApproximate) {
+            convertToAccurateDouble();
+        }
+    }
+
+    /**
+     * Appends a digit, optionally with one or more leading zeros, to the end of the value represented by
+     * this DecimalQuantity.
+     *
+     * <p>
+     * The primary use of this method is to construct numbers during a parsing loop. It allows parsing to
+     * take advantage of the digit list infrastructure primarily designed for formatting.
+     *
+     * @param value
+     *            The digit to append.
+     * @param leadingZeros
+     *            The number of zeros to append before the digit. For example, if the value in this
+     *            instance starts as 12.3, and you append a 4 with 1 leading zero, the value becomes
+     *            12.304.
+     * @param appendAsInteger
+     *            If true, increase the magnitude of existing digits to make room for the new digit. If
+     *            false, append to the end like a fraction digit. If true, there must not be any fraction
+     *            digits already in the number.
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public void appendDigit(byte value, int leadingZeros, boolean appendAsInteger) {
+        assert leadingZeros >= 0;
+
+        // Zero requires special handling to maintain the invariant that the least-significant digit
+        // in the BCD is nonzero.
+        if (value == 0) {
+            if (appendAsInteger && precision != 0) {
+                scale += leadingZeros + 1;
+            }
+            return;
+        }
+
+        // Deal with trailing zeros
+        if (scale > 0) {
+            leadingZeros += scale;
+            if (appendAsInteger) {
+                scale = 0;
+            }
+        }
+
+        // Append digit
+        shiftLeft(leadingZeros + 1);
+        setDigitPos(0, value);
+
+        // Fix scale if in integer mode
+        if (appendAsInteger) {
+            scale += leadingZeros + 1;
+        }
+    }
+
+    @Override
+    public String toPlainString() {
+        // NOTE: This logic is duplicated between here and DecimalQuantity_SimpleStorage.
+        StringBuilder sb = new StringBuilder();
+        if (isNegative()) {
+            sb.append('-');
+        }
+        for (int m = getUpperDisplayMagnitude(); m >= getLowerDisplayMagnitude(); m--) {
+            sb.append(getDigit(m));
+            if (m == 0)
+                sb.append('.');
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Returns a single digit from the BCD list. No internal state is changed by calling this method.
+     *
+     * @param position
+     *            The position of the digit to pop, counted in BCD units from the least significant
+     *            digit. If outside the range supported by the implementation, zero is returned.
+     * @return The digit at the specified location.
+     */
+    protected abstract byte getDigitPos(int position);
+
+    /**
+     * Sets the digit in the BCD list. This method only sets the digit; it is the caller's responsibility
+     * to call {@link #compact} after setting the digit.
+     *
+     * @param position
+     *            The position of the digit to pop, counted in BCD units from the least significant
+     *            digit. If outside the range supported by the implementation, an AssertionError is
+     *            thrown.
+     * @param value
+     *            The digit to set at the specified location.
+     */
+    protected abstract void setDigitPos(int position, byte value);
+
+    /**
+     * Adds zeros to the end of the BCD list. This will result in an invalid BCD representation; it is
+     * the caller's responsibility to do further manipulation and then call {@link #compact}.
+     *
+     * @param numDigits
+     *            The number of zeros to add.
+     */
+    protected abstract void shiftLeft(int numDigits);
+
+    /**
+     * Removes digits from the end of the BCD list. This may result in an invalid BCD representation; it
+     * is the caller's responsibility to follow-up with a call to {@link #compact}.
+     *
+     * @param numDigits
+     *            The number of zeros to add.
+     */
+    protected abstract void shiftRight(int numDigits);
+
+    /**
+     * Sets the internal representation to zero. Clears any values stored in scale, precision, hasDouble,
+     * origDouble, origDelta, and BCD data.
+     */
+    protected abstract void setBcdToZero();
+
+    /**
+     * Sets the internal BCD state to represent the value in the given int. The int is guaranteed to be
+     * either positive. The internal state is guaranteed to be empty when this method is called.
+     *
+     * @param n
+     *            The value to consume.
+     */
+    protected abstract void readIntToBcd(int input);
+
+    /**
+     * Sets the internal BCD state to represent the value in the given long. The long is guaranteed to be
+     * either positive. The internal state is guaranteed to be empty when this method is called.
+     *
+     * @param n
+     *            The value to consume.
+     */
+    protected abstract void readLongToBcd(long input);
+
+    /**
+     * Sets the internal BCD state to represent the value in the given BigInteger. The BigInteger is
+     * guaranteed to be positive, and it is guaranteed to be larger than Long.MAX_VALUE. The internal
+     * state is guaranteed to be empty when this method is called.
+     *
+     * @param n
+     *            The value to consume.
+     */
+    protected abstract void readBigIntegerToBcd(BigInteger input);
+
+    /**
+     * Returns a BigDecimal encoding the internal BCD value.
+     *
+     * @return A BigDecimal representation of the internal BCD.
+     */
+    protected abstract BigDecimal bcdToBigDecimal();
+
+    protected abstract void copyBcdFrom(DecimalQuantity _other);
+
+    /**
+     * Removes trailing zeros from the BCD (adjusting the scale as required) and then computes the
+     * precision. The precision is the number of digits in the number up through the greatest nonzero
+     * digit.
+     *
+     * <p>
+     * This method must always be called when bcd changes in order for assumptions to be correct in
+     * methods like {@link #fractionCount()}.
+     */
+    protected abstract void compact();
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity_DualStorageBCD.java b/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity_DualStorageBCD.java
index 89f868b..6006eec 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity_DualStorageBCD.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/DecimalQuantity_DualStorageBCD.java
@@ -7,413 +7,436 @@
 import java.math.BigInteger;
 
 /**
- * A DecimalQuantity with internal storage as a 64-bit BCD, with fallback to a byte array
- * for numbers that don't fit into the standard BCD.
+ * A DecimalQuantity with internal storage as a 64-bit BCD, with fallback to a byte array for numbers
+ * that don't fit into the standard BCD.
  * @hide Only a subset of ICU is exposed in Android
  */
 public final class DecimalQuantity_DualStorageBCD extends DecimalQuantity_AbstractBCD {
 
-  /**
-   * The BCD of the 16 digits of the number represented by this object. Every 4 bits of the long map
-   * to one digit. For example, the number "12345" in BCD is "0x12345".
-   *
-   * <p>Whenever bcd changes internally, {@link #compact()} must be called, except in special cases
-   * like setting the digit to zero.
-   */
-  private byte[] bcdBytes;
+    /**
+     * The BCD of the 16 digits of the number represented by this object. Every 4 bits of the long map to
+     * one digit. For example, the number "12345" in BCD is "0x12345".
+     *
+     * <p>
+     * Whenever bcd changes internally, {@link #compact()} must be called, except in special cases like
+     * setting the digit to zero.
+     */
+    private byte[] bcdBytes;
 
-  private long bcdLong = 0L;
+    private long bcdLong = 0L;
 
-  private boolean usingBytes = false;
+    private boolean usingBytes = false;
 
-  @Override
-  public int maxRepresentableDigits() {
-    return Integer.MAX_VALUE;
-  }
-
-  public DecimalQuantity_DualStorageBCD() {
-    setBcdToZero();
-    flags = 0;
-  }
-
-  public DecimalQuantity_DualStorageBCD(long input) {
-    setToLong(input);
-  }
-
-  public DecimalQuantity_DualStorageBCD(int input) {
-    setToInt(input);
-  }
-
-  public DecimalQuantity_DualStorageBCD(double input) {
-    setToDouble(input);
-  }
-
-  public DecimalQuantity_DualStorageBCD(BigInteger input) {
-    setToBigInteger(input);
-  }
-
-  public DecimalQuantity_DualStorageBCD(BigDecimal input) {
-    setToBigDecimal(input);
-  }
-
-  public DecimalQuantity_DualStorageBCD(DecimalQuantity_DualStorageBCD other) {
-    copyFrom(other);
-  }
-
-  public DecimalQuantity_DualStorageBCD(Number number) {
-    if (number instanceof Long) {
-      setToLong(number.longValue());
-    } else if (number instanceof Integer) {
-      setToInt(number.intValue());
-    } else if (number instanceof Double) {
-      setToDouble(number.doubleValue());
-    } else if (number instanceof BigInteger) {
-      setToBigInteger((BigInteger) number);
-    } else if (number instanceof BigDecimal) {
-      setToBigDecimal((BigDecimal) number);
-    } else if (number instanceof android.icu.math.BigDecimal) {
-      setToBigDecimal(((android.icu.math.BigDecimal) number).toBigDecimal());
-    } else {
-      throw new IllegalArgumentException(
-          "Number is of an unsupported type: " + number.getClass().getName());
+    @Override
+    public int maxRepresentableDigits() {
+        return Integer.MAX_VALUE;
     }
-  }
 
-  @Override
-  public DecimalQuantity createCopy() {
-    return new DecimalQuantity_DualStorageBCD(this);
-  }
-
-  @Override
-  protected byte getDigitPos(int position) {
-    if (usingBytes) {
-      if (position < 0 || position > precision) return 0;
-      return bcdBytes[position];
-    } else {
-      if (position < 0 || position >= 16) return 0;
-      return (byte) ((bcdLong >>> (position * 4)) & 0xf);
-    }
-  }
-
-  @Override
-  protected void setDigitPos(int position, byte value) {
-    assert position >= 0;
-    if (usingBytes) {
-      ensureCapacity(position + 1);
-      bcdBytes[position] = value;
-    } else if (position >= 16) {
-      switchStorage();
-      ensureCapacity(position + 1);
-      bcdBytes[position] = value;
-    } else {
-      int shift = position * 4;
-      bcdLong = bcdLong & ~(0xfL << shift) | ((long) value << shift);
-    }
-  }
-
-  @Override
-  protected void shiftLeft(int numDigits) {
-    if (!usingBytes && precision + numDigits > 16) {
-      switchStorage();
-    }
-    if (usingBytes) {
-      ensureCapacity(precision + numDigits);
-      int i = precision + numDigits - 1;
-      for (; i >= numDigits; i--) {
-        bcdBytes[i] = bcdBytes[i - numDigits];
-      }
-      for (; i >= 0; i--) {
-        bcdBytes[i] = 0;
-      }
-    } else {
-      bcdLong <<= (numDigits * 4);
-    }
-    scale -= numDigits;
-    precision += numDigits;
-  }
-
-  @Override
-  protected void shiftRight(int numDigits) {
-    if (usingBytes) {
-      int i = 0;
-      for (; i < precision - numDigits; i++) {
-        bcdBytes[i] = bcdBytes[i + numDigits];
-      }
-      for (; i < precision; i++) {
-        bcdBytes[i] = 0;
-      }
-    } else {
-      bcdLong >>>= (numDigits * 4);
-    }
-    scale += numDigits;
-    precision -= numDigits;
-  }
-
-  @Override
-  protected void setBcdToZero() {
-    if (usingBytes) {
-        bcdBytes = null;
-        usingBytes = false;
-    }
-    bcdLong = 0L;
-    scale = 0;
-    precision = 0;
-    isApproximate = false;
-    origDouble = 0;
-    origDelta = 0;
-  }
-
-  @Override
-  protected void readIntToBcd(int n) {
-    assert n != 0;
-    // ints always fit inside the long implementation.
-    long result = 0L;
-    int i = 16;
-    for (; n != 0; n /= 10, i--) {
-      result = (result >>> 4) + (((long) n % 10) << 60);
-    }
-    assert !usingBytes;
-    bcdLong = result >>> (i * 4);
-    scale = 0;
-    precision = 16 - i;
-  }
-
-  @Override
-  protected void readLongToBcd(long n) {
-    assert n != 0;
-    if (n >= 10000000000000000L) {
-      ensureCapacity();
-      int i = 0;
-      for (; n != 0L; n /= 10L, i++) {
-        bcdBytes[i] = (byte) (n % 10);
-      }
-      assert usingBytes;
-      scale = 0;
-      precision = i;
-    } else {
-      long result = 0L;
-      int i = 16;
-      for (; n != 0L; n /= 10L, i--) {
-        result = (result >>> 4) + ((n % 10) << 60);
-      }
-      assert i >= 0;
-      assert !usingBytes;
-      bcdLong = result >>> (i * 4);
-      scale = 0;
-      precision = 16 - i;
-    }
-  }
-
-  @Override
-  protected void readBigIntegerToBcd(BigInteger n) {
-    assert n.signum() != 0;
-    ensureCapacity(); // allocate initial byte array
-    int i = 0;
-    for (; n.signum() != 0; i++) {
-      BigInteger[] temp = n.divideAndRemainder(BigInteger.TEN);
-      ensureCapacity(i + 1);
-      bcdBytes[i] = temp[1].byteValue();
-      n = temp[0];
-    }
-    scale = 0;
-    precision = i;
-  }
-
-  @Override
-  protected BigDecimal bcdToBigDecimal() {
-    if (usingBytes) {
-      // Converting to a string here is faster than doing BigInteger/BigDecimal arithmetic.
-      BigDecimal result = new BigDecimal(toNumberString());
-      if (isNegative()) {
-          result = result.negate();
-      }
-      return result;
-    } else {
-      long tempLong = 0L;
-      for (int shift = (precision - 1); shift >= 0; shift--) {
-        tempLong = tempLong * 10 + getDigitPos(shift);
-      }
-      BigDecimal result = BigDecimal.valueOf(tempLong);
-      result = result.scaleByPowerOfTen(scale);
-      if (isNegative()) result = result.negate();
-      return result;
-    }
-  }
-
-  @Override
-  protected void compact() {
-    if (usingBytes) {
-      int delta = 0;
-      for (; delta < precision && bcdBytes[delta] == 0; delta++) ;
-      if (delta == precision) {
-        // Number is zero
+    public DecimalQuantity_DualStorageBCD() {
         setBcdToZero();
-        return;
-      } else {
-        // Remove trailing zeros
-        shiftRight(delta);
-      }
+        flags = 0;
+    }
 
-      // Compute precision
-      int leading = precision - 1;
-      for (; leading >= 0 && bcdBytes[leading] == 0; leading--) ;
-      precision = leading + 1;
+    public DecimalQuantity_DualStorageBCD(long input) {
+        setToLong(input);
+    }
 
-      // Switch storage mechanism if possible
-      if (precision <= 16) {
-        switchStorage();
-      }
+    public DecimalQuantity_DualStorageBCD(int input) {
+        setToInt(input);
+    }
 
-    } else {
-      if (bcdLong == 0L) {
-        // Number is zero
+    public DecimalQuantity_DualStorageBCD(double input) {
+        setToDouble(input);
+    }
+
+    public DecimalQuantity_DualStorageBCD(BigInteger input) {
+        setToBigInteger(input);
+    }
+
+    public DecimalQuantity_DualStorageBCD(BigDecimal input) {
+        setToBigDecimal(input);
+    }
+
+    public DecimalQuantity_DualStorageBCD(DecimalQuantity_DualStorageBCD other) {
+        copyFrom(other);
+    }
+
+    public DecimalQuantity_DualStorageBCD(Number number) {
+        if (number instanceof Long) {
+            setToLong(number.longValue());
+        } else if (number instanceof Integer) {
+            setToInt(number.intValue());
+        } else if (number instanceof Float) {
+            setToDouble(number.doubleValue());
+        } else if (number instanceof Double) {
+            setToDouble(number.doubleValue());
+        } else if (number instanceof BigInteger) {
+            setToBigInteger((BigInteger) number);
+        } else if (number instanceof BigDecimal) {
+            setToBigDecimal((BigDecimal) number);
+        } else if (number instanceof android.icu.math.BigDecimal) {
+            setToBigDecimal(((android.icu.math.BigDecimal) number).toBigDecimal());
+        } else {
+            throw new IllegalArgumentException(
+                    "Number is of an unsupported type: " + number.getClass().getName());
+        }
+    }
+
+    @Override
+    public DecimalQuantity createCopy() {
+        return new DecimalQuantity_DualStorageBCD(this);
+    }
+
+    @Override
+    protected byte getDigitPos(int position) {
+        if (usingBytes) {
+            if (position < 0 || position > precision)
+                return 0;
+            return bcdBytes[position];
+        } else {
+            if (position < 0 || position >= 16)
+                return 0;
+            return (byte) ((bcdLong >>> (position * 4)) & 0xf);
+        }
+    }
+
+    @Override
+    protected void setDigitPos(int position, byte value) {
+        assert position >= 0;
+        if (usingBytes) {
+            ensureCapacity(position + 1);
+            bcdBytes[position] = value;
+        } else if (position >= 16) {
+            switchStorage();
+            ensureCapacity(position + 1);
+            bcdBytes[position] = value;
+        } else {
+            int shift = position * 4;
+            bcdLong = bcdLong & ~(0xfL << shift) | ((long) value << shift);
+        }
+    }
+
+    @Override
+    protected void shiftLeft(int numDigits) {
+        if (!usingBytes && precision + numDigits > 16) {
+            switchStorage();
+        }
+        if (usingBytes) {
+            ensureCapacity(precision + numDigits);
+            int i = precision + numDigits - 1;
+            for (; i >= numDigits; i--) {
+                bcdBytes[i] = bcdBytes[i - numDigits];
+            }
+            for (; i >= 0; i--) {
+                bcdBytes[i] = 0;
+            }
+        } else {
+            bcdLong <<= (numDigits * 4);
+        }
+        scale -= numDigits;
+        precision += numDigits;
+    }
+
+    @Override
+    protected void shiftRight(int numDigits) {
+        if (usingBytes) {
+            int i = 0;
+            for (; i < precision - numDigits; i++) {
+                bcdBytes[i] = bcdBytes[i + numDigits];
+            }
+            for (; i < precision; i++) {
+                bcdBytes[i] = 0;
+            }
+        } else {
+            bcdLong >>>= (numDigits * 4);
+        }
+        scale += numDigits;
+        precision -= numDigits;
+    }
+
+    @Override
+    protected void setBcdToZero() {
+        if (usingBytes) {
+            bcdBytes = null;
+            usingBytes = false;
+        }
+        bcdLong = 0L;
+        scale = 0;
+        precision = 0;
+        isApproximate = false;
+        origDouble = 0;
+        origDelta = 0;
+    }
+
+    @Override
+    protected void readIntToBcd(int n) {
+        assert n != 0;
+        // ints always fit inside the long implementation.
+        long result = 0L;
+        int i = 16;
+        for (; n != 0; n /= 10, i--) {
+            result = (result >>> 4) + (((long) n % 10) << 60);
+        }
+        assert !usingBytes;
+        bcdLong = result >>> (i * 4);
+        scale = 0;
+        precision = 16 - i;
+    }
+
+    @Override
+    protected void readLongToBcd(long n) {
+        assert n != 0;
+        if (n >= 10000000000000000L) {
+            ensureCapacity();
+            int i = 0;
+            for (; n != 0L; n /= 10L, i++) {
+                bcdBytes[i] = (byte) (n % 10);
+            }
+            assert usingBytes;
+            scale = 0;
+            precision = i;
+        } else {
+            long result = 0L;
+            int i = 16;
+            for (; n != 0L; n /= 10L, i--) {
+                result = (result >>> 4) + ((n % 10) << 60);
+            }
+            assert i >= 0;
+            assert !usingBytes;
+            bcdLong = result >>> (i * 4);
+            scale = 0;
+            precision = 16 - i;
+        }
+    }
+
+    @Override
+    protected void readBigIntegerToBcd(BigInteger n) {
+        assert n.signum() != 0;
+        ensureCapacity(); // allocate initial byte array
+        int i = 0;
+        for (; n.signum() != 0; i++) {
+            BigInteger[] temp = n.divideAndRemainder(BigInteger.TEN);
+            ensureCapacity(i + 1);
+            bcdBytes[i] = temp[1].byteValue();
+            n = temp[0];
+        }
+        scale = 0;
+        precision = i;
+    }
+
+    @Override
+    protected BigDecimal bcdToBigDecimal() {
+        if (usingBytes) {
+            // Converting to a string here is faster than doing BigInteger/BigDecimal arithmetic.
+            BigDecimal result = new BigDecimal(toNumberString());
+            if (isNegative()) {
+                result = result.negate();
+            }
+            return result;
+        } else {
+            long tempLong = 0L;
+            for (int shift = (precision - 1); shift >= 0; shift--) {
+                tempLong = tempLong * 10 + getDigitPos(shift);
+            }
+            BigDecimal result = BigDecimal.valueOf(tempLong);
+            result = result.scaleByPowerOfTen(scale);
+            if (isNegative())
+                result = result.negate();
+            return result;
+        }
+    }
+
+    @Override
+    protected void compact() {
+        if (usingBytes) {
+            int delta = 0;
+            for (; delta < precision && bcdBytes[delta] == 0; delta++)
+                ;
+            if (delta == precision) {
+                // Number is zero
+                setBcdToZero();
+                return;
+            } else {
+                // Remove trailing zeros
+                shiftRight(delta);
+            }
+
+            // Compute precision
+            int leading = precision - 1;
+            for (; leading >= 0 && bcdBytes[leading] == 0; leading--)
+                ;
+            precision = leading + 1;
+
+            // Switch storage mechanism if possible
+            if (precision <= 16) {
+                switchStorage();
+            }
+
+        } else {
+            if (bcdLong == 0L) {
+                // Number is zero
+                setBcdToZero();
+                return;
+            }
+
+            // Compact the number (remove trailing zeros)
+            int delta = Long.numberOfTrailingZeros(bcdLong) / 4;
+            bcdLong >>>= delta * 4;
+            scale += delta;
+
+            // Compute precision
+            precision = 16 - (Long.numberOfLeadingZeros(bcdLong) / 4);
+        }
+    }
+
+    /** Ensure that a byte array of at least 40 digits is allocated. */
+    private void ensureCapacity() {
+        ensureCapacity(40);
+    }
+
+    private void ensureCapacity(int capacity) {
+        if (capacity == 0)
+            return;
+        int oldCapacity = usingBytes ? bcdBytes.length : 0;
+        if (!usingBytes) {
+            bcdBytes = new byte[capacity];
+        } else if (oldCapacity < capacity) {
+            byte[] bcd1 = new byte[capacity * 2];
+            System.arraycopy(bcdBytes, 0, bcd1, 0, oldCapacity);
+            bcdBytes = bcd1;
+        }
+        usingBytes = true;
+    }
+
+    /** Switches the internal storage mechanism between the 64-bit long and the byte array. */
+    private void switchStorage() {
+        if (usingBytes) {
+            // Change from bytes to long
+            bcdLong = 0L;
+            for (int i = precision - 1; i >= 0; i--) {
+                bcdLong <<= 4;
+                bcdLong |= bcdBytes[i];
+            }
+            bcdBytes = null;
+            usingBytes = false;
+        } else {
+            // Change from long to bytes
+            ensureCapacity();
+            for (int i = 0; i < precision; i++) {
+                bcdBytes[i] = (byte) (bcdLong & 0xf);
+                bcdLong >>>= 4;
+            }
+            assert usingBytes;
+        }
+    }
+
+    @Override
+    protected void copyBcdFrom(DecimalQuantity _other) {
+        DecimalQuantity_DualStorageBCD other = (DecimalQuantity_DualStorageBCD) _other;
         setBcdToZero();
-        return;
-      }
-
-      // Compact the number (remove trailing zeros)
-      int delta = Long.numberOfTrailingZeros(bcdLong) / 4;
-      bcdLong >>>= delta * 4;
-      scale += delta;
-
-      // Compute precision
-      precision = 16 - (Long.numberOfLeadingZeros(bcdLong) / 4);
-    }
-  }
-
-  /** Ensure that a byte array of at least 40 digits is allocated. */
-  private void ensureCapacity() {
-    ensureCapacity(40);
-  }
-
-  private void ensureCapacity(int capacity) {
-    if (capacity == 0) return;
-    int oldCapacity = usingBytes ? bcdBytes.length : 0;
-    if (!usingBytes) {
-      bcdBytes = new byte[capacity];
-    } else if (oldCapacity < capacity) {
-      byte[] bcd1 = new byte[capacity * 2];
-      System.arraycopy(bcdBytes, 0, bcd1, 0, oldCapacity);
-      bcdBytes = bcd1;
-    }
-    usingBytes = true;
-  }
-
-  /** Switches the internal storage mechanism between the 64-bit long and the byte array. */
-  private void switchStorage() {
-    if (usingBytes) {
-      // Change from bytes to long
-      bcdLong = 0L;
-      for (int i = precision - 1; i >= 0; i--) {
-        bcdLong <<= 4;
-        bcdLong |= bcdBytes[i];
-      }
-      bcdBytes = null;
-      usingBytes = false;
-    } else {
-      // Change from long to bytes
-      ensureCapacity();
-      for (int i = 0; i < precision; i++) {
-        bcdBytes[i] = (byte) (bcdLong & 0xf);
-        bcdLong >>>= 4;
-      }
-      assert usingBytes;
-    }
-  }
-
-  @Override
-  protected void copyBcdFrom(DecimalQuantity _other) {
-    DecimalQuantity_DualStorageBCD other = (DecimalQuantity_DualStorageBCD) _other;
-    setBcdToZero();
-    if (other.usingBytes) {
-      ensureCapacity(other.precision);
-      System.arraycopy(other.bcdBytes, 0, bcdBytes, 0, other.precision);
-    } else {
-      bcdLong = other.bcdLong;
-    }
-  }
-
-  /**
-   * Checks whether the bytes stored in this instance are all valid. For internal unit testing only.
-   *
-   * @return An error message if this instance is invalid, or null if this instance is healthy.
-   * @deprecated This API is for ICU internal use only.
- * @hide draft / provisional / internal are hidden on Android
-   */
-  @Deprecated
-  public String checkHealth() {
-    if (usingBytes) {
-      if (bcdLong != 0) return "Value in bcdLong but we are in byte mode";
-      if (precision == 0) return "Zero precision but we are in byte mode";
-      if (precision > bcdBytes.length) return "Precision exceeds length of byte array";
-      if (getDigitPos(precision - 1) == 0) return "Most significant digit is zero in byte mode";
-      if (getDigitPos(0) == 0) return "Least significant digit is zero in long mode";
-      for (int i = 0; i < precision; i++) {
-        if (getDigitPos(i) >= 10) return "Digit exceeding 10 in byte array";
-        if (getDigitPos(i) < 0) return "Digit below 0 in byte array";
-      }
-      for (int i = precision; i < bcdBytes.length; i++) {
-        if (getDigitPos(i) != 0) return "Nonzero digits outside of range in byte array";
-      }
-    } else {
-      if (bcdBytes != null) {
-        for (int i = 0; i < bcdBytes.length; i++) {
-          if (bcdBytes[i] != 0) return "Nonzero digits in byte array but we are in long mode";
+        if (other.usingBytes) {
+            ensureCapacity(other.precision);
+            System.arraycopy(other.bcdBytes, 0, bcdBytes, 0, other.precision);
+        } else {
+            bcdLong = other.bcdLong;
         }
-      }
-      if (precision == 0 && bcdLong != 0) return "Value in bcdLong even though precision is zero";
-      if (precision > 16) return "Precision exceeds length of long";
-      if (precision != 0 && getDigitPos(precision - 1) == 0)
-        return "Most significant digit is zero in long mode";
-      if (precision != 0 && getDigitPos(0) == 0)
-        return "Least significant digit is zero in long mode";
-      for (int i = 0; i < precision; i++) {
-        if (getDigitPos(i) >= 10) return "Digit exceeding 10 in long";
-        if (getDigitPos(i) < 0) return "Digit below 0 in long (?!)";
-      }
-      for (int i = precision; i < 16; i++) {
-        if (getDigitPos(i) != 0) return "Nonzero digits outside of range in long";
-      }
     }
 
-    return null;
-  }
-
-  /**
-   * Checks whether this {@link DecimalQuantity_DualStorageBCD} is using its internal byte array storage mechanism.
-   *
-   * @return true if an internal byte array is being used; false if a long is being used.
-   * @deprecated This API is ICU internal only.
- * @hide draft / provisional / internal are hidden on Android
-   */
-  @Deprecated
-  public boolean isUsingBytes() {
-    return usingBytes;
-  }
-
-  @Override
-  public String toString() {
-    return String.format(
-        "<DecimalQuantity %s:%d:%d:%s %s %s>",
-        (lOptPos > 1000 ? "999" : String.valueOf(lOptPos)),
-        lReqPos,
-        rReqPos,
-        (rOptPos < -1000 ? "-999" : String.valueOf(rOptPos)),
-        (usingBytes ? "bytes" : "long"),
-        toNumberString());
-  }
-
-  public String toNumberString() {
-      StringBuilder sb = new StringBuilder();
-      if (usingBytes) {
-        for (int i = precision - 1; i >= 0; i--) {
-          sb.append(bcdBytes[i]);
+    /**
+     * Checks whether the bytes stored in this instance are all valid. For internal unit testing only.
+     *
+     * @return An error message if this instance is invalid, or null if this instance is healthy.
+     * @deprecated This API is for ICU internal use only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public String checkHealth() {
+        if (usingBytes) {
+            if (bcdLong != 0)
+                return "Value in bcdLong but we are in byte mode";
+            if (precision == 0)
+                return "Zero precision but we are in byte mode";
+            if (precision > bcdBytes.length)
+                return "Precision exceeds length of byte array";
+            if (getDigitPos(precision - 1) == 0)
+                return "Most significant digit is zero in byte mode";
+            if (getDigitPos(0) == 0)
+                return "Least significant digit is zero in long mode";
+            for (int i = 0; i < precision; i++) {
+                if (getDigitPos(i) >= 10)
+                    return "Digit exceeding 10 in byte array";
+                if (getDigitPos(i) < 0)
+                    return "Digit below 0 in byte array";
+            }
+            for (int i = precision; i < bcdBytes.length; i++) {
+                if (getDigitPos(i) != 0)
+                    return "Nonzero digits outside of range in byte array";
+            }
+        } else {
+            if (bcdBytes != null) {
+                for (int i = 0; i < bcdBytes.length; i++) {
+                    if (bcdBytes[i] != 0)
+                        return "Nonzero digits in byte array but we are in long mode";
+                }
+            }
+            if (precision == 0 && bcdLong != 0)
+                return "Value in bcdLong even though precision is zero";
+            if (precision > 16)
+                return "Precision exceeds length of long";
+            if (precision != 0 && getDigitPos(precision - 1) == 0)
+                return "Most significant digit is zero in long mode";
+            if (precision != 0 && getDigitPos(0) == 0)
+                return "Least significant digit is zero in long mode";
+            for (int i = 0; i < precision; i++) {
+                if (getDigitPos(i) >= 10)
+                    return "Digit exceeding 10 in long";
+                if (getDigitPos(i) < 0)
+                    return "Digit below 0 in long (?!)";
+            }
+            for (int i = precision; i < 16; i++) {
+                if (getDigitPos(i) != 0)
+                    return "Nonzero digits outside of range in long";
+            }
         }
-      } else {
-        sb.append(Long.toHexString(bcdLong));
-      }
-      sb.append("E");
-      sb.append(scale);
-      return sb.toString();
-  }
+
+        return null;
+    }
+
+    /**
+     * Checks whether this {@link DecimalQuantity_DualStorageBCD} is using its internal byte array
+     * storage mechanism.
+     *
+     * @return true if an internal byte array is being used; false if a long is being used.
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public boolean isUsingBytes() {
+        return usingBytes;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("<DecimalQuantity %s:%d:%d:%s %s %s>",
+                (lOptPos > 1000 ? "999" : String.valueOf(lOptPos)),
+                lReqPos,
+                rReqPos,
+                (rOptPos < -1000 ? "-999" : String.valueOf(rOptPos)),
+                (usingBytes ? "bytes" : "long"),
+                toNumberString());
+    }
+
+    public String toNumberString() {
+        StringBuilder sb = new StringBuilder();
+        if (usingBytes) {
+            for (int i = precision - 1; i >= 0; i--) {
+                sb.append(bcdBytes[i]);
+            }
+        } else {
+            sb.append(Long.toHexString(bcdLong));
+        }
+        sb.append("E");
+        sb.append(scale);
+        return sb.toString();
+    }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/Grouper.java b/android_icu4j/src/main/java/android/icu/impl/number/Grouper.java
new file mode 100644
index 0000000..ebe659d
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/Grouper.java
@@ -0,0 +1,166 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number;
+
+import android.icu.impl.ICUData;
+import android.icu.impl.ICUResourceBundle;
+import android.icu.impl.number.PatternStringParser.ParsedPatternInfo;
+import android.icu.number.NumberFormatter.GroupingStrategy;
+import android.icu.util.ULocale;
+import android.icu.util.UResourceBundle;
+
+/**
+ * A full options object for grouping sizes.
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class Grouper {
+
+    private static final Grouper GROUPER_NEVER = new Grouper((short) -1, (short) -1, (short) -2);
+    private static final Grouper GROUPER_MIN2 = new Grouper((short) -2, (short) -2, (short) -3);
+    private static final Grouper GROUPER_AUTO = new Grouper((short) -2, (short) -2, (short) -2);
+    private static final Grouper GROUPER_ON_ALIGNED = new Grouper((short) -4, (short) -4, (short) 1);
+
+    private static final Grouper GROUPER_WESTERN = new Grouper((short) 3, (short) 3, (short) 1);
+    private static final Grouper GROUPER_INDIC = new Grouper((short) 3, (short) 2, (short) 1);
+    private static final Grouper GROUPER_WESTERN_MIN2 = new Grouper((short) 3, (short) 3, (short) 2);
+    private static final Grouper GROUPER_INDIC_MIN2 = new Grouper((short) 3, (short) 2, (short) 2);
+
+    /**
+     * Convert from the GroupingStrategy enum to a Grouper object.
+     */
+    public static Grouper forStrategy(GroupingStrategy grouping) {
+        switch (grouping) {
+        case OFF:
+            return GROUPER_NEVER;
+        case MIN2:
+            return GROUPER_MIN2;
+        case AUTO:
+            return GROUPER_AUTO;
+        case ON_ALIGNED:
+            return GROUPER_ON_ALIGNED;
+        case THOUSANDS:
+            return GROUPER_WESTERN;
+        default:
+            throw new AssertionError();
+        }
+    }
+
+    /**
+     * Resolve the values in Properties to a Grouper object.
+     */
+    public static Grouper forProperties(DecimalFormatProperties properties) {
+        short grouping1 = (short) properties.getGroupingSize();
+        short grouping2 = (short) properties.getSecondaryGroupingSize();
+        short minGrouping = (short) properties.getMinimumGroupingDigits();
+        grouping1 = grouping1 > 0 ? grouping1 : grouping2 > 0 ? grouping2 : grouping1;
+        grouping2 = grouping2 > 0 ? grouping2 : grouping1;
+        return getInstance(grouping1, grouping2, minGrouping);
+    }
+
+    public static Grouper getInstance(short grouping1, short grouping2, short minGrouping) {
+        if (grouping1 == -1) {
+            return GROUPER_NEVER;
+        } else if (grouping1 == 3 && grouping2 == 3 && minGrouping == 1) {
+            return GROUPER_WESTERN;
+        } else if (grouping1 == 3 && grouping2 == 2 && minGrouping == 1) {
+            return GROUPER_INDIC;
+        } else if (grouping1 == 3 && grouping2 == 3 && minGrouping == 2) {
+            return GROUPER_WESTERN_MIN2;
+        } else if (grouping1 == 3 && grouping2 == 2 && minGrouping == 2) {
+            return GROUPER_INDIC_MIN2;
+        } else {
+            return new Grouper(grouping1, grouping2, minGrouping);
+        }
+    }
+
+    private static short getMinGroupingForLocale(ULocale locale) {
+        // TODO: Cache this?
+        ICUResourceBundle resource = (ICUResourceBundle) UResourceBundle
+                .getBundleInstance(ICUData.ICU_BASE_NAME, locale);
+        String result = resource.getStringWithFallback("NumberElements/minimumGroupingDigits");
+        return Short.valueOf(result);
+    }
+
+    /**
+     * The primary grouping size, with the following special values:
+     * <ul>
+     * <li>-1 = no grouping
+     * <li>-2 = needs locale data
+     * <li>-4 = fall back to Western grouping if not in locale
+     * </ul>
+     */
+    private final short grouping1;
+
+    /**
+     * The secondary grouping size, with the following special values:
+     * <ul>
+     * <li>-1 = no grouping
+     * <li>-2 = needs locale data
+     * <li>-4 = fall back to Western grouping if not in locale
+     * </ul>
+     */
+    private final short grouping2;
+
+    /**
+     * The minimum gropuing size, with the following special values:
+     * <ul>
+     * <li>-2 = needs locale data
+     * <li>-3 = no less than 2
+     * </ul>
+     */
+    private final short minGrouping;
+
+    private Grouper(short grouping1, short grouping2, short minGrouping) {
+        this.grouping1 = grouping1;
+        this.grouping2 = grouping2;
+        this.minGrouping = minGrouping;
+    }
+
+    public Grouper withLocaleData(ULocale locale, ParsedPatternInfo patternInfo) {
+        if (this.grouping1 != -2 && this.grouping1 != -4) {
+            return this;
+        }
+
+        short grouping1 = (short) (patternInfo.positive.groupingSizes & 0xffff);
+        short grouping2 = (short) ((patternInfo.positive.groupingSizes >>> 16) & 0xffff);
+        short grouping3 = (short) ((patternInfo.positive.groupingSizes >>> 32) & 0xffff);
+        if (grouping2 == -1) {
+            grouping1 = this.grouping1 == -4 ? (short) 3 : (short) -1;
+        }
+        if (grouping3 == -1) {
+            grouping2 = grouping1;
+        }
+
+        short minGrouping;
+        if (this.minGrouping == -2) {
+            minGrouping = getMinGroupingForLocale(locale);
+        } else if (this.minGrouping == -3) {
+            minGrouping = (short) Math.max(2, getMinGroupingForLocale(locale));
+        } else {
+            minGrouping = this.minGrouping;
+        }
+
+        return getInstance(grouping1, grouping2, minGrouping);
+    }
+
+    public boolean groupAtPosition(int position, DecimalQuantity value) {
+        assert grouping1 != -2 && grouping1 != -4;
+        if (grouping1 == -1 || grouping1 == 0) {
+            // Either -1 or 0 means "no grouping"
+            return false;
+        }
+        position -= grouping1;
+        return position >= 0
+                && (position % grouping2) == 0
+                && value.getUpperDisplayMagnitude() - grouping1 + 1 >= minGrouping;
+    }
+
+    public short getPrimary() {
+        return grouping1;
+    }
+
+    public short getSecondary() {
+        return grouping2;
+    }
+}
\ No newline at end of file
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/LongNameHandler.java b/android_icu4j/src/main/java/android/icu/impl/number/LongNameHandler.java
index c224d6f..9515b8b 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/LongNameHandler.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/LongNameHandler.java
@@ -5,6 +5,7 @@
 
 import java.util.EnumMap;
 import java.util.Map;
+import java.util.MissingResourceException;
 
 import android.icu.impl.CurrencyData;
 import android.icu.impl.ICUData;
@@ -26,40 +27,70 @@
  */
 public class LongNameHandler implements MicroPropsGenerator {
 
+    private static final int DNAM_INDEX = StandardPlural.COUNT;
+    private static final int PER_INDEX = StandardPlural.COUNT + 1;
+    private static final int ARRAY_LENGTH = StandardPlural.COUNT + 2;
+
+    private static int getIndex(String pluralKeyword) {
+        // pluralKeyword can also be "dnam" or "per"
+        if (pluralKeyword.equals("dnam")) {
+            return DNAM_INDEX;
+        } else if (pluralKeyword.equals("per")) {
+            return PER_INDEX;
+        } else {
+            return StandardPlural.fromString(pluralKeyword).ordinal();
+        }
+    }
+
+    private static String getWithPlural(String[] strings, StandardPlural plural) {
+        String result = strings[plural.ordinal()];
+        if (result == null) {
+            result = strings[StandardPlural.OTHER.ordinal()];
+        }
+        if (result == null) {
+            // There should always be data in the "other" plural variant.
+            throw new ICUException("Could not find data in 'other' plural variant");
+        }
+        return result;
+    }
+
     //////////////////////////
     /// BEGIN DATA LOADING ///
     //////////////////////////
 
     private static final class PluralTableSink extends UResource.Sink {
 
-        Map<StandardPlural, String> output;
+        String[] outArray;
 
-        public PluralTableSink(Map<StandardPlural, String> output) {
-            this.output = output;
+        public PluralTableSink(String[] outArray) {
+            this.outArray = outArray;
         }
 
         @Override
         public void put(UResource.Key key, UResource.Value value, boolean noFallback) {
             UResource.Table pluralsTable = value.getTable();
             for (int i = 0; pluralsTable.getKeyAndValue(i, key, value); ++i) {
-                if (key.contentEquals("dnam") || key.contentEquals("per")) {
-                    continue;
-                }
-                StandardPlural plural = StandardPlural.fromString(key);
-                if (output.containsKey(plural)) {
+                int index = getIndex(key.toString());
+                if (outArray[index] != null) {
                     continue;
                 }
                 String formatString = value.getString();
-                output.put(plural, formatString);
+                outArray[index] = formatString;
             }
         }
     }
 
-    private static void getMeasureData(ULocale locale, MeasureUnit unit, UnitWidth width,
-            Map<StandardPlural, String> output) {
-        PluralTableSink sink = new PluralTableSink(output);
+    // NOTE: outArray MUST have at least ARRAY_LENGTH entries. No bounds checking is performed.
+
+    private static void getMeasureData(
+            ULocale locale,
+            MeasureUnit unit,
+            UnitWidth width,
+            String[] outArray) {
+        PluralTableSink sink = new PluralTableSink(outArray);
         ICUResourceBundle resource;
-        resource = (ICUResourceBundle) UResourceBundle.getBundleInstance(ICUData.ICU_UNIT_BASE_NAME, locale);
+        resource = (ICUResourceBundle) UResourceBundle.getBundleInstance(ICUData.ICU_UNIT_BASE_NAME,
+                locale);
         StringBuilder key = new StringBuilder();
         key.append("units");
         if (width == UnitWidth.NARROW) {
@@ -71,24 +102,49 @@
         key.append(unit.getType());
         key.append("/");
         key.append(unit.getSubtype());
-        resource.getAllItemsWithFallback(key.toString(), sink);
+        try {
+            resource.getAllItemsWithFallback(key.toString(), sink);
+        } catch (MissingResourceException e) {
+            throw new IllegalArgumentException("No data for unit " + unit + ", width " + width, e);
+        }
     }
 
-    private static void getCurrencyLongNameData(ULocale locale, Currency currency, Map<StandardPlural, String> output) {
+    private static void getCurrencyLongNameData(ULocale locale, Currency currency, String[] outArray) {
         // In ICU4J, this method gets a CurrencyData from CurrencyData.provider.
         // TODO(ICU4J): Implement this without going through CurrencyData, like in ICU4C?
         Map<String, String> data = CurrencyData.provider.getInstance(locale, true).getUnitPatterns();
         for (Map.Entry<String, String> e : data.entrySet()) {
             String pluralKeyword = e.getKey();
-            StandardPlural plural = StandardPlural.fromString(e.getKey());
+            int index = getIndex(pluralKeyword);
             String longName = currency.getName(locale, Currency.PLURAL_LONG_NAME, pluralKeyword, null);
             String simpleFormat = e.getValue();
             // Example pattern from data: "{0} {1}"
             // Example output after find-and-replace: "{0} US dollars"
             simpleFormat = simpleFormat.replace("{1}", longName);
-            // String compiled = SimpleFormatterImpl.compileToStringMinMaxArguments(simpleFormat, sb, 1, 1);
+            // String compiled = SimpleFormatterImpl.compileToStringMinMaxArguments(simpleFormat, sb, 1,
+            // 1);
             // SimpleModifier mod = new SimpleModifier(compiled, Field.CURRENCY, false);
-            output.put(plural, simpleFormat);
+            outArray[index] = simpleFormat;
+        }
+    }
+
+    private static String getPerUnitFormat(ULocale locale, UnitWidth width) {
+        ICUResourceBundle resource;
+        resource = (ICUResourceBundle) UResourceBundle.getBundleInstance(ICUData.ICU_UNIT_BASE_NAME,
+                locale);
+        StringBuilder key = new StringBuilder();
+        key.append("units");
+        if (width == UnitWidth.NARROW) {
+            key.append("Narrow");
+        } else if (width == UnitWidth.SHORT) {
+            key.append("Short");
+        }
+        key.append("/compound/per");
+        try {
+            return resource.getStringWithFallback(key.toString());
+        } catch (MissingResourceException e) {
+            throw new IllegalArgumentException(
+                    "Could not find x-per-y format for " + locale + ", width " + width);
         }
     }
 
@@ -100,16 +156,27 @@
     private final PluralRules rules;
     private final MicroPropsGenerator parent;
 
-    private LongNameHandler(Map<StandardPlural, SimpleModifier> modifiers, PluralRules rules,
+    private LongNameHandler(
+            Map<StandardPlural, SimpleModifier> modifiers,
+            PluralRules rules,
             MicroPropsGenerator parent) {
         this.modifiers = modifiers;
         this.rules = rules;
         this.parent = parent;
     }
 
-    public static LongNameHandler forCurrencyLongNames(ULocale locale, Currency currency, PluralRules rules,
+    public static String getUnitDisplayName(ULocale locale, MeasureUnit unit, UnitWidth width) {
+        String[] measureData = new String[ARRAY_LENGTH];
+        getMeasureData(locale, unit, width, measureData);
+        return measureData[DNAM_INDEX];
+    }
+
+    public static LongNameHandler forCurrencyLongNames(
+            ULocale locale,
+            Currency currency,
+            PluralRules rules,
             MicroPropsGenerator parent) {
-        Map<StandardPlural, String> simpleFormats = new EnumMap<StandardPlural, String>(StandardPlural.class);
+        String[] simpleFormats = new String[ARRAY_LENGTH];
         getCurrencyLongNameData(locale, currency, simpleFormats);
         // TODO(ICU4J): Reduce the number of object creations here?
         Map<StandardPlural, SimpleModifier> modifiers = new EnumMap<StandardPlural, SimpleModifier>(
@@ -118,9 +185,25 @@
         return new LongNameHandler(modifiers, rules, parent);
     }
 
-    public static LongNameHandler forMeasureUnit(ULocale locale, MeasureUnit unit, UnitWidth width, PluralRules rules,
+    public static LongNameHandler forMeasureUnit(
+            ULocale locale,
+            MeasureUnit unit,
+            MeasureUnit perUnit,
+            UnitWidth width,
+            PluralRules rules,
             MicroPropsGenerator parent) {
-        Map<StandardPlural, String> simpleFormats = new EnumMap<StandardPlural, String>(StandardPlural.class);
+        if (perUnit != null) {
+            // Compound unit: first try to simplify (e.g., meters per second is its own unit).
+            MeasureUnit simplified = MeasureUnit.resolveUnitPerUnit(unit, perUnit);
+            if (simplified != null) {
+                unit = simplified;
+            } else {
+                // No simplified form is available.
+                return forCompoundUnit(locale, unit, perUnit, width, rules, parent);
+            }
+        }
+
+        String[] simpleFormats = new String[ARRAY_LENGTH];
         getMeasureData(locale, unit, width, simpleFormats);
         // TODO: What field to use for units?
         // TODO(ICU4J): Reduce the number of object creations here?
@@ -130,20 +213,66 @@
         return new LongNameHandler(modifiers, rules, parent);
     }
 
-    private static void simpleFormatsToModifiers(Map<StandardPlural, String> simpleFormats, NumberFormat.Field field,
+    private static LongNameHandler forCompoundUnit(
+            ULocale locale,
+            MeasureUnit unit,
+            MeasureUnit perUnit,
+            UnitWidth width,
+            PluralRules rules,
+            MicroPropsGenerator parent) {
+        String[] primaryData = new String[ARRAY_LENGTH];
+        getMeasureData(locale, unit, width, primaryData);
+        String[] secondaryData = new String[ARRAY_LENGTH];
+        getMeasureData(locale, perUnit, width, secondaryData);
+        String perUnitFormat;
+        if (secondaryData[PER_INDEX] != null) {
+            perUnitFormat = secondaryData[PER_INDEX];
+        } else {
+            String rawPerUnitFormat = getPerUnitFormat(locale, width);
+            // rawPerUnitFormat is something like "{0}/{1}"; we need to substitute in the secondary unit.
+            // TODO: Lots of thrashing. Improve?
+            StringBuilder sb = new StringBuilder();
+            String compiled = SimpleFormatterImpl
+                    .compileToStringMinMaxArguments(rawPerUnitFormat, sb, 2, 2);
+            String secondaryFormat = getWithPlural(secondaryData, StandardPlural.ONE);
+            String secondaryCompiled = SimpleFormatterImpl
+                    .compileToStringMinMaxArguments(secondaryFormat, sb, 1, 1);
+            String secondaryString = SimpleFormatterImpl.getTextWithNoArguments(secondaryCompiled)
+                    .trim();
+            perUnitFormat = SimpleFormatterImpl.formatCompiledPattern(compiled, "{0}", secondaryString);
+        }
+        // TODO: What field to use for units?
+        Map<StandardPlural, SimpleModifier> modifiers = new EnumMap<StandardPlural, SimpleModifier>(
+                StandardPlural.class);
+        multiSimpleFormatsToModifiers(primaryData, perUnitFormat, null, modifiers);
+        return new LongNameHandler(modifiers, rules, parent);
+    }
+
+    private static void simpleFormatsToModifiers(
+            String[] simpleFormats,
+            NumberFormat.Field field,
             Map<StandardPlural, SimpleModifier> output) {
         StringBuilder sb = new StringBuilder();
         for (StandardPlural plural : StandardPlural.VALUES) {
-            String simpleFormat = simpleFormats.get(plural);
-            if (simpleFormat == null) {
-                simpleFormat = simpleFormats.get(StandardPlural.OTHER);
-            }
-            if (simpleFormat == null) {
-                // There should always be data in the "other" plural variant.
-                throw new ICUException("Could not find data in 'other' plural variant with field " + field);
-            }
-            String compiled = SimpleFormatterImpl.compileToStringMinMaxArguments(simpleFormat, sb, 1, 1);
-            output.put(plural, new SimpleModifier(compiled, null, false));
+            String simpleFormat = getWithPlural(simpleFormats, plural);
+            String compiled = SimpleFormatterImpl.compileToStringMinMaxArguments(simpleFormat, sb, 0, 1);
+            output.put(plural, new SimpleModifier(compiled, field, false));
+        }
+    }
+
+    private static void multiSimpleFormatsToModifiers(
+            String[] leadFormats,
+            String trailFormat,
+            NumberFormat.Field field,
+            Map<StandardPlural, SimpleModifier> output) {
+        StringBuilder sb = new StringBuilder();
+        String trailCompiled = SimpleFormatterImpl.compileToStringMinMaxArguments(trailFormat, sb, 1, 1);
+        for (StandardPlural plural : StandardPlural.VALUES) {
+            String leadFormat = getWithPlural(leadFormats, plural);
+            String compoundFormat = SimpleFormatterImpl.formatCompiledPattern(trailCompiled, leadFormat);
+            String compoundCompiled = SimpleFormatterImpl
+                    .compileToStringMinMaxArguments(compoundFormat, sb, 0, 1);
+            output.put(plural, new SimpleModifier(compoundCompiled, field, false));
         }
     }
 
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/MacroProps.java b/android_icu4j/src/main/java/android/icu/impl/number/MacroProps.java
index 113a079..6571efe 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/MacroProps.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/MacroProps.java
@@ -4,7 +4,6 @@
 package android.icu.impl.number;
 
 import android.icu.impl.Utility;
-import android.icu.number.Grouper;
 import android.icu.number.IntegerWidth;
 import android.icu.number.Notation;
 import android.icu.number.NumberFormatter.DecimalSeparatorDisplay;
@@ -19,92 +18,114 @@
  * @hide Only a subset of ICU is exposed in Android
  */
 public class MacroProps implements Cloneable {
-  public Notation notation;
-  public MeasureUnit unit;
-  public Rounder rounder;
-  public Grouper grouper;
-  public Padder padder;
-  public IntegerWidth integerWidth;
-  public Object symbols;
-  public UnitWidth unitWidth;
-  public SignDisplay sign;
-  public DecimalSeparatorDisplay decimal;
-  public AffixPatternProvider affixProvider; // not in API; for JDK compatibility mode only
-  public MultiplierImpl multiplier; // not in API; for JDK compatibility mode only
-  public PluralRules rules; // not in API; could be made public in the future
-  public Long threshold; // not in API; controls internal self-regulation threshold
-  public ULocale loc;
+    public Notation notation;
+    public MeasureUnit unit;
+    public MeasureUnit perUnit;
+    public Rounder rounder;
+    public Object grouping;
+    public Padder padder;
+    public IntegerWidth integerWidth;
+    public Object symbols;
+    public UnitWidth unitWidth;
+    public SignDisplay sign;
+    public DecimalSeparatorDisplay decimal;
+    public AffixPatternProvider affixProvider; // not in API; for JDK compatibility mode only
+    public MultiplierImpl multiplier; // not in API; for JDK compatibility mode only
+    public PluralRules rules; // not in API; could be made public in the future
+    public Long threshold; // not in API; controls internal self-regulation threshold
+    public ULocale loc;
 
-  /**
-   * Copies values from fallback into this instance if they are null in this instance.
-   *
-   * @param fallback The instance to copy from; not modified by this operation.
-   */
-  public void fallback(MacroProps fallback) {
-    if (notation == null) notation = fallback.notation;
-    if (unit == null) unit = fallback.unit;
-    if (rounder == null) rounder = fallback.rounder;
-    if (grouper == null) grouper = fallback.grouper;
-    if (padder == null) padder = fallback.padder;
-    if (integerWidth == null) integerWidth = fallback.integerWidth;
-    if (symbols == null) symbols = fallback.symbols;
-    if (unitWidth == null) unitWidth = fallback.unitWidth;
-    if (sign == null) sign = fallback.sign;
-    if (decimal == null) decimal = fallback.decimal;
-    if (affixProvider == null) affixProvider = fallback.affixProvider;
-    if (multiplier == null) multiplier = fallback.multiplier;
-    if (rules == null) rules = fallback.rules;
-    if (loc == null) loc = fallback.loc;
-  }
-
-  @Override
-  public int hashCode() {
-    return Utility.hash(
-        notation,
-        unit,
-        rounder,
-        grouper,
-        padder,
-        integerWidth,
-        symbols,
-        unitWidth,
-        sign,
-        decimal,
-        affixProvider,
-        multiplier,
-        rules,
-        loc);
-  }
-
-  @Override
-  public boolean equals(Object _other) {
-    if (_other == null) return false;
-    if (this == _other) return true;
-    if (!(_other instanceof MacroProps)) return false;
-    MacroProps other = (MacroProps) _other;
-    return Utility.equals(notation, other.notation)
-        && Utility.equals(unit, other.unit)
-        && Utility.equals(rounder, other.rounder)
-        && Utility.equals(grouper, other.grouper)
-        && Utility.equals(padder, other.padder)
-        && Utility.equals(integerWidth, other.integerWidth)
-        && Utility.equals(symbols, other.symbols)
-        && Utility.equals(unitWidth, other.unitWidth)
-        && Utility.equals(sign, other.sign)
-        && Utility.equals(decimal, other.decimal)
-        && Utility.equals(affixProvider, other.affixProvider)
-        && Utility.equals(multiplier, other.multiplier)
-        && Utility.equals(rules, other.rules)
-        && Utility.equals(loc, other.loc);
-  }
-
-  @Override
-  public Object clone() {
-    // TODO: Remove this method?
-    try {
-      return super.clone();
-    } catch (CloneNotSupportedException e) {
-      throw new AssertionError(e);
+    /**
+     * Copies values from fallback into this instance if they are null in this instance.
+     *
+     * @param fallback
+     *            The instance to copy from; not modified by this operation.
+     */
+    public void fallback(MacroProps fallback) {
+        if (notation == null)
+            notation = fallback.notation;
+        if (unit == null)
+            unit = fallback.unit;
+        if (perUnit == null)
+            perUnit = fallback.perUnit;
+        if (rounder == null)
+            rounder = fallback.rounder;
+        if (grouping == null)
+            grouping = fallback.grouping;
+        if (padder == null)
+            padder = fallback.padder;
+        if (integerWidth == null)
+            integerWidth = fallback.integerWidth;
+        if (symbols == null)
+            symbols = fallback.symbols;
+        if (unitWidth == null)
+            unitWidth = fallback.unitWidth;
+        if (sign == null)
+            sign = fallback.sign;
+        if (decimal == null)
+            decimal = fallback.decimal;
+        if (affixProvider == null)
+            affixProvider = fallback.affixProvider;
+        if (multiplier == null)
+            multiplier = fallback.multiplier;
+        if (rules == null)
+            rules = fallback.rules;
+        if (loc == null)
+            loc = fallback.loc;
     }
-  }
+
+    @Override
+    public int hashCode() {
+        return Utility.hash(notation,
+                unit,
+                perUnit,
+                rounder,
+                grouping,
+                padder,
+                integerWidth,
+                symbols,
+                unitWidth,
+                sign,
+                decimal,
+                affixProvider,
+                multiplier,
+                rules,
+                loc);
+    }
+
+    @Override
+    public boolean equals(Object _other) {
+        if (_other == null)
+            return false;
+        if (this == _other)
+            return true;
+        if (!(_other instanceof MacroProps))
+            return false;
+        MacroProps other = (MacroProps) _other;
+        return Utility.equals(notation, other.notation)
+                && Utility.equals(unit, other.unit)
+                && Utility.equals(perUnit, other.perUnit)
+                && Utility.equals(rounder, other.rounder)
+                && Utility.equals(grouping, other.grouping)
+                && Utility.equals(padder, other.padder)
+                && Utility.equals(integerWidth, other.integerWidth)
+                && Utility.equals(symbols, other.symbols)
+                && Utility.equals(unitWidth, other.unitWidth)
+                && Utility.equals(sign, other.sign)
+                && Utility.equals(decimal, other.decimal)
+                && Utility.equals(affixProvider, other.affixProvider)
+                && Utility.equals(multiplier, other.multiplier)
+                && Utility.equals(rules, other.rules)
+                && Utility.equals(loc, other.loc);
+    }
+
+    @Override
+    public Object clone() {
+        // TODO: Remove this method?
+        try {
+            return super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new AssertionError(e);
+        }
+    }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/MicroProps.java b/android_icu4j/src/main/java/android/icu/impl/number/MicroProps.java
index f6e0981..5866b7f 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/MicroProps.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/MicroProps.java
@@ -3,7 +3,6 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 package android.icu.impl.number;
 
-import android.icu.number.Grouper;
 import android.icu.number.IntegerWidth;
 import android.icu.number.NumberFormatter.DecimalSeparatorDisplay;
 import android.icu.number.NumberFormatter.SignDisplay;
@@ -35,8 +34,8 @@
 
     /**
      * @param immutable
-     *            Whether this MicroProps should behave as an immutable after construction with respect to the quantity
-     *            chain.
+     *            Whether this MicroProps should behave as an immutable after construction with respect
+     *            to the quantity chain.
      */
     public MicroProps(boolean immutable) {
         this.immutable = immutable;
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/MicroPropsGenerator.java b/android_icu4j/src/main/java/android/icu/impl/number/MicroPropsGenerator.java
index 3b5f368..c186ac0 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/MicroPropsGenerator.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/MicroPropsGenerator.java
@@ -4,19 +4,21 @@
 package android.icu.impl.number;
 
 /**
- * This interface is used when all number formatting settings, including the locale, are known, except for the quantity
- * itself. The {@link #processQuantity} method performs the final step in the number processing pipeline: it uses the
- * quantity to generate a finalized {@link MicroProps}, which can be used to render the number to output.
+ * This interface is used when all number formatting settings, including the locale, are known, except
+ * for the quantity itself. The {@link #processQuantity} method performs the final step in the number
+ * processing pipeline: it uses the quantity to generate a finalized {@link MicroProps}, which can be
+ * used to render the number to output.
  *
  * <p>
- * In other words, this interface is used for the parts of number processing that are <em>quantity-dependent</em>.
+ * In other words, this interface is used for the parts of number processing that are
+ * <em>quantity-dependent</em>.
  *
  * <p>
- * In order to allow for multiple different objects to all mutate the same MicroProps, a "chain" of MicroPropsGenerators
- * are linked together, and each one is responsible for manipulating a certain quantity-dependent part of the
- * MicroProps. At the top of the linked list is a base instance of {@link MicroProps} with properties that are not
- * quantity-dependent. Each element in the linked list calls {@link #processQuantity} on its "parent", then does its
- * work, and then returns the result.
+ * In order to allow for multiple different objects to all mutate the same MicroProps, a "chain" of
+ * MicroPropsGenerators are linked together, and each one is responsible for manipulating a certain
+ * quantity-dependent part of the MicroProps. At the top of the linked list is a base instance of
+ * {@link MicroProps} with properties that are not quantity-dependent. Each element in the linked list
+ * calls {@link #processQuantity} on its "parent", then does its work, and then returns the result.
  *
  * <p>
  * A class implementing MicroPropsGenerator looks something like this:
@@ -44,7 +46,8 @@
  */
 public interface MicroPropsGenerator {
     /**
-     * Considers the given {@link DecimalQuantity}, optionally mutates it, and returns a {@link MicroProps}.
+     * Considers the given {@link DecimalQuantity}, optionally mutates it, and returns a
+     * {@link MicroProps}.
      *
      * @param quantity
      *            The quantity for consideration and optional mutation.
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/Modifier.java b/android_icu4j/src/main/java/android/icu/impl/number/Modifier.java
index bafa2eb..2f7440c 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/Modifier.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/Modifier.java
@@ -4,12 +4,12 @@
 package android.icu.impl.number;
 
 /**
- * A Modifier is an object that can be passed through the formatting pipeline until it is finally applied to the string
- * builder. A Modifier usually contains a prefix and a suffix that are applied, but it could contain something else,
- * like a {@link android.icu.text.SimpleFormatter} pattern.
+ * A Modifier is an object that can be passed through the formatting pipeline until it is finally applied
+ * to the string builder. A Modifier usually contains a prefix and a suffix that are applied, but it
+ * could contain something else, like a {@link android.icu.text.SimpleFormatter} pattern.
  *
- * A Modifier is usually immutable, except in cases such as {@link MutablePatternModifier}, which are mutable for performance
- * reasons.
+ * A Modifier is usually immutable, except in cases such as {@link MutablePatternModifier}, which are
+ * mutable for performance reasons.
  * @hide Only a subset of ICU is exposed in Android
  */
 public interface Modifier {
@@ -20,17 +20,18 @@
      * @param output
      *            The string builder to which to apply this modifier.
      * @param leftIndex
-     *            The left index of the string within the builder. Equal to 0 when only one number is being formatted.
+     *            The left index of the string within the builder. Equal to 0 when only one number is
+     *            being formatted.
      * @param rightIndex
-     *            The right index of the string within the string builder. Equal to length when only one number is being
-     *            formatted.
+     *            The right index of the string within the string builder. Equal to length when only one
+     *            number is being formatted.
      * @return The number of characters (UTF-16 code units) that were added to the string builder.
      */
     public int apply(NumberStringBuilder output, int leftIndex, int rightIndex);
 
     /**
-     * Gets the length of the prefix. This information can be used in combination with {@link #apply} to extract the
-     * prefix and suffix strings.
+     * Gets the length of the prefix. This information can be used in combination with {@link #apply} to
+     * extract the prefix and suffix strings.
      *
      * @return The number of characters (UTF-16 code units) in the prefix.
      */
@@ -42,9 +43,9 @@
     public int getCodePointCount();
 
     /**
-     * Whether this modifier is strong. If a modifier is strong, it should always be applied immediately and not allowed
-     * to bubble up. With regard to padding, strong modifiers are considered to be on the inside of the prefix and
-     * suffix.
+     * Whether this modifier is strong. If a modifier is strong, it should always be applied immediately
+     * and not allowed to bubble up. With regard to padding, strong modifiers are considered to be on the
+     * inside of the prefix and suffix.
      *
      * @return Whether the modifier is strong.
      */
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/MultiplierImpl.java b/android_icu4j/src/main/java/android/icu/impl/number/MultiplierImpl.java
index 638c597..4f8e654 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/MultiplierImpl.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/MultiplierImpl.java
@@ -9,39 +9,39 @@
  * @hide Only a subset of ICU is exposed in Android
  */
 public class MultiplierImpl implements MicroPropsGenerator {
-  final int magnitudeMultiplier;
-  final BigDecimal bigDecimalMultiplier;
-  final MicroPropsGenerator parent;
+    final int magnitudeMultiplier;
+    final BigDecimal bigDecimalMultiplier;
+    final MicroPropsGenerator parent;
 
-  public MultiplierImpl(int magnitudeMultiplier) {
-    this.magnitudeMultiplier = magnitudeMultiplier;
-    this.bigDecimalMultiplier = null;
-    parent = null;
-  }
-
-  public MultiplierImpl(BigDecimal bigDecimalMultiplier) {
-    this.magnitudeMultiplier = 0;
-    this.bigDecimalMultiplier = bigDecimalMultiplier;
-    parent = null;
-  }
-
-  private MultiplierImpl(MultiplierImpl base, MicroPropsGenerator parent) {
-    this.magnitudeMultiplier = base.magnitudeMultiplier;
-    this.bigDecimalMultiplier = base.bigDecimalMultiplier;
-    this.parent = parent;
-  }
-
-  public MicroPropsGenerator copyAndChain(MicroPropsGenerator parent) {
-    return new MultiplierImpl(this, parent);
-  }
-
-  @Override
-  public MicroProps processQuantity(DecimalQuantity quantity) {
-    MicroProps micros = parent.processQuantity(quantity);
-    quantity.adjustMagnitude(magnitudeMultiplier);
-    if (bigDecimalMultiplier != null) {
-      quantity.multiplyBy(bigDecimalMultiplier);
+    public MultiplierImpl(int magnitudeMultiplier) {
+        this.magnitudeMultiplier = magnitudeMultiplier;
+        this.bigDecimalMultiplier = null;
+        parent = null;
     }
-    return micros;
-  }
+
+    public MultiplierImpl(BigDecimal bigDecimalMultiplier) {
+        this.magnitudeMultiplier = 0;
+        this.bigDecimalMultiplier = bigDecimalMultiplier;
+        parent = null;
+    }
+
+    private MultiplierImpl(MultiplierImpl base, MicroPropsGenerator parent) {
+        this.magnitudeMultiplier = base.magnitudeMultiplier;
+        this.bigDecimalMultiplier = base.bigDecimalMultiplier;
+        this.parent = parent;
+    }
+
+    public MicroPropsGenerator copyAndChain(MicroPropsGenerator parent) {
+        return new MultiplierImpl(this, parent);
+    }
+
+    @Override
+    public MicroProps processQuantity(DecimalQuantity quantity) {
+        MicroProps micros = parent.processQuantity(quantity);
+        quantity.adjustMagnitude(magnitudeMultiplier);
+        if (bigDecimalMultiplier != null) {
+            quantity.multiplyBy(bigDecimalMultiplier);
+        }
+        return micros;
+    }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/MultiplierProducer.java b/android_icu4j/src/main/java/android/icu/impl/number/MultiplierProducer.java
index daa5a4c..601ebb8 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/MultiplierProducer.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/MultiplierProducer.java
@@ -8,5 +8,14 @@
  * @hide Only a subset of ICU is exposed in Android
  */
 public interface MultiplierProducer {
+    /**
+     * Maps a magnitude to a multiplier in powers of ten. For example, in compact notation in English, a
+     * magnitude of 5 (e.g., 100,000) should return a multiplier of -3, since the number is displayed in
+     * thousands.
+     *
+     * @param magnitude
+     *            The power of ten of the input number.
+     * @return The shift in powers of ten.
+     */
     int getMultiplier(int magnitude);
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/MutablePatternModifier.java b/android_icu4j/src/main/java/android/icu/impl/number/MutablePatternModifier.java
index 350b8e8..0bc9976 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/MutablePatternModifier.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/MutablePatternModifier.java
@@ -12,26 +12,27 @@
 import android.icu.util.Currency;
 
 /**
- * This class is a {@link Modifier} that wraps a decimal format pattern. It applies the pattern's affixes in
- * {@link Modifier#apply}.
+ * This class is a {@link Modifier} that wraps a decimal format pattern. It applies the pattern's affixes
+ * in {@link Modifier#apply}.
  *
  * <p>
- * In addition to being a Modifier, this class contains the business logic for substituting the correct locale symbols
- * into the affixes of the decimal format pattern.
+ * In addition to being a Modifier, this class contains the business logic for substituting the correct
+ * locale symbols into the affixes of the decimal format pattern.
  *
  * <p>
- * In order to use this class, create a new instance and call the following four setters: {@link #setPatternInfo},
- * {@link #setPatternAttributes}, {@link #setSymbols}, and {@link #setNumberProperties}. After calling these four
- * setters, the instance will be ready for use as a Modifier.
+ * In order to use this class, create a new instance and call the following four setters:
+ * {@link #setPatternInfo}, {@link #setPatternAttributes}, {@link #setSymbols}, and
+ * {@link #setNumberProperties}. After calling these four setters, the instance will be ready for use as
+ * a Modifier.
  *
  * <p>
- * This is a MUTABLE, NON-THREAD-SAFE class designed for performance. Do NOT save references to this or attempt to use
- * it from multiple threads! Instead, you can obtain a safe, immutable decimal format pattern modifier by calling
- * {@link MutablePatternModifier#createImmutable}, in effect treating this instance as a builder for the immutable
- * variant.
+ * This is a MUTABLE, NON-THREAD-SAFE class designed for performance. Do NOT save references to this or
+ * attempt to use it from multiple threads! Instead, you can obtain a safe, immutable decimal format
+ * pattern modifier by calling {@link MutablePatternModifier#createImmutable}, in effect treating this
+ * instance as a builder for the immutable variant.
  * @hide Only a subset of ICU is exposed in Android
  */
-public class MutablePatternModifier implements Modifier, SymbolProvider, CharSequence, MicroPropsGenerator {
+public class MutablePatternModifier implements Modifier, SymbolProvider, MicroPropsGenerator {
 
     // Modifier details
     final boolean isStrong;
@@ -48,24 +49,20 @@
     PluralRules rules;
 
     // Number details
-    boolean isNegative;
+    int signum;
     StandardPlural plural;
 
     // QuantityChain details
     MicroPropsGenerator parent;
 
-    // Transient CharSequence fields
-    boolean inCharSequenceMode;
-    int flags;
-    int length;
-    boolean prependSign;
-    boolean plusReplacesMinusSign;
+    // Transient fields for rendering
+    StringBuilder currentAffix;
 
     /**
      * @param isStrong
      *            Whether the modifier should be considered strong. For more information, see
-     *            {@link Modifier#isStrong()}. Most of the time, decimal format pattern modifiers should be considered
-     *            as non-strong.
+     *            {@link Modifier#isStrong()}. Most of the time, decimal format pattern modifiers should
+     *            be considered as non-strong.
      */
     public MutablePatternModifier(boolean isStrong) {
         this.isStrong = isStrong;
@@ -73,8 +70,8 @@
 
     /**
      * Sets a reference to the parsed decimal format pattern, usually obtained from
-     * {@link PatternStringParser#parseToPatternInfo(String)}, but any implementation of {@link AffixPatternProvider} is
-     * accepted.
+     * {@link PatternStringParser#parseToPatternInfo(String)}, but any implementation of
+     * {@link AffixPatternProvider} is accepted.
      */
     public void setPatternInfo(AffixPatternProvider patternInfo) {
         this.patternInfo = patternInfo;
@@ -103,10 +100,14 @@
      * @param unitWidth
      *            The width used to render currencies.
      * @param rules
-     *            Required if the triple currency sign, "¤¤¤", appears in the pattern, which can be determined from the
-     *            convenience method {@link #needsPlurals()}.
+     *            Required if the triple currency sign, "¤¤¤", appears in the pattern, which can be
+     *            determined from the convenience method {@link #needsPlurals()}.
      */
-    public void setSymbols(DecimalFormatSymbols symbols, Currency currency, UnitWidth unitWidth, PluralRules rules) {
+    public void setSymbols(
+            DecimalFormatSymbols symbols,
+            Currency currency,
+            UnitWidth unitWidth,
+            PluralRules rules) {
         assert (rules != null) == needsPlurals();
         this.symbols = symbols;
         this.currency = currency;
@@ -117,30 +118,31 @@
     /**
      * Sets attributes of the current number being processed.
      *
-     * @param isNegative
-     *            Whether the number is negative.
+     * @param signum
+     *            -1 if negative; +1 if positive; or 0 if zero.
      * @param plural
-     *            The plural form of the number, required only if the pattern contains the triple currency sign, "¤¤¤"
-     *            (and as indicated by {@link #needsPlurals()}).
+     *            The plural form of the number, required only if the pattern contains the triple
+     *            currency sign, "¤¤¤" (and as indicated by {@link #needsPlurals()}).
      */
-    public void setNumberProperties(boolean isNegative, StandardPlural plural) {
+    public void setNumberProperties(int signum, StandardPlural plural) {
         assert (plural != null) == needsPlurals();
-        this.isNegative = isNegative;
+        this.signum = signum;
         this.plural = plural;
     }
 
     /**
-     * Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order to localize.
-     * This is currently true only if there is a currency long name placeholder in the pattern ("¤¤¤").
+     * Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order
+     * to localize. This is currently true only if there is a currency long name placeholder in the
+     * pattern ("¤¤¤").
      */
     public boolean needsPlurals() {
         return patternInfo.containsSymbolType(AffixUtils.TYPE_CURRENCY_TRIPLE);
     }
 
     /**
-     * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable
-     * and can be saved for future use. The number properties in the current instance are mutated; all other properties
-     * are left untouched.
+     * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which
+     * is immutable and can be saved for future use. The number properties in the current instance are
+     * mutated; all other properties are left untouched.
      *
      * <p>
      * The resulting modifier cannot be used in a QuantityChain.
@@ -152,9 +154,9 @@
     }
 
     /**
-     * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable
-     * and can be saved for future use. The number properties in the current instance are mutated; all other properties
-     * are left untouched.
+     * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which
+     * is immutable and can be saved for future use. The number properties in the current instance are
+     * mutated; all other properties are left untouched.
      *
      * @param parent
      *            The QuantityChain to which to chain this immutable.
@@ -167,42 +169,48 @@
             // Slower path when we require the plural keyword.
             ParameterizedModifier pm = new ParameterizedModifier();
             for (StandardPlural plural : StandardPlural.VALUES) {
-                setNumberProperties(false, plural);
-                pm.setModifier(false, plural, createConstantModifier(a, b));
-                setNumberProperties(true, plural);
-                pm.setModifier(true, plural, createConstantModifier(a, b));
+                setNumberProperties(1, plural);
+                pm.setModifier(1, plural, createConstantModifier(a, b));
+                setNumberProperties(0, plural);
+                pm.setModifier(0, plural, createConstantModifier(a, b));
+                setNumberProperties(-1, plural);
+                pm.setModifier(-1, plural, createConstantModifier(a, b));
             }
             pm.freeze();
             return new ImmutablePatternModifier(pm, rules, parent);
         } else {
             // Faster path when plural keyword is not needed.
-            setNumberProperties(false, null);
+            setNumberProperties(1, null);
             Modifier positive = createConstantModifier(a, b);
-            setNumberProperties(true, null);
+            setNumberProperties(0, null);
+            Modifier zero = createConstantModifier(a, b);
+            setNumberProperties(-1, null);
             Modifier negative = createConstantModifier(a, b);
-            ParameterizedModifier pm = new ParameterizedModifier(positive, negative);
+            ParameterizedModifier pm = new ParameterizedModifier(positive, zero, negative);
             return new ImmutablePatternModifier(pm, null, parent);
         }
     }
 
     /**
-     * Uses the current properties to create a single {@link ConstantMultiFieldModifier} with currency spacing support
-     * if required.
+     * Uses the current properties to create a single {@link ConstantMultiFieldModifier} with currency
+     * spacing support if required.
      *
      * @param a
-     *            A working NumberStringBuilder object; passed from the outside to prevent the need to create many new
-     *            instances if this method is called in a loop.
+     *            A working NumberStringBuilder object; passed from the outside to prevent the need to
+     *            create many new instances if this method is called in a loop.
      * @param b
      *            Another working NumberStringBuilder object.
      * @return The constant modifier object.
      */
-    private ConstantMultiFieldModifier createConstantModifier(NumberStringBuilder a, NumberStringBuilder b) {
+    private ConstantMultiFieldModifier createConstantModifier(
+            NumberStringBuilder a,
+            NumberStringBuilder b) {
         insertPrefix(a.clear(), 0);
         insertSuffix(b.clear(), 0);
         if (patternInfo.hasCurrencySign()) {
-            return new CurrencySpacingEnabledModifier(a, b, isStrong, symbols);
+            return new CurrencySpacingEnabledModifier(a, b, !patternInfo.hasBody(), isStrong, symbols);
         } else {
-            return new ConstantMultiFieldModifier(a, b, isStrong);
+            return new ConstantMultiFieldModifier(a, b, !patternInfo.hasBody(), isStrong);
         }
     }
 
@@ -211,7 +219,10 @@
         final PluralRules rules;
         final MicroPropsGenerator parent;
 
-        ImmutablePatternModifier(ParameterizedModifier pm, PluralRules rules, MicroPropsGenerator parent) {
+        ImmutablePatternModifier(
+                ParameterizedModifier pm,
+                PluralRules rules,
+                MicroPropsGenerator parent) {
             this.pm = pm;
             this.rules = rules;
             this.parent = parent;
@@ -226,13 +237,13 @@
 
         public void applyToMicros(MicroProps micros, DecimalQuantity quantity) {
             if (rules == null) {
-                micros.modMiddle = pm.getModifier(quantity.isNegative());
+                micros.modMiddle = pm.getModifier(quantity.signum());
             } else {
                 // TODO: Fix this. Avoid the copy.
                 DecimalQuantity copy = quantity.createCopy();
                 copy.roundToInfinity();
                 StandardPlural plural = copy.getStandardPlural(rules);
-                micros.modMiddle = pm.getModifier(quantity.isNegative(), plural);
+                micros.modMiddle = pm.getModifier(quantity.signum(), plural);
             }
         }
     }
@@ -250,9 +261,9 @@
             // TODO: Fix this. Avoid the copy.
             DecimalQuantity copy = fq.createCopy();
             micros.rounding.apply(copy);
-            setNumberProperties(fq.isNegative(), copy.getStandardPlural(rules));
+            setNumberProperties(fq.signum(), copy.getStandardPlural(rules));
         } else {
-            setNumberProperties(fq.isNegative(), null);
+            setNumberProperties(fq.signum(), null);
         }
         micros.modMiddle = this;
         return micros;
@@ -262,29 +273,35 @@
     public int apply(NumberStringBuilder output, int leftIndex, int rightIndex) {
         int prefixLen = insertPrefix(output, leftIndex);
         int suffixLen = insertSuffix(output, rightIndex + prefixLen);
-        CurrencySpacingEnabledModifier.applyCurrencySpacing(output, leftIndex, prefixLen, rightIndex + prefixLen,
-                suffixLen, symbols);
-        return prefixLen + suffixLen;
+        // If the pattern had no decimal stem body (like #,##0.00), overwrite the value.
+        int overwriteLen = 0;
+        if (!patternInfo.hasBody()) {
+            overwriteLen = output.splice(leftIndex + prefixLen, rightIndex + prefixLen, "", 0, 0, null);
+        }
+        CurrencySpacingEnabledModifier.applyCurrencySpacing(output,
+                leftIndex,
+                prefixLen,
+                rightIndex + prefixLen + overwriteLen,
+                suffixLen,
+                symbols);
+        return prefixLen + overwriteLen + suffixLen;
     }
 
     @Override
     public int getPrefixLength() {
-        // Enter and exit CharSequence Mode to get the length.
-        enterCharSequenceMode(true);
-        int result = AffixUtils.unescapedCodePointCount(this, this);  // prefix length
-        exitCharSequenceMode();
+        // Render the affix to get the length
+        prepareAffix(true);
+        int result = AffixUtils.unescapedCount(currentAffix, true, this); // prefix length
         return result;
     }
 
     @Override
     public int getCodePointCount() {
-        // Enter and exit CharSequence Mode to get the length.
-        enterCharSequenceMode(true);
-        int result = AffixUtils.unescapedCodePointCount(this, this);  // prefix length
-        exitCharSequenceMode();
-        enterCharSequenceMode(false);
-        result += AffixUtils.unescapedCodePointCount(this, this);  // suffix length
-        exitCharSequenceMode();
+        // Render the affixes to get the length
+        prepareAffix(true);
+        int result = AffixUtils.unescapedCount(currentAffix, false, this); // prefix length
+        prepareAffix(false);
+        result += AffixUtils.unescapedCount(currentAffix, false, this); // suffix length
         return result;
     }
 
@@ -294,20 +311,38 @@
     }
 
     private int insertPrefix(NumberStringBuilder sb, int position) {
-        enterCharSequenceMode(true);
-        int length = AffixUtils.unescape(this, sb, position, this);
-        exitCharSequenceMode();
+        prepareAffix(true);
+        int length = AffixUtils.unescape(currentAffix, sb, position, this);
         return length;
     }
 
     private int insertSuffix(NumberStringBuilder sb, int position) {
-        enterCharSequenceMode(false);
-        int length = AffixUtils.unescape(this, sb, position, this);
-        exitCharSequenceMode();
+        prepareAffix(false);
+        int length = AffixUtils.unescape(currentAffix, sb, position, this);
         return length;
     }
 
     /**
+     * Pre-processes the prefix or suffix into the currentAffix field, creating and mutating that field
+     * if necessary. Calls down to {@link PatternStringUtils#affixPatternProviderToStringBuilder}.
+     *
+     * @param isPrefix
+     *            true to prepare the prefix; false to prepare the suffix.
+     */
+    private void prepareAffix(boolean isPrefix) {
+        if (currentAffix == null) {
+            currentAffix = new StringBuilder();
+        }
+        PatternStringUtils.patternInfoToStringBuilder(patternInfo,
+                isPrefix,
+                signum,
+                signDisplay,
+                plural,
+                perMilleReplacesPercent,
+                currentAffix);
+    }
+
+    /**
      * Returns the string that substitutes a given symbol type in a pattern.
      */
     @Override
@@ -327,10 +362,10 @@
                 return currency.getCurrencyCode();
             } else if (unitWidth == UnitWidth.HIDDEN) {
                 return "";
-            } else if (unitWidth == UnitWidth.NARROW) {
-                return currency.getName(symbols.getULocale(), Currency.NARROW_SYMBOL_NAME, null);
             } else {
-                return currency.getName(symbols.getULocale(), Currency.SYMBOL_NAME, null);
+                int selector = unitWidth == UnitWidth.NARROW ? Currency.NARROW_SYMBOL_NAME
+                        : Currency.SYMBOL_NAME;
+                return currency.getName(symbols.getULocale(), selector, null);
             }
         case AffixUtils.TYPE_CURRENCY_DOUBLE:
             return currency.getCurrencyCode();
@@ -339,7 +374,8 @@
             // Plural currencies set via the API are formatted in LongNameHandler.
             // This code path is used by DecimalFormat via CurrencyPluralInfo.
             assert plural != null;
-            return currency.getName(symbols.getULocale(), Currency.PLURAL_LONG_NAME, plural.getKeyword(), null);
+            return currency
+                    .getName(symbols.getULocale(), Currency.PLURAL_LONG_NAME, plural.getKeyword(), null);
         case AffixUtils.TYPE_CURRENCY_QUAD:
             return "\uFFFD";
         case AffixUtils.TYPE_CURRENCY_QUINT:
@@ -348,81 +384,4 @@
             throw new AssertionError();
         }
     }
-
-    /** This method contains the heart of the logic for rendering LDML affix strings. */
-    private void enterCharSequenceMode(boolean isPrefix) {
-        assert !inCharSequenceMode;
-        inCharSequenceMode = true;
-
-        // Should the output render '+' where '-' would normally appear in the pattern?
-        plusReplacesMinusSign = !isNegative
-                && (signDisplay == SignDisplay.ALWAYS || signDisplay == SignDisplay.ACCOUNTING_ALWAYS)
-                && patternInfo.positiveHasPlusSign() == false;
-
-        // Should we use the affix from the negative subpattern? (If not, we will use the positive subpattern.)
-        boolean useNegativeAffixPattern = patternInfo.hasNegativeSubpattern()
-                && (isNegative || (patternInfo.negativeHasMinusSign() && plusReplacesMinusSign));
-
-        // Resolve the flags for the affix pattern.
-        flags = 0;
-        if (useNegativeAffixPattern) {
-            flags |= AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN;
-        }
-        if (isPrefix) {
-            flags |= AffixPatternProvider.Flags.PREFIX;
-        }
-        if (plural != null) {
-            assert plural.ordinal() == (AffixPatternProvider.Flags.PLURAL_MASK & plural.ordinal());
-            flags |= plural.ordinal();
-        }
-
-        // Should we prepend a sign to the pattern?
-        if (!isPrefix || useNegativeAffixPattern) {
-            prependSign = false;
-        } else if (isNegative) {
-            prependSign = signDisplay != SignDisplay.NEVER;
-        } else {
-            prependSign = plusReplacesMinusSign;
-        }
-
-        // Finally, compute the length of the affix pattern.
-        length = patternInfo.length(flags) + (prependSign ? 1 : 0);
-    }
-
-    private void exitCharSequenceMode() {
-        assert inCharSequenceMode;
-        inCharSequenceMode = false;
-    }
-
-    @Override
-    public int length() {
-        assert inCharSequenceMode;
-        return length;
-    }
-
-    @Override
-    public char charAt(int index) {
-        assert inCharSequenceMode;
-        char candidate;
-        if (prependSign && index == 0) {
-            candidate = '-';
-        } else if (prependSign) {
-            candidate = patternInfo.charAt(flags, index - 1);
-        } else {
-            candidate = patternInfo.charAt(flags, index);
-        }
-        if (plusReplacesMinusSign && candidate == '-') {
-            return '+';
-        }
-        if (perMilleReplacesPercent && candidate == '%') {
-            return '‰';
-        }
-        return candidate;
-    }
-
-    @Override
-    public CharSequence subSequence(int start, int end) {
-        // Never called by AffixUtils
-        throw new AssertionError();
-    }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/NumberStringBuilder.java b/android_icu4j/src/main/java/android/icu/impl/number/NumberStringBuilder.java
index 39cdc0b..eeeb5dd 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/NumberStringBuilder.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/NumberStringBuilder.java
@@ -14,8 +14,8 @@
 import android.icu.text.NumberFormat.Field;
 
 /**
- * A StringBuilder optimized for number formatting. It implements the following key features beyond a normal JDK
- * StringBuilder:
+ * A StringBuilder optimized for number formatting. It implements the following key features beyond a
+ * normal JDK StringBuilder:
  *
  * <ol>
  * <li>Efficient prepend as well as append.
@@ -158,8 +158,8 @@
     }
 
     /**
-     * Inserts the specified CharSequence at the specified index in the string, reading from the CharSequence from start
-     * (inclusive) to end (exclusive).
+     * Inserts the specified CharSequence at the specified index in the string, reading from the
+     * CharSequence from start (inclusive) to end (exclusive).
      *
      * @return The number of chars added, which is the length of CharSequence.
      */
@@ -174,8 +174,41 @@
     }
 
     /**
-     * Appends the chars in the specified char array to the end of the string, and associates them with the fields in
-     * the specified field array, which must have the same length as chars.
+     * Replaces the chars between startThis and endThis with the chars between startOther and endOther of
+     * the given CharSequence. Calling this method with startThis == endThis is equivalent to calling
+     * insert.
+     *
+     * @return The number of chars added, which may be negative if the removed segment is longer than the
+     *         length of the CharSequence segment that was inserted.
+     */
+    public int splice(
+            int startThis,
+            int endThis,
+            CharSequence sequence,
+            int startOther,
+            int endOther,
+            Field field) {
+        int thisLength = endThis - startThis;
+        int otherLength = endOther - startOther;
+        int count = otherLength - thisLength;
+        int position;
+        if (count > 0) {
+            // Overall, chars need to be added.
+            position = prepareForInsert(startThis, count);
+        } else {
+            // Overall, chars need to be removed or kept the same.
+            position = remove(startThis, -count);
+        }
+        for (int i = 0; i < otherLength; i++) {
+            chars[position + i] = sequence.charAt(startOther + i);
+            fields[position + i] = field;
+        }
+        return count;
+    }
+
+    /**
+     * Appends the chars in the specified char array to the end of the string, and associates them with
+     * the fields in the specified field array, which must have the same length as chars.
      *
      * @return The number of chars added, which is the length of the char array.
      */
@@ -184,8 +217,8 @@
     }
 
     /**
-     * Inserts the chars in the specified char array at the specified index in the string, and associates them with the
-     * fields in the specified field array, which must have the same length as chars.
+     * Inserts the chars in the specified char array at the specified index in the string, and associates
+     * them with the fields in the specified field array, which must have the same length as chars.
      *
      * @return The number of chars added, which is the length of the char array.
      */
@@ -259,7 +292,8 @@
     }
 
     private int prepareForInsertHelper(int index, int count) {
-        // Java note: Keeping this code out of prepareForInsert() increases the speed of append operations.
+        // Java note: Keeping this code out of prepareForInsert() increases the speed of append
+        // operations.
         int oldCapacity = getCapacity();
         int oldZero = zero;
         char[] oldChars = chars;
@@ -274,9 +308,17 @@
             // First copy the prefix and then the suffix, leaving room for the new chars that the
             // caller wants to insert.
             System.arraycopy(oldChars, oldZero, newChars, newZero, index);
-            System.arraycopy(oldChars, oldZero + index, newChars, newZero + index + count, length - index);
+            System.arraycopy(oldChars,
+                    oldZero + index,
+                    newChars,
+                    newZero + index + count,
+                    length - index);
             System.arraycopy(oldFields, oldZero, newFields, newZero, index);
-            System.arraycopy(oldFields, oldZero + index, newFields, newZero + index + count, length - index);
+            System.arraycopy(oldFields,
+                    oldZero + index,
+                    newFields,
+                    newZero + index + count,
+                    length - index);
 
             chars = newChars;
             fields = newFields;
@@ -288,9 +330,17 @@
             // First copy the entire string to the location of the prefix, and then move the suffix
             // to make room for the new chars that the caller wants to insert.
             System.arraycopy(oldChars, oldZero, oldChars, newZero, length);
-            System.arraycopy(oldChars, newZero + index, oldChars, newZero + index + count, length - index);
+            System.arraycopy(oldChars,
+                    newZero + index,
+                    oldChars,
+                    newZero + index + count,
+                    length - index);
             System.arraycopy(oldFields, oldZero, oldFields, newZero, length);
-            System.arraycopy(oldFields, newZero + index, oldFields, newZero + index + count, length - index);
+            System.arraycopy(oldFields,
+                    newZero + index,
+                    oldFields,
+                    newZero + index + count,
+                    length - index);
 
             zero = newZero;
             length += count;
@@ -298,6 +348,18 @@
         return zero + index;
     }
 
+    /**
+     * Removes the "count" chars starting at "index". Returns the position at which the chars were
+     * removed.
+     */
+    private int remove(int index, int count) {
+        int position = index + zero;
+        System.arraycopy(chars, position + count, chars, position, length - index - count);
+        System.arraycopy(fields, position + count, fields, position, length - index - count);
+        length -= count;
+        return position;
+    }
+
     private int getCapacity() {
         return chars.length;
     }
@@ -344,8 +406,8 @@
      * Returns a string that includes field information, for debugging purposes.
      *
      * <p>
-     * For example, if the string is "-12.345", the debug string will be something like "&lt;NumberStringBuilder
-     * [-123.45] [-iii.ff]&gt;"
+     * For example, if the string is "-12.345", the debug string will be something like
+     * "&lt;NumberStringBuilder [-123.45] [-iii.ff]&gt;"
      *
      * @return A string for debugging purposes.
      */
@@ -376,7 +438,8 @@
     }
 
     /**
-     * @return Whether the contents and field values of this string builder are equal to the given chars and fields.
+     * @return Whether the contents and field values of this string builder are equal to the given chars
+     *         and fields.
      * @see #toCharArray
      * @see #toFieldArray
      */
@@ -457,7 +520,8 @@
             Field _field = (i < zero + length) ? fields[i] : null;
             if (seenStart && field != _field) {
                 // Special case: GROUPING_SEPARATOR counts as an INTEGER.
-                if (field == NumberFormat.Field.INTEGER && _field == NumberFormat.Field.GROUPING_SEPARATOR) {
+                if (field == NumberFormat.Field.INTEGER
+                        && _field == NumberFormat.Field.GROUPING_SEPARATOR) {
                     continue;
                 }
                 fp.setEndIndex(i - zero + offset);
@@ -484,9 +548,13 @@
         int currentStart = -1;
         for (int i = 0; i < length; i++) {
             Field field = fields[i + zero];
-            if (current == NumberFormat.Field.INTEGER && field == NumberFormat.Field.GROUPING_SEPARATOR) {
+            if (current == NumberFormat.Field.INTEGER
+                    && field == NumberFormat.Field.GROUPING_SEPARATOR) {
                 // Special case: GROUPING_SEPARATOR counts as an INTEGER.
-                as.addAttribute(NumberFormat.Field.GROUPING_SEPARATOR, NumberFormat.Field.GROUPING_SEPARATOR, i, i + 1);
+                as.addAttribute(NumberFormat.Field.GROUPING_SEPARATOR,
+                        NumberFormat.Field.GROUPING_SEPARATOR,
+                        i,
+                        i + 1);
             } else if (current != field) {
                 if (current != null) {
                     as.addAttribute(current, current, currentStart, i);
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/Padder.java b/android_icu4j/src/main/java/android/icu/impl/number/Padder.java
index 894915f..faab233 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/Padder.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/Padder.java
@@ -10,40 +10,37 @@
     public static final String FALLBACK_PADDING_STRING = "\u0020"; // i.e. a space
 
     public enum PadPosition {
-      BEFORE_PREFIX,
-      AFTER_PREFIX,
-      BEFORE_SUFFIX,
-      AFTER_SUFFIX;
+        BEFORE_PREFIX, AFTER_PREFIX, BEFORE_SUFFIX, AFTER_SUFFIX;
 
-      public static PadPosition fromOld(int old) {
-        switch (old) {
-          case android.icu.text.DecimalFormat.PAD_BEFORE_PREFIX:
-            return PadPosition.BEFORE_PREFIX;
-          case android.icu.text.DecimalFormat.PAD_AFTER_PREFIX:
-            return PadPosition.AFTER_PREFIX;
-          case android.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX:
-            return PadPosition.BEFORE_SUFFIX;
-          case android.icu.text.DecimalFormat.PAD_AFTER_SUFFIX:
-            return PadPosition.AFTER_SUFFIX;
-          default:
-            throw new IllegalArgumentException("Don't know how to map " + old);
+        public static PadPosition fromOld(int old) {
+            switch (old) {
+            case android.icu.text.DecimalFormat.PAD_BEFORE_PREFIX:
+                return PadPosition.BEFORE_PREFIX;
+            case android.icu.text.DecimalFormat.PAD_AFTER_PREFIX:
+                return PadPosition.AFTER_PREFIX;
+            case android.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX:
+                return PadPosition.BEFORE_SUFFIX;
+            case android.icu.text.DecimalFormat.PAD_AFTER_SUFFIX:
+                return PadPosition.AFTER_SUFFIX;
+            default:
+                throw new IllegalArgumentException("Don't know how to map " + old);
+            }
         }
-      }
 
-      public int toOld() {
-        switch (this) {
-          case BEFORE_PREFIX:
-            return android.icu.text.DecimalFormat.PAD_BEFORE_PREFIX;
-          case AFTER_PREFIX:
-            return android.icu.text.DecimalFormat.PAD_AFTER_PREFIX;
-          case BEFORE_SUFFIX:
-            return android.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX;
-          case AFTER_SUFFIX:
-            return android.icu.text.DecimalFormat.PAD_AFTER_SUFFIX;
-          default:
-            return -1; // silence compiler errors
+        public int toOld() {
+            switch (this) {
+            case BEFORE_PREFIX:
+                return android.icu.text.DecimalFormat.PAD_BEFORE_PREFIX;
+            case AFTER_PREFIX:
+                return android.icu.text.DecimalFormat.PAD_AFTER_PREFIX;
+            case BEFORE_SUFFIX:
+                return android.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX;
+            case AFTER_SUFFIX:
+                return android.icu.text.DecimalFormat.PAD_AFTER_SUFFIX;
+            default:
+                return -1; // silence compiler errors
+            }
         }
-      }
     }
 
     /* like package-private */ public static final Padder NONE = new Padder(null, -1, null);
@@ -77,10 +74,16 @@
         return targetWidth > 0;
     }
 
-    public int padAndApply(Modifier mod1, Modifier mod2, NumberStringBuilder string, int leftIndex, int rightIndex) {
+    public int padAndApply(
+            Modifier mod1,
+            Modifier mod2,
+            NumberStringBuilder string,
+            int leftIndex,
+            int rightIndex) {
         int modLength = mod1.getCodePointCount() + mod2.getCodePointCount();
         int requiredPadding = targetWidth - modLength - string.codePointCount();
-        assert leftIndex == 0 && rightIndex == string.length(); // fix the previous line to remove this assertion
+        assert leftIndex == 0 && rightIndex == string.length(); // fix the previous line to remove this
+                                                                // assertion
 
         int length = 0;
         if (requiredPadding <= 0) {
@@ -106,7 +109,10 @@
         return length;
     }
 
-    private static int addPaddingHelper(String paddingString, int requiredPadding, NumberStringBuilder string,
+    private static int addPaddingHelper(
+            String paddingString,
+            int requiredPadding,
+            NumberStringBuilder string,
             int index) {
         for (int i = 0; i < requiredPadding; i++) {
             // TODO: If appending to the end, this will cause actual insertion operations. Improve.
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/ParameterizedModifier.java b/android_icu4j/src/main/java/android/icu/impl/number/ParameterizedModifier.java
index ce379ec..1fcc734 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/ParameterizedModifier.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/ParameterizedModifier.java
@@ -6,12 +6,13 @@
 import android.icu.impl.StandardPlural;
 
 /**
- * A ParameterizedModifier by itself is NOT a Modifier. Rather, it wraps a data structure containing two or more
- * Modifiers and returns the modifier appropriate for the current situation.
+ * A ParameterizedModifier by itself is NOT a Modifier. Rather, it wraps a data structure containing two
+ * or more Modifiers and returns the modifier appropriate for the current situation.
  * @hide Only a subset of ICU is exposed in Android
  */
 public class ParameterizedModifier {
     private final Modifier positive;
+    private final Modifier zero;
     private final Modifier negative;
     final Modifier[] mods;
     boolean frozen;
@@ -22,49 +23,51 @@
      * <p>
      * If this constructor is used, a plural form CANNOT be passed to {@link #getModifier}.
      */
-    public ParameterizedModifier(Modifier positive, Modifier negative) {
+    public ParameterizedModifier(Modifier positive, Modifier zero, Modifier negative) {
         this.positive = positive;
+        this.zero = zero;
         this.negative = negative;
         this.mods = null;
         this.frozen = true;
     }
 
     /**
-     * This constructor prepares the ParameterizedModifier to be populated with a positive and negative Modifier for
-     * multiple plural forms.
+     * This constructor prepares the ParameterizedModifier to be populated with a positive and negative
+     * Modifier for multiple plural forms.
      *
      * <p>
      * If this constructor is used, a plural form MUST be passed to {@link #getModifier}.
      */
     public ParameterizedModifier() {
         this.positive = null;
+        this.zero = null;
         this.negative = null;
-        this.mods = new Modifier[2 * StandardPlural.COUNT];
+        this.mods = new Modifier[3 * StandardPlural.COUNT];
         this.frozen = false;
     }
 
-    public void setModifier(boolean isNegative, StandardPlural plural, Modifier mod) {
+    public void setModifier(int signum, StandardPlural plural, Modifier mod) {
         assert !frozen;
-        mods[getModIndex(isNegative, plural)] = mod;
+        mods[getModIndex(signum, plural)] = mod;
     }
 
     public void freeze() {
         frozen = true;
     }
 
-    public Modifier getModifier(boolean isNegative) {
+    public Modifier getModifier(int signum) {
         assert frozen;
         assert mods == null;
-        return isNegative ? negative : positive;
+        return signum == 0 ? zero : signum < 0 ? negative : positive;
     }
 
-    public Modifier getModifier(boolean isNegative, StandardPlural plural) {
+    public Modifier getModifier(int signum, StandardPlural plural) {
         assert frozen;
         assert positive == null;
-        return mods[getModIndex(isNegative, plural)];
+        return mods[getModIndex(signum, plural)];
     }
 
-    private static int getModIndex(boolean isNegative, StandardPlural plural) {
-        return plural.ordinal() * 2 + (isNegative ? 1 : 0);
+    private static int getModIndex(int signum, StandardPlural plural) {
+        return plural.ordinal() * 3 + (signum + 1);
     }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/Parse.java b/android_icu4j/src/main/java/android/icu/impl/number/Parse.java
deleted file mode 100644
index 8fbaf28..0000000
--- a/android_icu4j/src/main/java/android/icu/impl/number/Parse.java
+++ /dev/null
@@ -1,2387 +0,0 @@
-/* GENERATED SOURCE. DO NOT MODIFY. */
-// © 2017 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html#License
-package android.icu.impl.number;
-
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.text.ParseException;
-import java.text.ParsePosition;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import android.icu.impl.StandardPlural;
-import android.icu.impl.TextTrieMap;
-import android.icu.lang.UCharacter;
-import android.icu.text.CurrencyPluralInfo;
-import android.icu.text.DecimalFormatSymbols;
-import android.icu.text.NumberFormat;
-import android.icu.text.UnicodeSet;
-import android.icu.util.Currency;
-import android.icu.util.Currency.CurrencyStringInfo;
-import android.icu.util.CurrencyAmount;
-import android.icu.util.ULocale;
-
-/**
- * A parser designed to convert an arbitrary human-generated string to its best representation as a
- * number: a long, a BigInteger, or a BigDecimal.
- *
- * <p>The parser may traverse multiple parse paths in the same strings if there is ambiguity. For
- * example, the string "12,345.67" has two main interpretations: it could be "12.345" in a locale
- * that uses '.' as the grouping separator, or it could be "12345.67" in a locale that uses ',' as
- * the grouping separator. Since the second option has a longer parse path (consumes more of the
- * input string), the parser will accept the second option.
- * @hide Only a subset of ICU is exposed in Android
- */
-public class Parse {
-
-  /** Controls the set of rules for parsing a string. */
-  public static enum ParseMode {
-    /**
-     * Lenient mode should be used if you want to accept malformed user input. It will use
-     * heuristics to attempt to parse through typographical errors in the string.
-     */
-    LENIENT,
-
-    /**
-     * Strict mode should be used if you want to require that the input is well-formed. More
-     * specifically, it differs from lenient mode in the following ways:
-     *
-     * <ul>
-     *   <li>Grouping widths must match the grouping settings. For example, "12,3,45" will fail if
-     *       the grouping width is 3, as in the pattern "#,##0".
-     *   <li>The string must contain a complete prefix and suffix. For example, if the pattern is
-     *       "{#};(#)", then "{123}" or "(123)" would match, but "{123", "123}", and "123" would all
-     *       fail. (The latter strings would be accepted in lenient mode.)
-     *   <li>Whitespace may not appear at arbitrary places in the string. In lenient mode,
-     *       whitespace is allowed to occur arbitrarily before and after prefixes and exponent
-     *       separators.
-     *   <li>Leading grouping separators are not allowed, as in ",123".
-     *   <li>Minus and plus signs can only appear if specified in the pattern. In lenient mode, a
-     *       plus or minus sign can always precede a number.
-     *   <li>The set of characters that can be interpreted as a decimal or grouping separator is
-     *       smaller.
-     *   <li><strong>If currency parsing is enabled,</strong> currencies must only appear where
-     *       specified in either the current pattern string or in a valid pattern string for the
-     *       current locale. For example, if the pattern is "¤0.00", then "$1.23" would match, but
-     *       "1.23$" would fail to match.
-     * </ul>
-     */
-    STRICT,
-
-    /**
-     * Fast mode should be used in applications that don't require prefixes and suffixes to match.
-     *
-     * <p>In addition to ignoring prefixes and suffixes, fast mode performs the following
-     * optimizations:
-     *
-     * <ul>
-     *   <li>Ignores digit strings from {@link DecimalFormatSymbols} and only uses the code point's
-     *       Unicode digit property. If you are not using custom digit strings, this should not
-     *       cause a change in behavior.
-     *   <li>Instead of traversing multiple possible parse paths, a "greedy" parsing strategy is
-     *       used, which might mean that fast mode won't accept strings that lenient or strict mode
-     *       would accept. Since prefix and suffix strings are ignored, this is not an issue unless
-     *       you are using custom symbols.
-     * </ul>
-     */
-    FAST,
-  }
-
-  /**
-   * An enum containing the choices for strategy in parsing when choosing between grouping and
-   * decimal separators.
-   */
-  public static enum GroupingMode {
-    /**
-     * Accept decimal equivalents as decimals, and if that fails, accept all equivalence classes
-     * (periods, commas, and whitespace-like) as grouping. This is a more lenient strategy.
-     *
-     * <p>For example, if the formatter's current locale is <em>fr-FR</em>, then "1.234" will parse
-     * as 1234, even though <em>fr-FR</em> does not use a period as the grouping separator.
-     */
-    DEFAULT,
-
-    /**
-     * Accept decimal equivalents as decimals and grouping equivalents as grouping. This strategy is
-     * more strict.
-     *
-     * <p>For example, if the formatter's current locale is <em>fr-FR</em>, then "1.234" will fail
-     * to parse since <em>fr-FR</em> does not use a period as the grouping separator.
-     */
-    RESTRICTED
-  }
-
-  /**
-   * @see Parse#parse(String, ParsePosition, ParseMode, boolean, boolean, DecimalFormatProperties,
-   *     DecimalFormatSymbols)
-   */
-  private static enum StateName {
-    BEFORE_PREFIX,
-    AFTER_PREFIX,
-    AFTER_INTEGER_DIGIT,
-    AFTER_FRACTION_DIGIT,
-    AFTER_EXPONENT_SEPARATOR,
-    AFTER_EXPONENT_DIGIT,
-    BEFORE_SUFFIX,
-    BEFORE_SUFFIX_SEEN_EXPONENT,
-    AFTER_SUFFIX,
-    INSIDE_CURRENCY,
-    INSIDE_DIGIT,
-    INSIDE_STRING,
-    INSIDE_AFFIX_PATTERN;
-  }
-
-  // This set was decided after discussion with icu-design@. See ticket #13309.
-  // Zs+TAB is "horizontal whitespace" according to UTS #18 (blank property).
-  private static final UnicodeSet UNISET_WHITESPACE =
-      new UnicodeSet("[[:Zs:][\\u0009]]").freeze();
-
-  // BiDi characters are skipped over and ignored at any point in the string, even in strict mode.
-  private static final UnicodeSet UNISET_BIDI =
-      new UnicodeSet("[[\\u200E\\u200F\\u061C]]").freeze();
-
-  // TODO: Re-generate these sets from the database. They probably haven't been updated in a while.
-  private static final UnicodeSet UNISET_PERIOD_LIKE =
-      new UnicodeSet("[.\\u2024\\u3002\\uFE12\\uFE52\\uFF0E\\uFF61]").freeze();
-  private static final UnicodeSet UNISET_STRICT_PERIOD_LIKE =
-      new UnicodeSet("[.\\u2024\\uFE52\\uFF0E\\uFF61]").freeze();
-  private static final UnicodeSet UNISET_COMMA_LIKE =
-      new UnicodeSet("[,\\u060C\\u066B\\u3001\\uFE10\\uFE11\\uFE50\\uFE51\\uFF0C\\uFF64]").freeze();
-  private static final UnicodeSet UNISET_STRICT_COMMA_LIKE =
-      new UnicodeSet("[,\\u066B\\uFE10\\uFE50\\uFF0C]").freeze();
-  private static final UnicodeSet UNISET_OTHER_GROUPING_SEPARATORS =
-      new UnicodeSet(
-              "[\\ '\\u00A0\\u066C\\u2000-\\u200A\\u2018\\u2019\\u202F\\u205F\\u3000\\uFF07]")
-          .freeze();
-
-  // For parse return value calculation.
-  private static final BigDecimal MIN_LONG_AS_BIG_DECIMAL = new BigDecimal(Long.MIN_VALUE);
-  private static final BigDecimal MAX_LONG_AS_BIG_DECIMAL = new BigDecimal(Long.MAX_VALUE);
-
-  private enum SeparatorType {
-    COMMA_LIKE,
-    PERIOD_LIKE,
-    OTHER_GROUPING,
-    UNKNOWN;
-
-    static SeparatorType fromCp(int cp, ParseMode mode) {
-      if (mode == ParseMode.FAST) {
-        return SeparatorType.UNKNOWN;
-      } else if (mode == ParseMode.STRICT) {
-        if (UNISET_STRICT_COMMA_LIKE.contains(cp)) return COMMA_LIKE;
-        if (UNISET_STRICT_PERIOD_LIKE.contains(cp)) return PERIOD_LIKE;
-        if (UNISET_OTHER_GROUPING_SEPARATORS.contains(cp)) return OTHER_GROUPING;
-        return UNKNOWN;
-      } else {
-        if (UNISET_COMMA_LIKE.contains(cp)) return COMMA_LIKE;
-        if (UNISET_PERIOD_LIKE.contains(cp)) return PERIOD_LIKE;
-        if (UNISET_OTHER_GROUPING_SEPARATORS.contains(cp)) return OTHER_GROUPING;
-        return UNKNOWN;
-      }
-    }
-  }
-
-  private static enum DigitType {
-    INTEGER,
-    FRACTION,
-    EXPONENT
-  }
-
-  /**
-   * Holds a snapshot in time of a single parse path. This includes the digits seen so far, the
-   * current state name, and other properties like the grouping separator used on this parse path,
-   * details about the exponent and negative signs, etc.
-   */
-  private static class StateItem {
-    // Parser state:
-    // The "trailingChars" is used to keep track of how many characters from the end of the string
-    // are ignorable and should be removed from the parse position should this item be accepted.
-    // The "score" is used to help rank two otherwise equivalent parse paths. Currently, the only
-    // function giving points to the score is prefix/suffix.
-    StateName name;
-    int trailingCount;
-    int score;
-
-    // Numerical value:
-    DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
-    int numDigits;
-    int trailingZeros;
-    int exponent;
-
-    // Other items that we've seen:
-    int groupingCp;
-    long groupingWidths;
-    String isoCode;
-    boolean sawNegative;
-    boolean sawNegativeExponent;
-    boolean sawCurrency;
-    boolean sawNaN;
-    boolean sawInfinity;
-    AffixHolder affix;
-    boolean sawPrefix;
-    boolean sawSuffix;
-    boolean sawDecimalPoint;
-    boolean sawExponentDigit;
-
-    // Data for intermediate parsing steps:
-    StateName returnTo1;
-    StateName returnTo2;
-    // For string literals:
-    CharSequence currentString;
-    int currentOffset;
-    boolean currentTrailing;
-    // For affix patterns:
-    CharSequence currentAffixPattern;
-    long currentStepwiseParserTag;
-    // For currency:
-    TextTrieMap<CurrencyStringInfo>.ParseState currentCurrencyTrieState;
-    // For multi-code-point digits:
-    TextTrieMap<Byte>.ParseState currentDigitTrieState;
-    DigitType currentDigitType;
-
-    // Identification for path tracing:
-    final char id;
-    String path;
-
-    StateItem(char _id) {
-      id = _id;
-    }
-
-    /**
-     * Clears the instance so that it can be re-used.
-     *
-     * @return Myself, for chaining.
-     */
-    StateItem clear() {
-      // Parser state:
-      name = StateName.BEFORE_PREFIX;
-      trailingCount = 0;
-      score = 0;
-
-      // Numerical value:
-      fq.clear();
-      numDigits = 0;
-      trailingZeros = 0;
-      exponent = 0;
-
-      // Other items we've seen:
-      groupingCp = -1;
-      groupingWidths = 0L;
-      isoCode = null;
-      sawNegative = false;
-      sawNegativeExponent = false;
-      sawCurrency = false;
-      sawNaN = false;
-      sawInfinity = false;
-      affix = null;
-      sawPrefix = false;
-      sawSuffix = false;
-      sawDecimalPoint = false;
-      sawExponentDigit = false;
-
-      // Data for intermediate parsing steps:
-      returnTo1 = null;
-      returnTo2 = null;
-      currentString = null;
-      currentOffset = 0;
-      currentTrailing = false;
-      currentAffixPattern = null;
-      currentStepwiseParserTag = 0L;
-      currentCurrencyTrieState = null;
-      currentDigitTrieState = null;
-      currentDigitType = null;
-
-      // Identification for path tracing:
-      // id is constant and is not cleared
-      path = "";
-
-      return this;
-    }
-
-    /**
-     * Sets the internal value of this instance equal to another instance.
-     *
-     * <p>newName and cpOrN1 are required as parameters to this function because every time a code
-     * point is consumed and a state item is copied, both of the corresponding fields should be
-     * updated; it would be an error if they weren't updated.
-     *
-     * @param other The instance to copy from.
-     * @param newName The state name that the new copy should take on.
-     * @param trailing If positive, record this code point as trailing; if negative, reset the
-     *     trailing count to zero.
-     * @return Myself, for chaining.
-     */
-    StateItem copyFrom(StateItem other, StateName newName, int trailing) {
-      // Parser state:
-      name = newName;
-      score = other.score;
-
-      // Either reset trailingCount or add the width of the current code point.
-      trailingCount = (trailing < 0) ? 0 : other.trailingCount + Character.charCount(trailing);
-
-      // Numerical value:
-      fq.copyFrom(other.fq);
-      numDigits = other.numDigits;
-      trailingZeros = other.trailingZeros;
-      exponent = other.exponent;
-
-      // Other items we've seen:
-      groupingCp = other.groupingCp;
-      groupingWidths = other.groupingWidths;
-      isoCode = other.isoCode;
-      sawNegative = other.sawNegative;
-      sawNegativeExponent = other.sawNegativeExponent;
-      sawCurrency = other.sawCurrency;
-      sawNaN = other.sawNaN;
-      sawInfinity = other.sawInfinity;
-      affix = other.affix;
-      sawPrefix = other.sawPrefix;
-      sawSuffix = other.sawSuffix;
-      sawDecimalPoint = other.sawDecimalPoint;
-      sawExponentDigit = other.sawExponentDigit;
-
-      // Data for intermediate parsing steps:
-      returnTo1 = other.returnTo1;
-      returnTo2 = other.returnTo2;
-      currentString = other.currentString;
-      currentOffset = other.currentOffset;
-      currentTrailing = other.currentTrailing;
-      currentAffixPattern = other.currentAffixPattern;
-      currentStepwiseParserTag = other.currentStepwiseParserTag;
-      currentCurrencyTrieState = other.currentCurrencyTrieState;
-      currentDigitTrieState = other.currentDigitTrieState;
-      currentDigitType = other.currentDigitType;
-
-      // Record source node if debugging
-      if (DEBUGGING) {
-        path = other.path + other.id;
-      }
-
-      return this;
-    }
-
-    /**
-     * Adds a digit to the internal representation of this instance.
-     *
-     * @param digit The digit that was read from the string.
-     * @param type Whether the digit occured after the decimal point.
-     */
-    void appendDigit(byte digit, DigitType type) {
-      if (type == DigitType.EXPONENT) {
-        sawExponentDigit = true;
-        int newExponent = exponent * 10 + digit;
-        if (newExponent < exponent) {
-          // overflow
-          exponent = Integer.MAX_VALUE;
-        } else {
-          exponent = newExponent;
-        }
-      } else {
-        numDigits++;
-        if (type == DigitType.FRACTION && digit == 0) {
-          trailingZeros++;
-        } else if (type == DigitType.FRACTION) {
-          fq.appendDigit(digit, trailingZeros, false);
-          trailingZeros = 0;
-        } else {
-          fq.appendDigit(digit, 0, true);
-        }
-      }
-    }
-
-    /** @return Whether or not this item contains a valid number. */
-    public boolean hasNumber() {
-      return numDigits > 0 || sawNaN || sawInfinity;
-    }
-
-    /**
-     * Converts the internal digits from this instance into a Number, preferring a Long, then a
-     * BigInteger, then a BigDecimal. A Double is used for NaN, infinity, and -0.0.
-     *
-     * @return The Number. Never null.
-     */
-    Number toNumber(DecimalFormatProperties properties) {
-      // Check for NaN, infinity, and -0.0
-      if (sawNaN) {
-        return Double.NaN;
-      }
-      if (sawInfinity) {
-        if (sawNegative) {
-          return Double.NEGATIVE_INFINITY;
-        } else {
-          return Double.POSITIVE_INFINITY;
-        }
-      }
-      if (fq.isZero() && sawNegative) {
-        return -0.0;
-      }
-
-      // Check for exponent overflow
-      boolean forceBigDecimal = properties.getParseToBigDecimal();
-      if (exponent == Integer.MAX_VALUE) {
-        if (sawNegativeExponent && sawNegative) {
-          return -0.0;
-        } else if (sawNegativeExponent) {
-          return 0.0;
-        } else if (sawNegative) {
-          return Double.NEGATIVE_INFINITY;
-        } else {
-          return Double.POSITIVE_INFINITY;
-        }
-      } else if (exponent > 1000) {
-        // BigDecimals can handle huge values better than BigIntegers.
-        forceBigDecimal = true;
-      }
-
-      // Multipliers must be applied in reverse.
-      BigDecimal multiplier = properties.getMultiplier();
-      if (properties.getMagnitudeMultiplier() != 0) {
-        if (multiplier == null) multiplier = BigDecimal.ONE;
-        multiplier = multiplier.scaleByPowerOfTen(properties.getMagnitudeMultiplier());
-      }
-      int delta = (sawNegativeExponent ? -1 : 1) * exponent;
-
-      // We need to use a math context in order to prevent non-terminating decimal expansions.
-      // This is only used when dividing by the multiplier.
-      MathContext mc = RoundingUtils.getMathContextOr34Digits(properties);
-
-      // Construct the output number.
-      // This is the only step during fast-mode parsing that incurs object creations.
-      BigDecimal result = fq.toBigDecimal();
-      if (sawNegative) result = result.negate();
-      result = result.scaleByPowerOfTen(delta);
-      if (multiplier != null) {
-        result = result.divide(multiplier, mc);
-      }
-      result = result.stripTrailingZeros();
-      if (forceBigDecimal || result.scale() > 0) {
-        return result;
-      } else if (result.compareTo(MIN_LONG_AS_BIG_DECIMAL) >= 0
-          && result.compareTo(MAX_LONG_AS_BIG_DECIMAL) <= 0) {
-        return result.longValueExact();
-      } else {
-        return result.toBigIntegerExact();
-      }
-    }
-
-    /**
-     * Converts the internal digits to a number, and also associates the number with the parsed
-     * currency.
-     *
-     * @return The CurrencyAmount. Never null.
-     */
-    public CurrencyAmount toCurrencyAmount(DecimalFormatProperties properties) {
-      assert isoCode != null;
-      Number number = toNumber(properties);
-      Currency currency = Currency.getInstance(isoCode);
-      return new CurrencyAmount(number, currency);
-    }
-
-    @Override
-    public String toString() {
-      StringBuilder sb = new StringBuilder();
-      sb.append("[");
-      sb.append(path);
-      sb.append("] ");
-      sb.append(name.name());
-      if (name == StateName.INSIDE_STRING) {
-        sb.append("{");
-        sb.append(currentString);
-        sb.append(":");
-        sb.append(currentOffset);
-        sb.append("}");
-      }
-      if (name == StateName.INSIDE_AFFIX_PATTERN) {
-        sb.append("{");
-        sb.append(currentAffixPattern);
-        sb.append(":");
-        sb.append(AffixUtils.getOffset(currentStepwiseParserTag) - 1);
-        sb.append("}");
-      }
-      sb.append(" ");
-      sb.append(fq.toBigDecimal());
-      sb.append(" grouping:");
-      sb.append(groupingCp == -1 ? new char[] {'?'} : Character.toChars(groupingCp));
-      sb.append(" widths:");
-      sb.append(Long.toHexString(groupingWidths));
-      sb.append(" seen:");
-      sb.append(sawNegative ? 1 : 0);
-      sb.append(sawNegativeExponent ? 1 : 0);
-      sb.append(sawNaN ? 1 : 0);
-      sb.append(sawInfinity ? 1 : 0);
-      sb.append(sawPrefix ? 1 : 0);
-      sb.append(sawSuffix ? 1 : 0);
-      sb.append(sawDecimalPoint ? 1 : 0);
-      sb.append(" trailing:");
-      sb.append(trailingCount);
-      sb.append(" score:");
-      sb.append(score);
-      sb.append(" affix:");
-      sb.append(affix);
-      sb.append(" currency:");
-      sb.append(isoCode);
-      return sb.toString();
-    }
-  }
-
-  /**
-   * Holds an ordered list of {@link StateItem} and other metadata about the string to be parsed.
-   * There are two internal arrays of {@link StateItem}, which are swapped back and forth in order
-   * to avoid object creations. The items in one array can be populated at the same time that items
-   * in the other array are being read from.
-   */
-  private static class ParserState {
-
-    // Basic ParserStateItem lists:
-    StateItem[] items = new StateItem[16];
-    StateItem[] prevItems = new StateItem[16];
-    int length;
-    int prevLength;
-
-    // Properties and Symbols memory:
-    DecimalFormatProperties properties;
-    DecimalFormatSymbols symbols;
-    ParseMode mode;
-    boolean caseSensitive;
-    boolean parseCurrency;
-    GroupingMode groupingMode;
-
-    // Other pre-computed fields:
-    int decimalCp1;
-    int decimalCp2;
-    int groupingCp1;
-    int groupingCp2;
-    SeparatorType decimalType1;
-    SeparatorType decimalType2;
-    SeparatorType groupingType1;
-    SeparatorType groupingType2;
-
-    TextTrieMap<Byte> digitTrie;
-    Set<AffixHolder> affixHolders = new HashSet<AffixHolder>();
-
-    ParserState() {
-      for (int i = 0; i < items.length; i++) {
-        items[i] = new StateItem((char) ('A' + i));
-        prevItems[i] = new StateItem((char) ('A' + i));
-      }
-    }
-
-    /**
-     * Clears the internal state in order to prepare for parsing a new string.
-     *
-     * @return Myself, for chaining.
-     */
-    ParserState clear() {
-      length = 0;
-      prevLength = 0;
-      digitTrie = null;
-      affixHolders.clear();
-      return this;
-    }
-
-    /**
-     * Swaps the internal arrays of {@link StateItem}. Sets the length of the primary list to zero,
-     * so that it can be appended to.
-     */
-    void swap() {
-      StateItem[] temp = prevItems;
-      prevItems = items;
-      items = temp;
-      prevLength = length;
-      length = 0;
-    }
-
-    /**
-     * Swaps the internal arrays of {@link StateItem}. Sets the length of the primary list to the
-     * length of the previous list, so that it can be read from.
-     */
-    void swapBack() {
-      StateItem[] temp = prevItems;
-      prevItems = items;
-      items = temp;
-      length = prevLength;
-      prevLength = 0;
-    }
-
-    /**
-     * Gets the next available {@link StateItem} from the primary list for writing. This method
-     * should be thought of like a list append method, except that there are no object creations
-     * taking place.
-     *
-     * <p>It is the caller's responsibility to call either {@link StateItem#clear} or {@link
-     * StateItem#copyFrom} on the returned object.
-     *
-     * @return A dirty {@link StateItem}.
-     */
-    StateItem getNext() {
-      if (length >= items.length) {
-        // TODO: What to do here? Expand the array?
-        // This case is rare and would happen only with specially designed input.
-        // For now, just overwrite the last entry.
-        length = items.length - 1;
-      }
-      StateItem item = items[length];
-      length++;
-      return item;
-    }
-
-    /** @return The index of the last inserted StateItem via a call to {@link #getNext}. */
-    public int lastInsertedIndex() {
-      assert length > 0;
-      return length - 1;
-    }
-
-    /**
-     * Gets a {@link StateItem} from the primary list. Assumes that the item has already been added
-     * via a call to {@link #getNext}.
-     *
-     * @param i The index of the item to get.
-     * @return The item.
-     */
-    public StateItem getItem(int i) {
-      assert i >= 0 && i < length;
-      return items[i];
-    }
-
-    @Override
-    public String toString() {
-      StringBuilder sb = new StringBuilder();
-      sb.append("<ParseState mode:");
-      sb.append(mode);
-      sb.append(" caseSensitive:");
-      sb.append(caseSensitive);
-      sb.append(" parseCurrency:");
-      sb.append(parseCurrency);
-      sb.append(" groupingMode:");
-      sb.append(groupingMode);
-      sb.append(" decimalCps:");
-      sb.append((char) decimalCp1);
-      sb.append((char) decimalCp2);
-      sb.append(" groupingCps:");
-      sb.append((char) groupingCp1);
-      sb.append((char) groupingCp2);
-      sb.append(" affixes:");
-      sb.append(affixHolders);
-      sb.append(">");
-      return sb.toString();
-    }
-  }
-
-  /**
-   * A wrapper for affixes. Affixes can be string-based or pattern-based, and they can come from
-   * several sources, including the property bag and the locale paterns from CLDR data.
-   */
-  private static class AffixHolder {
-    final String p; // prefix
-    final String s; // suffix
-    final boolean strings;
-    final boolean negative;
-
-    static final AffixHolder EMPTY_POSITIVE = new AffixHolder("", "", true, false);
-    static final AffixHolder EMPTY_NEGATIVE = new AffixHolder("", "", true, true);
-
-    static void addToState(ParserState state, DecimalFormatProperties properties) {
-      AffixHolder pp = fromPropertiesPositivePattern(properties);
-      AffixHolder np = fromPropertiesNegativePattern(properties);
-      AffixHolder ps = fromPropertiesPositiveString(properties);
-      AffixHolder ns = fromPropertiesNegativeString(properties);
-      if (pp != null) state.affixHolders.add(pp);
-      if (ps != null) state.affixHolders.add(ps);
-      if (np != null) state.affixHolders.add(np);
-      if (ns != null) state.affixHolders.add(ns);
-    }
-
-    static AffixHolder fromPropertiesPositivePattern(DecimalFormatProperties properties) {
-      String ppp = properties.getPositivePrefixPattern();
-      String psp = properties.getPositiveSuffixPattern();
-      if (properties.getSignAlwaysShown()) {
-        // TODO: This logic is somewhat duplicated from MurkyModifier.
-        boolean foundSign = false;
-        String npp = properties.getNegativePrefixPattern();
-        String nsp = properties.getNegativeSuffixPattern();
-        if (AffixUtils.containsType(npp, AffixUtils.TYPE_MINUS_SIGN)) {
-          foundSign = true;
-          ppp = AffixUtils.replaceType(npp, AffixUtils.TYPE_MINUS_SIGN, '+');
-        }
-        if (AffixUtils.containsType(nsp, AffixUtils.TYPE_MINUS_SIGN)) {
-          foundSign = true;
-          psp = AffixUtils.replaceType(nsp, AffixUtils.TYPE_MINUS_SIGN, '+');
-        }
-        if (!foundSign) {
-          ppp = "+" + ppp;
-        }
-      }
-      return getInstance(ppp, psp, false, false);
-    }
-
-    static AffixHolder fromPropertiesNegativePattern(DecimalFormatProperties properties) {
-      String npp = properties.getNegativePrefixPattern();
-      String nsp = properties.getNegativeSuffixPattern();
-      if (npp == null && nsp == null) {
-        npp = properties.getPositivePrefixPattern();
-        nsp = properties.getPositiveSuffixPattern();
-        if (npp == null) {
-          npp = "-";
-        } else {
-          npp = "-" + npp;
-        }
-      }
-      return getInstance(npp, nsp, false, true);
-    }
-
-    static AffixHolder fromPropertiesPositiveString(DecimalFormatProperties properties) {
-      String pp = properties.getPositivePrefix();
-      String ps = properties.getPositiveSuffix();
-      if (pp == null && ps == null) return null;
-      return getInstance(pp, ps, true, false);
-    }
-
-    static AffixHolder fromPropertiesNegativeString(DecimalFormatProperties properties) {
-      String np = properties.getNegativePrefix();
-      String ns = properties.getNegativeSuffix();
-      if (np == null && ns == null) return null;
-      return getInstance(np, ns, true, true);
-    }
-
-    static AffixHolder getInstance(String p, String s, boolean strings, boolean negative) {
-      if (p == null && s == null) return negative ? EMPTY_NEGATIVE : EMPTY_POSITIVE;
-      if (p == null) p = "";
-      if (s == null) s = "";
-      if (p.length() == 0 && s.length() == 0) return negative ? EMPTY_NEGATIVE : EMPTY_POSITIVE;
-      return new AffixHolder(p, s, strings, negative);
-    }
-
-    AffixHolder(String pp, String sp, boolean strings, boolean negative) {
-      this.p = pp;
-      this.s = sp;
-      this.strings = strings;
-      this.negative = negative;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      if (other == null) return false;
-      if (this == other) return true;
-      if (!(other instanceof AffixHolder)) return false;
-      AffixHolder _other = (AffixHolder) other;
-      if (!p.equals(_other.p)) return false;
-      if (!s.equals(_other.s)) return false;
-      if (strings != _other.strings) return false;
-      if (negative != _other.negative) return false;
-      return true;
-    }
-
-    @Override
-    public int hashCode() {
-      return p.hashCode() ^ s.hashCode();
-    }
-
-    @Override
-    public String toString() {
-      StringBuilder sb = new StringBuilder();
-      sb.append("{");
-      sb.append(p);
-      sb.append("|");
-      sb.append(s);
-      sb.append("|");
-      sb.append(strings ? 'S' : 'P');
-      sb.append("}");
-      return sb.toString();
-    }
-  }
-
-  /**
-   * A class that holds information about all currency affix patterns for the locale. This allows
-   * the parser to accept currencies in any format that are valid for the locale.
-   */
-  private static class CurrencyAffixPatterns {
-    private final Set<AffixHolder> set = new HashSet<AffixHolder>();
-
-    private static final ConcurrentHashMap<ULocale, CurrencyAffixPatterns> currencyAffixPatterns =
-        new ConcurrentHashMap<ULocale, CurrencyAffixPatterns>();
-
-    static void addToState(ULocale uloc, ParserState state) {
-      CurrencyAffixPatterns value = currencyAffixPatterns.get(uloc);
-      if (value == null) {
-        // There can be multiple threads computing the same CurrencyAffixPatterns simultaneously,
-        // but that scenario is harmless.
-        CurrencyAffixPatterns newValue = new CurrencyAffixPatterns(uloc);
-        currencyAffixPatterns.putIfAbsent(uloc, newValue);
-        value = currencyAffixPatterns.get(uloc);
-      }
-      state.affixHolders.addAll(value.set);
-    }
-
-    private CurrencyAffixPatterns(ULocale uloc) {
-      // Get the basic currency pattern.
-      String pattern = NumberFormat.getPatternForStyle(uloc, NumberFormat.CURRENCYSTYLE);
-      addPattern(pattern);
-
-      // Get the currency plural patterns.
-      // TODO: Update this after CurrencyPluralInfo is replaced.
-      CurrencyPluralInfo pluralInfo = CurrencyPluralInfo.getInstance(uloc);
-      for (StandardPlural plural : StandardPlural.VALUES) {
-        pattern = pluralInfo.getCurrencyPluralPattern(plural.getKeyword());
-        addPattern(pattern);
-      }
-    }
-
-    private static final ThreadLocal<DecimalFormatProperties> threadLocalProperties =
-        new ThreadLocal<DecimalFormatProperties>() {
-          @Override
-          protected DecimalFormatProperties initialValue() {
-            return new DecimalFormatProperties();
-          }
-        };
-
-    private void addPattern(String pattern) {
-      DecimalFormatProperties properties = threadLocalProperties.get();
-      try {
-        PatternStringParser.parseToExistingProperties(pattern, properties);
-      } catch (IllegalArgumentException e) {
-        // This should only happen if there is a bug in CLDR data. Fail silently.
-      }
-      set.add(AffixHolder.fromPropertiesPositivePattern(properties));
-      set.add(AffixHolder.fromPropertiesNegativePattern(properties));
-    }
-  }
-
-  /**
-   * Makes a {@link TextTrieMap} for parsing digit strings. A trie is required only if the digit
-   * strings are longer than one code point. In order for this to be the case, the user would have
-   * needed to specify custom multi-character digits, like "(0)".
-   *
-   * @param digitStrings The list of digit strings from DecimalFormatSymbols.
-   * @return A trie, or null if a trie is not required.
-   */
-  static TextTrieMap<Byte> makeDigitTrie(String[] digitStrings) {
-    boolean requiresTrie = false;
-    for (int i = 0; i < 10; i++) {
-      String str = digitStrings[i];
-      if (Character.charCount(Character.codePointAt(str, 0)) != str.length()) {
-        requiresTrie = true;
-        break;
-      }
-    }
-    if (!requiresTrie) return null;
-
-    // TODO: Consider caching the tries so they don't need to be re-created run to run.
-    // (Low-priority since multi-character digits are rare in practice)
-    TextTrieMap<Byte> trieMap = new TextTrieMap<Byte>(false);
-    for (int i = 0; i < 10; i++) {
-      trieMap.put(digitStrings[i], (byte) i);
-    }
-    return trieMap;
-  }
-
-  protected static final ThreadLocal<ParserState> threadLocalParseState =
-      new ThreadLocal<ParserState>() {
-        @Override
-        protected ParserState initialValue() {
-          return new ParserState();
-        }
-      };
-
-  protected static final ThreadLocal<ParsePosition> threadLocalParsePosition =
-      new ThreadLocal<ParsePosition>() {
-        @Override
-        protected ParsePosition initialValue() {
-          return new ParsePosition(0);
-        }
-      };
-
-  /**
-   * @deprecated This API is ICU internal only. TODO: Remove this set from ScientificNumberFormat.
- * @hide draft / provisional / internal are hidden on Android
-   */
-  @Deprecated
-  public static final UnicodeSet UNISET_PLUS =
-      new UnicodeSet(
-              0x002B, 0x002B, 0x207A, 0x207A, 0x208A, 0x208A, 0x2795, 0x2795, 0xFB29, 0xFB29,
-              0xFE62, 0xFE62, 0xFF0B, 0xFF0B)
-          .freeze();
-
-  /**
-   * @deprecated This API is ICU internal only. TODO: Remove this set from ScientificNumberFormat.
- * @hide draft / provisional / internal are hidden on Android
-   */
-  @Deprecated
-  public static final UnicodeSet UNISET_MINUS =
-      new UnicodeSet(
-              0x002D, 0x002D, 0x207B, 0x207B, 0x208B, 0x208B, 0x2212, 0x2212, 0x2796, 0x2796,
-              0xFE63, 0xFE63, 0xFF0D, 0xFF0D)
-          .freeze();
-
-  public static Number parse(String input, DecimalFormatProperties properties, DecimalFormatSymbols symbols) {
-    ParsePosition ppos = threadLocalParsePosition.get();
-    ppos.setIndex(0);
-    return parse(input, ppos, properties, symbols);
-  }
-
-  // TODO: DELETE ME once debugging is finished
-  public static volatile boolean DEBUGGING = false;
-
-  /**
-   * Implements an iterative parser that maintains a lists of possible states at each code point in
-   * the string. At each code point in the string, the list of possible states is updated based on
-   * the states coming from the previous code point. The parser stops when it reaches the end of the
-   * string or when there are no possible parse paths remaining in the string.
-   *
-   * <p>TODO: This API is not fully flushed out. Right now this is internal-only.
-   *
-   * @param input The string to parse.
-   * @param ppos A {@link ParsePosition} to hold the index at which parsing stopped.
-   * @param properties A property bag, used only for determining the prefix/suffix strings and the
-   *     padding character.
-   * @param symbols A {@link DecimalFormatSymbols} object, used for determining locale-specific
-   *     symbols for grouping/decimal separators, digit strings, and prefix/suffix substitutions.
-   * @return A Number matching the parser's best interpretation of the string.
-   */
-  public static Number parse(
-      CharSequence input,
-      ParsePosition ppos,
-      DecimalFormatProperties properties,
-      DecimalFormatSymbols symbols) {
-    StateItem best = _parse(input, ppos, false, properties, symbols);
-    return (best == null) ? null : best.toNumber(properties);
-  }
-
-  public static CurrencyAmount parseCurrency(
-      String input, DecimalFormatProperties properties, DecimalFormatSymbols symbols) throws ParseException {
-    return parseCurrency(input, null, properties, symbols);
-  }
-
-  public static CurrencyAmount parseCurrency(
-      CharSequence input, ParsePosition ppos, DecimalFormatProperties properties, DecimalFormatSymbols symbols)
-      throws ParseException {
-    if (ppos == null) {
-      ppos = threadLocalParsePosition.get();
-      ppos.setIndex(0);
-      ppos.setErrorIndex(-1);
-    }
-    StateItem best = _parse(input, ppos, true, properties, symbols);
-    return (best == null) ? null : best.toCurrencyAmount(properties);
-  }
-
-  private static StateItem _parse(
-      CharSequence input,
-      ParsePosition ppos,
-      boolean parseCurrency,
-      DecimalFormatProperties properties,
-      DecimalFormatSymbols symbols) {
-
-    if (input == null || ppos == null || properties == null || symbols == null) {
-      throw new IllegalArgumentException("All arguments are required for parse.");
-    }
-
-    ParseMode mode = properties.getParseMode();
-    if (mode == null) mode = ParseMode.LENIENT;
-    boolean integerOnly = properties.getParseIntegerOnly();
-    boolean ignoreExponent = properties.getParseNoExponent();
-    boolean ignoreGrouping = properties.getGroupingSize() <= 0;
-
-    // Set up the initial state
-    ParserState state = threadLocalParseState.get().clear();
-    state.properties = properties;
-    state.symbols = symbols;
-    state.mode = mode;
-    state.parseCurrency = parseCurrency;
-    state.groupingMode = properties.getParseGroupingMode();
-    if (state.groupingMode == null) state.groupingMode = GroupingMode.DEFAULT;
-    state.caseSensitive = properties.getParseCaseSensitive();
-    state.decimalCp1 = Character.codePointAt(symbols.getDecimalSeparatorString(), 0);
-    state.decimalCp2 = Character.codePointAt(symbols.getMonetaryDecimalSeparatorString(), 0);
-    state.groupingCp1 = Character.codePointAt(symbols.getGroupingSeparatorString(), 0);
-    state.groupingCp2 = Character.codePointAt(symbols.getMonetaryGroupingSeparatorString(), 0);
-    state.decimalType1 = SeparatorType.fromCp(state.decimalCp1, mode);
-    state.decimalType2 = SeparatorType.fromCp(state.decimalCp2, mode);
-    state.groupingType1 = SeparatorType.fromCp(state.groupingCp1, mode);
-    state.groupingType2 = SeparatorType.fromCp(state.groupingCp2, mode);
-    StateItem initialStateItem = state.getNext().clear();
-    initialStateItem.name = StateName.BEFORE_PREFIX;
-
-    if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-      state.digitTrie = makeDigitTrie(symbols.getDigitStringsLocal());
-      AffixHolder.addToState(state, properties);
-      if (parseCurrency) {
-        CurrencyAffixPatterns.addToState(symbols.getULocale(), state);
-      }
-    }
-
-    if (DEBUGGING) {
-      System.out.println("Parsing: " + input);
-      System.out.println(properties);
-      System.out.println(state);
-    }
-
-    // Start walking through the string, one codepoint at a time. Backtracking is not allowed. This
-    // is to enforce linear runtime and prevent cases that could result in an infinite loop.
-    int offset = ppos.getIndex();
-    for (; offset < input.length(); ) {
-      int cp = Character.codePointAt(input, offset);
-      state.swap();
-      for (int i = 0; i < state.prevLength; i++) {
-        StateItem item = state.prevItems[i];
-        if (DEBUGGING) {
-          System.out.println(":" + offset + item.id + " " + item);
-        }
-
-        // In the switch statement below, if you see a line like:
-        //    if (state.length > 0 && mode == ParseMode.FAST) break;
-        // it is used for accelerating the fast parse mode. The check is performed only in the
-        // states BEFORE_PREFIX, AFTER_INTEGER_DIGIT, and AFTER_FRACTION_DIGIT, which are the
-        // most common states.
-
-        switch (item.name) {
-          case BEFORE_PREFIX:
-            // Beginning of string
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptMinusOrPlusSign(cp, StateName.BEFORE_PREFIX, state, item, false);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            acceptIntegerDigit(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptBidi(cp, StateName.BEFORE_PREFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptWhitespace(cp, StateName.BEFORE_PREFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptPadding(cp, StateName.BEFORE_PREFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptNan(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptInfinity(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            if (!integerOnly) {
-              acceptDecimalPoint(cp, StateName.AFTER_FRACTION_DIGIT, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptPrefix(cp, StateName.AFTER_PREFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              if (!ignoreGrouping) {
-                acceptGrouping(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-                if (state.length > 0 && mode == ParseMode.FAST) break;
-              }
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_PREFIX, state, item);
-              }
-            }
-            break;
-
-          case AFTER_PREFIX:
-            // Prefix is consumed
-            acceptBidi(cp, StateName.AFTER_PREFIX, state, item);
-            acceptPadding(cp, StateName.AFTER_PREFIX, state, item);
-            acceptNan(cp, StateName.BEFORE_SUFFIX, state, item);
-            acceptInfinity(cp, StateName.BEFORE_SUFFIX, state, item);
-            acceptIntegerDigit(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-            if (!integerOnly) {
-              acceptDecimalPoint(cp, StateName.AFTER_FRACTION_DIGIT, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.AFTER_PREFIX, state, item);
-              if (!ignoreGrouping) {
-                acceptGrouping(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-              }
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.AFTER_PREFIX, state, item);
-              }
-            }
-            break;
-
-          case AFTER_INTEGER_DIGIT:
-            // Previous character was an integer digit (or grouping/whitespace)
-            acceptIntegerDigit(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            if (!integerOnly) {
-              acceptDecimalPoint(cp, StateName.AFTER_FRACTION_DIGIT, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            if (!ignoreGrouping) {
-              acceptGrouping(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            acceptBidi(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptPadding(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            if (!ignoreExponent) {
-              acceptExponentSeparator(cp, StateName.AFTER_EXPONENT_SEPARATOR, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptSuffix(cp, StateName.AFTER_SUFFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.BEFORE_SUFFIX, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.BEFORE_SUFFIX, state, item, false);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_SUFFIX, state, item);
-              }
-            }
-            break;
-
-          case AFTER_FRACTION_DIGIT:
-            // We encountered a decimal point
-            acceptFractionDigit(cp, StateName.AFTER_FRACTION_DIGIT, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptBidi(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptPadding(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            if (!ignoreExponent) {
-              acceptExponentSeparator(cp, StateName.AFTER_EXPONENT_SEPARATOR, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptSuffix(cp, StateName.AFTER_SUFFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.BEFORE_SUFFIX, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.BEFORE_SUFFIX, state, item, false);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_SUFFIX, state, item);
-              }
-            }
-            break;
-
-          case AFTER_EXPONENT_SEPARATOR:
-            acceptBidi(cp, StateName.AFTER_EXPONENT_SEPARATOR, state, item);
-            acceptMinusOrPlusSign(cp, StateName.AFTER_EXPONENT_SEPARATOR, state, item, true);
-            acceptExponentDigit(cp, StateName.AFTER_EXPONENT_DIGIT, state, item);
-            break;
-
-          case AFTER_EXPONENT_DIGIT:
-            acceptBidi(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-            acceptPadding(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-            acceptExponentDigit(cp, StateName.AFTER_EXPONENT_DIGIT, state, item);
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptSuffix(cp, StateName.AFTER_SUFFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.BEFORE_SUFFIX, state, item, false);
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-              }
-            }
-            break;
-
-          case BEFORE_SUFFIX:
-            // Accept whitespace, suffixes, and exponent separators
-            acceptBidi(cp, StateName.BEFORE_SUFFIX, state, item);
-            acceptPadding(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (!ignoreExponent) {
-              acceptExponentSeparator(cp, StateName.AFTER_EXPONENT_SEPARATOR, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptSuffix(cp, StateName.AFTER_SUFFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.BEFORE_SUFFIX, state, item);
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.BEFORE_SUFFIX, state, item, false);
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_SUFFIX, state, item);
-              }
-            }
-            break;
-
-          case BEFORE_SUFFIX_SEEN_EXPONENT:
-            // Accept whitespace and suffixes but not exponent separators
-            acceptBidi(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-            acceptPadding(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptSuffix(cp, StateName.AFTER_SUFFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item, false);
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-              }
-            }
-            break;
-
-          case AFTER_SUFFIX:
-            if ((mode == ParseMode.LENIENT || mode == ParseMode.FAST) && parseCurrency) {
-              // Continue traversing in case there is a currency symbol to consume
-              acceptBidi(cp, StateName.AFTER_SUFFIX, state, item);
-              acceptPadding(cp, StateName.AFTER_SUFFIX, state, item);
-              acceptWhitespace(cp, StateName.AFTER_SUFFIX, state, item);
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.AFTER_SUFFIX, state, item, false);
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.AFTER_SUFFIX, state, item);
-              }
-            }
-            // Otherwise, do not accept any more characters.
-            break;
-
-          case INSIDE_CURRENCY:
-            acceptCurrencyOffset(cp, state, item);
-            break;
-
-          case INSIDE_DIGIT:
-            acceptDigitTrieOffset(cp, state, item);
-            break;
-
-          case INSIDE_STRING:
-            acceptStringOffset(cp, state, item);
-            break;
-
-          case INSIDE_AFFIX_PATTERN:
-            acceptAffixPatternOffset(cp, state, item);
-            break;
-        }
-      }
-
-      if (state.length == 0) {
-        // No parse paths continue past this point. We have found the longest parsable string
-        // from the input. Restore previous state without the offset and break.
-        state.swapBack();
-        break;
-      }
-
-      offset += Character.charCount(cp);
-    }
-
-    // Post-processing
-    if (state.length == 0) {
-      if (DEBUGGING) {
-        System.out.println("No matches found");
-        System.out.println("- - - - - - - - - -");
-      }
-      return null;
-    } else {
-
-      // Loop through the candidates.  "continue" skips a candidate as invalid.
-      StateItem best = null;
-      outer:
-      for (int i = 0; i < state.length; i++) {
-        StateItem item = state.items[i];
-
-        if (DEBUGGING) {
-          System.out.println(":end " + item);
-        }
-
-        // Check that at least one digit was read.
-        if (!item.hasNumber()) {
-          if (DEBUGGING) System.out.println("-> rejected due to no number value");
-          continue;
-        }
-
-        if (mode == ParseMode.STRICT) {
-          // Perform extra checks for strict mode.
-          // We require that the affixes match.
-          boolean sawPrefix = item.sawPrefix || (item.affix != null && item.affix.p.isEmpty());
-          boolean sawSuffix = item.sawSuffix || (item.affix != null && item.affix.s.isEmpty());
-          boolean hasEmptyAffix =
-              state.affixHolders.contains(AffixHolder.EMPTY_POSITIVE)
-                  || state.affixHolders.contains(AffixHolder.EMPTY_NEGATIVE);
-          if (sawPrefix && sawSuffix) {
-            // OK
-          } else if (!sawPrefix && !sawSuffix && hasEmptyAffix) {
-            // OK
-          } else {
-            // Has a prefix or suffix that doesn't match
-            if (DEBUGGING) System.out.println("-> rejected due to mismatched prefix/suffix");
-            continue;
-          }
-
-          // Check for scientific notation.
-          if (properties.getMinimumExponentDigits() > 0 && !item.sawExponentDigit) {
-            if (DEBUGGING) System.out.println("-> reject due to lack of exponent");
-            continue;
-          }
-
-          // Check that grouping sizes are valid.
-          int grouping1 = properties.getGroupingSize();
-          int grouping2 = properties.getSecondaryGroupingSize();
-          grouping1 = grouping1 > 0 ? grouping1 : grouping2;
-          grouping2 = grouping2 > 0 ? grouping2 : grouping1;
-          long groupingWidths = item.groupingWidths;
-          int numGroupingRegions = 16 - Long.numberOfLeadingZeros(groupingWidths) / 4;
-          // If the last grouping is zero, accept strings like "1," but reject string like "1,.23"
-          // Strip off multiple last-groupings to handle cases like "123,," or "123  "
-          while (numGroupingRegions > 1 && (groupingWidths & 0xf) == 0) {
-            if (item.sawDecimalPoint) {
-              if (DEBUGGING) System.out.println("-> rejected due to decimal point after grouping");
-              continue outer;
-            } else {
-              groupingWidths >>>= 4;
-              numGroupingRegions--;
-            }
-          }
-          if (grouping1 <= 0) {
-            // OK (no grouping data available)
-          } else if (numGroupingRegions <= 1) {
-            // OK (no grouping digits)
-          } else if ((groupingWidths & 0xf) != grouping1) {
-            // First grouping size is invalid
-            if (DEBUGGING) System.out.println("-> rejected due to first grouping violation");
-            continue;
-          } else if (((groupingWidths >>> ((numGroupingRegions - 1) * 4)) & 0xf) > grouping2) {
-            // String like "1234,567" where the highest grouping is too large
-            if (DEBUGGING) System.out.println("-> rejected due to final grouping violation");
-            continue;
-          } else {
-            for (int j = 1; j < numGroupingRegions - 1; j++) {
-              if (((groupingWidths >>> (j * 4)) & 0xf) != grouping2) {
-                // A grouping size somewhere in the middle is invalid
-                if (DEBUGGING) System.out.println("-> rejected due to inner grouping violation");
-                continue outer;
-              }
-            }
-          }
-        }
-
-        // Optionally require that the presence of a decimal point matches the pattern.
-        if (properties.getDecimalPatternMatchRequired()
-            && item.sawDecimalPoint
-                != (properties.getDecimalSeparatorAlwaysShown()
-                    || properties.getMaximumFractionDigits() != 0)) {
-          if (DEBUGGING) System.out.println("-> rejected due to decimal point violation");
-          continue;
-        }
-
-        // When parsing currencies, require that a currency symbol was found.
-        if (parseCurrency && !item.sawCurrency) {
-          if (DEBUGGING) System.out.println("-> rejected due to lack of currency");
-          continue;
-        }
-
-        // If we get here, then this candidate is acceptable.
-        // Use the earliest candidate in the list, or the one with the highest score, or the
-        // one with the fewest trailing digits.
-        if (best == null) {
-          best = item;
-        } else if (item.score > best.score) {
-          best = item;
-        } else if (item.trailingCount < best.trailingCount) {
-          best = item;
-        }
-      }
-
-      if (DEBUGGING) {
-        System.out.println("- - - - - - - - - -");
-      }
-
-      if (best != null) {
-        ppos.setIndex(offset - best.trailingCount);
-        return best;
-      } else {
-        ppos.setErrorIndex(offset);
-        return null;
-      }
-    }
-  }
-
-  /**
-   * If <code>cp</code> is whitespace (as determined by the unicode set {@link #UNISET_WHITESPACE}),
-   * copies <code>item</code> to the new list in <code>state</code> and sets its state name to
-   * <code>nextName</code>.
-   *
-   * @param cp The code point to check.
-   * @param nextName The new state name if the check passes.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptWhitespace(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    if (UNISET_WHITESPACE.contains(cp)) {
-      state.getNext().copyFrom(item, nextName, cp);
-    }
-  }
-
-  /**
-   * If <code>cp</code> is a bidi control character (as determined by the unicode set {@link
-   * #UNISET_BIDI}), copies <code>item</code> to the new list in <code>state</code> and sets its
-   * state name to <code>nextName</code>.
-   *
-   * @param cp The code point to check.
-   * @param nextName The new state name if the check passes.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptBidi(int cp, StateName nextName, ParserState state, StateItem item) {
-    if (UNISET_BIDI.contains(cp)) {
-      state.getNext().copyFrom(item, nextName, cp);
-    }
-  }
-
-  /**
-   * If <code>cp</code> is a padding character (as determined by {@link ParserState#paddingCp}),
-   * copies <code>item</code> to the new list in <code>state</code> and sets its state name to
-   * <code>nextName</code>.
-   *
-   * @param cp The code point to check.
-   * @param nextName The new state name if the check passes.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptPadding(int cp, StateName nextName, ParserState state, StateItem item) {
-    CharSequence padding = state.properties.getPadString();
-    if (padding == null || padding.length() == 0) return;
-    int referenceCp = Character.codePointAt(padding, 0);
-    if (cp == referenceCp) {
-      state.getNext().copyFrom(item, nextName, cp);
-    }
-  }
-
-  private static void acceptIntegerDigit(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    acceptDigitHelper(cp, nextName, state, item, DigitType.INTEGER);
-  }
-
-  private static void acceptFractionDigit(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    acceptDigitHelper(cp, nextName, state, item, DigitType.FRACTION);
-  }
-
-  private static void acceptExponentDigit(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    acceptDigitHelper(cp, nextName, state, item, DigitType.EXPONENT);
-  }
-
-  /**
-   * If <code>cp</code> is a digit character (as determined by either {@link UCharacter#digit} or
-   * {@link ParserState#digitCps}), copies <code>item</code> to the new list in <code>state</code>
-   * and sets its state name to one determined by <code>type</code>. Also copies the digit into a
-   * field in the new item determined by <code>type</code>.
-   *
-   * @param cp The code point to check.
-   * @param nextName The state to set if a digit is accepted.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   * @param type The digit type, which determines the next state and the field into which to insert
-   *     the digit.
-   */
-  private static void acceptDigitHelper(
-      int cp, StateName nextName, ParserState state, StateItem item, DigitType type) {
-    // Check the Unicode digit character property
-    byte digit = (byte) UCharacter.digit(cp, 10);
-    StateItem next = null;
-
-    // Look for the digit:
-    if (digit >= 0) {
-      // Code point is a number
-      next = state.getNext().copyFrom(item, nextName, -1);
-    }
-
-    // Do not perform the expensive string manipulations in fast mode.
-    if (digit < 0 && (state.mode == ParseMode.LENIENT || state.mode == ParseMode.STRICT)) {
-      if (state.digitTrie == null) {
-        // Check custom digits, all of which are at most one code point
-        for (byte d = 0; d < 10; d++) {
-          int referenceCp = Character.codePointAt(state.symbols.getDigitStringsLocal()[d], 0);
-          if (cp == referenceCp) {
-            digit = d;
-            next = state.getNext().copyFrom(item, nextName, -1);
-          }
-        }
-      } else {
-        // Custom digits have more than one code point
-        acceptDigitTrie(cp, nextName, state, item, type);
-      }
-    }
-
-    // Save state
-    recordDigit(next, digit, type);
-  }
-
-  /**
-   * Helper function for {@link acceptDigit} and {@link acceptDigitTrie} to save a complete digit in
-   * a state item and update grouping widths.
-   *
-   * @param next The new StateItem
-   * @param digit The digit to record
-   * @param type The type of the digit to record (INTEGER, FRACTION, or EXPONENT)
-   */
-  private static void recordDigit(StateItem next, byte digit, DigitType type) {
-    if (next == null) return;
-    next.appendDigit(digit, type);
-    if (type == DigitType.INTEGER && (next.groupingWidths & 0xf) < 15) {
-      next.groupingWidths++;
-    }
-  }
-
-  /**
-   * If <code>cp</code> is a sign (as determined by the unicode sets {@link #UNISET_PLUS} and {@link
-   * #UNISET_MINUS}), copies <code>item</code> to the new list in <code>state</code>. Loops back to
-   * the same state name.
-   *
-   * @param cp The code point to check.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptMinusOrPlusSign(
-      int cp, StateName nextName, ParserState state, StateItem item, boolean exponent) {
-    acceptMinusSign(cp, nextName, null, state, item, exponent);
-    acceptPlusSign(cp, nextName, null, state, item, exponent);
-  }
-
-  private static long acceptMinusSign(
-      int cp,
-      StateName returnTo1,
-      StateName returnTo2,
-      ParserState state,
-      StateItem item,
-      boolean exponent) {
-    if (UNISET_MINUS.contains(cp)) {
-      StateItem next = state.getNext().copyFrom(item, returnTo1, -1);
-      next.returnTo1 = returnTo2;
-      if (exponent) {
-        next.sawNegativeExponent = true;
-      } else {
-        next.sawNegative = true;
-      }
-      return 1L << state.lastInsertedIndex();
-    } else {
-      return 0L;
-    }
-  }
-
-  private static long acceptPlusSign(
-      int cp,
-      StateName returnTo1,
-      StateName returnTo2,
-      ParserState state,
-      StateItem item,
-      boolean exponent) {
-    if (UNISET_PLUS.contains(cp)) {
-      StateItem next = state.getNext().copyFrom(item, returnTo1, -1);
-      next.returnTo1 = returnTo2;
-      return 1L << state.lastInsertedIndex();
-    } else {
-      return 0L;
-    }
-  }
-
-  /**
-   * If <code>cp</code> is a grouping separator (as determined by the unicode set {@link
-   * #UNISET_GROUPING}), copies <code>item</code> to the new list in <code>state</code> and loops
-   * back to the same state. Also accepts if <code>cp</code> is the locale-specific grouping
-   * separator in {@link ParserState#groupingCp}, in which case the {@link
-   * StateItem#usesLocaleSymbols} flag is also set.
-   *
-   * @param cp The code point to check.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptGrouping(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    // Do not accept mixed grouping separators in the same string.
-    if (item.groupingCp == -1) {
-      // First time seeing a grouping separator.
-      SeparatorType cpType = SeparatorType.fromCp(cp, state.mode);
-
-      // Always accept if exactly the same as the locale grouping separator.
-      if (cp != state.groupingCp1 && cp != state.groupingCp2) {
-        // Reject if not in one of the three primary equivalence classes.
-        if (cpType == SeparatorType.UNKNOWN) {
-          return;
-        }
-        if (state.groupingMode == GroupingMode.RESTRICTED) {
-          // Reject if not in the same class as the locale grouping separator.
-          if (cpType != state.groupingType1 || cpType != state.groupingType2) {
-            return;
-          }
-        } else {
-          // Reject if in the same class as the decimal separator.
-          if (cpType == SeparatorType.COMMA_LIKE
-              && (state.decimalType1 == SeparatorType.COMMA_LIKE
-                  || state.decimalType2 == SeparatorType.COMMA_LIKE)) {
-            return;
-          }
-          if (cpType == SeparatorType.PERIOD_LIKE
-              && (state.decimalType1 == SeparatorType.PERIOD_LIKE
-                  || state.decimalType2 == SeparatorType.PERIOD_LIKE)) {
-            return;
-          }
-        }
-      }
-
-      // A match was found.
-      StateItem next = state.getNext().copyFrom(item, nextName, cp);
-      next.groupingCp = cp;
-      next.groupingWidths <<= 4;
-    } else {
-      // Have already seen a grouping separator.
-      if (cp == item.groupingCp) {
-        StateItem next = state.getNext().copyFrom(item, nextName, cp);
-        next.groupingWidths <<= 4;
-      }
-    }
-  }
-
-  /**
-   * If <code>cp</code> is a decimal (as determined by the unicode set {@link #UNISET_DECIMAL}),
-   * copies <code>item</code> to the new list in <code>state</code> and goes to {@link
-   * StateName#AFTER_FRACTION_DIGIT}. Also accepts if <code>cp</code> is the locale-specific decimal
-   * point in {@link ParserState#decimalCp}, in which case the {@link StateItem#usesLocaleSymbols}
-   * flag is also set.
-   *
-   * @param cp The code point to check.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptDecimalPoint(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    if (cp == item.groupingCp) {
-      // Don't accept a decimal point that is the same as the grouping separator
-      return;
-    }
-
-    SeparatorType cpType = SeparatorType.fromCp(cp, state.mode);
-
-    // We require that the decimal separator be in the same class as the locale.
-    if (cpType != state.decimalType1 && cpType != state.decimalType2) {
-      return;
-    }
-
-    // If in UNKNOWN or OTHER, require an exact match.
-    if (cpType == SeparatorType.OTHER_GROUPING || cpType == SeparatorType.UNKNOWN) {
-      if (cp != state.decimalCp1 && cp != state.decimalCp2) {
-        return;
-      }
-    }
-
-    // A match was found.
-    StateItem next = state.getNext().copyFrom(item, nextName, -1);
-    next.sawDecimalPoint = true;
-  }
-
-  private static void acceptNan(int cp, StateName nextName, ParserState state, StateItem item) {
-    CharSequence nan = state.symbols.getNaN();
-    long added = acceptString(cp, nextName, null, state, item, nan, 0, false);
-
-    // Set state in the items that were added by the function call
-    for (int i = Long.numberOfTrailingZeros(added); (1L << i) <= added; i++) {
-      if (((1L << i) & added) != 0) {
-        state.getItem(i).sawNaN = true;
-      }
-    }
-  }
-
-  private static void acceptInfinity(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    CharSequence inf = state.symbols.getInfinity();
-    long added = acceptString(cp, nextName, null, state, item, inf, 0, false);
-
-    // Set state in the items that were added by the function call
-    for (int i = Long.numberOfTrailingZeros(added); (1L << i) <= added; i++) {
-      if (((1L << i) & added) != 0) {
-        state.getItem(i).sawInfinity = true;
-      }
-    }
-  }
-
-  private static void acceptExponentSeparator(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    CharSequence exp = state.symbols.getExponentSeparator();
-    acceptString(cp, nextName, null, state, item, exp, 0, true);
-  }
-
-  private static void acceptPrefix(int cp, StateName nextName, ParserState state, StateItem item) {
-    for (AffixHolder holder : state.affixHolders) {
-      acceptAffixHolder(cp, nextName, state, item, holder, true);
-    }
-  }
-
-  private static void acceptSuffix(int cp, StateName nextName, ParserState state, StateItem item) {
-    if (item.affix != null) {
-      acceptAffixHolder(cp, nextName, state, item, item.affix, false);
-    } else {
-      for (AffixHolder holder : state.affixHolders) {
-        acceptAffixHolder(cp, nextName, state, item, holder, false);
-      }
-    }
-  }
-
-  private static void acceptAffixHolder(
-      int cp,
-      StateName nextName,
-      ParserState state,
-      StateItem item,
-      AffixHolder holder,
-      boolean prefix) {
-    if (holder == null) return;
-    String str = prefix ? holder.p : holder.s;
-    long added;
-    if (holder.strings) {
-      added = acceptString(cp, nextName, null, state, item, str, 0, false);
-    } else {
-      added =
-          acceptAffixPattern(cp, nextName, state, item, str, AffixUtils.nextToken(0, str));
-    }
-    // Record state in the added entries
-    for (int i = Long.numberOfTrailingZeros(added); (1L << i) <= added; i++) {
-      if (((1L << i) & added) != 0) {
-        StateItem next = state.getItem(i);
-        next.affix = holder;
-        if (prefix) next.sawPrefix = true;
-        if (!prefix) next.sawSuffix = true;
-        if (holder.negative) next.sawNegative = true;
-        // 10 point reward for consuming a prefix/suffix:
-        next.score += 10;
-        // 1 point reward for positive holders (if there is ambiguity, we want to favor positive):
-        if (!holder.negative) next.score += 1;
-        // 5 point reward for affix holders that have an empty prefix or suffix (we won't see them again):
-        if (!next.sawPrefix && holder.p.isEmpty()) next.score += 5;
-        if (!next.sawSuffix && holder.s.isEmpty()) next.score += 5;
-      }
-    }
-  }
-
-  private static long acceptStringOffset(int cp, ParserState state, StateItem item) {
-    return acceptString(
-        cp,
-        item.returnTo1,
-        item.returnTo2,
-        state,
-        item,
-        item.currentString,
-        item.currentOffset,
-        item.currentTrailing);
-  }
-
-  /**
-   * Accepts a code point if the code point is compatible with the string at the given offset.
-   * Handles runs of ignorable characters.
-   *
-   * <p>This method will add either one or two {@link StateItem} to the {@link ParserState}.
-   *
-   * @param cp The current code point, which will be checked for a match to the string.
-   * @param ret1 The state to return to after reaching the end of the string.
-   * @param ret2 The state to save in <code>returnTo1</code> after reaching the end of the string.
-   *     Set to null if returning to the main state loop.
-   * @param trailing true if this string should be ignored for the purposes of recording trailing
-   *     code points; false if it trailing count should be reset after reading the string.
-   * @param state The current {@link ParserState}
-   * @param item The current {@link StateItem}
-   * @param str The string against which to check for a match.
-   * @param offset The number of chars into the string. Initial value should be 0.
-   * @param trailing false if this string is strong and should reset trailing count to zero when it
-   *     is fully consumed.
-   * @return A bitmask where the bits correspond to the items that were added. Set to 0L if no items
-   *     were added.
-   */
-  private static long acceptString(
-      int cp,
-      StateName ret1,
-      StateName ret2,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      int offset,
-      boolean trailing) {
-    if (str == null || str.length() == 0) return 0L;
-    return acceptStringOrAffixPatternWithIgnorables(
-        cp, ret1, ret2, state, item, str, offset, trailing, true);
-  }
-
-  private static long acceptStringNonIgnorable(
-      int cp,
-      StateName ret1,
-      StateName ret2,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      boolean trailing,
-      int referenceCp,
-      long firstOffsetOrTag,
-      long nextOffsetOrTag) {
-    long added = 0L;
-    int firstOffset = (int) firstOffsetOrTag;
-    int nextOffset = (int) nextOffsetOrTag;
-    if (codePointEquals(referenceCp, cp, state)) {
-      if (firstOffset < str.length()) {
-        added |= acceptStringHelper(cp, ret1, ret2, state, item, str, firstOffset, trailing);
-      }
-      if (nextOffset >= str.length()) {
-        added |= acceptStringHelper(cp, ret1, ret2, state, item, str, nextOffset, trailing);
-      }
-      return added;
-    } else {
-      return 0L;
-    }
-  }
-
-  /**
-   * Internal method that is used to step to the next code point of a string or exit the string if
-   * at the end.
-   *
-   * @param cp See {@link #acceptString}
-   * @param returnTo1 See {@link #acceptString}
-   * @param returnTo2 See {@link #acceptString}
-   * @param state See {@link #acceptString}
-   * @param item See {@link #acceptString}
-   * @param str See {@link #acceptString}
-   * @param newOffset The offset at which the next step should start. If past the end of the string,
-   *     exit the string and return to the outer loop.
-   * @param trailing See {@link #acceptString}
-   * @return Bitmask containing one entry, the one that was added.
-   */
-  private static long acceptStringHelper(
-      int cp,
-      StateName returnTo1,
-      StateName returnTo2,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      int newOffset,
-      boolean trailing) {
-    StateItem next = state.getNext().copyFrom(item, null, cp);
-    next.score += 1; // reward for consuming a cp from string
-    if (newOffset < str.length()) {
-      // String has more code points.
-      next.name = StateName.INSIDE_STRING;
-      next.returnTo1 = returnTo1;
-      next.returnTo2 = returnTo2;
-      next.currentString = str;
-      next.currentOffset = newOffset;
-      next.currentTrailing = trailing;
-    } else {
-      // We've reached the end of the string.
-      next.name = returnTo1;
-      if (!trailing) next.trailingCount = 0;
-      next.returnTo1 = returnTo2;
-      next.returnTo2 = null;
-    }
-    return 1L << state.lastInsertedIndex();
-  }
-
-  private static long acceptAffixPatternOffset(int cp, ParserState state, StateItem item) {
-    return acceptAffixPattern(
-        cp, item.returnTo1, state, item, item.currentAffixPattern, item.currentStepwiseParserTag);
-  }
-
-  /**
-   * Accepts a code point if the code point is compatible with the affix pattern at the offset
-   * encoded in the tag argument.
-   *
-   * @param cp The current code point, which will be checked for a match to the string.
-   * @param returnTo The state to return to after reaching the end of the string.
-   * @param state The current {@link ParserState}
-   * @param item The current {@link StateItem}
-   * @param str The string containing the affix pattern.
-   * @param tag The current state of the stepwise parser. Initial value should be 0L.
-   * @return A bitmask where the bits correspond to the items that were added. Set to 0L if no items
-   *     were added.
-   */
-  private static long acceptAffixPattern(
-      int cp, StateName ret1, ParserState state, StateItem item, CharSequence str, long tag) {
-    if (str == null || str.length() == 0) return 0L;
-    return acceptStringOrAffixPatternWithIgnorables(
-        cp, ret1, null, state, item, str, tag, false, false);
-  }
-
-  private static long acceptAffixPatternNonIgnorable(
-      int cp,
-      StateName returnTo,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      int typeOrCp,
-      long firstTag,
-      long nextTag) {
-
-    // Convert from the returned tag to a code point, string, or currency to check
-    int resolvedCp = -1;
-    CharSequence resolvedStr = null;
-    boolean resolvedMinusSign = false;
-    boolean resolvedPlusSign = false;
-    boolean resolvedCurrency = false;
-    if (typeOrCp < 0) {
-      // Symbol
-      switch (typeOrCp) {
-        case AffixUtils.TYPE_MINUS_SIGN:
-          resolvedMinusSign = true;
-          break;
-        case AffixUtils.TYPE_PLUS_SIGN:
-          resolvedPlusSign = true;
-          break;
-        case AffixUtils.TYPE_PERCENT:
-          resolvedStr = state.symbols.getPercentString();
-          if (resolvedStr.length() != 1 || resolvedStr.charAt(0) != '%') {
-            resolvedCp = '%'; // accept ASCII percent as well as locale percent
-          }
-          break;
-        case AffixUtils.TYPE_PERMILLE:
-          resolvedStr = state.symbols.getPerMillString();
-          if (resolvedStr.length() != 1 || resolvedStr.charAt(0) != '‰') {
-            resolvedCp = '‰'; // accept ASCII permille as well as locale permille
-          }
-          break;
-        case AffixUtils.TYPE_CURRENCY_SINGLE:
-        case AffixUtils.TYPE_CURRENCY_DOUBLE:
-        case AffixUtils.TYPE_CURRENCY_TRIPLE:
-        case AffixUtils.TYPE_CURRENCY_QUAD:
-        case AffixUtils.TYPE_CURRENCY_QUINT:
-        case AffixUtils.TYPE_CURRENCY_OVERFLOW:
-          resolvedCurrency = true;
-          break;
-        default:
-          throw new AssertionError();
-      }
-    } else {
-      resolvedCp = typeOrCp;
-    }
-
-    long added = 0L;
-    if (resolvedCp >= 0 && codePointEquals(cp, resolvedCp, state)) {
-      if (firstTag >= 0) {
-        added |= acceptAffixPatternHelper(cp, returnTo, state, item, str, firstTag);
-      }
-      if (nextTag < 0) {
-        added |= acceptAffixPatternHelper(cp, returnTo, state, item, str, nextTag);
-      }
-    }
-    if (resolvedMinusSign) {
-      if (firstTag >= 0) {
-        added |= acceptMinusSign(cp, StateName.INSIDE_AFFIX_PATTERN, returnTo, state, item, false);
-      }
-      if (nextTag < 0) {
-        added |= acceptMinusSign(cp, returnTo, null, state, item, false);
-      }
-      if (added == 0L) {
-        // Also attempt to accept custom minus sign string
-        String mss = state.symbols.getMinusSignString();
-        int mssCp = Character.codePointAt(mss, 0);
-        if (mss.length() != Character.charCount(mssCp) || !UNISET_MINUS.contains(mssCp)) {
-          resolvedStr = mss;
-        }
-      }
-    }
-    if (resolvedPlusSign) {
-      if (firstTag >= 0) {
-        added |= acceptPlusSign(cp, StateName.INSIDE_AFFIX_PATTERN, returnTo, state, item, false);
-      }
-      if (nextTag < 0) {
-        added |= acceptPlusSign(cp, returnTo, null, state, item, false);
-      }
-      if (added == 0L) {
-        // Also attempt to accept custom plus sign string
-        String pss = state.symbols.getPlusSignString();
-        int pssCp = Character.codePointAt(pss, 0);
-        if (pss.length() != Character.charCount(pssCp) || !UNISET_MINUS.contains(pssCp)) {
-          resolvedStr = pss;
-        }
-      }
-    }
-    if (resolvedStr != null) {
-      if (firstTag >= 0) {
-        added |=
-            acceptString(
-                cp, StateName.INSIDE_AFFIX_PATTERN, returnTo, state, item, resolvedStr, 0, false);
-      }
-      if (nextTag < 0) {
-        added |= acceptString(cp, returnTo, null, state, item, resolvedStr, 0, false);
-      }
-    }
-    if (resolvedCurrency) {
-      if (firstTag >= 0) {
-        added |= acceptCurrency(cp, StateName.INSIDE_AFFIX_PATTERN, returnTo, state, item);
-      }
-      if (nextTag < 0) {
-        added |= acceptCurrency(cp, returnTo, null, state, item);
-      }
-    }
-
-    // Set state in the items that were added by the function calls
-    for (int i = Long.numberOfTrailingZeros(added); (1L << i) <= added; i++) {
-      if (((1L << i) & added) != 0) {
-        state.getItem(i).currentAffixPattern = str;
-        state.getItem(i).currentStepwiseParserTag = firstTag;
-      }
-    }
-    return added;
-  }
-
-  /**
-   * Internal method that is used to step to the next token of a affix pattern or exit the affix
-   * pattern if at the end.
-   *
-   * @param cp See {@link #acceptAffixPattern}
-   * @param returnTo1 See {@link #acceptAffixPattern}
-   * @param state See {@link #acceptAffixPattern}
-   * @param item See {@link #acceptAffixPattern}
-   * @param str See {@link #acceptAffixPattern}
-   * @param newOffset The tag corresponding to the next token in the affix pattern that should be
-   *     recorded and consumed in a future call to {@link #acceptAffixPatternOffset}.
-   * @return Bitmask containing one entry, the one that was added.
-   */
-  private static long acceptAffixPatternHelper(
-      int cp,
-      StateName returnTo,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      long newTag) {
-    StateItem next = state.getNext().copyFrom(item, null, cp);
-    next.score += 1; // reward for consuming a cp from pattern
-    if (newTag >= 0) {
-      // Additional tokens in affix string.
-      next.name = StateName.INSIDE_AFFIX_PATTERN;
-      next.returnTo1 = returnTo;
-      next.currentAffixPattern = str;
-      next.currentStepwiseParserTag = newTag;
-    } else {
-      // Reached last token in affix string.
-      next.name = returnTo;
-      next.trailingCount = 0;
-      next.returnTo1 = null;
-    }
-    return 1L << state.lastInsertedIndex();
-  }
-
-  /**
-   * Consumes tokens from a string or affix pattern following ICU's rules for handling of whitespace
-   * and bidi control characters (collectively called "ignorables"). The methods {@link
-   * #acceptStringHelper}, {@link #acceptAffixPatternHelper}, {@link #acceptStringNonIgnorable}, and
-   * {@link #acceptAffixPatternNonIgnorable} will be called by this method to actually add parse
-   * paths.
-   *
-   * <p>In the "NonIgnorable" functions, two arguments are passed: firstOffsetOrTag and
-   * nextOffsetOrTag. These two arguments should add parse paths according to the following rules:
-   *
-   * <pre>
-   * if (firstOffsetOrTag is valid or inside string boundary) {
-   *   // Add parse path going to firstOffsetOrTag
-   * }
-   * if (nextOffsetOrTag is invalid or beyond string boundary) {
-   *   // Add parse path leaving the string
-   * }
-   * </pre>
-   *
-   * <p>Note that there may be multiple parse paths added by these lines. This is important in order
-   * to properly handle runs of ignorables.
-   *
-   * @param cp See {@link #acceptString} and {@link #acceptAffixPattern}
-   * @param ret1 See {@link #acceptString} and {@link #acceptAffixPattern}
-   * @param ret2 See {@link #acceptString} (affix pattern can pass null)
-   * @param state See {@link #acceptString} and {@link #acceptAffixPattern}
-   * @param item See {@link #acceptString} and {@link #acceptAffixPattern}
-   * @param str See {@link #acceptString} and {@link #acceptAffixPattern}
-   * @param offsetOrTag The current int offset for strings, or the current tag for affix patterns.
-   * @param trailing See {@link #acceptString} (affix patterns can pass false)
-   * @param isString true if the parameters correspond to a string; false if they correspond to an
-   *     affix pattern.
-   * @return A bitmask containing the entries that were added.
-   */
-  private static long acceptStringOrAffixPatternWithIgnorables(
-      int cp,
-      StateName ret1,
-      StateName ret2 /* String only */,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      long offsetOrTag /* offset for string; tag for affix pattern */,
-      boolean trailing /* String only */,
-      boolean isString) {
-
-    // Runs of ignorables (whitespace and bidi control marks) can occur at the beginning, middle,
-    // or end of the reference string, or a run across the entire string.
-    //
-    // - A run at the beginning or in the middle corresponds to a run of length *zero or more*
-    //   in the input.
-    // - A run at the end need to be matched exactly.
-    // - A string that contains only ignorable characters also needs to be matched exactly.
-    //
-    // Because the behavior differs, we need logic here to determine which case we have.
-
-    int typeOrCp =
-        isString
-            ? Character.codePointAt(str, (int) offsetOrTag)
-            : AffixUtils.getTypeOrCp(offsetOrTag);
-
-    if (isIgnorable(typeOrCp, state)) {
-      // Look for the next nonignorable code point
-      int nextTypeOrCp = typeOrCp;
-      long prevOffsetOrTag;
-      long nextOffsetOrTag = offsetOrTag;
-      long firstOffsetOrTag = 0L;
-      while (true) {
-        prevOffsetOrTag = nextOffsetOrTag;
-        nextOffsetOrTag =
-            isString
-                ? nextOffsetOrTag + Character.charCount(nextTypeOrCp)
-                : AffixUtils.nextToken(nextOffsetOrTag, str);
-        if (firstOffsetOrTag == 0L) firstOffsetOrTag = nextOffsetOrTag;
-        if (isString ? nextOffsetOrTag >= str.length() : nextOffsetOrTag < 0) {
-          // Integer.MIN_VALUE is an invalid value for either a type or a cp;
-          // use it to indicate the end of the string.
-          nextTypeOrCp = Integer.MIN_VALUE;
-          break;
-        }
-        nextTypeOrCp =
-            isString
-                ? Character.codePointAt(str, (int) nextOffsetOrTag)
-                : AffixUtils.getTypeOrCp(nextOffsetOrTag);
-        if (!isIgnorable(nextTypeOrCp, state)) break;
-      }
-
-      if (nextTypeOrCp == Integer.MIN_VALUE) {
-        // Run at end or string that contains only ignorable characters.
-        if (codePointEquals(cp, typeOrCp, state)) {
-          // Step forward and also exit the string if not at very end.
-          // RETURN
-          long added = 0L;
-          added |=
-              isString
-                  ? acceptStringHelper(
-                      cp, ret1, ret2, state, item, str, (int) firstOffsetOrTag, trailing)
-                  : acceptAffixPatternHelper(cp, ret1, state, item, str, firstOffsetOrTag);
-          if (firstOffsetOrTag != nextOffsetOrTag) {
-            added |=
-                isString
-                    ? acceptStringHelper(
-                        cp, ret1, ret2, state, item, str, (int) nextOffsetOrTag, trailing)
-                    : acceptAffixPatternHelper(cp, ret1, state, item, str, nextOffsetOrTag);
-          }
-          return added;
-        } else {
-          // Code point does not exactly match the run at end.
-          // RETURN
-          return 0L;
-        }
-      } else {
-        // Run at beginning or in middle.
-        if (isIgnorable(cp, state)) {
-          // Consume the ignorable.
-          // RETURN
-          return isString
-              ? acceptStringHelper(
-                  cp, ret1, ret2, state, item, str, (int) prevOffsetOrTag, trailing)
-              : acceptAffixPatternHelper(cp, ret1, state, item, str, prevOffsetOrTag);
-        } else {
-          // Go to nonignorable cp.
-          // FALL THROUGH
-        }
-      }
-
-      // Fall through to the nonignorable code point found above.
-      assert nextTypeOrCp != Integer.MIN_VALUE;
-      typeOrCp = nextTypeOrCp;
-      offsetOrTag = nextOffsetOrTag;
-    }
-    assert !isIgnorable(typeOrCp, state);
-
-    // Look for the next nonignorable code point after this nonignorable code point
-    // to determine if we are at the end of the string.
-    int nextTypeOrCp = typeOrCp;
-    long nextOffsetOrTag = offsetOrTag;
-    long firstOffsetOrTag = 0L;
-    while (true) {
-      nextOffsetOrTag =
-          isString
-              ? nextOffsetOrTag + Character.charCount(nextTypeOrCp)
-              : AffixUtils.nextToken(nextOffsetOrTag, str);
-      if (firstOffsetOrTag == 0L) firstOffsetOrTag = nextOffsetOrTag;
-      if (isString ? nextOffsetOrTag >= str.length() : nextOffsetOrTag < 0) {
-        nextTypeOrCp = -1;
-        break;
-      }
-      nextTypeOrCp =
-          isString
-              ? Character.codePointAt(str, (int) nextOffsetOrTag)
-              : AffixUtils.getTypeOrCp(nextOffsetOrTag);
-      if (!isIgnorable(nextTypeOrCp, state)) break;
-    }
-
-    // Nonignorable logic.
-    return isString
-        ? acceptStringNonIgnorable(
-            cp, ret1, ret2, state, item, str, trailing, typeOrCp, firstOffsetOrTag, nextOffsetOrTag)
-        : acceptAffixPatternNonIgnorable(
-            cp, ret1, state, item, str, typeOrCp, firstOffsetOrTag, nextOffsetOrTag);
-  }
-
-  /**
-   * This method can add up to four items to the new list in <code>state</code>.
-   *
-   * <p>If <code>cp</code> is equal to any known ISO code or long name, copies <code>item</code> to
-   * the new list in <code>state</code> and sets its ISO code to the corresponding currency.
-   *
-   * <p>If <code>cp</code> is the first code point of any ISO code or long name having more them one
-   * code point in length, copies <code>item</code> to the new list in <code>state</code> along with
-   * an instance of {@link TextTrieMap.ParseState} for tracking the following code points.
-   *
-   * @param cp The code point to check.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptCurrency(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    acceptCurrency(cp, nextName, null, state, item);
-  }
-
-  private static long acceptCurrency(
-      int cp, StateName returnTo1, StateName returnTo2, ParserState state, StateItem item) {
-    if (item.sawCurrency) return 0L;
-    long added = 0L;
-
-    // Accept from local currency information
-    String str1, str2;
-    Currency currency = state.properties.getCurrency();
-    if (currency != null) {
-      str1 = currency.getName(state.symbols.getULocale(), Currency.SYMBOL_NAME, null);
-      str2 = currency.getCurrencyCode();
-      // TODO: Should we also accept long names? In currency mode, they are in the CLDR data.
-    } else {
-      currency = state.symbols.getCurrency();
-      str1 = state.symbols.getCurrencySymbol();
-      str2 = state.symbols.getInternationalCurrencySymbol();
-    }
-    added |= acceptString(cp, returnTo1, returnTo2, state, item, str1, 0, false);
-    added |= acceptString(cp, returnTo1, returnTo2, state, item, str2, 0, false);
-    for (int i = Long.numberOfTrailingZeros(added); (1L << i) <= added; i++) {
-      if (((1L << i) & added) != 0) {
-        state.getItem(i).sawCurrency = true;
-        state.getItem(i).isoCode = str2;
-      }
-    }
-
-    // Accept from CLDR data
-    if (state.parseCurrency) {
-      ULocale uloc = state.symbols.getULocale();
-      TextTrieMap<Currency.CurrencyStringInfo>.ParseState trie1 =
-          Currency.openParseState(uloc, cp, Currency.LONG_NAME);
-      TextTrieMap<Currency.CurrencyStringInfo>.ParseState trie2 =
-          Currency.openParseState(uloc, cp, Currency.SYMBOL_NAME);
-      added |= acceptCurrencyHelper(cp, returnTo1, returnTo2, state, item, trie1);
-      added |= acceptCurrencyHelper(cp, returnTo1, returnTo2, state, item, trie2);
-    }
-
-    return added;
-  }
-
-  /**
-   * If <code>cp</code> is the next code point of any currency, copies <code>item</code> to the new
-   * list in <code>state</code> along with an instance of {@link TextTrieMap.ParseState} for
-   * tracking the following code points.
-   *
-   * <p>This method should only be called in a state following {@link #acceptCurrency}.
-   *
-   * @param cp The code point to check.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptCurrencyOffset(int cp, ParserState state, StateItem item) {
-    acceptCurrencyHelper(
-        cp, item.returnTo1, item.returnTo2, state, item, item.currentCurrencyTrieState);
-  }
-
-  private static long acceptCurrencyHelper(
-      int cp,
-      StateName returnTo1,
-      StateName returnTo2,
-      ParserState state,
-      StateItem item,
-      TextTrieMap<Currency.CurrencyStringInfo>.ParseState trieState) {
-    if (trieState == null) return 0L;
-    trieState.accept(cp);
-    long added = 0L;
-    Iterator<Currency.CurrencyStringInfo> currentMatches = trieState.getCurrentMatches();
-    if (currentMatches != null) {
-      // Match on current code point
-      // TODO: What should happen with multiple currency matches?
-      StateItem next = state.getNext().copyFrom(item, returnTo1, -1);
-      next.returnTo1 = returnTo2;
-      next.returnTo2 = null;
-      next.sawCurrency = true;
-      next.isoCode = currentMatches.next().getISOCode();
-      added |= 1L << state.lastInsertedIndex();
-    }
-    if (!trieState.atEnd()) {
-      // Prepare for matches on future code points
-      StateItem next = state.getNext().copyFrom(item, StateName.INSIDE_CURRENCY, -1);
-      next.returnTo1 = returnTo1;
-      next.returnTo2 = returnTo2;
-      next.currentCurrencyTrieState = trieState;
-      added |= 1L << state.lastInsertedIndex();
-    }
-    return added;
-  }
-
-  private static long acceptDigitTrie(
-      int cp, StateName nextName, ParserState state, StateItem item, DigitType type) {
-    assert state.digitTrie != null;
-    TextTrieMap<Byte>.ParseState trieState = state.digitTrie.openParseState(cp);
-    if (trieState == null) return 0L;
-    return acceptDigitTrieHelper(cp, nextName, state, item, type, trieState);
-  }
-
-  private static void acceptDigitTrieOffset(int cp, ParserState state, StateItem item) {
-    acceptDigitTrieHelper(
-        cp, item.returnTo1, state, item, item.currentDigitType, item.currentDigitTrieState);
-  }
-
-  private static long acceptDigitTrieHelper(
-      int cp,
-      StateName returnTo1,
-      ParserState state,
-      StateItem item,
-      DigitType type,
-      TextTrieMap<Byte>.ParseState trieState) {
-    if (trieState == null) return 0L;
-    trieState.accept(cp);
-    long added = 0L;
-    Iterator<Byte> currentMatches = trieState.getCurrentMatches();
-    if (currentMatches != null) {
-      // Match on current code point
-      byte digit = currentMatches.next();
-      StateItem next = state.getNext().copyFrom(item, returnTo1, -1);
-      next.returnTo1 = null;
-      recordDigit(next, digit, type);
-      added |= 1L << state.lastInsertedIndex();
-    }
-    if (!trieState.atEnd()) {
-      // Prepare for matches on future code points
-      StateItem next = state.getNext().copyFrom(item, StateName.INSIDE_DIGIT, -1);
-      next.returnTo1 = returnTo1;
-      next.currentDigitTrieState = trieState;
-      next.currentDigitType = type;
-      added |= 1L << state.lastInsertedIndex();
-    }
-    return added;
-  }
-
-  /**
-   * Checks whether the two given code points are equal after applying case mapping as requested in
-   * the ParserState.
-   *
-   * @see #acceptString
-   * @see #acceptAffixPattern
-   */
-  private static boolean codePointEquals(int cp1, int cp2, ParserState state) {
-    if (!state.caseSensitive) {
-      cp1 = UCharacter.foldCase(cp1, true);
-      cp2 = UCharacter.foldCase(cp2, true);
-    }
-    return cp1 == cp2;
-  }
-
-  /**
-   * Checks whether the given code point is "ignorable" and should be skipped. BiDi control marks
-   * are always ignorable, and whitespace is ignorable in lenient mode.
-   *
-   * <p>Returns false if cp is negative.
-   *
-   * @param cp The code point to test.
-   * @param state The current {@link ParserState}, used for determining strict mode.
-   * @return true if cp is ignorable; false otherwise.
-   */
-  private static boolean isIgnorable(int cp, ParserState state) {
-    if (cp < 0) return false;
-    if (UNISET_BIDI.contains(cp)) return true;
-    return state.mode == ParseMode.LENIENT && UNISET_WHITESPACE.contains(cp);
-  }
-}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/PatternStringParser.java b/android_icu4j/src/main/java/android/icu/impl/number/PatternStringParser.java
index 7c664fa..1255c99 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/PatternStringParser.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/PatternStringParser.java
@@ -14,8 +14,8 @@
     public static final int IGNORE_ROUNDING_ALWAYS = 2;
 
     /**
-     * Runs the recursive descent parser on the given pattern string, returning a data structure with raw information
-     * about the pattern string.
+     * Runs the recursive descent parser on the given pattern string, returning a data structure with raw
+     * information about the pattern string.
      *
      * <p>
      * To obtain a more useful form of the data, consider using {@link #parseToProperties} instead.
@@ -37,9 +37,10 @@
      * @param pattern
      *            The pattern string, like "#,##0.00"
      * @param ignoreRounding
-     *            Whether to leave out rounding information (minFrac, maxFrac, and rounding increment) when parsing the
-     *            pattern. This may be desirable if a custom rounding mode, such as CurrencyUsage, is to be used
-     *            instead. One of {@link PatternStringParser#IGNORE_ROUNDING_ALWAYS},
+     *            Whether to leave out rounding information (minFrac, maxFrac, and rounding increment)
+     *            when parsing the pattern. This may be desirable if a custom rounding mode, such as
+     *            CurrencyUsage, is to be used instead. One of
+     *            {@link PatternStringParser#IGNORE_ROUNDING_ALWAYS},
      *            {@link PatternStringParser#IGNORE_ROUNDING_IF_CURRENCY}, or
      *            {@link PatternStringParser#IGNORE_ROUNDING_NEVER}.
      * @return A property bag object.
@@ -57,9 +58,10 @@
     }
 
     /**
-     * Parses a pattern string into an existing property bag. All properties that can be encoded into a pattern string
-     * will be overwritten with either their default value or with the value coming from the pattern string. Properties
-     * that cannot be encoded into a pattern string, such as rounding mode, are not modified.
+     * Parses a pattern string into an existing property bag. All properties that can be encoded into a
+     * pattern string will be overwritten with either their default value or with the value coming from
+     * the pattern string. Properties that cannot be encoded into a pattern string, such as rounding
+     * mode, are not modified.
      *
      * @param pattern
      *            The pattern string, like "#,##0.00"
@@ -70,7 +72,9 @@
      * @throws IllegalArgumentException
      *             If there was a syntax error in the pattern string.
      */
-    public static void parseToExistingProperties(String pattern, DecimalFormatProperties properties,
+    public static void parseToExistingProperties(
+            String pattern,
+            DecimalFormatProperties properties,
             int ignoreRounding) {
         parseToExistingPropertiesImpl(pattern, properties, ignoreRounding);
     }
@@ -113,6 +117,7 @@
             return right - left;
         }
 
+        @Override
         public String getString(int flags) {
             long endpoints = getEndpoints(flags);
             int left = (int) (endpoints & 0xffffffff);
@@ -166,6 +171,11 @@
         public boolean containsSymbolType(int type) {
             return AffixUtils.containsType(pattern, type);
         }
+
+        @Override
+        public boolean hasBody() {
+            return positive.integerTotal > 0;
+        }
     }
 
     public static class ParsedSubpatternInfo {
@@ -264,7 +274,10 @@
         consumePadding(state, result, PadPosition.AFTER_SUFFIX);
     }
 
-    private static void consumePadding(ParserState state, ParsedSubpatternInfo result, PadPosition paddingLocation) {
+    private static void consumePadding(
+            ParserState state,
+            ParsedSubpatternInfo result,
+            PadPosition paddingLocation) {
         if (state.peek() != '*') {
             return;
         }
@@ -506,7 +519,10 @@
     /// END RECURSIVE DESCENT PARSER IMPLEMENTATION ///
     ///////////////////////////////////////////////////
 
-    private static void parseToExistingPropertiesImpl(String pattern, DecimalFormatProperties properties, int ignoreRounding) {
+    private static void parseToExistingPropertiesImpl(
+            String pattern,
+            DecimalFormatProperties properties,
+            int ignoreRounding) {
         if (pattern == null || pattern.length() == 0) {
             // Backwards compatibility requires that we reset to the default values.
             // TODO: Only overwrite the properties that "saveToProperties" normally touches?
@@ -520,7 +536,9 @@
     }
 
     /** Finalizes the temporary data stored in the ParsedPatternInfo to the Properties. */
-    private static void patternInfoToProperties(DecimalFormatProperties properties, ParsedPatternInfo patternInfo,
+    private static void patternInfoToProperties(
+            DecimalFormatProperties properties,
+            ParsedPatternInfo patternInfo,
             int _ignoreRounding) {
         // Translate from PatternParseResult to Properties.
         // Note that most data from "negative" is ignored per the specification of DecimalFormat.
@@ -574,12 +592,14 @@
             properties.setMaximumFractionDigits(-1);
             properties.setRoundingIncrement(null);
             properties.setMinimumSignificantDigits(positive.integerAtSigns);
-            properties.setMaximumSignificantDigits(positive.integerAtSigns + positive.integerTrailingHashSigns);
+            properties.setMaximumSignificantDigits(
+                    positive.integerAtSigns + positive.integerTrailingHashSigns);
         } else if (positive.rounding != null) {
             if (!ignoreRounding) {
                 properties.setMinimumFractionDigits(minFrac);
                 properties.setMaximumFractionDigits(positive.fractionTotal);
-                properties.setRoundingIncrement(positive.rounding.toBigDecimal().setScale(positive.fractionNumerals));
+                properties.setRoundingIncrement(
+                        positive.rounding.toBigDecimal().setScale(positive.fractionNumerals));
             } else {
                 properties.setMinimumFractionDigits(-1);
                 properties.setMaximumFractionDigits(-1);
@@ -635,7 +655,8 @@
         // Padding settings
         if (positive.paddingLocation != null) {
             // The width of the positive prefix and suffix templates are included in the padding
-            int paddingWidth = positive.widthExceptAffixes + AffixUtils.estimateLength(posPrefix)
+            int paddingWidth = positive.widthExceptAffixes
+                    + AffixUtils.estimateLength(posPrefix)
                     + AffixUtils.estimateLength(posSuffix);
             properties.setFormatWidth(paddingWidth);
             String rawPaddingString = patternInfo.getString(AffixPatternProvider.Flags.PADDING);
@@ -664,9 +685,10 @@
         properties.setPositivePrefixPattern(posPrefix);
         properties.setPositiveSuffixPattern(posSuffix);
         if (patternInfo.negative != null) {
-            properties.setNegativePrefixPattern(patternInfo
-                    .getString(AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN | AffixPatternProvider.Flags.PREFIX));
-            properties.setNegativeSuffixPattern(patternInfo.getString(AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN));
+            properties.setNegativePrefixPattern(patternInfo.getString(
+                    AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN | AffixPatternProvider.Flags.PREFIX));
+            properties.setNegativeSuffixPattern(
+                    patternInfo.getString(AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN));
         } else {
             properties.setNegativePrefixPattern(null);
             properties.setNegativeSuffixPattern(null);
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/PatternStringUtils.java b/android_icu4j/src/main/java/android/icu/impl/number/PatternStringUtils.java
index 3145422..b8a2221 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/PatternStringUtils.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/PatternStringUtils.java
@@ -5,7 +5,9 @@
 
 import java.math.BigDecimal;
 
+import android.icu.impl.StandardPlural;
 import android.icu.impl.number.Padder.PadPosition;
+import android.icu.number.NumberFormatter.SignDisplay;
 import android.icu.text.DecimalFormatSymbols;
 
 /**
@@ -18,8 +20,9 @@
      * Creates a pattern string from a property bag.
      *
      * <p>
-     * Since pattern strings support only a subset of the functionality available in a property bag, a new property bag
-     * created from the string returned by this function may not be the same as the original property bag.
+     * Since pattern strings support only a subset of the functionality available in a property bag, a
+     * new property bag created from the string returned by this function may not be the same as the
+     * original property bag.
      *
      * @param properties
      *            The property bag to serialize.
@@ -63,7 +66,8 @@
 
         // Figure out the grouping sizes.
         int grouping1, grouping2, grouping;
-        if (groupingSize != Math.min(dosMax, -1) && firstGroupingSize != Math.min(dosMax, -1)
+        if (groupingSize != Math.min(dosMax, -1)
+                && firstGroupingSize != Math.min(dosMax, -1)
                 && groupingSize != firstGroupingSize) {
             grouping = groupingSize;
             grouping1 = groupingSize;
@@ -186,7 +190,9 @@
 
         // Negative affixes
         // Ignore if the negative prefix pattern is "-" and the negative suffix is empty
-        if (np != null || ns != null || (npp == null && nsp != null)
+        if (np != null
+                || ns != null
+                || (npp == null && nsp != null)
                 || (npp != null && (npp.length() != 1 || npp.charAt(0) != '-' || nsp.length() != 0))) {
             sb.append(';');
             if (npp != null)
@@ -234,14 +240,15 @@
     }
 
     /**
-     * Converts a pattern between standard notation and localized notation. Localized notation means that instead of
-     * using generic placeholders in the pattern, you use the corresponding locale-specific characters instead. For
-     * example, in locale <em>fr-FR</em>, the period in the pattern "0.000" means "decimal" in standard notation (as it
-     * does in every other locale), but it means "grouping" in localized notation.
+     * Converts a pattern between standard notation and localized notation. Localized notation means that
+     * instead of using generic placeholders in the pattern, you use the corresponding locale-specific
+     * characters instead. For example, in locale <em>fr-FR</em>, the period in the pattern "0.000" means
+     * "decimal" in standard notation (as it does in every other locale), but it means "grouping" in
+     * localized notation.
      *
      * <p>
-     * A greedy string-substitution strategy is used to substitute locale symbols. If two symbols are ambiguous or have
-     * the same prefix, the result is not well-defined.
+     * A greedy string-substitution strategy is used to substitute locale symbols. If two symbols are
+     * ambiguous or have the same prefix, the result is not well-defined.
      *
      * <p>
      * Locale symbols are not allowed to contain the ASCII quote character.
@@ -254,11 +261,14 @@
      * @param symbols
      *            The symbols corresponding to the localized pattern.
      * @param toLocalized
-     *            true to convert from standard to localized notation; false to convert from localized to standard
-     *            notation.
+     *            true to convert from standard to localized notation; false to convert from localized to
+     *            standard notation.
      * @return The pattern expressed in the other notation.
      */
-    public static String convertLocalized(String input, DecimalFormatSymbols symbols, boolean toLocalized) {
+    public static String convertLocalized(
+            String input,
+            DecimalFormatSymbols symbols,
+            boolean toLocalized) {
         if (input == null)
             return null;
 
@@ -392,4 +402,79 @@
         return result.toString();
     }
 
+    /**
+     * This method contains the heart of the logic for rendering LDML affix strings. It handles
+     * sign-always-shown resolution, whether to use the positive or negative subpattern, permille
+     * substitution, and plural forms for CurrencyPluralInfo.
+     */
+    public static void patternInfoToStringBuilder(
+            AffixPatternProvider patternInfo,
+            boolean isPrefix,
+            int signum,
+            SignDisplay signDisplay,
+            StandardPlural plural,
+            boolean perMilleReplacesPercent,
+            StringBuilder output) {
+
+        // Should the output render '+' where '-' would normally appear in the pattern?
+        boolean plusReplacesMinusSign = signum != -1
+                && (signDisplay == SignDisplay.ALWAYS
+                        || signDisplay == SignDisplay.ACCOUNTING_ALWAYS
+                        || (signum == 1
+                                && (signDisplay == SignDisplay.EXCEPT_ZERO
+                                        || signDisplay == SignDisplay.ACCOUNTING_EXCEPT_ZERO)))
+                && patternInfo.positiveHasPlusSign() == false;
+
+        // Should we use the affix from the negative subpattern? (If not, we will use the positive
+        // subpattern.)
+        boolean useNegativeAffixPattern = patternInfo.hasNegativeSubpattern()
+                && (signum == -1 || (patternInfo.negativeHasMinusSign() && plusReplacesMinusSign));
+
+        // Resolve the flags for the affix pattern.
+        int flags = 0;
+        if (useNegativeAffixPattern) {
+            flags |= AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN;
+        }
+        if (isPrefix) {
+            flags |= AffixPatternProvider.Flags.PREFIX;
+        }
+        if (plural != null) {
+            assert plural.ordinal() == (AffixPatternProvider.Flags.PLURAL_MASK & plural.ordinal());
+            flags |= plural.ordinal();
+        }
+
+        // Should we prepend a sign to the pattern?
+        boolean prependSign;
+        if (!isPrefix || useNegativeAffixPattern) {
+            prependSign = false;
+        } else if (signum == -1) {
+            prependSign = signDisplay != SignDisplay.NEVER;
+        } else {
+            prependSign = plusReplacesMinusSign;
+        }
+
+        // Compute the length of the affix pattern.
+        int length = patternInfo.length(flags) + (prependSign ? 1 : 0);
+
+        // Finally, set the result into the StringBuilder.
+        output.setLength(0);
+        for (int index = 0; index < length; index++) {
+            char candidate;
+            if (prependSign && index == 0) {
+                candidate = '-';
+            } else if (prependSign) {
+                candidate = patternInfo.charAt(flags, index - 1);
+            } else {
+                candidate = patternInfo.charAt(flags, index);
+            }
+            if (plusReplacesMinusSign && candidate == '-') {
+                candidate = '+';
+            }
+            if (perMilleReplacesPercent && candidate == '%') {
+                candidate = '‰';
+            }
+            output.append(candidate);
+        }
+    }
+
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/Properties.java b/android_icu4j/src/main/java/android/icu/impl/number/Properties.java
index 5a9850c..8207147 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/Properties.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/Properties.java
@@ -9,8 +9,8 @@
 import java.io.Serializable;
 
 /**
- * ICU 59 called the class DecimalFormatProperties as just Properties. We need to keep a thin implementation for the
- * purposes of serialization.
+ * ICU 59 called the class DecimalFormatProperties as just Properties. We need to keep a thin
+ * implementation for the purposes of serialization.
  * @hide Only a subset of ICU is exposed in Android
  */
 public class Properties implements Serializable {
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/PropertiesAffixPatternProvider.java b/android_icu4j/src/main/java/android/icu/impl/number/PropertiesAffixPatternProvider.java
new file mode 100644
index 0000000..fe91132
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/PropertiesAffixPatternProvider.java
@@ -0,0 +1,152 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number;
+
+/**
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class PropertiesAffixPatternProvider implements AffixPatternProvider {
+    private final String posPrefix;
+    private final String posSuffix;
+    private final String negPrefix;
+    private final String negSuffix;
+
+    public PropertiesAffixPatternProvider(DecimalFormatProperties properties) {
+        // There are two ways to set affixes in DecimalFormat: via the pattern string (applyPattern), and via the
+        // explicit setters (setPositivePrefix and friends).  The way to resolve the settings is as follows:
+        //
+        // 1) If the explicit setting is present for the field, use it.
+        // 2) Otherwise, follows UTS 35 rules based on the pattern string.
+        //
+        // Importantly, the explicit setters affect only the one field they override.  If you set the positive
+        // prefix, that should not affect the negative prefix.  Since it is impossible for the user of this class
+        // to know whether the origin for a string was the override or the pattern, we have to say that we always
+        // have a negative subpattern and perform all resolution logic here.
+
+        // Convenience: Extract the properties into local variables.
+        // Variables are named with three chars: [p/n][p/s][o/p]
+        // [p/n] => p for positive, n for negative
+        // [p/s] => p for prefix, s for suffix
+        // [o/p] => o for escaped custom override string, p for pattern string
+        String ppo = AffixUtils.escape(properties.getPositivePrefix());
+        String pso = AffixUtils.escape(properties.getPositiveSuffix());
+        String npo = AffixUtils.escape(properties.getNegativePrefix());
+        String nso = AffixUtils.escape(properties.getNegativeSuffix());
+        String ppp = properties.getPositivePrefixPattern();
+        String psp = properties.getPositiveSuffixPattern();
+        String npp = properties.getNegativePrefixPattern();
+        String nsp = properties.getNegativeSuffixPattern();
+
+        if (ppo != null) {
+            posPrefix = ppo;
+        } else if (ppp != null) {
+            posPrefix = ppp;
+        } else {
+            // UTS 35: Default positive prefix is empty string.
+            posPrefix = "";
+        }
+
+        if (pso != null) {
+            posSuffix = pso;
+        } else if (psp != null) {
+            posSuffix = psp;
+        } else {
+            // UTS 35: Default positive suffix is empty string.
+            posSuffix = "";
+        }
+
+        if (npo != null) {
+            negPrefix = npo;
+        } else if (npp != null) {
+            negPrefix = npp;
+        } else {
+            // UTS 35: Default negative prefix is "-" with positive prefix.
+            // Important: We prepend the "-" to the pattern, not the override!
+            negPrefix = ppp == null ? "-" : "-" + ppp;
+        }
+
+        if (nso != null) {
+            negSuffix = nso;
+        } else if (nsp != null) {
+            negSuffix = nsp;
+        } else {
+            // UTS 35: Default negative prefix is the positive prefix.
+            negSuffix = psp == null ? "" : psp;
+        }
+    }
+
+    @Override
+    public char charAt(int flags, int i) {
+        return getString(flags).charAt(i);
+    }
+
+    @Override
+    public int length(int flags) {
+        return getString(flags).length();
+    }
+
+    @Override
+    public String getString(int flags) {
+        boolean prefix = (flags & Flags.PREFIX) != 0;
+        boolean negative = (flags & Flags.NEGATIVE_SUBPATTERN) != 0;
+        if (prefix && negative) {
+            return negPrefix;
+        } else if (prefix) {
+            return posPrefix;
+        } else if (negative) {
+            return negSuffix;
+        } else {
+            return posSuffix;
+        }
+    }
+
+    @Override
+    public boolean positiveHasPlusSign() {
+        return AffixUtils.containsType(posPrefix, AffixUtils.TYPE_PLUS_SIGN)
+                || AffixUtils.containsType(posSuffix, AffixUtils.TYPE_PLUS_SIGN);
+    }
+
+    @Override
+    public boolean hasNegativeSubpattern() {
+        // See comments in the constructor for more information on why this is always true.
+        return true;
+    }
+
+    @Override
+    public boolean negativeHasMinusSign() {
+        return AffixUtils.containsType(negPrefix, AffixUtils.TYPE_MINUS_SIGN)
+                || AffixUtils.containsType(negSuffix, AffixUtils.TYPE_MINUS_SIGN);
+    }
+
+    @Override
+    public boolean hasCurrencySign() {
+        return AffixUtils.hasCurrencySymbols(posPrefix) || AffixUtils.hasCurrencySymbols(posSuffix)
+                || AffixUtils.hasCurrencySymbols(negPrefix) || AffixUtils.hasCurrencySymbols(negSuffix);
+    }
+
+    @Override
+    public boolean containsSymbolType(int type) {
+        return AffixUtils.containsType(posPrefix, type) || AffixUtils.containsType(posSuffix, type)
+                || AffixUtils.containsType(negPrefix, type) || AffixUtils.containsType(negSuffix, type);
+    }
+
+    @Override
+    public boolean hasBody() {
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return super.toString()
+                + " {"
+                + posPrefix
+                + "#"
+                + posSuffix
+                + ";"
+                + negPrefix
+                + "#"
+                + negSuffix
+                + "}";
+    }
+}
\ No newline at end of file
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/RoundingUtils.java b/android_icu4j/src/main/java/android/icu/impl/number/RoundingUtils.java
index 04a2fc9..3d9d2a8 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/RoundingUtils.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/RoundingUtils.java
@@ -11,177 +11,193 @@
  * @hide Only a subset of ICU is exposed in Android*/
 public class RoundingUtils {
 
-  public static final int SECTION_LOWER = 1;
-  public static final int SECTION_MIDPOINT = 2;
-  public static final int SECTION_UPPER = 3;
+    public static final int SECTION_LOWER = 1;
+    public static final int SECTION_MIDPOINT = 2;
+    public static final int SECTION_UPPER = 3;
 
-  /**
-   * The default rounding mode.
-   */
-  public static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_EVEN;
+    /**
+     * The default rounding mode.
+     */
+    public static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_EVEN;
 
-  /**
-   * The maximum number of fraction places, integer numerals, or significant digits.
-   * TODO: This does not feel like the best home for this value.
-   */
-  public static final int MAX_INT_FRAC_SIG = 100;
+    /**
+     * The maximum number of fraction places, integer numerals, or significant digits. TODO: This does
+     * not feel like the best home for this value.
+     */
+    public static final int MAX_INT_FRAC_SIG = 999;
 
-  /**
-   * Converts a rounding mode and metadata about the quantity being rounded to a boolean determining
-   * whether the value should be rounded toward infinity or toward zero.
-   *
-   * <p>The parameters are of type int because benchmarks on an x86-64 processor against OpenJDK
-   * showed that ints were demonstrably faster than enums in switch statements.
-   *
-   * @param isEven Whether the digit immediately before the rounding magnitude is even.
-   * @param isNegative Whether the quantity is negative.
-   * @param section Whether the part of the quantity to the right of the rounding magnitude is
-   *     exactly halfway between two digits, whether it is in the lower part (closer to zero), or
-   *     whether it is in the upper part (closer to infinity). See {@link #SECTION_LOWER}, {@link
-   *     #SECTION_MIDPOINT}, and {@link #SECTION_UPPER}.
-   * @param roundingMode The integer version of the {@link RoundingMode}, which you can get via
-   *     {@link RoundingMode#ordinal}.
-   * @param reference A reference object to be used when throwing an ArithmeticException.
-   * @return true if the number should be rounded toward zero; false if it should be rounded toward
-   *     infinity.
-   */
-  public static boolean getRoundingDirection(
-      boolean isEven, boolean isNegative, int section, int roundingMode, Object reference) {
-    switch (roundingMode) {
-      case BigDecimal.ROUND_UP:
-        // round away from zero
-        return false;
-
-      case BigDecimal.ROUND_DOWN:
-        // round toward zero
-        return true;
-
-      case BigDecimal.ROUND_CEILING:
-        // round toward positive infinity
-        return isNegative;
-
-      case BigDecimal.ROUND_FLOOR:
-        // round toward negative infinity
-        return !isNegative;
-
-      case BigDecimal.ROUND_HALF_UP:
-        switch (section) {
-          case SECTION_MIDPOINT:
+    /**
+     * Converts a rounding mode and metadata about the quantity being rounded to a boolean determining
+     * whether the value should be rounded toward infinity or toward zero.
+     *
+     * <p>
+     * The parameters are of type int because benchmarks on an x86-64 processor against OpenJDK showed
+     * that ints were demonstrably faster than enums in switch statements.
+     *
+     * @param isEven
+     *            Whether the digit immediately before the rounding magnitude is even.
+     * @param isNegative
+     *            Whether the quantity is negative.
+     * @param section
+     *            Whether the part of the quantity to the right of the rounding magnitude is exactly
+     *            halfway between two digits, whether it is in the lower part (closer to zero), or
+     *            whether it is in the upper part (closer to infinity). See {@link #SECTION_LOWER},
+     *            {@link #SECTION_MIDPOINT}, and {@link #SECTION_UPPER}.
+     * @param roundingMode
+     *            The integer version of the {@link RoundingMode}, which you can get via
+     *            {@link RoundingMode#ordinal}.
+     * @param reference
+     *            A reference object to be used when throwing an ArithmeticException.
+     * @return true if the number should be rounded toward zero; false if it should be rounded toward
+     *         infinity.
+     */
+    public static boolean getRoundingDirection(
+            boolean isEven,
+            boolean isNegative,
+            int section,
+            int roundingMode,
+            Object reference) {
+        switch (roundingMode) {
+        case BigDecimal.ROUND_UP:
+            // round away from zero
             return false;
-          case SECTION_LOWER:
+
+        case BigDecimal.ROUND_DOWN:
+            // round toward zero
             return true;
-          case SECTION_UPPER:
-            return false;
+
+        case BigDecimal.ROUND_CEILING:
+            // round toward positive infinity
+            return isNegative;
+
+        case BigDecimal.ROUND_FLOOR:
+            // round toward negative infinity
+            return !isNegative;
+
+        case BigDecimal.ROUND_HALF_UP:
+            switch (section) {
+            case SECTION_MIDPOINT:
+                return false;
+            case SECTION_LOWER:
+                return true;
+            case SECTION_UPPER:
+                return false;
+            }
+            break;
+
+        case BigDecimal.ROUND_HALF_DOWN:
+            switch (section) {
+            case SECTION_MIDPOINT:
+                return true;
+            case SECTION_LOWER:
+                return true;
+            case SECTION_UPPER:
+                return false;
+            }
+            break;
+
+        case BigDecimal.ROUND_HALF_EVEN:
+            switch (section) {
+            case SECTION_MIDPOINT:
+                return isEven;
+            case SECTION_LOWER:
+                return true;
+            case SECTION_UPPER:
+                return false;
+            }
+            break;
         }
-        break;
 
-      case BigDecimal.ROUND_HALF_DOWN:
-        switch (section) {
-          case SECTION_MIDPOINT:
-            return true;
-          case SECTION_LOWER:
-            return true;
-          case SECTION_UPPER:
+        // Rounding mode UNNECESSARY
+        throw new ArithmeticException("Rounding is required on " + reference.toString());
+    }
+
+    /**
+     * Gets whether the given rounding mode's rounding boundary is at the midpoint. The rounding boundary
+     * is the point at which a number switches from being rounded down to being rounded up. For example,
+     * with rounding mode HALF_EVEN, HALF_UP, or HALF_DOWN, the rounding boundary is at the midpoint, and
+     * this function would return true. However, for UP, DOWN, CEILING, and FLOOR, the rounding boundary
+     * is at the "edge", and this function would return false.
+     *
+     * @param roundingMode
+     *            The integer version of the {@link RoundingMode}.
+     * @return true if rounding mode is HALF_EVEN, HALF_UP, or HALF_DOWN; false otherwise.
+     */
+    public static boolean roundsAtMidpoint(int roundingMode) {
+        switch (roundingMode) {
+        case BigDecimal.ROUND_UP:
+        case BigDecimal.ROUND_DOWN:
+        case BigDecimal.ROUND_CEILING:
+        case BigDecimal.ROUND_FLOOR:
             return false;
-        }
-        break;
 
-      case BigDecimal.ROUND_HALF_EVEN:
-        switch (section) {
-          case SECTION_MIDPOINT:
-            return isEven;
-          case SECTION_LOWER:
+        default:
             return true;
-          case SECTION_UPPER:
-            return false;
         }
-        break;
     }
 
-    // Rounding mode UNNECESSARY
-    throw new ArithmeticException("Rounding is required on " + reference.toString());
-  }
+    private static final MathContext[] MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED = new MathContext[RoundingMode
+            .values().length];
 
-  /**
-   * Gets whether the given rounding mode's rounding boundary is at the midpoint. The rounding
-   * boundary is the point at which a number switches from being rounded down to being rounded up.
-   * For example, with rounding mode HALF_EVEN, HALF_UP, or HALF_DOWN, the rounding boundary is at
-   * the midpoint, and this function would return true. However, for UP, DOWN, CEILING, and FLOOR,
-   * the rounding boundary is at the "edge", and this function would return false.
-   *
-   * @param roundingMode The integer version of the {@link RoundingMode}.
-   * @return true if rounding mode is HALF_EVEN, HALF_UP, or HALF_DOWN; false otherwise.
-   */
-  public static boolean roundsAtMidpoint(int roundingMode) {
-    switch (roundingMode) {
-      case BigDecimal.ROUND_UP:
-      case BigDecimal.ROUND_DOWN:
-      case BigDecimal.ROUND_CEILING:
-      case BigDecimal.ROUND_FLOOR:
-        return false;
+    private static final MathContext[] MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS = new MathContext[RoundingMode
+            .values().length];
 
-      default:
-        return true;
+    static {
+        for (int i = 0; i < MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS.length; i++) {
+            MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[i] = new MathContext(0, RoundingMode.valueOf(i));
+            MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS[i] = new MathContext(34);
+        }
     }
-  }
 
-  private static final MathContext[] MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED =
-      new MathContext[RoundingMode.values().length];
-
-  private static final MathContext[] MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS =
-      new MathContext[RoundingMode.values().length];
-
-  static {
-    for (int i = 0; i < MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS.length; i++) {
-      MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[i] = new MathContext(0, RoundingMode.valueOf(i));
-      MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS[i] = new MathContext(34);
+    /**
+     * Gets the user-specified math context out of the property bag. If there is none, falls back to a
+     * math context with unlimited precision and the user-specified rounding mode, which defaults to
+     * HALF_EVEN (the IEEE 754R default).
+     *
+     * @param properties
+     *            The property bag.
+     * @return A {@link MathContext}. Never null.
+     */
+    public static MathContext getMathContextOrUnlimited(DecimalFormatProperties properties) {
+        MathContext mathContext = properties.getMathContext();
+        if (mathContext == null) {
+            RoundingMode roundingMode = properties.getRoundingMode();
+            if (roundingMode == null)
+                roundingMode = RoundingMode.HALF_EVEN;
+            mathContext = MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[roundingMode.ordinal()];
+        }
+        return mathContext;
     }
-  }
 
-  /**
-   * Gets the user-specified math context out of the property bag. If there is none, falls back to a
-   * math context with unlimited precision and the user-specified rounding mode, which defaults to
-   * HALF_EVEN (the IEEE 754R default).
-   *
-   * @param properties The property bag.
-   * @return A {@link MathContext}. Never null.
-   */
-  public static MathContext getMathContextOrUnlimited(DecimalFormatProperties properties) {
-    MathContext mathContext = properties.getMathContext();
-    if (mathContext == null) {
-      RoundingMode roundingMode = properties.getRoundingMode();
-      if (roundingMode == null) roundingMode = RoundingMode.HALF_EVEN;
-      mathContext = MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[roundingMode.ordinal()];
+    /**
+     * Gets the user-specified math context out of the property bag. If there is none, falls back to a
+     * math context with 34 digits of precision (the 128-bit IEEE 754R default) and the user-specified
+     * rounding mode, which defaults to HALF_EVEN (the IEEE 754R default).
+     *
+     * @param properties
+     *            The property bag.
+     * @return A {@link MathContext}. Never null.
+     */
+    public static MathContext getMathContextOr34Digits(DecimalFormatProperties properties) {
+        MathContext mathContext = properties.getMathContext();
+        if (mathContext == null) {
+            RoundingMode roundingMode = properties.getRoundingMode();
+            if (roundingMode == null)
+                roundingMode = RoundingMode.HALF_EVEN;
+            mathContext = MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS[roundingMode.ordinal()];
+        }
+        return mathContext;
     }
-    return mathContext;
-  }
 
-  /**
-   * Gets the user-specified math context out of the property bag. If there is none, falls back to a
-   * math context with 34 digits of precision (the 128-bit IEEE 754R default) and the user-specified
-   * rounding mode, which defaults to HALF_EVEN (the IEEE 754R default).
-   *
-   * @param properties The property bag.
-   * @return A {@link MathContext}. Never null.
-   */
-  public static MathContext getMathContextOr34Digits(DecimalFormatProperties properties) {
-    MathContext mathContext = properties.getMathContext();
-    if (mathContext == null) {
-      RoundingMode roundingMode = properties.getRoundingMode();
-      if (roundingMode == null) roundingMode = RoundingMode.HALF_EVEN;
-      mathContext = MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS[roundingMode.ordinal()];
+    /**
+     * Gets a MathContext with unlimited precision and the specified RoundingMode. Equivalent to "new
+     * MathContext(0, roundingMode)", but pulls from a singleton to prevent object thrashing.
+     *
+     * @param roundingMode
+     *            The {@link RoundingMode} to use.
+     * @return The corresponding {@link MathContext}.
+     */
+    public static MathContext mathContextUnlimited(RoundingMode roundingMode) {
+        return MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[roundingMode.ordinal()];
     }
-    return mathContext;
-  }
-
-  /**
-   * Gets a MathContext with unlimited precision and the specified RoundingMode. Equivalent to "new
-   * MathContext(0, roundingMode)", but pulls from a singleton to prevent object thrashing.
-   *
-   * @param roundingMode The {@link RoundingMode} to use.
-   * @return The corresponding {@link MathContext}.
-   */
-  public static MathContext mathContextUnlimited(RoundingMode roundingMode) {
-    return MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[roundingMode.ordinal()];
-  }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/SimpleModifier.java b/android_icu4j/src/main/java/android/icu/impl/number/SimpleModifier.java
index 02da22e..7dedb98 100644
--- a/android_icu4j/src/main/java/android/icu/impl/number/SimpleModifier.java
+++ b/android_icu4j/src/main/java/android/icu/impl/number/SimpleModifier.java
@@ -7,8 +7,8 @@
 import android.icu.text.NumberFormat.Field;
 
 /**
- * The second primary implementation of {@link Modifier}, this one consuming a {@link android.icu.text.SimpleFormatter}
- * pattern.
+ * The second primary implementation of {@link Modifier}, this one consuming a
+ * {@link android.icu.text.SimpleFormatter} pattern.
  * @hide Only a subset of ICU is exposed in Android
  */
 public class SimpleModifier implements Modifier {
@@ -29,18 +29,28 @@
         this.field = field;
         this.strong = strong;
 
-        assert SimpleFormatterImpl.getArgumentLimit(compiledPattern) == 1;
-        if (compiledPattern.charAt(1) != '\u0000') {
+        int argLimit = SimpleFormatterImpl.getArgumentLimit(compiledPattern);
+        if (argLimit == 0) {
+            // No arguments in compiled pattern
             prefixLength = compiledPattern.charAt(1) - ARG_NUM_LIMIT;
-            suffixOffset = 3 + prefixLength;
-        } else {
-            prefixLength = 0;
-            suffixOffset = 2;
-        }
-        if (3 + prefixLength < compiledPattern.length()) {
-            suffixLength = compiledPattern.charAt(suffixOffset) - ARG_NUM_LIMIT;
-        } else {
+            assert 2 + prefixLength == compiledPattern.length();
+            // Set suffixOffset = -1 to indicate no arguments in compiled pattern.
+            suffixOffset = -1;
             suffixLength = 0;
+        } else {
+            assert argLimit == 1;
+            if (compiledPattern.charAt(1) != '\u0000') {
+                prefixLength = compiledPattern.charAt(1) - ARG_NUM_LIMIT;
+                suffixOffset = 3 + prefixLength;
+            } else {
+                prefixLength = 0;
+                suffixOffset = 2;
+            }
+            if (3 + prefixLength < compiledPattern.length()) {
+                suffixLength = compiledPattern.charAt(suffixOffset) - ARG_NUM_LIMIT;
+            } else {
+                suffixLength = 0;
+            }
         }
     }
 
@@ -61,7 +71,8 @@
             count += Character.codePointCount(compiledPattern, 2, 2 + prefixLength);
         }
         if (suffixLength > 0) {
-            count += Character.codePointCount(compiledPattern, 1 + suffixOffset, 1 + suffixOffset + suffixLength);
+            count += Character
+                    .codePointCount(compiledPattern, 1 + suffixOffset, 1 + suffixOffset + suffixLength);
         }
         return count;
     }
@@ -73,12 +84,13 @@
 
     /**
      * TODO: This belongs in SimpleFormatterImpl. The only reason I haven't moved it there yet is because
-     * DoubleSidedStringBuilder is an internal class and SimpleFormatterImpl feels like it should not depend on it.
+     * DoubleSidedStringBuilder is an internal class and SimpleFormatterImpl feels like it should not
+     * depend on it.
      *
      * <p>
-     * Formats a value that is already stored inside the StringBuilder <code>result</code> between the indices
-     * <code>startIndex</code> and <code>endIndex</code> by inserting characters before the start index and after the
-     * end index.
+     * Formats a value that is already stored inside the StringBuilder <code>result</code> between the
+     * indices <code>startIndex</code> and <code>endIndex</code> by inserting characters before the start
+     * index and after the end index.
      *
      * <p>
      * This is well-defined only for patterns with exactly one argument.
@@ -91,14 +103,26 @@
      *            The right index of the value within the string builder.
      * @return The number of characters (UTF-16 code points) that were added to the StringBuilder.
      */
-    public int formatAsPrefixSuffix(NumberStringBuilder result, int startIndex, int endIndex, Field field) {
-        if (prefixLength > 0) {
-            result.insert(startIndex, compiledPattern, 2, 2 + prefixLength, field);
+    public int formatAsPrefixSuffix(
+            NumberStringBuilder result,
+            int startIndex,
+            int endIndex,
+            Field field) {
+        if (suffixOffset == -1) {
+            // There is no argument for the inner number; overwrite the entire segment with our string.
+            return result.splice(startIndex, endIndex, compiledPattern, 2, 2 + prefixLength, field);
+        } else {
+            if (prefixLength > 0) {
+                result.insert(startIndex, compiledPattern, 2, 2 + prefixLength, field);
+            }
+            if (suffixLength > 0) {
+                result.insert(endIndex + prefixLength,
+                        compiledPattern,
+                        1 + suffixOffset,
+                        1 + suffixOffset + suffixLength,
+                        field);
+            }
+            return prefixLength + suffixLength;
         }
-        if (suffixLength > 0) {
-            result.insert(endIndex + prefixLength, compiledPattern, 1 + suffixOffset, 1 + suffixOffset + suffixLength,
-                    field);
-        }
-        return prefixLength + suffixLength;
     }
 }
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/AffixMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/AffixMatcher.java
new file mode 100644
index 0000000..c3ed32d
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/AffixMatcher.java
@@ -0,0 +1,276 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+import android.icu.impl.StandardPlural;
+import android.icu.impl.StringSegment;
+import android.icu.impl.Utility;
+import android.icu.impl.number.AffixPatternProvider;
+import android.icu.impl.number.AffixUtils;
+import android.icu.impl.number.PatternStringUtils;
+import android.icu.number.NumberFormatter.SignDisplay;
+import android.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class AffixMatcher implements NumberParseMatcher {
+    private final AffixPatternMatcher prefix;
+    private final AffixPatternMatcher suffix;
+    private final int flags;
+
+    /**
+     * Comparator for two AffixMatcher instances which prioritizes longer prefixes followed by longer
+     * suffixes, ensuring that the longest prefix/suffix pair is always chosen.
+     */
+    public static final Comparator<AffixMatcher> COMPARATOR = new Comparator<AffixMatcher>() {
+        @Override
+        public int compare(AffixMatcher o1, AffixMatcher o2) {
+            if (length(o1.prefix) != length(o2.prefix)) {
+                return length(o1.prefix) > length(o2.prefix) ? -1 : 1;
+            } else if (length(o1.suffix) != length(o2.suffix)) {
+                return length(o1.suffix) > length(o2.suffix) ? -1 : 1;
+            } else if (!o1.equals(o2)) {
+                // If the prefix and suffix are the same length, arbitrarily break ties.
+                // We can't return zero unless the elements are equal.
+                return o1.hashCode() > o2.hashCode() ? -1 : 1;
+            } else {
+                return 0;
+            }
+        }
+    };
+
+    private static boolean isInteresting(
+            AffixPatternProvider patternInfo,
+            IgnorablesMatcher ignorables,
+            int parseFlags) {
+        String posPrefixString = patternInfo.getString(AffixPatternProvider.FLAG_POS_PREFIX);
+        String posSuffixString = patternInfo.getString(AffixPatternProvider.FLAG_POS_SUFFIX);
+        String negPrefixString = null;
+        String negSuffixString = null;
+        if (patternInfo.hasNegativeSubpattern()) {
+            negPrefixString = patternInfo.getString(AffixPatternProvider.FLAG_NEG_PREFIX);
+            negSuffixString = patternInfo.getString(AffixPatternProvider.FLAG_NEG_SUFFIX);
+        }
+
+        if (0 == (parseFlags & ParsingUtils.PARSE_FLAG_USE_FULL_AFFIXES)
+                && AffixUtils.containsOnlySymbolsAndIgnorables(posPrefixString, ignorables.getSet())
+                && AffixUtils.containsOnlySymbolsAndIgnorables(posSuffixString, ignorables.getSet())
+                && AffixUtils.containsOnlySymbolsAndIgnorables(negPrefixString, ignorables.getSet())
+                && AffixUtils.containsOnlySymbolsAndIgnorables(negSuffixString, ignorables.getSet())
+                // HACK: Plus and minus sign are a special case: we accept them trailing only if they are
+                // trailing in the pattern string.
+                && !AffixUtils.containsType(posSuffixString, AffixUtils.TYPE_PLUS_SIGN)
+                && !AffixUtils.containsType(posSuffixString, AffixUtils.TYPE_MINUS_SIGN)
+                && !AffixUtils.containsType(negSuffixString, AffixUtils.TYPE_PLUS_SIGN)
+                && !AffixUtils.containsType(negSuffixString, AffixUtils.TYPE_MINUS_SIGN)) {
+            // The affixes contain only symbols and ignorables.
+            // No need to generate affix matchers.
+            return false;
+        }
+        return true;
+    }
+
+    public static void newGenerate(
+            AffixPatternProvider patternInfo,
+            NumberParserImpl output,
+            MatcherFactory factory,
+            IgnorablesMatcher ignorables,
+            int parseFlags) {
+        if (!isInteresting(patternInfo, ignorables, parseFlags)) {
+            return;
+        }
+
+        // The affixes have interesting characters, or we are in strict mode.
+        // Use initial capacity of 6, the highest possible number of AffixMatchers.
+        StringBuilder sb = new StringBuilder();
+        ArrayList<AffixMatcher> matchers = new ArrayList<AffixMatcher>(6);
+        boolean includeUnpaired = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES);
+        SignDisplay signDisplay = (0 != (parseFlags & ParsingUtils.PARSE_FLAG_PLUS_SIGN_ALLOWED))
+                ? SignDisplay.ALWAYS
+                : SignDisplay.NEVER;
+
+        AffixPatternMatcher posPrefix = null;
+        AffixPatternMatcher posSuffix = null;
+
+        // Pre-process the affix strings to resolve LDML rules like sign display.
+        for (int signum = 1; signum >= -1; signum--) {
+            // Generate Prefix
+            PatternStringUtils.patternInfoToStringBuilder(patternInfo,
+                    true,
+                    signum,
+                    signDisplay,
+                    StandardPlural.OTHER,
+                    false,
+                    sb);
+            AffixPatternMatcher prefix = AffixPatternMatcher
+                    .fromAffixPattern(sb.toString(), factory, parseFlags);
+
+            // Generate Suffix
+            PatternStringUtils.patternInfoToStringBuilder(patternInfo,
+                    false,
+                    signum,
+                    signDisplay,
+                    StandardPlural.OTHER,
+                    false,
+                    sb);
+            AffixPatternMatcher suffix = AffixPatternMatcher
+                    .fromAffixPattern(sb.toString(), factory, parseFlags);
+
+            if (signum == 1) {
+                posPrefix = prefix;
+                posSuffix = suffix;
+            } else if (Utility.equals(prefix, posPrefix) && Utility.equals(suffix, posSuffix)) {
+                // Skip adding these matchers (we already have equivalents)
+                continue;
+            }
+
+            // Flags for setting in the ParsedNumber
+            int flags = (signum == -1) ? ParsedNumber.FLAG_NEGATIVE : 0;
+
+            // Note: it is indeed possible for posPrefix and posSuffix to both be null.
+            // We still need to add that matcher for strict mode to work.
+            matchers.add(getInstance(prefix, suffix, flags));
+            if (includeUnpaired && prefix != null && suffix != null) {
+                // The following if statements are designed to prevent adding two identical matchers.
+                if (signum == 1 || !Utility.equals(prefix, posPrefix)) {
+                    matchers.add(getInstance(prefix, null, flags));
+                }
+                if (signum == 1 || !Utility.equals(suffix, posSuffix)) {
+                    matchers.add(getInstance(null, suffix, flags));
+                }
+            }
+        }
+
+        // Put the AffixMatchers in order, and then add them to the output.
+        Collections.sort(matchers, COMPARATOR);
+        output.addMatchers(matchers);
+    }
+
+    private static final AffixMatcher getInstance(
+            AffixPatternMatcher prefix,
+            AffixPatternMatcher suffix,
+            int flags) {
+        // TODO: Special handling for common cases like both strings empty.
+        return new AffixMatcher(prefix, suffix, flags);
+    }
+
+    private AffixMatcher(AffixPatternMatcher prefix, AffixPatternMatcher suffix, int flags) {
+        this.prefix = prefix;
+        this.suffix = suffix;
+        this.flags = flags;
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        if (!result.seenNumber()) {
+            // Prefix
+            // Do not match if:
+            // 1. We have already seen a prefix (result.prefix != null)
+            // 2. The prefix in this AffixMatcher is empty (prefix == null)
+            if (result.prefix != null || prefix == null) {
+                return false;
+            }
+
+            // Attempt to match the prefix.
+            int initialOffset = segment.getOffset();
+            boolean maybeMore = prefix.match(segment, result);
+            if (initialOffset != segment.getOffset()) {
+                result.prefix = prefix.getPattern();
+            }
+            return maybeMore;
+
+        } else {
+            // Suffix
+            // Do not match if:
+            // 1. We have already seen a suffix (result.suffix != null)
+            // 2. The suffix in this AffixMatcher is empty (suffix == null)
+            // 3. The matched prefix does not equal this AffixMatcher's prefix
+            if (result.suffix != null || suffix == null || !matched(prefix, result.prefix)) {
+                return false;
+            }
+
+            // Attempt to match the suffix.
+            int initialOffset = segment.getOffset();
+            boolean maybeMore = suffix.match(segment, result);
+            if (initialOffset != segment.getOffset()) {
+                result.suffix = suffix.getPattern();
+            }
+            return maybeMore;
+        }
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        if (prefix != null) {
+            leadCodePoints.addAll(prefix.getLeadCodePoints());
+        }
+        if (suffix != null) {
+            leadCodePoints.addAll(suffix.getLeadCodePoints());
+        }
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // Check to see if our affix is the one that was matched. If so, set the flags in the result.
+        if (matched(prefix, result.prefix) && matched(suffix, result.suffix)) {
+            // Fill in the result prefix and suffix with non-null values (empty string).
+            // Used by strict mode to determine whether an entire affix pair was matched.
+            if (result.prefix == null) {
+                result.prefix = "";
+            }
+            if (result.suffix == null) {
+                result.suffix = "";
+            }
+            result.flags |= flags;
+        }
+    }
+
+    /**
+     * Helper method to return whether the given AffixPatternMatcher equals the given pattern string.
+     * Either both arguments must be null or the pattern string inside the AffixPatternMatcher must equal
+     * the given pattern string.
+     */
+    static boolean matched(AffixPatternMatcher affix, String patternString) {
+        return (affix == null && patternString == null)
+                || (affix != null && affix.getPattern().equals(patternString));
+    }
+
+    /**
+     * Helper method to return the length of the given AffixPatternMatcher. Returns 0 for null.
+     */
+    private static int length(AffixPatternMatcher matcher) {
+        return matcher == null ? 0 : matcher.getPattern().length();
+    }
+
+    @Override
+    public boolean equals(Object _other) {
+        if (!(_other instanceof AffixMatcher)) {
+            return false;
+        }
+        AffixMatcher other = (AffixMatcher) _other;
+        return Utility.equals(prefix, other.prefix)
+                && Utility.equals(suffix, other.suffix)
+                && flags == other.flags;
+    }
+
+    @Override
+    public int hashCode() {
+        return Utility.hashCode(prefix) ^ Utility.hashCode(suffix) ^ flags;
+    }
+
+    @Override
+    public String toString() {
+        boolean isNegative = 0 != (flags & ParsedNumber.FLAG_NEGATIVE);
+        return "<AffixMatcher" + (isNegative ? ":negative " : " ") + prefix + "#" + suffix + ">";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/AffixPatternMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/AffixPatternMatcher.java
new file mode 100644
index 0000000..1387527
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/AffixPatternMatcher.java
@@ -0,0 +1,132 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.number.AffixUtils;
+
+/**
+ * A specialized version of {@link SeriesMatcher} that matches EITHER a prefix OR a suffix.
+ * {@link AffixMatcher} combines two of these in order to match both the prefix and suffix.
+ *
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class AffixPatternMatcher extends SeriesMatcher implements AffixUtils.TokenConsumer {
+
+    private final String affixPattern;
+
+    // Used during construction only:
+    private MatcherFactory factory;
+    private IgnorablesMatcher ignorables;
+    private int lastTypeOrCp;
+
+    private AffixPatternMatcher(String affixPattern) {
+        this.affixPattern = affixPattern;
+    }
+
+    /**
+     * Creates an AffixPatternMatcher (based on SeriesMatcher) from the given affix pattern. Returns null
+     * if the affix pattern is empty.
+     */
+    public static AffixPatternMatcher fromAffixPattern(
+            String affixPattern,
+            MatcherFactory factory,
+            int parseFlags) {
+        if (affixPattern.isEmpty()) {
+            return null;
+        }
+
+        AffixPatternMatcher series = new AffixPatternMatcher(affixPattern);
+        series.factory = factory;
+        series.ignorables = (0 != (parseFlags & ParsingUtils.PARSE_FLAG_EXACT_AFFIX)) ? null
+                : factory.ignorables();
+        series.lastTypeOrCp = 0;
+        AffixUtils.iterateWithConsumer(affixPattern, series);
+
+        // De-reference the memory
+        series.factory = null;
+        series.ignorables = null;
+        series.lastTypeOrCp = 0;
+
+        series.freeze();
+        return series;
+    }
+
+    /**
+     * This method is NOT intended to be called directly. It is here for the AffixUtils.TokenConsumer
+     * interface only.
+     */
+    @Override
+    public void consumeToken(int typeOrCp) {
+        // This is called by AffixUtils.iterateWithConsumer() for each token.
+
+        // Add an ignorables matcher between tokens except between two literals, and don't put two
+        // ignorables matchers in a row.
+        if (ignorables != null
+                && length() > 0
+                && (lastTypeOrCp < 0 || !ignorables.getSet().contains(lastTypeOrCp))) {
+            addMatcher(ignorables);
+        }
+
+        if (typeOrCp < 0) {
+            // Case 1: the token is a symbol.
+            switch (typeOrCp) {
+            case AffixUtils.TYPE_MINUS_SIGN:
+                addMatcher(factory.minusSign(true));
+                break;
+            case AffixUtils.TYPE_PLUS_SIGN:
+                addMatcher(factory.plusSign(true));
+                break;
+            case AffixUtils.TYPE_PERCENT:
+                addMatcher(factory.percent());
+                break;
+            case AffixUtils.TYPE_PERMILLE:
+                addMatcher(factory.permille());
+                break;
+            case AffixUtils.TYPE_CURRENCY_SINGLE:
+            case AffixUtils.TYPE_CURRENCY_DOUBLE:
+            case AffixUtils.TYPE_CURRENCY_TRIPLE:
+            case AffixUtils.TYPE_CURRENCY_QUAD:
+            case AffixUtils.TYPE_CURRENCY_QUINT:
+                // All currency symbols use the same matcher
+                addMatcher(factory.currency());
+                break;
+            default:
+                throw new AssertionError();
+            }
+
+        } else if (ignorables != null && ignorables.getSet().contains(typeOrCp)) {
+            // Case 2: the token is an ignorable literal.
+            // No action necessary: the ignorables matcher has already been added.
+
+        } else {
+            // Case 3: the token is a non-ignorable literal.
+            addMatcher(CodePointMatcher.getInstance(typeOrCp));
+        }
+        lastTypeOrCp = typeOrCp;
+    }
+
+    public String getPattern() {
+        return affixPattern;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (this == other)
+            return true;
+        if (!(other instanceof AffixPatternMatcher))
+            return false;
+        return affixPattern.equals(((AffixPatternMatcher) other).affixPattern);
+    }
+
+    @Override
+    public int hashCode() {
+        return affixPattern.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return affixPattern;
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/AnyMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/AnyMatcher.java
new file mode 100644
index 0000000..5566ace
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/AnyMatcher.java
@@ -0,0 +1,99 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.UnicodeSet;
+
+/**
+ * Composes a number of matchers, and succeeds if any of the matchers succeed. Always greedily chooses
+ * the first matcher in the list to succeed.
+ *
+ * @author sffc
+ * @see SeriesMatcher
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class AnyMatcher implements NumberParseMatcher {
+
+    protected List<NumberParseMatcher> matchers = null;
+    protected boolean frozen = false;
+
+    public void addMatcher(NumberParseMatcher matcher) {
+        assert !frozen;
+        if (matchers == null) {
+            matchers = new ArrayList<NumberParseMatcher>();
+        }
+        matchers.add(matcher);
+    }
+
+    public void freeze() {
+        frozen = true;
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        assert frozen;
+        if (matchers == null) {
+            return false;
+        }
+
+        int initialOffset = segment.getOffset();
+        boolean maybeMore = false;
+        for (int i = 0; i < matchers.size(); i++) {
+            NumberParseMatcher matcher = matchers.get(i);
+            maybeMore = maybeMore || matcher.match(segment, result);
+            if (segment.getOffset() != initialOffset) {
+                // Match succeeded.
+                // NOTE: Except for a couple edge cases, if a matcher accepted string A, then it will
+                // accept any string starting with A. Therefore, there is no possibility that matchers
+                // later in the list may be evaluated on longer strings, and we can exit the loop here.
+                break;
+            }
+        }
+
+        // None of the matchers succeeded.
+        return maybeMore;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        assert frozen;
+        if (matchers == null) {
+            return UnicodeSet.EMPTY;
+        }
+
+        if (matchers.size() == 1) {
+            return matchers.get(0).getLeadCodePoints();
+        }
+
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        for (int i = 0; i < matchers.size(); i++) {
+            NumberParseMatcher matcher = matchers.get(i);
+            leadCodePoints.addAll(matcher.getLeadCodePoints());
+        }
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        assert frozen;
+        if (matchers == null) {
+            return;
+        }
+
+        for (int i = 0; i < matchers.size(); i++) {
+            NumberParseMatcher matcher = matchers.get(i);
+            matcher.postProcess(result);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<AnyMatcher " + matchers + ">";
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/CodePointMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/CodePointMatcher.java
new file mode 100644
index 0000000..c282d9a
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/CodePointMatcher.java
@@ -0,0 +1,52 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.UnicodeSet;
+
+/**
+ * Matches a single code point, performing no other logic.
+ *
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class CodePointMatcher implements NumberParseMatcher {
+
+    private final int cp;
+
+    public static CodePointMatcher getInstance(int cp) {
+        // TODO: Cache certain popular instances?
+        return new CodePointMatcher(cp);
+    }
+
+    private CodePointMatcher(int cp) {
+        this.cp = cp;
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        if (segment.startsWith(cp)) {
+            segment.adjustOffsetByCodePoint();
+            result.setCharsConsumed(segment);
+        }
+        return false;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        return new UnicodeSet().add(cp).freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<CodePointMatcher U+" + Integer.toHexString(cp) + ">";
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/CurrencyMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/CurrencyMatcher.java
new file mode 100644
index 0000000..bdd23ea
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/CurrencyMatcher.java
@@ -0,0 +1,73 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.UnicodeSet;
+import android.icu.util.Currency;
+import android.icu.util.ULocale;
+
+/**
+ * A matcher for a single currency instance (not the full trie).
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class CurrencyMatcher implements NumberParseMatcher {
+
+    private final String isoCode;
+    private final String currency1;
+    private final String currency2;
+
+    public static CurrencyMatcher getInstance(Currency currency, ULocale loc) {
+        return new CurrencyMatcher(currency.getSubtype(),
+                currency.getSymbol(loc),
+                currency.getCurrencyCode());
+    }
+
+    private CurrencyMatcher(String isoCode, String currency1, String currency2) {
+        this.isoCode = isoCode;
+        this.currency1 = currency1;
+        this.currency2 = currency2;
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        if (result.currencyCode != null) {
+            return false;
+        }
+
+        int overlap1 = segment.getCommonPrefixLength(currency1);
+        if (overlap1 == currency1.length()) {
+            result.currencyCode = isoCode;
+            segment.adjustOffset(overlap1);
+            result.setCharsConsumed(segment);
+        }
+
+        int overlap2 = segment.getCommonPrefixLength(currency2);
+        if (overlap2 == currency2.length()) {
+            result.currencyCode = isoCode;
+            segment.adjustOffset(overlap2);
+            result.setCharsConsumed(segment);
+        }
+
+        return overlap1 == segment.length() || overlap2 == segment.length();
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        ParsingUtils.putLeadCodePoint(currency1, leadCodePoints);
+        ParsingUtils.putLeadCodePoint(currency2, leadCodePoints);
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<CurrencyMatcher " + isoCode + ">";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/CurrencyTrieMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/CurrencyTrieMatcher.java
new file mode 100644
index 0000000..2202c7f
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/CurrencyTrieMatcher.java
@@ -0,0 +1,73 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import java.util.Iterator;
+
+import android.icu.impl.StringSegment;
+import android.icu.impl.TextTrieMap;
+import android.icu.text.UnicodeSet;
+import android.icu.util.Currency;
+import android.icu.util.Currency.CurrencyStringInfo;
+import android.icu.util.ULocale;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class CurrencyTrieMatcher implements NumberParseMatcher {
+
+    private final TextTrieMap<CurrencyStringInfo> longNameTrie;
+    private final TextTrieMap<CurrencyStringInfo> symbolTrie;
+
+    public static CurrencyTrieMatcher getInstance(ULocale locale) {
+        // TODO: Pre-compute some of the more popular locales?
+        return new CurrencyTrieMatcher(locale);
+    }
+
+    private CurrencyTrieMatcher(ULocale locale) {
+        // TODO: Currency trie does not currently have an option for case folding.  It defaults to use
+        // case folding on long-names but not symbols.
+        longNameTrie = Currency.getParsingTrie(locale, Currency.LONG_NAME);
+        symbolTrie = Currency.getParsingTrie(locale, Currency.SYMBOL_NAME);
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        if (result.currencyCode != null) {
+            return false;
+        }
+
+        TextTrieMap.Output trieOutput = new TextTrieMap.Output();
+        Iterator<CurrencyStringInfo> values = longNameTrie.get(segment, 0, trieOutput);
+        if (values == null) {
+            values = symbolTrie.get(segment, 0, trieOutput);
+        }
+        if (values != null) {
+            result.currencyCode = values.next().getISOCode();
+            segment.adjustOffset(trieOutput.matchLength);
+            result.setCharsConsumed(segment);
+        }
+        return trieOutput.partialMatch;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        longNameTrie.putLeadCodePoints(leadCodePoints);
+        symbolTrie.putLeadCodePoints(leadCodePoints);
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<CurrencyTrieMatcher>";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/DecimalMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/DecimalMatcher.java
new file mode 100644
index 0000000..cf671a7
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/DecimalMatcher.java
@@ -0,0 +1,362 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.impl.number.DecimalQuantity_DualStorageBCD;
+import android.icu.impl.number.Grouper;
+import android.icu.impl.number.parse.UnicodeSetStaticCache.Key;
+import android.icu.lang.UCharacter;
+import android.icu.text.DecimalFormatSymbols;
+import android.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class DecimalMatcher implements NumberParseMatcher {
+
+    /** If true, only accept strings whose grouping sizes match the locale */
+    private final boolean requireGroupingMatch;
+
+    /** If true, do not accept grouping separators at all */
+    private final boolean groupingDisabled;
+
+    /** If true, do not accept fraction grouping separators */
+    private final boolean fractionGroupingDisabled;
+
+    /** If true, do not accept numbers in the fraction */
+    private final boolean integerOnly;
+
+    /** If true, save the result as an exponent instead of a quantity in the ParsedNumber */
+    private final boolean isScientific;
+
+    private final int grouping1;
+    private final int grouping2;
+
+    private final String groupingSeparator;
+    private final String decimalSeparator;
+
+    // Assumption: these sets all consist of single code points. If this assumption needs to be broken,
+    // fix getLeadCodePoints() as well as matching logic. Be careful of the performance impact.
+    private final UnicodeSet groupingUniSet;
+    private final UnicodeSet decimalUniSet;
+    private final UnicodeSet separatorSet;
+    private final UnicodeSet leadSet;
+    private final String[] digitStrings;
+
+    public static DecimalMatcher getInstance(
+            DecimalFormatSymbols symbols,
+            Grouper grouper,
+            int parseFlags) {
+        // TODO: Cache popular instances?
+        return new DecimalMatcher(symbols, grouper, parseFlags);
+    }
+
+    private DecimalMatcher(DecimalFormatSymbols symbols, Grouper grouper, int parseFlags) {
+        if (0 != (parseFlags & ParsingUtils.PARSE_FLAG_MONETARY_SEPARATORS)) {
+            groupingSeparator = symbols.getMonetaryGroupingSeparatorString();
+            decimalSeparator = symbols.getMonetaryDecimalSeparatorString();
+        } else {
+            groupingSeparator = symbols.getGroupingSeparatorString();
+            decimalSeparator = symbols.getDecimalSeparatorString();
+        }
+        boolean strictSeparators = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_STRICT_SEPARATORS);
+        Key groupingKey = strictSeparators ? Key.STRICT_ALL_SEPARATORS : Key.ALL_SEPARATORS;
+
+        // Attempt to find separators in the static cache
+
+        groupingUniSet = UnicodeSetStaticCache.get(groupingKey);
+        Key decimalKey = UnicodeSetStaticCache.chooseFrom(decimalSeparator,
+                strictSeparators ? Key.STRICT_COMMA : Key.COMMA,
+                strictSeparators ? Key.STRICT_PERIOD : Key.PERIOD);
+        if (decimalKey != null) {
+            decimalUniSet = UnicodeSetStaticCache.get(decimalKey);
+        } else {
+            decimalUniSet = new UnicodeSet().add(decimalSeparator.codePointAt(0)).freeze();
+        }
+
+        if (groupingKey != null && decimalKey != null) {
+            // Everything is available in the static cache
+            separatorSet = groupingUniSet;
+            leadSet = UnicodeSetStaticCache.get(strictSeparators ? Key.DIGITS_OR_ALL_SEPARATORS
+                    : Key.DIGITS_OR_STRICT_ALL_SEPARATORS);
+        } else {
+            separatorSet = new UnicodeSet().addAll(groupingUniSet).addAll(decimalUniSet).freeze();
+            leadSet = null;
+        }
+
+        int cpZero = symbols.getCodePointZero();
+        if (cpZero == -1 || !UCharacter.isDigit(cpZero) || UCharacter.digit(cpZero) != 0) {
+            digitStrings = symbols.getDigitStringsLocal();
+        } else {
+            digitStrings = null;
+        }
+
+        requireGroupingMatch = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_STRICT_GROUPING_SIZE);
+        groupingDisabled = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_GROUPING_DISABLED);
+        fractionGroupingDisabled = 0 != (parseFlags
+                & ParsingUtils.PARSE_FLAG_FRACTION_GROUPING_DISABLED);
+        integerOnly = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_INTEGER_ONLY);
+        isScientific = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_DECIMAL_SCIENTIFIC);
+        grouping1 = grouper.getPrimary();
+        grouping2 = grouper.getSecondary();
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        return match(segment, result, false);
+    }
+
+    public boolean match(StringSegment segment, ParsedNumber result, boolean negativeExponent) {
+        if (result.seenNumber() && !isScientific) {
+            // A number has already been consumed.
+            return false;
+        }
+
+        ParsedNumber backupResult = null;
+        if (requireGroupingMatch) {
+            backupResult = new ParsedNumber();
+            backupResult.copyFrom(result);
+        }
+
+        // strict parsing
+        boolean strictFail = false; // did we exit with a strict parse failure?
+        String actualGroupingString = groupingSeparator;
+        String actualDecimalString = decimalSeparator;
+        int groupedDigitCount = 0; // tracking count of digits delimited by grouping separator
+        int backupOffset = -1; // used for preserving the last confirmed position
+        boolean afterFirstGrouping = false;
+        boolean seenGrouping = false;
+        boolean seenDecimal = false;
+        int digitsAfterDecimal = 0;
+        int initialOffset = segment.getOffset();
+        int exponent = 0;
+        boolean hasPartialPrefix = false;
+        while (segment.length() > 0) {
+            hasPartialPrefix = false;
+
+            // Attempt to match a digit.
+            byte digit = -1;
+
+            // Try by code point digit value.
+            int cp = segment.getCodePoint();
+            if (UCharacter.isDigit(cp)) {
+                segment.adjustOffset(Character.charCount(cp));
+                digit = (byte) UCharacter.digit(cp);
+            }
+
+            // Try by digit string.
+            if (digit == -1 && digitStrings != null) {
+                for (int i = 0; i < digitStrings.length; i++) {
+                    String str = digitStrings[i];
+                    int overlap = segment.getCommonPrefixLength(str);
+                    if (overlap == str.length()) {
+                        segment.adjustOffset(overlap);
+                        digit = (byte) i;
+                        break;
+                    } else if (overlap == segment.length()) {
+                        hasPartialPrefix = true;
+                    }
+                }
+            }
+
+            if (digit >= 0) {
+                // Digit was found.
+                // Check for grouping size violation
+                if (backupOffset != -1) {
+                    if (requireGroupingMatch) {
+                        // comma followed by digit, so group before comma is a secondary
+                        // group. If there was a group separator before that, the group
+                        // must == the secondary group length, else it can be <= the the
+                        // secondary group length.
+                        if ((afterFirstGrouping && groupedDigitCount != grouping2)
+                                || (!afterFirstGrouping && groupedDigitCount > grouping2)) {
+                            strictFail = true;
+                            break;
+                        }
+                    }
+                    afterFirstGrouping = true;
+                    backupOffset = -1;
+                    groupedDigitCount = 0;
+                }
+
+                // Save the digit in the DecimalQuantity or scientific adjustment.
+                if (isScientific) {
+                    int nextExponent = digit + exponent * 10;
+                    if (nextExponent < exponent) {
+                        // Overflow
+                        exponent = Integer.MAX_VALUE;
+                    } else {
+                        exponent = nextExponent;
+                    }
+                } else {
+                    if (result.quantity == null) {
+                        result.quantity = new DecimalQuantity_DualStorageBCD();
+                    }
+                    result.quantity.appendDigit(digit, 0, true);
+                }
+                result.setCharsConsumed(segment);
+                groupedDigitCount++;
+                if (seenDecimal) {
+                    digitsAfterDecimal++;
+                }
+                continue;
+            }
+
+            // Attempt to match a literal grouping or decimal separator
+            int decimalOverlap = segment.getCommonPrefixLength(actualDecimalString);
+            boolean decimalStringMatch = decimalOverlap == actualDecimalString.length();
+            int groupingOverlap = segment.getCommonPrefixLength(actualGroupingString);
+            boolean groupingStringMatch = groupingOverlap == actualGroupingString.length();
+
+            hasPartialPrefix = (decimalOverlap == segment.length())
+                    || (groupingOverlap == segment.length());
+
+            if (!seenDecimal
+                    && !groupingStringMatch
+                    && (decimalStringMatch || (!seenDecimal && decimalUniSet.contains(cp)))) {
+                // matched a decimal separator
+                if (requireGroupingMatch) {
+                    if (backupOffset != -1 || (seenGrouping && groupedDigitCount != grouping1)) {
+                        strictFail = true;
+                        break;
+                    }
+                }
+
+                // If we're only parsing integers, then don't parse this one.
+                if (integerOnly) {
+                    break;
+                }
+
+                seenDecimal = true;
+                if (!decimalStringMatch) {
+                    actualDecimalString = UCharacter.toString(cp);
+                }
+                segment.adjustOffset(actualDecimalString.length());
+                result.setCharsConsumed(segment);
+                result.flags |= ParsedNumber.FLAG_HAS_DECIMAL_SEPARATOR;
+                continue;
+            }
+
+            if (!groupingDisabled
+                    && !decimalStringMatch
+                    && (groupingStringMatch || (!seenGrouping && groupingUniSet.contains(cp)))) {
+                // matched a grouping separator
+                if (requireGroupingMatch) {
+                    if (groupedDigitCount == 0) {
+                        // leading group
+                        strictFail = true;
+                        break;
+                    } else if (backupOffset != -1) {
+                        // two group separators in a row
+                        break;
+                    }
+                }
+
+                if (fractionGroupingDisabled && seenDecimal) {
+                    // Stop parsing here.
+                    break;
+                }
+
+                seenGrouping = true;
+                if (!groupingStringMatch) {
+                    actualGroupingString = UCharacter.toString(cp);
+                }
+                backupOffset = segment.getOffset();
+                segment.adjustOffset(actualGroupingString.length());
+                // Note: do NOT set charsConsumed
+                continue;
+            }
+
+            // Not a digit and not a separator
+            break;
+        }
+
+        // Back up if there was a trailing grouping separator
+        if (backupOffset != -1) {
+            segment.setOffset(backupOffset);
+            hasPartialPrefix = true; // redundant with `groupingOverlap == segment.length()`
+        }
+
+        // Check the final grouping for validity
+        if (requireGroupingMatch
+                && !seenDecimal
+                && seenGrouping
+                && afterFirstGrouping
+                && groupedDigitCount != grouping1) {
+            strictFail = true;
+        }
+
+        if (requireGroupingMatch && strictFail) {
+            result.copyFrom(backupResult);
+            segment.setOffset(initialOffset);
+        }
+
+        if (result.quantity == null && segment.getOffset() != initialOffset) {
+            // Strings that start with a separator but have no digits.
+            // We don't need a backup of ParsedNumber because no changes could have been made to it.
+            segment.setOffset(initialOffset);
+            hasPartialPrefix = true;
+        }
+
+        if (result.quantity != null) {
+            // The final separator was a decimal separator.
+            result.quantity.adjustMagnitude(-digitsAfterDecimal);
+        }
+
+        if (isScientific && segment.getOffset() != initialOffset) {
+            assert result.quantity != null; // scientific notation always comes after the number
+            boolean overflow = (exponent == Integer.MAX_VALUE);
+            if (!overflow) {
+                try {
+                    result.quantity.adjustMagnitude(negativeExponent ? -exponent : exponent);
+                } catch (ArithmeticException e) {
+                    overflow = true;
+                }
+            }
+            if (overflow) {
+                if (negativeExponent) {
+                    // Set to zero
+                    result.quantity.clear();
+                } else {
+                    // Set to infinity
+                    result.quantity = null;
+                    result.flags |= ParsedNumber.FLAG_INFINITY;
+                }
+            }
+        }
+
+        return segment.length() == 0 || hasPartialPrefix;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        if (digitStrings == null && leadSet != null) {
+            return leadSet;
+        }
+
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        // Assumption: the sets are all single code points.
+        leadCodePoints.addAll(UnicodeSetStaticCache.get(Key.DIGITS));
+        leadCodePoints.addAll(separatorSet);
+        if (digitStrings != null) {
+            for (int i = 0; i < digitStrings.length; i++) {
+                ParsingUtils.putLeadCodePoint(digitStrings[i], leadCodePoints);
+            }
+        }
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<DecimalMatcher>";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/FlagHandler.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/FlagHandler.java
new file mode 100644
index 0000000..74bf56a
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/FlagHandler.java
@@ -0,0 +1,30 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+/**
+ * Unconditionally applies a given set of flags to the ParsedNumber in the post-processing step.
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class FlagHandler extends ValidationMatcher {
+
+    public static final FlagHandler PERCENT = new FlagHandler(ParsedNumber.FLAG_PERCENT);
+    public static final FlagHandler PERMILLE = new FlagHandler(ParsedNumber.FLAG_PERMILLE);
+
+    private final int flags;
+
+    private FlagHandler(int flags) {
+        this.flags = flags;
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        result.flags |= flags;
+    }
+
+    @Override
+    public String toString() {
+        return "<FlagsHandler " + Integer.toHexString(flags) + ">";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/IgnorablesMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/IgnorablesMatcher.java
new file mode 100644
index 0000000..856c24e
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/IgnorablesMatcher.java
@@ -0,0 +1,45 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class IgnorablesMatcher extends SymbolMatcher implements NumberParseMatcher.Flexible {
+
+    public static final IgnorablesMatcher DEFAULT = new IgnorablesMatcher(
+            UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.DEFAULT_IGNORABLES));
+
+    public static final IgnorablesMatcher STRICT = new IgnorablesMatcher(
+            UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.STRICT_IGNORABLES));
+
+    public static IgnorablesMatcher getInstance(UnicodeSet ignorables) {
+        assert ignorables.isFrozen();
+        return new IgnorablesMatcher(ignorables);
+    }
+
+    private IgnorablesMatcher(UnicodeSet ignorables) {
+        super("", ignorables);
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return false;
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<IgnorablesMatcher>";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/InfinityMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/InfinityMatcher.java
new file mode 100644
index 0000000..dde2773
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/InfinityMatcher.java
@@ -0,0 +1,50 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.DecimalFormatSymbols;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class InfinityMatcher extends SymbolMatcher {
+
+    private static final InfinityMatcher DEFAULT = new InfinityMatcher();
+
+    public static InfinityMatcher getInstance(DecimalFormatSymbols symbols) {
+        String symbolString = symbols.getInfinity();
+        if (DEFAULT.uniSet.contains(symbolString)) {
+            return DEFAULT;
+        } else {
+            return new InfinityMatcher(symbolString);
+        }
+    }
+
+    private InfinityMatcher(String symbolString) {
+        super(symbolString, DEFAULT.uniSet);
+    }
+
+    private InfinityMatcher() {
+        super(UnicodeSetStaticCache.Key.INFINITY);
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return 0 != (result.flags & ParsedNumber.FLAG_INFINITY);
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.flags |= ParsedNumber.FLAG_INFINITY;
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<PercentMatcher>";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/MatcherFactory.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/MatcherFactory.java
new file mode 100644
index 0000000..acd4127
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/MatcherFactory.java
@@ -0,0 +1,48 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.text.DecimalFormatSymbols;
+import android.icu.util.Currency;
+import android.icu.util.ULocale;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class MatcherFactory {
+    Currency currency;
+    DecimalFormatSymbols symbols;
+    IgnorablesMatcher ignorables;
+    ULocale locale;
+
+    public MinusSignMatcher minusSign(boolean allowTrailing) {
+        return MinusSignMatcher.getInstance(symbols, allowTrailing);
+    }
+
+    public PlusSignMatcher plusSign(boolean allowTrailing) {
+        return PlusSignMatcher.getInstance(symbols, allowTrailing);
+    }
+
+    public PercentMatcher percent() {
+        return PercentMatcher.getInstance(symbols);
+    }
+
+    public PermilleMatcher permille() {
+        return PermilleMatcher.getInstance(symbols);
+    }
+
+    public AnyMatcher currency() {
+        AnyMatcher any = new AnyMatcher();
+        any.addMatcher(CurrencyMatcher.getInstance(currency, locale));
+        any.addMatcher(CurrencyTrieMatcher.getInstance(locale));
+        any.freeze();
+        return any;
+    }
+
+    public IgnorablesMatcher ignorables() {
+        return ignorables;
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/MinusSignMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/MinusSignMatcher.java
new file mode 100644
index 0000000..b7b2f5f
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/MinusSignMatcher.java
@@ -0,0 +1,56 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.DecimalFormatSymbols;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class MinusSignMatcher extends SymbolMatcher {
+
+    private static final MinusSignMatcher DEFAULT = new MinusSignMatcher(false);
+    private static final MinusSignMatcher DEFAULT_ALLOW_TRAILING = new MinusSignMatcher(true);
+
+    public static MinusSignMatcher getInstance(DecimalFormatSymbols symbols, boolean allowTrailing) {
+        String symbolString = symbols.getMinusSignString();
+        if (DEFAULT.uniSet.contains(symbolString)) {
+            return allowTrailing ? DEFAULT_ALLOW_TRAILING : DEFAULT;
+        } else {
+            return new MinusSignMatcher(symbolString, allowTrailing);
+        }
+    }
+
+    private final boolean allowTrailing;
+
+    private MinusSignMatcher(String symbolString, boolean allowTrailing) {
+        super(symbolString, DEFAULT.uniSet);
+        this.allowTrailing = allowTrailing;
+    }
+
+    private MinusSignMatcher(boolean allowTrailing) {
+        super(UnicodeSetStaticCache.Key.MINUS_SIGN);
+        this.allowTrailing = allowTrailing;
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return 0 != (result.flags & ParsedNumber.FLAG_NEGATIVE)
+                || (allowTrailing ? false : result.seenNumber());
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.flags |= ParsedNumber.FLAG_NEGATIVE;
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<MinusSignMatcher>";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/MultiplierHandler.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/MultiplierHandler.java
new file mode 100644
index 0000000..615795d
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/MultiplierHandler.java
@@ -0,0 +1,41 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class MultiplierHandler extends ValidationMatcher {
+
+    private final BigDecimal multiplier;
+    private final MathContext mc;
+    private final boolean isNegative;
+
+    public MultiplierHandler(BigDecimal multiplier, MathContext mc) {
+        this.multiplier = BigDecimal.ONE.divide(multiplier, mc).abs();
+        this.mc = mc;
+        isNegative = multiplier.signum() < 0;
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        if (result.quantity != null) {
+            result.quantity.multiplyBy(multiplier);
+            result.quantity.roundToMagnitude(result.quantity.getMagnitude() - mc.getPrecision(), mc);
+            if (isNegative) {
+                result.flags ^= ParsedNumber.FLAG_NEGATIVE;
+            }
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<MultiplierHandler " + multiplier + ">";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/NanMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/NanMatcher.java
new file mode 100644
index 0000000..928855a
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/NanMatcher.java
@@ -0,0 +1,60 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.DecimalFormatSymbols;
+import android.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class NanMatcher extends SymbolMatcher {
+
+    private static final NanMatcher DEFAULT = new NanMatcher("NaN");
+
+    public static NanMatcher getInstance(DecimalFormatSymbols symbols, int parseFlags) {
+        String symbolString = symbols.getNaN();
+        if (DEFAULT.string.equals(symbolString)) {
+            return DEFAULT;
+        } else {
+            return new NanMatcher(symbolString);
+        }
+    }
+
+    private NanMatcher(String symbolString) {
+        super(symbolString, UnicodeSet.EMPTY);
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        // Overriding this here to allow use of statically allocated sets
+        int leadCp = string.codePointAt(0);
+        UnicodeSet s = UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.NAN_LEAD);
+        if (s.contains(leadCp)) {
+            return s;
+        } else {
+            return super.getLeadCodePoints();
+        }
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return result.seenNumber();
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.flags |= ParsedNumber.FLAG_NAN;
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<NanMatcher>";
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/NumberParseMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/NumberParseMatcher.java
new file mode 100644
index 0000000..f986272
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/NumberParseMatcher.java
@@ -0,0 +1,64 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.UnicodeSet;
+
+/**
+ * Given a string, there should NOT be more than one way to consume the string with the same matcher
+ * applied multiple times. If there is, the non-greedy parsing algorithm will be unhappy and may enter an
+ * exponential-time loop. For example, consider the "A Matcher" that accepts "any number of As". Given
+ * the string "AAAA", there are 2^N = 8 ways to apply the A Matcher to this string: you could have the A
+ * Matcher apply 4 times to each character; you could have it apply just once to all the characters; you
+ * could have it apply to the first 2 characters and the second 2 characters; and so on. A better version
+ * of the "A Matcher" would be for it to accept exactly one A, and allow the algorithm to run it
+ * repeatedly to consume a string of multiple As. The A Matcher can implement the Flexible interface
+ * below to signal that it can be applied multiple times in a row.
+ *
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public interface NumberParseMatcher {
+
+    /**
+     * Matchers can implement the Flexible interface to indicate that they are optional and can be run
+     * repeatedly. Used by SeriesMatcher, primarily in the context of IgnorablesMatcher.
+     */
+    public interface Flexible {
+    }
+
+    /**
+     * Runs this matcher starting at the beginning of the given StringSegment. If this matcher finds
+     * something interesting in the StringSegment, it should update the offset of the StringSegment
+     * corresponding to how many chars were matched.
+     *
+     * @param segment
+     *            The StringSegment to match against. Matches always start at the beginning of the
+     *            segment. The segment is guaranteed to contain at least one char.
+     * @param result
+     *            The data structure to store results if the match succeeds.
+     * @return Whether this matcher thinks there may be more interesting chars beyond the end of the
+     *         string segment.
+     */
+    public boolean match(StringSegment segment, ParsedNumber result);
+
+    /**
+     * Should return a set representing all possible chars (UTF-16 code units) that could be the first
+     * char that this matcher can consume. This method is only called during construction phase, and its
+     * return value is used to skip this matcher unless a segment begins with a char in this set. To make
+     * this matcher always run, return {@link UnicodeSet#ALL_CODE_POINTS}.
+     */
+    public UnicodeSet getLeadCodePoints();
+
+    /**
+     * Method called at the end of a parse, after all matchers have failed to consume any more chars.
+     * Allows a matcher to make final modifications to the result given the knowledge that no more
+     * matches are possible.
+     *
+     * @param result
+     *            The data structure to store results.
+     */
+    public void postProcess(ParsedNumber result);
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/NumberParserImpl.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/NumberParserImpl.java
new file mode 100644
index 0000000..7af4eff
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/NumberParserImpl.java
@@ -0,0 +1,495 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import java.text.ParsePosition;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+
+import android.icu.impl.StringSegment;
+import android.icu.impl.number.AffixPatternProvider;
+import android.icu.impl.number.AffixUtils;
+import android.icu.impl.number.CustomSymbolCurrency;
+import android.icu.impl.number.DecimalFormatProperties;
+import android.icu.impl.number.Grouper;
+import android.icu.impl.number.PatternStringParser;
+import android.icu.impl.number.PatternStringParser.ParsedPatternInfo;
+import android.icu.impl.number.PropertiesAffixPatternProvider;
+import android.icu.impl.number.RoundingUtils;
+import android.icu.number.NumberFormatter.GroupingStrategy;
+import android.icu.text.DecimalFormatSymbols;
+import android.icu.text.UnicodeSet;
+import android.icu.util.Currency;
+import android.icu.util.CurrencyAmount;
+import android.icu.util.ULocale;
+
+/**
+ * Primary number parsing implementation class.
+ *
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class NumberParserImpl {
+
+    @Deprecated
+    public static NumberParserImpl removeMeWhenMerged(ULocale locale, String pattern, int parseFlags) {
+        NumberParserImpl parser = new NumberParserImpl(parseFlags);
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
+        IgnorablesMatcher ignorables = IgnorablesMatcher.DEFAULT;
+
+        MatcherFactory factory = new MatcherFactory();
+        factory.currency = Currency.getInstance("USD");
+        factory.symbols = symbols;
+        factory.ignorables = ignorables;
+        factory.locale = locale;
+
+        ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(pattern);
+        AffixMatcher.newGenerate(patternInfo, parser, factory, ignorables, parseFlags);
+
+        Grouper grouper = Grouper.forStrategy(GroupingStrategy.AUTO).withLocaleData(locale, patternInfo);
+        parser.addMatcher(DecimalMatcher.getInstance(symbols, grouper, parseFlags));
+        parser.addMatcher(CurrencyTrieMatcher.getInstance(locale));
+        parser.addMatcher(NanMatcher.getInstance(symbols, parseFlags));
+
+        parser.freeze();
+        return parser;
+    }
+
+    // TODO: Find a better place for this enum.
+    /** Controls the set of rules for parsing a string. */
+    public static enum ParseMode {
+        /**
+         * Lenient mode should be used if you want to accept malformed user input. It will use heuristics
+         * to attempt to parse through typographical errors in the string.
+         */
+        LENIENT,
+
+        /**
+         * Strict mode should be used if you want to require that the input is well-formed. More
+         * specifically, it differs from lenient mode in the following ways:
+         *
+         * <ul>
+         * <li>Grouping widths must match the grouping settings. For example, "12,3,45" will fail if the
+         * grouping width is 3, as in the pattern "#,##0".
+         * <li>The string must contain a complete prefix and suffix. For example, if the pattern is
+         * "{#};(#)", then "{123}" or "(123)" would match, but "{123", "123}", and "123" would all fail.
+         * (The latter strings would be accepted in lenient mode.)
+         * <li>Whitespace may not appear at arbitrary places in the string. In lenient mode, whitespace
+         * is allowed to occur arbitrarily before and after prefixes and exponent separators.
+         * <li>Leading grouping separators are not allowed, as in ",123".
+         * <li>Minus and plus signs can only appear if specified in the pattern. In lenient mode, a plus
+         * or minus sign can always precede a number.
+         * <li>The set of characters that can be interpreted as a decimal or grouping separator is
+         * smaller.
+         * <li><strong>If currency parsing is enabled,</strong> currencies must only appear where
+         * specified in either the current pattern string or in a valid pattern string for the current
+         * locale. For example, if the pattern is "¤0.00", then "$1.23" would match, but "1.23$" would
+         * fail to match.
+         * </ul>
+         */
+        STRICT,
+    }
+
+    @Deprecated
+    public static NumberParserImpl createParserFromPattern(
+            ULocale locale,
+            String pattern,
+            boolean strictGrouping) {
+        // Temporary frontend for testing.
+
+        int parseFlags = ParsingUtils.PARSE_FLAG_IGNORE_CASE
+                | ParsingUtils.PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES
+                | ParsingUtils.PARSE_FLAG_OPTIMIZE;
+        if (strictGrouping) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_STRICT_GROUPING_SIZE;
+        }
+
+        NumberParserImpl parser = new NumberParserImpl(parseFlags);
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
+        IgnorablesMatcher ignorables = IgnorablesMatcher.DEFAULT;
+
+        MatcherFactory factory = new MatcherFactory();
+        factory.currency = Currency.getInstance("USD");
+        factory.symbols = symbols;
+        factory.ignorables = ignorables;
+        factory.locale = locale;
+
+        ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(pattern);
+        AffixMatcher.newGenerate(patternInfo, parser, factory, ignorables, parseFlags);
+
+        Grouper grouper = Grouper.forStrategy(GroupingStrategy.AUTO).withLocaleData(locale, patternInfo);
+
+        parser.addMatcher(ignorables);
+        parser.addMatcher(DecimalMatcher.getInstance(symbols, grouper, parseFlags));
+        parser.addMatcher(MinusSignMatcher.getInstance(symbols, false));
+        parser.addMatcher(NanMatcher.getInstance(symbols, parseFlags));
+        parser.addMatcher(ScientificMatcher.getInstance(symbols, grouper));
+        parser.addMatcher(CurrencyTrieMatcher.getInstance(locale));
+        parser.addMatcher(new RequireNumberMatcher());
+
+        parser.freeze();
+        return parser;
+    }
+
+    public static Number parseStatic(
+            String input,
+            ParsePosition ppos,
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols) {
+        NumberParserImpl parser = createParserFromProperties(properties, symbols, false, false);
+        ParsedNumber result = new ParsedNumber();
+        parser.parse(input, true, result);
+        if (result.success()) {
+            ppos.setIndex(result.charEnd);
+            return result.getNumber();
+        } else {
+            ppos.setErrorIndex(result.charEnd);
+            return null;
+        }
+    }
+
+    public static CurrencyAmount parseStaticCurrency(
+            String input,
+            ParsePosition ppos,
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols) {
+        NumberParserImpl parser = createParserFromProperties(properties, symbols, true, false);
+        ParsedNumber result = new ParsedNumber();
+        parser.parse(input, true, result);
+        if (result.success()) {
+            ppos.setIndex(result.charEnd);
+            // TODO: Clean this up
+            Currency currency;
+            if (result.currencyCode != null) {
+                currency = Currency.getInstance(result.currencyCode);
+            } else {
+                assert 0 != (result.flags & ParsedNumber.FLAG_HAS_DEFAULT_CURRENCY);
+                currency = CustomSymbolCurrency
+                        .resolve(properties.getCurrency(), symbols.getULocale(), symbols);
+            }
+            return new CurrencyAmount(result.getNumber(), currency);
+        } else {
+            ppos.setErrorIndex(result.charEnd);
+            return null;
+        }
+    }
+
+    public static NumberParserImpl createDefaultParserForLocale(ULocale loc, boolean optimize) {
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(loc);
+        DecimalFormatProperties properties = PatternStringParser.parseToProperties("0");
+        return createParserFromProperties(properties, symbols, false, optimize);
+    }
+
+    public static NumberParserImpl createParserFromProperties(
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols,
+            boolean parseCurrency,
+            boolean optimize) {
+
+        ULocale locale = symbols.getULocale();
+        AffixPatternProvider patternInfo = new PropertiesAffixPatternProvider(properties);
+        Currency currency = CustomSymbolCurrency.resolve(properties.getCurrency(), locale, symbols);
+        boolean isStrict = properties.getParseMode() == ParseMode.STRICT;
+        Grouper grouper = Grouper.forProperties(properties);
+        int parseFlags = 0;
+        // Fraction grouping is disabled by default because it has never been supported in DecimalFormat
+        parseFlags |= ParsingUtils.PARSE_FLAG_FRACTION_GROUPING_DISABLED;
+        if (!properties.getParseCaseSensitive()) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_IGNORE_CASE;
+        }
+        if (properties.getParseIntegerOnly()) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_INTEGER_ONLY;
+        }
+        if (properties.getSignAlwaysShown()) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_PLUS_SIGN_ALLOWED;
+        }
+        if (isStrict) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_STRICT_GROUPING_SIZE;
+            parseFlags |= ParsingUtils.PARSE_FLAG_STRICT_SEPARATORS;
+            parseFlags |= ParsingUtils.PARSE_FLAG_USE_FULL_AFFIXES;
+            parseFlags |= ParsingUtils.PARSE_FLAG_EXACT_AFFIX;
+        } else {
+            parseFlags |= ParsingUtils.PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES;
+        }
+        if (grouper.getPrimary() <= 0) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_GROUPING_DISABLED;
+        }
+        if (parseCurrency || patternInfo.hasCurrencySign()) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_MONETARY_SEPARATORS;
+        }
+        if (optimize) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_OPTIMIZE;
+        }
+        IgnorablesMatcher ignorables = isStrict ? IgnorablesMatcher.STRICT : IgnorablesMatcher.DEFAULT;
+
+        NumberParserImpl parser = new NumberParserImpl(parseFlags);
+
+        MatcherFactory factory = new MatcherFactory();
+        factory.currency = currency;
+        factory.symbols = symbols;
+        factory.ignorables = ignorables;
+        factory.locale = locale;
+
+        //////////////////////
+        /// AFFIX MATCHERS ///
+        //////////////////////
+
+        // Set up a pattern modifier with mostly defaults to generate AffixMatchers.
+        AffixMatcher.newGenerate(patternInfo, parser, factory, ignorables, parseFlags);
+
+        ////////////////////////
+        /// CURRENCY MATCHER ///
+        ////////////////////////
+
+        if (parseCurrency || patternInfo.hasCurrencySign()) {
+            parser.addMatcher(CurrencyMatcher.getInstance(currency, locale));
+            parser.addMatcher(CurrencyTrieMatcher.getInstance(locale));
+        }
+
+        ///////////////
+        /// PERCENT ///
+        ///////////////
+
+        // ICU-TC meeting, April 11, 2018: accept percent/permille only if it is in the pattern,
+        // and to maintain regressive behavior, divide by 100 even if no percent sign is present.
+        if (patternInfo.containsSymbolType(AffixUtils.TYPE_PERCENT)) {
+            parser.addMatcher(PercentMatcher.getInstance(symbols));
+            // causes number to be always scaled by 100:
+            parser.addMatcher(FlagHandler.PERCENT);
+        }
+        if (patternInfo.containsSymbolType(AffixUtils.TYPE_PERMILLE)) {
+            parser.addMatcher(PermilleMatcher.getInstance(symbols));
+            // causes number to be always scaled by 1000:
+            parser.addMatcher(FlagHandler.PERMILLE);
+        }
+
+        ///////////////////////////////
+        /// OTHER STANDARD MATCHERS ///
+        ///////////////////////////////
+
+        if (!isStrict) {
+            parser.addMatcher(PlusSignMatcher.getInstance(symbols, false));
+            parser.addMatcher(MinusSignMatcher.getInstance(symbols, false));
+        }
+        parser.addMatcher(NanMatcher.getInstance(symbols, parseFlags));
+        parser.addMatcher(InfinityMatcher.getInstance(symbols));
+        String padString = properties.getPadString();
+        if (padString != null && !ignorables.getSet().contains(padString)) {
+            parser.addMatcher(PaddingMatcher.getInstance(padString));
+        }
+        parser.addMatcher(ignorables);
+        parser.addMatcher(DecimalMatcher.getInstance(symbols, grouper, parseFlags));
+        if (!properties.getParseNoExponent()) {
+            parser.addMatcher(ScientificMatcher.getInstance(symbols, grouper));
+        }
+
+        //////////////////
+        /// VALIDATORS ///
+        //////////////////
+
+        parser.addMatcher(new RequireNumberMatcher());
+        if (isStrict) {
+            parser.addMatcher(new RequireAffixMatcher());
+        }
+        if (isStrict && properties.getMinimumExponentDigits() > 0) {
+            parser.addMatcher(new RequireExponentMatcher());
+        }
+        if (parseCurrency) {
+            parser.addMatcher(new RequireCurrencyMatcher());
+        }
+        if (properties.getDecimalPatternMatchRequired()) {
+            boolean patternHasDecimalSeparator = properties.getDecimalSeparatorAlwaysShown()
+                    || properties.getMaximumFractionDigits() != 0;
+            parser.addMatcher(RequireDecimalSeparatorMatcher.getInstance(patternHasDecimalSeparator));
+        }
+        if (properties.getMultiplier() != null) {
+            // We need to use a math context in order to prevent non-terminating decimal expansions.
+            // This is only used when dividing by the multiplier.
+            parser.addMatcher(new MultiplierHandler(properties.getMultiplier(),
+                    RoundingUtils.getMathContextOr34Digits(properties)));
+        }
+
+        parser.freeze();
+        return parser;
+    }
+
+    private final int parseFlags;
+    private final List<NumberParseMatcher> matchers;
+    private final List<UnicodeSet> leadCodePointses;
+    private Comparator<ParsedNumber> comparator;
+    private boolean frozen;
+
+    /**
+     * Creates a new, empty parser.
+     *
+     * @param parseFlags
+     *            The parser settings defined in the PARSE_FLAG_* fields.
+     */
+    public NumberParserImpl(int parseFlags) {
+        matchers = new ArrayList<NumberParseMatcher>();
+        if (0 != (parseFlags & ParsingUtils.PARSE_FLAG_OPTIMIZE)) {
+            leadCodePointses = new ArrayList<UnicodeSet>();
+        } else {
+            leadCodePointses = null;
+        }
+        comparator = ParsedNumber.COMPARATOR; // default value
+        this.parseFlags = parseFlags;
+        frozen = false;
+    }
+
+    public void addMatcher(NumberParseMatcher matcher) {
+        assert !frozen;
+        this.matchers.add(matcher);
+        if (leadCodePointses != null) {
+            addLeadCodePointsForMatcher(matcher);
+        }
+    }
+
+    public void addMatchers(Collection<? extends NumberParseMatcher> matchers) {
+        assert !frozen;
+        this.matchers.addAll(matchers);
+        if (leadCodePointses != null) {
+            for (NumberParseMatcher matcher : matchers) {
+                addLeadCodePointsForMatcher(matcher);
+            }
+        }
+    }
+
+    private void addLeadCodePointsForMatcher(NumberParseMatcher matcher) {
+        UnicodeSet leadCodePoints = matcher.getLeadCodePoints();
+        assert leadCodePoints.isFrozen();
+        // TODO: Avoid the clone operation here.
+        if (0 != (parseFlags & ParsingUtils.PARSE_FLAG_IGNORE_CASE)) {
+            leadCodePoints = leadCodePoints.cloneAsThawed().closeOver(UnicodeSet.ADD_CASE_MAPPINGS)
+                    .freeze();
+        }
+        this.leadCodePointses.add(leadCodePoints);
+    }
+
+    public void setComparator(Comparator<ParsedNumber> comparator) {
+        assert !frozen;
+        this.comparator = comparator;
+    }
+
+    public void freeze() {
+        frozen = true;
+    }
+
+    public void parse(String input, boolean greedy, ParsedNumber result) {
+        parse(input, 0, greedy, result);
+    }
+
+    /**
+     * Primary entrypoint to parsing code path.
+     *
+     * @param input
+     *            The string to parse. This is a String, not CharSequence, to enforce assumptions about
+     *            immutability (CharSequences are not guaranteed to be immutable).
+     * @param start
+     *            The index into the string at which to start parsing.
+     * @param greedy
+     *            Whether to use the faster but potentially less accurate greedy code path.
+     * @param result
+     *            Output variable to store results.
+     */
+    public void parse(String input, int start, boolean greedy, ParsedNumber result) {
+        assert frozen;
+        assert start >= 0 && start < input.length();
+        StringSegment segment = new StringSegment(input,
+                0 != (parseFlags & ParsingUtils.PARSE_FLAG_IGNORE_CASE));
+        segment.adjustOffset(start);
+        if (greedy) {
+            parseGreedyRecursive(segment, result);
+        } else {
+            parseLongestRecursive(segment, result);
+        }
+        for (NumberParseMatcher matcher : matchers) {
+            matcher.postProcess(result);
+        }
+        // Android Patch: to be removed in ICU 62
+        result.postProcess();
+        // End Android Patch
+    }
+
+    private void parseGreedyRecursive(StringSegment segment, ParsedNumber result) {
+        // Base Case
+        if (segment.length() == 0) {
+            return;
+        }
+
+        int initialOffset = segment.getOffset();
+        int leadCp = segment.getCodePoint();
+        for (int i = 0; i < matchers.size(); i++) {
+            if (leadCodePointses != null && !leadCodePointses.get(i).contains(leadCp)) {
+                continue;
+            }
+            NumberParseMatcher matcher = matchers.get(i);
+            matcher.match(segment, result);
+            if (segment.getOffset() != initialOffset) {
+                // In a greedy parse, recurse on only the first match.
+                parseGreedyRecursive(segment, result);
+                // The following line resets the offset so that the StringSegment says the same across
+                // the function
+                // call boundary. Since we recurse only once, this line is not strictly necessary.
+                segment.setOffset(initialOffset);
+                return;
+            }
+        }
+
+        // NOTE: If we get here, the greedy parse completed without consuming the entire string.
+    }
+
+    private void parseLongestRecursive(StringSegment segment, ParsedNumber result) {
+        // Base Case
+        if (segment.length() == 0) {
+            return;
+        }
+
+        // TODO: Give a nice way for the matcher to reset the ParsedNumber?
+        ParsedNumber initial = new ParsedNumber();
+        initial.copyFrom(result);
+        ParsedNumber candidate = new ParsedNumber();
+
+        int initialOffset = segment.getOffset();
+        for (int i = 0; i < matchers.size(); i++) {
+            NumberParseMatcher matcher = matchers.get(i);
+
+            // In a non-greedy parse, we attempt all possible matches and pick the best.
+            for (int charsToConsume = 0; charsToConsume < segment.length();) {
+                charsToConsume += Character.charCount(Character.codePointAt(segment, charsToConsume));
+
+                // Run the matcher on a segment of the current length.
+                candidate.copyFrom(initial);
+                segment.setLength(charsToConsume);
+                boolean maybeMore = matcher.match(segment, candidate);
+                segment.resetLength();
+
+                // If the entire segment was consumed, recurse.
+                if (segment.getOffset() - initialOffset == charsToConsume) {
+                    parseLongestRecursive(segment, candidate);
+                    if (comparator.compare(candidate, result) > 0) {
+                        result.copyFrom(candidate);
+                    }
+                }
+
+                // Since the segment can be re-used, reset the offset.
+                // This does not have an effect if the matcher did not consume any chars.
+                segment.setOffset(initialOffset);
+
+                // Unless the matcher wants to see the next char, continue to the next matcher.
+                if (!maybeMore) {
+                    break;
+                }
+            }
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<NumberParserImpl matchers=" + matchers.toString() + ">";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/PaddingMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/PaddingMatcher.java
new file mode 100644
index 0000000..2ec8699
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/PaddingMatcher.java
@@ -0,0 +1,38 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class PaddingMatcher extends SymbolMatcher implements NumberParseMatcher.Flexible {
+
+    public static PaddingMatcher getInstance(String padString) {
+        return new PaddingMatcher(padString);
+    }
+
+    private PaddingMatcher(String symbolString) {
+        super(symbolString, UnicodeSet.EMPTY);
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return false;
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<PaddingMatcher>";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/ParsedNumber.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/ParsedNumber.java
new file mode 100644
index 0000000..a67d804
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/ParsedNumber.java
@@ -0,0 +1,179 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import java.math.BigDecimal;
+import java.util.Comparator;
+
+import android.icu.impl.StringSegment;
+import android.icu.impl.number.DecimalQuantity_DualStorageBCD;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class ParsedNumber {
+
+    public DecimalQuantity_DualStorageBCD quantity;
+
+    /**
+     * The index of the last char consumed during parsing. If parsing started at index 0, this is equal
+     * to the number of chars consumed. This is NOT necessarily the same as the StringSegment offset;
+     * "weak" chars, like whitespace, change the offset, but the charsConsumed is not touched until a
+     * "strong" char is encountered.
+     */
+    public int charEnd;
+
+    /**
+     * Boolean flags (see constants below).
+     */
+    public int flags;
+
+    /**
+     * The pattern string corresponding to the prefix that got consumed.
+     */
+    public String prefix;
+
+    /**
+     * The pattern string corresponding to the suffix that got consumed.
+     */
+    public String suffix;
+
+    /**
+     * The currency that got consumed.
+     */
+    public String currencyCode;
+
+    public static final int FLAG_NEGATIVE = 0x0001;
+    public static final int FLAG_PERCENT = 0x0002;
+    public static final int FLAG_PERMILLE = 0x0004;
+    public static final int FLAG_HAS_EXPONENT = 0x0008;
+    public static final int FLAG_HAS_DEFAULT_CURRENCY = 0x0010;
+    public static final int FLAG_HAS_DECIMAL_SEPARATOR = 0x0020;
+    public static final int FLAG_NAN = 0x0040;
+    public static final int FLAG_INFINITY = 0x0080;
+    public static final int FLAG_FAIL = 0x0100;
+
+    /** A Comparator that favors ParsedNumbers with the most chars consumed. */
+    public static final Comparator<ParsedNumber> COMPARATOR = new Comparator<ParsedNumber>() {
+        @Override
+        public int compare(ParsedNumber o1, ParsedNumber o2) {
+            return o1.charEnd - o2.charEnd;
+        }
+    };
+
+    public ParsedNumber() {
+        clear();
+    }
+
+    /**
+     * Clears the data from this ParsedNumber, in effect failing the current parse.
+     */
+    public void clear() {
+        quantity = null;
+        charEnd = 0;
+        flags = 0;
+        prefix = null;
+        suffix = null;
+        currencyCode = null;
+    }
+
+    public void copyFrom(ParsedNumber other) {
+        quantity = other.quantity == null ? null
+                : (DecimalQuantity_DualStorageBCD) other.quantity.createCopy();
+        charEnd = other.charEnd;
+        flags = other.flags;
+        prefix = other.prefix;
+        suffix = other.suffix;
+        currencyCode = other.currencyCode;
+    }
+
+    /**
+     * Call this method to register that a "strong" char was consumed. This should be done after calling
+     * {@link StringSegment#setOffset} or {@link StringSegment#adjustOffset} except when the char is
+     * "weak", like whitespace.
+     *
+     * <p>
+     * <strong>What is a strong versus weak char?</strong> The behavior of number parsing is to "stop"
+     * after reading the number, even if there is other content following the number. For example, after
+     * parsing the string "123 " (123 followed by a space), the cursor should be set to 3, not 4, even
+     * though there are matchers that accept whitespace. In this example, the digits are strong, whereas
+     * the whitespace is weak. Grouping separators are weak, whereas decimal separators are strong. Most
+     * other chars are strong.
+     *
+     * @param segment
+     *            The current StringSegment, usually immediately following a call to setOffset.
+     */
+    public void setCharsConsumed(StringSegment segment) {
+        charEnd = segment.getOffset();
+    }
+
+    // Android Patch: to be removed in ICU 62
+    public void postProcess() {
+        if (quantity != null && 0 != (flags & FLAG_PERCENT)) {
+            quantity.adjustMagnitude(-2);
+        }
+        if (quantity != null && 0 != (flags & FLAG_PERMILLE)) {
+            quantity.adjustMagnitude(-3);
+        }
+    }
+    // End Android Patch
+
+    /**
+     * Returns whether this the parse was successful. To be successful, at least one char must have been
+     * consumed, and the failure flag must not be set.
+     */
+    public boolean success() {
+        return charEnd > 0 && 0 == (flags & FLAG_FAIL);
+    }
+
+    public boolean seenNumber() {
+        return quantity != null || 0 != (flags & FLAG_NAN) || 0 != (flags & FLAG_INFINITY);
+    }
+
+    public Number getNumber() {
+        return getNumber(false);
+    }
+
+    public Number getNumber(boolean forceBigDecimal) {
+        boolean sawNegative = 0 != (flags & FLAG_NEGATIVE);
+        boolean sawNaN = 0 != (flags & FLAG_NAN);
+        boolean sawInfinity = 0 != (flags & FLAG_INFINITY);
+
+        // Check for NaN, infinity, and -0.0
+        if (sawNaN) {
+            return Double.NaN;
+        }
+        if (sawInfinity) {
+            if (sawNegative) {
+                return Double.NEGATIVE_INFINITY;
+            } else {
+                return Double.POSITIVE_INFINITY;
+            }
+        }
+        if (quantity.isZero() && sawNegative) {
+            return -0.0;
+        }
+
+        if (quantity.fitsInLong() && !forceBigDecimal) {
+            long l = quantity.toLong();
+            if (0 != (flags & FLAG_NEGATIVE)) {
+                l *= -1;
+            }
+            return l;
+        }
+
+        BigDecimal d = quantity.toBigDecimal();
+        if (0 != (flags & FLAG_NEGATIVE)) {
+            d = d.negate();
+        }
+        // Special case: MIN_LONG
+        if (d.compareTo(BigDecimal.valueOf(Long.MIN_VALUE)) == 0 && !forceBigDecimal) {
+            return Long.MIN_VALUE;
+        }
+        return d;
+
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/ParsingUtils.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/ParsingUtils.java
new file mode 100644
index 0000000..db3b583
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/ParsingUtils.java
@@ -0,0 +1,44 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.text.UnicodeSet;
+import android.icu.text.UnicodeSet.EntryRange;
+
+/**
+ * A collection of utility functions used by the number parsing package.
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class ParsingUtils {
+
+    public static final int PARSE_FLAG_IGNORE_CASE = 0x0001;
+    public static final int PARSE_FLAG_MONETARY_SEPARATORS = 0x0002;
+    public static final int PARSE_FLAG_STRICT_SEPARATORS = 0x0004;
+    public static final int PARSE_FLAG_STRICT_GROUPING_SIZE = 0x0008;
+    public static final int PARSE_FLAG_INTEGER_ONLY = 0x0010;
+    public static final int PARSE_FLAG_GROUPING_DISABLED = 0x0020;
+    public static final int PARSE_FLAG_DECIMAL_SCIENTIFIC = 0x0040;
+    public static final int PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES = 0x0080;
+    public static final int PARSE_FLAG_USE_FULL_AFFIXES = 0x0100;
+    public static final int PARSE_FLAG_EXACT_AFFIX = 0x0200;
+    public static final int PARSE_FLAG_PLUS_SIGN_ALLOWED = 0x0400;
+    public static final int PARSE_FLAG_FRACTION_GROUPING_DISABLED = 0x0800;
+    public static final int PARSE_FLAG_OPTIMIZE = 0x1000;
+
+    public static void putLeadCodePoints(UnicodeSet input, UnicodeSet output) {
+        for (EntryRange range : input.ranges()) {
+            output.add(range.codepoint, range.codepointEnd);
+        }
+        for (String str : input.strings()) {
+            output.add(str.codePointAt(0));
+        }
+    }
+
+    public static void putLeadCodePoint(String input, UnicodeSet output) {
+        if (!input.isEmpty()) {
+            output.add(input.codePointAt(0));
+        }
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/PercentMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/PercentMatcher.java
new file mode 100644
index 0000000..3e277e7
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/PercentMatcher.java
@@ -0,0 +1,50 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.DecimalFormatSymbols;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class PercentMatcher extends SymbolMatcher {
+
+    private static final PercentMatcher DEFAULT = new PercentMatcher();
+
+    public static PercentMatcher getInstance(DecimalFormatSymbols symbols) {
+        String symbolString = symbols.getPercentString();
+        if (DEFAULT.uniSet.contains(symbolString)) {
+            return DEFAULT;
+        } else {
+            return new PercentMatcher(symbolString);
+        }
+    }
+
+    private PercentMatcher(String symbolString) {
+        super(symbolString, DEFAULT.uniSet);
+    }
+
+    private PercentMatcher() {
+        super(UnicodeSetStaticCache.Key.PERCENT_SIGN);
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return 0 != (result.flags & ParsedNumber.FLAG_PERCENT);
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.flags |= ParsedNumber.FLAG_PERCENT;
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<PercentMatcher>";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/PermilleMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/PermilleMatcher.java
new file mode 100644
index 0000000..06c6369
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/PermilleMatcher.java
@@ -0,0 +1,50 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.DecimalFormatSymbols;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class PermilleMatcher extends SymbolMatcher {
+
+    private static final PermilleMatcher DEFAULT = new PermilleMatcher();
+
+    public static PermilleMatcher getInstance(DecimalFormatSymbols symbols) {
+        String symbolString = symbols.getPerMillString();
+        if (DEFAULT.uniSet.contains(symbolString)) {
+            return DEFAULT;
+        } else {
+            return new PermilleMatcher(symbolString);
+        }
+    }
+
+    private PermilleMatcher(String symbolString) {
+        super(symbolString, DEFAULT.uniSet);
+    }
+
+    private PermilleMatcher() {
+        super(UnicodeSetStaticCache.Key.PERMILLE_SIGN);
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return 0 != (result.flags & ParsedNumber.FLAG_PERMILLE);
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.flags |= ParsedNumber.FLAG_PERMILLE;
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<PermilleMatcher>";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/PlusSignMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/PlusSignMatcher.java
new file mode 100644
index 0000000..dc99eb1
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/PlusSignMatcher.java
@@ -0,0 +1,55 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.DecimalFormatSymbols;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class PlusSignMatcher extends SymbolMatcher {
+
+    private static final PlusSignMatcher DEFAULT = new PlusSignMatcher(false);
+    private static final PlusSignMatcher DEFAULT_ALLOW_TRAILING = new PlusSignMatcher(true);
+
+    public static PlusSignMatcher getInstance(DecimalFormatSymbols symbols, boolean allowTrailing) {
+        String symbolString = symbols.getPlusSignString();
+        if (DEFAULT.uniSet.contains(symbolString)) {
+            return allowTrailing ? DEFAULT_ALLOW_TRAILING : DEFAULT;
+        } else {
+            return new PlusSignMatcher(symbolString, allowTrailing);
+        }
+    }
+
+    private final boolean allowTrailing;
+
+    private PlusSignMatcher(String symbolString, boolean allowTrailing) {
+        super(symbolString, DEFAULT.uniSet);
+        this.allowTrailing = allowTrailing;
+    }
+
+    private PlusSignMatcher(boolean allowTrailing) {
+        super(UnicodeSetStaticCache.Key.PLUS_SIGN);
+        this.allowTrailing = allowTrailing;
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return allowTrailing ? false : result.seenNumber();
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<PlusSignMatcher>";
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireAffixMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireAffixMatcher.java
new file mode 100644
index 0000000..050db25
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireAffixMatcher.java
@@ -0,0 +1,26 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class RequireAffixMatcher extends ValidationMatcher {
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        if (result.prefix == null || result.suffix == null) {
+            // We saw a prefix or a suffix but not both. Fail the parse.
+            result.flags |= ParsedNumber.FLAG_FAIL;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<RequireAffix>";
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireCurrencyMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireCurrencyMatcher.java
new file mode 100644
index 0000000..37b67c8
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireCurrencyMatcher.java
@@ -0,0 +1,25 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class RequireCurrencyMatcher extends ValidationMatcher {
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        if (result.currencyCode == null && 0 == (result.flags & ParsedNumber.FLAG_HAS_DEFAULT_CURRENCY)) {
+            result.flags |= ParsedNumber.FLAG_FAIL;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<RequireCurrency>";
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireDecimalSeparatorMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireDecimalSeparatorMatcher.java
new file mode 100644
index 0000000..1ece933
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireDecimalSeparatorMatcher.java
@@ -0,0 +1,38 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class RequireDecimalSeparatorMatcher extends ValidationMatcher {
+
+    private static final RequireDecimalSeparatorMatcher A = new RequireDecimalSeparatorMatcher(true);
+    private static final RequireDecimalSeparatorMatcher B = new RequireDecimalSeparatorMatcher(false);
+
+    private final boolean patternHasDecimalSeparator;
+
+    public static RequireDecimalSeparatorMatcher getInstance(boolean patternHasDecimalSeparator) {
+        return patternHasDecimalSeparator ? A : B;
+    }
+
+    private RequireDecimalSeparatorMatcher(boolean patternHasDecimalSeparator) {
+        this.patternHasDecimalSeparator = patternHasDecimalSeparator;
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        boolean parseHasDecimalSeparator = 0 != (result.flags & ParsedNumber.FLAG_HAS_DECIMAL_SEPARATOR);
+        if (parseHasDecimalSeparator != patternHasDecimalSeparator) {
+            result.flags |= ParsedNumber.FLAG_FAIL;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<RequireDecimalSeparator>";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireExponentMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireExponentMatcher.java
new file mode 100644
index 0000000..d2f312b
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireExponentMatcher.java
@@ -0,0 +1,25 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class RequireExponentMatcher extends ValidationMatcher {
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        if (0 == (result.flags & ParsedNumber.FLAG_HAS_EXPONENT)) {
+            result.flags |= ParsedNumber.FLAG_FAIL;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<RequireExponent>";
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireNumberMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireNumberMatcher.java
new file mode 100644
index 0000000..8300115
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/RequireNumberMatcher.java
@@ -0,0 +1,26 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class RequireNumberMatcher extends ValidationMatcher {
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // Require that a number is matched.
+        if (!result.seenNumber()) {
+            result.flags |= ParsedNumber.FLAG_FAIL;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<RequireNumber>";
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/ScientificMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/ScientificMatcher.java
new file mode 100644
index 0000000..49e675e
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/ScientificMatcher.java
@@ -0,0 +1,100 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.impl.number.Grouper;
+import android.icu.text.DecimalFormatSymbols;
+import android.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public class ScientificMatcher implements NumberParseMatcher {
+
+    private final String exponentSeparatorString;
+    private final DecimalMatcher exponentMatcher;
+
+    public static ScientificMatcher getInstance(DecimalFormatSymbols symbols, Grouper grouper) {
+        // TODO: Static-initialize most common instances?
+        return new ScientificMatcher(symbols, grouper);
+    }
+
+    private ScientificMatcher(DecimalFormatSymbols symbols, Grouper grouper) {
+        exponentSeparatorString = symbols.getExponentSeparator();
+        exponentMatcher = DecimalMatcher.getInstance(symbols,
+                grouper,
+                ParsingUtils.PARSE_FLAG_DECIMAL_SCIENTIFIC | ParsingUtils.PARSE_FLAG_INTEGER_ONLY);
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        // Only accept scientific notation after the mantissa.
+        if (!result.seenNumber()) {
+            return false;
+        }
+
+        // First match the scientific separator, and then match another number after it.
+        int overlap1 = segment.getCommonPrefixLength(exponentSeparatorString);
+        if (overlap1 == exponentSeparatorString.length()) {
+            // Full exponent separator match.
+
+            // First attempt to get a code point, returning true if we can't get one.
+            segment.adjustOffset(overlap1);
+            if (segment.length() == 0) {
+                return true;
+            }
+
+            // Allow a sign, and then try to match digits.
+            boolean minusSign = false;
+            if (segment.startsWith(UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.MINUS_SIGN))) {
+                minusSign = true;
+                segment.adjustOffsetByCodePoint();
+            } else if (segment.startsWith(UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.PLUS_SIGN))) {
+                segment.adjustOffsetByCodePoint();
+            }
+
+            int digitsOffset = segment.getOffset();
+            boolean digitsReturnValue = exponentMatcher.match(segment, result, minusSign);
+            if (segment.getOffset() != digitsOffset) {
+                // At least one exponent digit was matched.
+                result.flags |= ParsedNumber.FLAG_HAS_EXPONENT;
+            } else {
+                // No exponent digits were matched; un-match the exponent separator.
+                segment.adjustOffset(-overlap1);
+            }
+            return digitsReturnValue;
+
+        } else if (overlap1 == segment.length()) {
+            // Partial exponent separator match
+            return true;
+        }
+
+        // No match
+        return false;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        int leadCp = exponentSeparatorString.codePointAt(0);
+        UnicodeSet s = UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.SCIENTIFIC_LEAD);
+        if (s.contains(leadCp)) {
+            return s;
+        } else {
+            return new UnicodeSet().add(leadCp).freeze();
+        }
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<ScientificMatcher " + exponentSeparatorString + ">";
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/SeriesMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/SeriesMatcher.java
new file mode 100644
index 0000000..2ab266e
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/SeriesMatcher.java
@@ -0,0 +1,116 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.UnicodeSet;
+
+/**
+ * Composes a number of matchers, running one after another. Matches the input string only if all of the
+ * matchers in the series succeed. Performs greedy matches within the context of the series.
+ *
+ * @author sffc
+ * @see AnyMatcher
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class SeriesMatcher implements NumberParseMatcher {
+
+    protected List<NumberParseMatcher> matchers = null;
+    protected boolean frozen = false;
+
+    public void addMatcher(NumberParseMatcher matcher) {
+        assert !frozen;
+        if (matchers == null) {
+            matchers = new ArrayList<NumberParseMatcher>();
+        }
+        matchers.add(matcher);
+    }
+
+    public void freeze() {
+        frozen = true;
+    }
+
+    public int length() {
+        return matchers == null ? 0 : matchers.size();
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        assert frozen;
+        if (matchers == null) {
+            return false;
+        }
+
+        // TODO: Give a nice way to reset ParsedNumber to avoid the copy here.
+        ParsedNumber backup = new ParsedNumber();
+        backup.copyFrom(result);
+
+        int initialOffset = segment.getOffset();
+        boolean maybeMore = true;
+        for (int i = 0; i < matchers.size();) {
+            NumberParseMatcher matcher = matchers.get(i);
+            int matcherOffset = segment.getOffset();
+            if (segment.length() != 0) {
+                maybeMore = matcher.match(segment, result);
+            } else {
+                // Nothing for this matcher to match; ask for more.
+                maybeMore = true;
+            }
+
+            boolean success = (segment.getOffset() != matcherOffset);
+            boolean isFlexible = matcher instanceof NumberParseMatcher.Flexible;
+            if (success && isFlexible) {
+                // Match succeeded, and this is a flexible matcher. Re-run it.
+            } else if (success) {
+                // Match succeeded, and this is NOT a flexible matcher. Proceed to the next matcher.
+                i++;
+            } else if (isFlexible) {
+                // Match failed, and this is a flexible matcher. Try again with the next matcher.
+                i++;
+            } else {
+                // Match failed, and this is NOT a flexible matcher. Exit.
+                segment.setOffset(initialOffset);
+                result.copyFrom(backup);
+                return maybeMore;
+            }
+        }
+
+        // All matchers in the series succeeded.
+        return maybeMore;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        assert frozen;
+        if (matchers == null) {
+            return UnicodeSet.EMPTY;
+        }
+
+        // SeriesMatchers are never allowed to start with a Flexible matcher.
+        assert !(matchers.get(0) instanceof NumberParseMatcher.Flexible);
+        return matchers.get(0).getLeadCodePoints();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        assert frozen;
+        if (matchers == null) {
+            return;
+        }
+
+        for (int i = 0; i < matchers.size(); i++) {
+            NumberParseMatcher matcher = matchers.get(i);
+            matcher.postProcess(result);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<SeriesMatcher " + matchers + ">";
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/SymbolMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/SymbolMatcher.java
new file mode 100644
index 0000000..8d55a67
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/SymbolMatcher.java
@@ -0,0 +1,83 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ *
+ */
+public abstract class SymbolMatcher implements NumberParseMatcher {
+    protected final String string;
+    protected final UnicodeSet uniSet;
+
+    // TODO: Implement this class using only UnicodeSet and not String?
+    // How to deal with case folding?
+
+    protected SymbolMatcher(String symbolString, UnicodeSet symbolUniSet) {
+        string = symbolString;
+        uniSet = symbolUniSet;
+    }
+
+    protected SymbolMatcher(UnicodeSetStaticCache.Key key) {
+        string = "";
+        uniSet = UnicodeSetStaticCache.get(key);
+    }
+
+    public UnicodeSet getSet() {
+        return uniSet;
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        // Smoke test first; this matcher might be disabled.
+        if (isDisabled(result)) {
+            return false;
+        }
+
+        // Test the string first in order to consume trailing chars greedily.
+        int overlap = 0;
+        if (!string.isEmpty()) {
+            overlap = segment.getCommonPrefixLength(string);
+            if (overlap == string.length()) {
+                segment.adjustOffset(string.length());
+                accept(segment, result);
+                return false;
+            }
+        }
+
+        if (segment.startsWith(uniSet)) {
+            segment.adjustOffsetByCodePoint();
+            accept(segment, result);
+            return false;
+        }
+
+        return overlap == segment.length();
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        if (string.isEmpty()) {
+            // Assumption: for sets from UnicodeSetStaticCache, uniSet == leadCodePoints.
+            return uniSet;
+        }
+
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        ParsingUtils.putLeadCodePoints(uniSet, leadCodePoints);
+        ParsingUtils.putLeadCodePoint(string, leadCodePoints);
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    protected abstract boolean isDisabled(ParsedNumber result);
+
+    protected abstract void accept(StringSegment segment, ParsedNumber result);
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/UnicodeSetStaticCache.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/UnicodeSetStaticCache.java
new file mode 100644
index 0000000..35360cc
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/UnicodeSetStaticCache.java
@@ -0,0 +1,131 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import java.util.EnumMap;
+import java.util.Map;
+
+import android.icu.text.UnicodeSet;
+
+/**
+ * This class statically initializes UnicodeSets useful for number parsing. Microbenchmarks show this to
+ * bring a very sizeable performance boost.
+ *
+ * IMPORTANT ASSUMPTION: All of the sets contain code points (no strings) and they are all case-folded.
+ * If this assumption were ever broken, logic in classes such as SymbolMatcher would need to be updated
+ * in order to return well-formed sets upon calls to getLeadCodePoints().
+ *
+ * @author sffc
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public class UnicodeSetStaticCache {
+    public static enum Key {
+        // Ignorables
+        BIDI,
+        WHITESPACE,
+        DEFAULT_IGNORABLES,
+        STRICT_IGNORABLES,
+
+        // Separators
+        // Notes:
+        // - COMMA is a superset of STRICT_COMMA
+        // - PERIOD is a superset of SCRICT_PERIOD
+        // - ALL_SEPARATORS is the union of COMMA, PERIOD, and OTHER_GROUPING_SEPARATORS
+        // - STRICT_ALL_SEPARATORS is the union of STRICT_COMMA, STRICT_PERIOD, and OTHER_GRP_SEPARATORS
+        COMMA,
+        PERIOD,
+        STRICT_COMMA,
+        STRICT_PERIOD,
+        OTHER_GROUPING_SEPARATORS,
+        ALL_SEPARATORS,
+        STRICT_ALL_SEPARATORS,
+
+        // Symbols
+        // TODO: NaN?
+        MINUS_SIGN,
+        PLUS_SIGN,
+        PERCENT_SIGN,
+        PERMILLE_SIGN,
+        INFINITY,
+
+        // Other
+        DIGITS,
+        NAN_LEAD,
+        SCIENTIFIC_LEAD,
+        CWCF, // TODO: Check if this is being used and remove it if not.
+
+        // Combined Separators with Digits (for lead code points)
+        DIGITS_OR_ALL_SEPARATORS,
+        DIGITS_OR_STRICT_ALL_SEPARATORS,
+    };
+
+    private static final Map<Key, UnicodeSet> unicodeSets = new EnumMap<Key, UnicodeSet>(Key.class);
+
+    public static UnicodeSet get(Key key) {
+        return unicodeSets.get(key);
+    }
+
+    public static Key chooseFrom(String str, Key key1) {
+        return get(key1).contains(str) ? key1 : null;
+    }
+
+    public static Key chooseFrom(String str, Key key1, Key key2) {
+        return get(key1).contains(str) ? key1 : chooseFrom(str, key2);
+    }
+
+    public static Key chooseFrom(String str, Key key1, Key key2, Key key3) {
+        return get(key1).contains(str) ? key1 : chooseFrom(str, key2, key3);
+    }
+
+    private static UnicodeSet computeUnion(Key k1, Key k2) {
+        return new UnicodeSet().addAll(get(k1)).addAll(get(k2)).freeze();
+    }
+
+    private static UnicodeSet computeUnion(Key k1, Key k2, Key k3) {
+        return new UnicodeSet().addAll(get(k1)).addAll(get(k2)).addAll(get(k3)).freeze();
+    }
+
+    static {
+        // BiDi characters are skipped over and ignored at any point in the string, even in strict mode.
+        unicodeSets.put(Key.BIDI, new UnicodeSet("[[\\u200E\\u200F\\u061C]]").freeze());
+
+        // This set was decided after discussion with icu-design@. See ticket #13309.
+        // Zs+TAB is "horizontal whitespace" according to UTS #18 (blank property).
+        unicodeSets.put(Key.WHITESPACE, new UnicodeSet("[[:Zs:][\\u0009]]").freeze());
+
+        unicodeSets.put(Key.DEFAULT_IGNORABLES, computeUnion(Key.BIDI, Key.WHITESPACE));
+        unicodeSets.put(Key.STRICT_IGNORABLES, get(Key.BIDI));
+
+        // TODO: Re-generate these sets from the UCD. They probably haven't been updated in a while.
+        unicodeSets.put(Key.COMMA, new UnicodeSet("[,،٫、︐︑﹐﹑,、]").freeze());
+        unicodeSets.put(Key.STRICT_COMMA, new UnicodeSet("[,٫︐﹐,]").freeze());
+        unicodeSets.put(Key.PERIOD, new UnicodeSet("[.․。︒﹒.。]").freeze());
+        unicodeSets.put(Key.STRICT_PERIOD, new UnicodeSet("[.․﹒.。]").freeze());
+        unicodeSets.put(Key.OTHER_GROUPING_SEPARATORS,
+                new UnicodeSet("['٬‘’'\\u0020\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]").freeze());
+        unicodeSets.put(Key.ALL_SEPARATORS,
+                computeUnion(Key.COMMA, Key.PERIOD, Key.OTHER_GROUPING_SEPARATORS));
+        unicodeSets.put(Key.STRICT_ALL_SEPARATORS,
+                computeUnion(Key.STRICT_COMMA, Key.STRICT_PERIOD, Key.OTHER_GROUPING_SEPARATORS));
+
+        unicodeSets.put(Key.MINUS_SIGN, new UnicodeSet("[-⁻₋−➖﹣-]").freeze());
+        unicodeSets.put(Key.PLUS_SIGN, new UnicodeSet("[+⁺₊➕﬩﹢+]").freeze());
+
+        // TODO: Fill in the next three sets.
+        unicodeSets.put(Key.PERCENT_SIGN, new UnicodeSet("[%٪]").freeze());
+        unicodeSets.put(Key.PERMILLE_SIGN, new UnicodeSet("[‰؉]").freeze());
+        unicodeSets.put(Key.INFINITY, new UnicodeSet("[∞]").freeze());
+
+        unicodeSets.put(Key.DIGITS, new UnicodeSet("[:digit:]").freeze());
+        unicodeSets.put(Key.NAN_LEAD,
+                new UnicodeSet("[NnТтmeՈոс¤НнчTtsҳ\u975e\u1002\u0e9a\u10d0\u0f68\u0644\u0646]")
+                        .freeze());
+        unicodeSets.put(Key.SCIENTIFIC_LEAD, new UnicodeSet("[Ee×·е\u0627]").freeze());
+        unicodeSets.put(Key.CWCF, new UnicodeSet("[:CWCF:]").freeze());
+
+        unicodeSets.put(Key.DIGITS_OR_ALL_SEPARATORS, computeUnion(Key.DIGITS, Key.ALL_SEPARATORS));
+        unicodeSets.put(Key.DIGITS_OR_STRICT_ALL_SEPARATORS,
+                computeUnion(Key.DIGITS, Key.STRICT_ALL_SEPARATORS));
+    }
+}
diff --git a/android_icu4j/src/main/java/android/icu/impl/number/parse/ValidationMatcher.java b/android_icu4j/src/main/java/android/icu/impl/number/parse/ValidationMatcher.java
new file mode 100644
index 0000000..512ea42
--- /dev/null
+++ b/android_icu4j/src/main/java/android/icu/impl/number/parse/ValidationMatcher.java
@@ -0,0 +1,25 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.impl.number.parse;
+
+import android.icu.impl.StringSegment;
+import android.icu.text.UnicodeSet;
+
+/**
+ * A Matcher used only for post-process validation, not for consuming characters at runtime.
+ * @hide Only a subset of ICU is exposed in Android
+ */
+public abstract class ValidationMatcher implements NumberParseMatcher {
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        return false;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        return UnicodeSet.EMPTY;
+    }
+
+}
diff --git a/android_icu4j/src/main/java/android/icu/lang/UCharacter.java b/android_icu4j/src/main/java/android/icu/lang/UCharacter.java
index e8d5e86..fd45b64 100644
--- a/android_icu4j/src/main/java/android/icu/lang/UCharacter.java
+++ b/android_icu4j/src/main/java/android/icu/lang/UCharacter.java
@@ -132,7 +132,7 @@
  * Comparison:<ul>
  * <li> isUWhiteSpace=UCHAR_WHITE_SPACE: Unicode White_Space property;
  *       most of general categories "Z" (separators) + most whitespace ISO controls
- *       (including no-break spaces, but excluding IS1..IS4 and ZWSP)
+ *       (including no-break spaces, but excluding IS1..IS4)
  * <li> isWhitespace: Java isWhitespace; Z + whitespace ISO controls but excluding no-break spaces
  * <li> isSpaceChar: just Z (including no-break spaces)</ul>
  *
@@ -4516,38 +4516,6 @@
     }
 
     /**
-     * Return a string with just the first word titlecased, for menus and UI, etc. This does not affect most of the string,
-     * and sometimes has no effect at all; the original string is returned whenever casing
-     * would not be appropriate for the first word (such as for CJK characters or initial numbers).
-     * Initial non-letters are skipped in order to find the character to change.
-     * Characters past the first affected are left untouched: see also TITLECASE_NO_LOWERCASE.
-     * <p>Examples:
-     * <table border='1'><tr><th>Source</th><th>Result</th><th>Locale</th></tr>
-     * <tr><td>anglo-American locale</td><td>Anglo-American locale</td></tr>
-     * <tr><td>“contact us”</td><td>“Contact us”</td></tr>
-     * <tr><td>49ers win!</td><td>49ers win!</td></tr>
-     * <tr><td>丰(abc)</td><td>丰(abc)</td></tr>
-     * <tr><td>«ijs»</td><td>«Ijs»</td></tr>
-     * <tr><td>«ijs»</td><td>«IJs»</td><td>nl-BE</td></tr>
-     * <tr><td>«ijs»</td><td>«İjs»</td><td>tr-DE</td></tr>
-     * </table>
-     * @param locale the locale for accessing exceptional behavior (eg for tr).
-     * @param str the source string to change
-     * @return the modified string, or the original if no modifications were necessary.
-     * @deprecated ICU internal only
-     * @hide original deprecated declaration
-     * @hide draft / provisional / internal are hidden on Android
-     */
-    @Deprecated
-    public static String toTitleFirst(ULocale locale, String str) {
-        // TODO: Remove this function. Inline it where it is called in CLDR.
-        return TO_TITLE_WHOLE_STRING_NO_LOWERCASE.apply(locale.toLocale(), null, str);
-    }
-
-    private static final android.icu.text.CaseMap.Title TO_TITLE_WHOLE_STRING_NO_LOWERCASE =
-            android.icu.text.CaseMap.toTitle().wholeString().noLowercase();
-
-    /**
      * <strong>[icu]</strong> <p>Returns the titlecase version of the argument string.
      * <p>Position for titlecasing is determined by the argument break
      * iterator, hence the user can customize his break iterator for
diff --git a/android_icu4j/src/main/java/android/icu/number/CompactNotation.java b/android_icu4j/src/main/java/android/icu/number/CompactNotation.java
index b7fb71b..7263d24 100644
--- a/android_icu4j/src/main/java/android/icu/number/CompactNotation.java
+++ b/android_icu4j/src/main/java/android/icu/number/CompactNotation.java
@@ -11,6 +11,7 @@
 import android.icu.impl.StandardPlural;
 import android.icu.impl.number.CompactData;
 import android.icu.impl.number.CompactData.CompactType;
+import android.icu.impl.number.DecimalFormatProperties;
 import android.icu.impl.number.DecimalQuantity;
 import android.icu.impl.number.MicroProps;
 import android.icu.impl.number.MicroPropsGenerator;
@@ -22,13 +23,13 @@
 import android.icu.text.PluralRules;
 import android.icu.util.ULocale;
 
-
 /**
- * A class that defines the scientific notation style to be used when formatting numbers in NumberFormatter.
+ * A class that defines the scientific notation style to be used when formatting numbers in
+ * NumberFormatter.
  *
  * <p>
- * This class exposes no public functionality. To create a CompactNotation, use one of the factory methods in
- * {@link Notation}.
+ * This class exposes no public functionality. To create a CompactNotation, use one of the factory
+ * methods in {@link Notation}.
  *
  * @see NumberFormatter
  * @hide Only a subset of ICU is exposed in Android
@@ -39,6 +40,17 @@
     final CompactStyle compactStyle;
     final Map<String, Map<String, String>> compactCustomData;
 
+    /**
+     * Create a compact notation with custom data.
+     * @deprecated This API is ICU internal only.
+     * @see DecimalFormatProperties#setCompactCustomData
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public static CompactNotation forCustomData(Map<String, Map<String, String>> compactCustomData) {
+        return new CompactNotation(compactCustomData);
+    }
+
     /* package-private */ CompactNotation(CompactStyle compactStyle) {
         compactCustomData = null;
         this.compactStyle = compactStyle;
@@ -49,26 +61,32 @@
         this.compactCustomData = compactCustomData;
     }
 
-    /* package-private */ MicroPropsGenerator withLocaleData(ULocale locale, String nsName, CompactType compactType,
-            PluralRules rules, MutablePatternModifier buildReference, MicroPropsGenerator parent) {
+    /* package-private */ MicroPropsGenerator withLocaleData(
+            ULocale locale,
+            String nsName,
+            CompactType compactType,
+            PluralRules rules,
+            MutablePatternModifier buildReference,
+            MicroPropsGenerator parent) {
         // TODO: Add a data cache? It would be keyed by locale, nsName, compact type, and compact style.
         return new CompactHandler(this, locale, nsName, compactType, rules, buildReference, parent);
     }
 
     private static class CompactHandler implements MicroPropsGenerator {
 
-        private static class CompactModInfo {
-            public ImmutablePatternModifier mod;
-            public int numDigits;
-        }
-
         final PluralRules rules;
         final MicroPropsGenerator parent;
-        final Map<String, CompactModInfo> precomputedMods;
+        final Map<String, ImmutablePatternModifier> precomputedMods;
         final CompactData data;
 
-        private CompactHandler(CompactNotation notation, ULocale locale, String nsName, CompactType compactType,
-                PluralRules rules, MutablePatternModifier buildReference, MicroPropsGenerator parent) {
+        private CompactHandler(
+                CompactNotation notation,
+                ULocale locale,
+                String nsName,
+                CompactType compactType,
+                PluralRules rules,
+                MutablePatternModifier buildReference,
+                MicroPropsGenerator parent) {
             this.rules = rules;
             this.parent = parent;
             this.data = new CompactData();
@@ -79,7 +97,7 @@
             }
             if (buildReference != null) {
                 // Safe code path
-                precomputedMods = new HashMap<String, CompactModInfo>();
+                precomputedMods = new HashMap<String, ImmutablePatternModifier>();
                 precomputeAllModifiers(buildReference);
             } else {
                 // Unsafe code path
@@ -93,12 +111,9 @@
             data.getUniquePatterns(allPatterns);
 
             for (String patternString : allPatterns) {
-                CompactModInfo info = new CompactModInfo();
                 ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(patternString);
                 buildReference.setPatternInfo(patternInfo);
-                info.mod = buildReference.createImmutable();
-                info.numDigits = patternInfo.positive.integerTotal;
-                precomputedMods.put(patternString, info);
+                precomputedMods.put(patternString, buildReference.createImmutable());
             }
         }
 
@@ -121,28 +136,22 @@
 
             StandardPlural plural = quantity.getStandardPlural(rules);
             String patternString = data.getPattern(magnitude, plural);
-            @SuppressWarnings("unused") // see #13075
-            int numDigits = -1;
             if (patternString == null) {
                 // Use the default (non-compact) modifier.
                 // No need to take any action.
             } else if (precomputedMods != null) {
                 // Safe code path.
                 // Java uses a hash set here for O(1) lookup. C++ uses a linear search.
-                CompactModInfo info = precomputedMods.get(patternString);
-                info.mod.applyToMicros(micros, quantity);
-                numDigits = info.numDigits;
+                ImmutablePatternModifier mod = precomputedMods.get(patternString);
+                mod.applyToMicros(micros, quantity);
             } else {
                 // Unsafe code path.
                 // Overwrite the PatternInfo in the existing modMiddle.
                 assert micros.modMiddle instanceof MutablePatternModifier;
                 ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(patternString);
                 ((MutablePatternModifier) micros.modMiddle).setPatternInfo(patternInfo);
-                numDigits = patternInfo.positive.integerTotal;
             }
 
-            // FIXME: Deal with numDigits == 0 (Awaiting a test case)
-
             // We already performed rounding. Do not perform it again.
             micros.rounding = Rounder.constructPassThrough();
 
diff --git a/android_icu4j/src/main/java/android/icu/number/CurrencyRounder.java b/android_icu4j/src/main/java/android/icu/number/CurrencyRounder.java
index 14d8f61..b457ab2 100644
--- a/android_icu4j/src/main/java/android/icu/number/CurrencyRounder.java
+++ b/android_icu4j/src/main/java/android/icu/number/CurrencyRounder.java
@@ -6,8 +6,8 @@
 import android.icu.util.Currency;
 
 /**
- * A class that defines a rounding strategy parameterized by a currency to be used when formatting numbers in
- * NumberFormatter.
+ * A class that defines a rounding strategy parameterized by a currency to be used when formatting
+ * numbers in NumberFormatter.
  *
  * <p>
  * To create a CurrencyRounder, use one of the factory methods on Rounder.
@@ -25,13 +25,13 @@
      * Associates a currency with this rounding strategy.
      *
      * <p>
-     * <strong>Calling this method is <em>not required</em></strong>, because the currency specified in unit() or via a
-     * CurrencyAmount passed into format(Measure) is automatically applied to currency rounding strategies. However,
-     * this method enables you to override that automatic association.
+     * <strong>Calling this method is <em>not required</em></strong>, because the currency specified in
+     * unit() or via a CurrencyAmount passed into format(Measure) is automatically applied to currency
+     * rounding strategies. However, this method enables you to override that automatic association.
      *
      * <p>
-     * This method also enables numbers to be formatted using currency rounding rules without explicitly using a
-     * currency format.
+     * This method also enables numbers to be formatted using currency rounding rules without explicitly
+     * using a currency format.
      *
      * @param currency
      *            The currency to associate with this rounding strategy.
diff --git a/android_icu4j/src/main/java/android/icu/number/FormattedNumber.java b/android_icu4j/src/main/java/android/icu/number/FormattedNumber.java
index 19a4855..39c5a37 100644
--- a/android_icu4j/src/main/java/android/icu/number/FormattedNumber.java
+++ b/android_icu4j/src/main/java/android/icu/number/FormattedNumber.java
@@ -16,8 +16,8 @@
 import android.icu.util.ICUUncheckedIOException;
 
 /**
- * The result of a number formatting operation. This class allows the result to be exported in several data types,
- * including a String, an AttributedCharacterIterator, and a BigDecimal.
+ * The result of a number formatting operation. This class allows the result to be exported in several
+ * data types, including a String, an AttributedCharacterIterator, and a BigDecimal.
  *
  * @see NumberFormatter
  * @hide Only a subset of ICU is exposed in Android
@@ -47,12 +47,12 @@
     }
 
     /**
-     * Append the formatted number to an Appendable, such as a StringBuilder. This may be slightly more efficient than
-     * creating a String.
+     * Append the formatted number to an Appendable, such as a StringBuilder. This may be slightly more
+     * efficient than creating a String.
      *
      * <p>
-     * If an IOException occurs when appending to the Appendable, an unchecked {@link ICUUncheckedIOException} is thrown
-     * instead.
+     * If an IOException occurs when appending to the Appendable, an unchecked
+     * {@link ICUUncheckedIOException} is thrown instead.
      *
      * @param appendable
      *            The Appendable to which to append the formatted number string.
@@ -72,16 +72,18 @@
     }
 
     /**
-     * Determine the start and end indices of the first occurrence of the given <em>field</em> in the output string.
-     * This allows you to determine the locations of the integer part, fraction part, and sign.
+     * Determine the start and end indices of the first occurrence of the given <em>field</em> in the
+     * output string. This allows you to determine the locations of the integer part, fraction part, and
+     * sign.
      *
      * <p>
-     * If multiple different field attributes are needed, this method can be called repeatedly, or if <em>all</em> field
-     * attributes are needed, consider using getFieldIterator().
+     * If multiple different field attributes are needed, this method can be called repeatedly, or if
+     * <em>all</em> field attributes are needed, consider using getFieldIterator().
      *
      * <p>
-     * If a field occurs multiple times in an output string, such as a grouping separator, this method will only ever
-     * return the first occurrence. Use getFieldIterator() to access all occurrences of an attribute.
+     * If a field occurs multiple times in an output string, such as a grouping separator, this method
+     * will only ever return the first occurrence. Use getFieldIterator() to access all occurrences of an
+     * attribute.
      *
      * @param fieldPosition
      *            The FieldPosition to populate with the start and end indices of the desired field.
@@ -104,13 +106,15 @@
     }
 
     /**
-     * Export the formatted number as an AttributedCharacterIterator. This allows you to determine which characters in
-     * the output string correspond to which <em>fields</em>, such as the integer part, fraction part, and sign.
+     * Export the formatted number as an AttributedCharacterIterator. This allows you to determine which
+     * characters in the output string correspond to which <em>fields</em>, such as the integer part,
+     * fraction part, and sign.
      *
      * <p>
      * If information on only one field is needed, consider using populateFieldPosition() instead.
      *
-     * @return An AttributedCharacterIterator, containing information on the field attributes of the number string.
+     * @return An AttributedCharacterIterator, containing information on the field attributes of the
+     *         number string.
      * @see android.icu.text.NumberFormat.Field
      * @see AttributedCharacterIterator
      * @see NumberFormatter
@@ -121,8 +125,9 @@
     }
 
     /**
-     * Export the formatted number as a BigDecimal. This endpoint is useful for obtaining the exact number being printed
-     * after scaling and rounding have been applied by the number formatting pipeline.
+     * Export the formatted number as a BigDecimal. This endpoint is useful for obtaining the exact
+     * number being printed after scaling and rounding have been applied by the number formatting
+     * pipeline.
      *
      * @return A BigDecimal representation of the formatted number.
      * @see NumberFormatter
@@ -133,32 +138,30 @@
     }
 
     /**
-     * @deprecated This API is ICU internal only.
+     * @deprecated This API is ICU internal only. Use {@link #populateFieldPosition} or
+     *             {@link #getFieldIterator} for similar functionality.
      * @hide draft / provisional / internal are hidden on Android
      */
     @Deprecated
     public String getPrefix() {
         NumberStringBuilder temp = new NumberStringBuilder();
-        int length = micros.modOuter.apply(temp, 0, 0);
-        length += micros.modMiddle.apply(temp, 0, length);
-        /* length += */ micros.modInner.apply(temp, 0, length);
-        int prefixLength = micros.modOuter.getPrefixLength() + micros.modMiddle.getPrefixLength()
-                + micros.modInner.getPrefixLength();
+        // #13453: DecimalFormat wants the affixes from the pattern only (modMiddle).
+        micros.modMiddle.apply(temp, 0, 0);
+        int prefixLength = micros.modMiddle.getPrefixLength();
         return temp.subSequence(0, prefixLength).toString();
     }
 
     /**
-     * @deprecated This API is ICU internal only.
+     * @deprecated This API is ICU internal only. Use {@link #populateFieldPosition} or
+     *             {@link #getFieldIterator} for similar functionality.
      * @hide draft / provisional / internal are hidden on Android
      */
     @Deprecated
     public String getSuffix() {
         NumberStringBuilder temp = new NumberStringBuilder();
-        int length = micros.modOuter.apply(temp, 0, 0);
-        length += micros.modMiddle.apply(temp, 0, length);
-        length += micros.modInner.apply(temp, 0, length);
-        int prefixLength = micros.modOuter.getPrefixLength() + micros.modMiddle.getPrefixLength()
-                + micros.modInner.getPrefixLength();
+        // #13453: DecimalFormat wants the affixes from the pattern only (modMiddle).
+        int length = micros.modMiddle.apply(temp, 0, 0);
+        int prefixLength = micros.modMiddle.getPrefixLength();
         return temp.subSequence(prefixLength, length).toString();
     }
 
@@ -180,7 +183,9 @@
     public int hashCode() {
         // NumberStringBuilder and BigDecimal are mutable, so we can't call
         // #equals() or #hashCode() on them directly.
-        return Arrays.hashCode(nsb.toCharArray()) ^ Arrays.hashCode(nsb.toFieldArray()) ^ fq.toBigDecimal().hashCode();
+        return Arrays.hashCode(nsb.toCharArray())
+                ^ Arrays.hashCode(nsb.toFieldArray())
+                ^ fq.toBigDecimal().hashCode();
     }
 
     /**
@@ -200,7 +205,7 @@
         // #equals() or #hashCode() on them directly.
         FormattedNumber _other = (FormattedNumber) other;
         return Arrays.equals(nsb.toCharArray(), _other.nsb.toCharArray())
-                ^ Arrays.equals(nsb.toFieldArray(), _other.nsb.toFieldArray())
-                ^ fq.toBigDecimal().equals(_other.fq.toBigDecimal());
+                && Arrays.equals(nsb.toFieldArray(), _other.nsb.toFieldArray())
+                && fq.toBigDecimal().equals(_other.fq.toBigDecimal());
     }
 }
\ No newline at end of file
diff --git a/android_icu4j/src/main/java/android/icu/number/FractionRounder.java b/android_icu4j/src/main/java/android/icu/number/FractionRounder.java
index 5b1dedb..59cae49 100644
--- a/android_icu4j/src/main/java/android/icu/number/FractionRounder.java
+++ b/android_icu4j/src/main/java/android/icu/number/FractionRounder.java
@@ -6,8 +6,8 @@
 import android.icu.impl.number.RoundingUtils;
 
 /**
- * A class that defines a rounding strategy based on a number of fraction places and optionally significant digits to be
- * used when formatting numbers in NumberFormatter.
+ * A class that defines a rounding strategy based on a number of fraction places and optionally
+ * significant digits to be used when formatting numbers in NumberFormatter.
  *
  * <p>
  * To create a FractionRounder, use one of the factory methods on Rounder.
@@ -22,15 +22,16 @@
     }
 
     /**
-     * Ensure that no less than this number of significant digits are retained when rounding according to fraction
-     * rules.
+     * Ensure that no less than this number of significant digits are retained when rounding according to
+     * fraction rules.
      *
      * <p>
-     * For example, with integer rounding, the number 3.141 becomes "3". However, with minimum figures set to 2, 3.141
-     * becomes "3.1" instead.
+     * For example, with integer rounding, the number 3.141 becomes "3". However, with minimum figures
+     * set to 2, 3.141 becomes "3.1" instead.
      *
      * <p>
-     * This setting does not affect the number of trailing zeros. For example, 3.01 would print as "3", not "3.0".
+     * This setting does not affect the number of trailing zeros. For example, 3.01 would print as "3",
+     * not "3.0".
      *
      * @param minSignificantDigits
      *            The number of significant figures to guarantee.
@@ -39,25 +40,26 @@
      * @hide draft / provisional / internal are hidden on Android
      */
     public Rounder withMinDigits(int minSignificantDigits) {
-        if (minSignificantDigits > 0 && minSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (minSignificantDigits >= 1 && minSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructFractionSignificant(this, minSignificantDigits, -1);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Ensure that no more than this number of significant digits are retained when rounding according to fraction
-     * rules.
+     * Ensure that no more than this number of significant digits are retained when rounding according to
+     * fraction rules.
      *
      * <p>
-     * For example, with integer rounding, the number 123.4 becomes "123". However, with maximum figures set to 2, 123.4
-     * becomes "120" instead.
+     * For example, with integer rounding, the number 123.4 becomes "123". However, with maximum figures
+     * set to 2, 123.4 becomes "120" instead.
      *
      * <p>
-     * This setting does not affect the number of trailing zeros. For example, with fixed fraction of 2, 123.4 would
-     * become "120.00".
+     * This setting does not affect the number of trailing zeros. For example, with fixed fraction of 2,
+     * 123.4 would become "120.00".
      *
      * @param maxSignificantDigits
      *            Round the number to no more than this number of significant figures.
@@ -66,11 +68,12 @@
      * @hide draft / provisional / internal are hidden on Android
      */
     public Rounder withMaxDigits(int maxSignificantDigits) {
-        if (maxSignificantDigits > 0 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (maxSignificantDigits >= 1 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructFractionSignificant(this, -1, maxSignificantDigits);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 }
\ No newline at end of file
diff --git a/android_icu4j/src/main/java/android/icu/number/Grouper.java b/android_icu4j/src/main/java/android/icu/number/Grouper.java
deleted file mode 100644
index 3d4b854..0000000
--- a/android_icu4j/src/main/java/android/icu/number/Grouper.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/* GENERATED SOURCE. DO NOT MODIFY. */
-// © 2017 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html#License
-package android.icu.number;
-
-import android.icu.impl.number.DecimalQuantity;
-import android.icu.impl.number.PatternStringParser.ParsedPatternInfo;
-
-/**
- * @deprecated This API is a technical preview. It is likely to change in an upcoming release.
- * @hide Only a subset of ICU is exposed in Android
- * @hide draft / provisional / internal are hidden on Android
- */
-@Deprecated
-public class Grouper {
-
-    // Conveniences for Java handling of bytes
-    private static final byte N2 = -2;
-    private static final byte N1 = -1;
-    private static final byte B2 = 2;
-    private static final byte B3 = 3;
-
-    private static final Grouper DEFAULTS = new Grouper(N2, N2, false);
-    private static final Grouper MIN2 = new Grouper(N2, N2, true);
-    private static final Grouper NONE = new Grouper(N1, N1, false);
-
-    private final byte grouping1; // -2 means "needs locale data"; -1 means "no grouping"
-    private final byte grouping2;
-    private final boolean min2;
-
-    private Grouper(byte grouping1, byte grouping2, boolean min2) {
-        this.grouping1 = grouping1;
-        this.grouping2 = grouping2;
-        this.min2 = min2;
-    }
-
-    /**
-     * @deprecated This API is a technical preview. It is likely to change in an upcoming release.
-     * @hide draft / provisional / internal are hidden on Android
-     */
-    @Deprecated
-    public static Grouper defaults() {
-        return DEFAULTS;
-    }
-
-    /**
-     * @deprecated This API is a technical preview. It is likely to change in an upcoming release.
-     * @hide draft / provisional / internal are hidden on Android
-     */
-    @Deprecated
-    public static Grouper minTwoDigits() {
-        return MIN2;
-    }
-
-    /**
-     * @deprecated This API is a technical preview. It is likely to change in an upcoming release.
-     * @hide draft / provisional / internal are hidden on Android
-     */
-    @Deprecated
-    public static Grouper none() {
-        return NONE;
-    }
-
-    //////////////////////////
-    // PACKAGE-PRIVATE APIS //
-    //////////////////////////
-
-    private static final Grouper GROUPING_3 = new Grouper(B3, B3, false);
-    private static final Grouper GROUPING_3_2 = new Grouper(B3, B2, false);
-    private static final Grouper GROUPING_3_MIN2 = new Grouper(B3, B3, true);
-    private static final Grouper GROUPING_3_2_MIN2 = new Grouper(B3, B2, true);
-
-    static Grouper getInstance(byte grouping1, byte grouping2, boolean min2) {
-        if (grouping1 == -1) {
-            return NONE;
-        } else if (!min2 && grouping1 == 3 && grouping2 == 3) {
-            return GROUPING_3;
-        } else if (!min2 && grouping1 == 3 && grouping2 == 2) {
-            return GROUPING_3_2;
-        } else if (min2 && grouping1 == 3 && grouping2 == 3) {
-            return GROUPING_3_MIN2;
-        } else if (min2 && grouping1 == 3 && grouping2 == 2) {
-            return GROUPING_3_2_MIN2;
-        } else {
-            return new Grouper(grouping1, grouping2, min2);
-        }
-    }
-
-    Grouper withLocaleData(ParsedPatternInfo patternInfo) {
-        if (grouping1 != -2) {
-            return this;
-        }
-        // TODO: short or byte?
-        byte grouping1 = (byte) (patternInfo.positive.groupingSizes & 0xffff);
-        byte grouping2 = (byte) ((patternInfo.positive.groupingSizes >>> 16) & 0xffff);
-        byte grouping3 = (byte) ((patternInfo.positive.groupingSizes >>> 32) & 0xffff);
-        if (grouping2 == -1) {
-            grouping1 = -1;
-        }
-        if (grouping3 == -1) {
-            grouping2 = grouping1;
-        }
-        return getInstance(grouping1, grouping2, min2);
-    }
-
-    boolean groupAtPosition(int position, DecimalQuantity value) {
-        assert grouping1 != -2;
-        if (grouping1 == -1 || grouping1 == 0) {
-            // Either -1 or 0 means "no grouping"
-            return false;
-        }
-        position -= grouping1;
-        return position >= 0 && (position % grouping2) == 0
-                && value.getUpperDisplayMagnitude() - grouping1 + 1 >= (min2 ? 2 : 1);
-    }
-}
\ No newline at end of file
diff --git a/android_icu4j/src/main/java/android/icu/number/IntegerWidth.java b/android_icu4j/src/main/java/android/icu/number/IntegerWidth.java
index bccc2ad..d9a2571 100644
--- a/android_icu4j/src/main/java/android/icu/number/IntegerWidth.java
+++ b/android_icu4j/src/main/java/android/icu/number/IntegerWidth.java
@@ -28,7 +28,8 @@
     }
 
     /**
-     * Pad numbers at the beginning with zeros to guarantee a certain number of numerals before the decimal separator.
+     * Pad numbers at the beginning with zeros to guarantee a certain number of numerals before the
+     * decimal separator.
      *
      * <p>
      * For example, with minInt=3, the number 55 will get printed as "055".
@@ -42,11 +43,12 @@
     public static IntegerWidth zeroFillTo(int minInt) {
         if (minInt == 1) {
             return DEFAULT;
-        } else if (minInt >= 0 && minInt < RoundingUtils.MAX_INT_FRAC_SIG) {
+        } else if (minInt >= 0 && minInt <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return new IntegerWidth(minInt, -1);
         } else {
-            throw new IllegalArgumentException(
-                    "Integer digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Integer digits must be between 0 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
@@ -56,7 +58,8 @@
      * For example, with maxInt=3, the number 1234 will get printed as "234".
      *
      * @param maxInt
-     *            The maximum number of places before the decimal separator.
+     *            The maximum number of places before the decimal separator. maxInt == -1 means no
+     *            truncation.
      * @return An IntegerWidth for passing to the NumberFormatter integerWidth() setter.
      * @see NumberFormatter
      * @hide draft / provisional / internal are hidden on Android
@@ -64,13 +67,14 @@
     public IntegerWidth truncateAt(int maxInt) {
         if (maxInt == this.maxInt) {
             return this;
-        } else if (maxInt >= 0 && maxInt < RoundingUtils.MAX_INT_FRAC_SIG) {
+        } else if (maxInt >= 0 && maxInt <= RoundingUtils.MAX_INT_FRAC_SIG && maxInt >= minInt) {
             return new IntegerWidth(minInt, maxInt);
         } else if (maxInt == -1) {
-            return new IntegerWidth(minInt, maxInt);
+            return new IntegerWidth(minInt, -1);
         } else {
-            throw new IllegalArgumentException(
-                    "Integer digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Integer digits must be between -1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 }
\ No newline at end of file
diff --git a/android_icu4j/src/main/java/android/icu/number/LocalizedNumberFormatter.java b/android_icu4j/src/main/java/android/icu/number/LocalizedNumberFormatter.java
index c87ae16..8e42204 100644
--- a/android_icu4j/src/main/java/android/icu/number/LocalizedNumberFormatter.java
+++ b/android_icu4j/src/main/java/android/icu/number/LocalizedNumberFormatter.java
@@ -39,8 +39,8 @@
     }
 
     /**
-     * Format the given byte, short, int, or long to a string using the settings specified in the NumberFormatter fluent
-     * setting chain.
+     * Format the given byte, short, int, or long to a string using the settings specified in the
+     * NumberFormatter fluent setting chain.
      *
      * @param input
      *            The number to format.
@@ -53,8 +53,8 @@
     }
 
     /**
-     * Format the given float or double to a string using the settings specified in the NumberFormatter fluent setting
-     * chain.
+     * Format the given float or double to a string using the settings specified in the NumberFormatter
+     * fluent setting chain.
      *
      * @param input
      *            The number to format.
@@ -67,8 +67,8 @@
     }
 
     /**
-     * Format the given {@link BigInteger}, {@link BigDecimal}, or other {@link Number} to a string using the settings
-     * specified in the NumberFormatter fluent setting chain.
+     * Format the given {@link BigInteger}, {@link BigDecimal}, or other {@link Number} to a string using
+     * the settings specified in the NumberFormatter fluent setting chain.
      *
      * @param input
      *            The number to format.
@@ -81,12 +81,12 @@
     }
 
     /**
-     * Format the given {@link Measure} or {@link CurrencyAmount} to a string using the settings specified in the
-     * NumberFormatter fluent setting chain.
+     * Format the given {@link Measure} or {@link CurrencyAmount} to a string using the settings
+     * specified in the NumberFormatter fluent setting chain.
      *
      * <p>
-     * The unit specified here overrides any unit that may have been specified in the setter chain. This method is
-     * intended for cases when each input to the number formatter has a different unit.
+     * The unit specified here overrides any unit that may have been specified in the setter chain. This
+     * method is intended for cases when each input to the number formatter has a different unit.
      *
      * @param input
      *            The number to format.
@@ -112,8 +112,9 @@
     }
 
     /**
-     * This is the core entrypoint to the number formatting pipeline. It performs self-regulation: a static code path
-     * for the first few calls, and compiling a more efficient data structure if called repeatedly.
+     * This is the core entrypoint to the number formatting pipeline. It performs self-regulation: a
+     * static code path for the first few calls, and compiling a more efficient data structure if called
+     * repeatedly.
      *
      * <p>
      * This function is very hot, being called in every call to the number formatting pipeline.
diff --git a/android_icu4j/src/main/java/android/icu/number/Notation.java b/android_icu4j/src/main/java/android/icu/number/Notation.java
index 574781b..aa76ca6 100644
--- a/android_icu4j/src/main/java/android/icu/number/Notation.java
+++ b/android_icu4j/src/main/java/android/icu/number/Notation.java
@@ -16,8 +16,14 @@
 public class Notation {
 
     // TODO: Support engineering intervals other than 3?
-    private static final ScientificNotation SCIENTIFIC = new ScientificNotation(1, false, 1, SignDisplay.AUTO);
-    private static final ScientificNotation ENGINEERING = new ScientificNotation(3, false, 1, SignDisplay.AUTO);
+    private static final ScientificNotation SCIENTIFIC = new ScientificNotation(1,
+            false,
+            1,
+            SignDisplay.AUTO);
+    private static final ScientificNotation ENGINEERING = new ScientificNotation(3,
+            false,
+            1,
+            SignDisplay.AUTO);
     private static final CompactNotation COMPACT_SHORT = new CompactNotation(CompactStyle.SHORT);
     private static final CompactNotation COMPACT_LONG = new CompactNotation(CompactStyle.LONG);
     private static final SimpleNotation SIMPLE = new SimpleNotation();
@@ -26,10 +32,11 @@
     }
 
     /**
-     * Print the number using scientific notation (also known as scientific form, standard index form, or standard form
-     * in the UK). The format for scientific notation varies by locale; for example, many Western locales display the
-     * number in the form "#E0", where the number is displayed with one digit before the decimal separator, zero or more
-     * digits after the decimal separator, and the corresponding power of 10 displayed after the "E".
+     * Print the number using scientific notation (also known as scientific form, standard index form, or
+     * standard form in the UK). The format for scientific notation varies by locale; for example, many
+     * Western locales display the number in the form "#E0", where the number is displayed with one digit
+     * before the decimal separator, zero or more digits after the decimal separator, and the
+     * corresponding power of 10 displayed after the "E".
      *
      * <p>
      * Example outputs in <em>en-US</em> when printing 8.765E4 through 8.765E-3:
@@ -55,8 +62,8 @@
     }
 
     /**
-     * Print the number using engineering notation, a variant of scientific notation in which the exponent must be
-     * divisible by 3.
+     * Print the number using engineering notation, a variant of scientific notation in which the
+     * exponent must be divisible by 3.
      *
      * <p>
      * Example outputs in <em>en-US</em> when printing 8.765E4 through 8.765E-3:
@@ -85,18 +92,18 @@
      * Print the number using short-form compact notation.
      *
      * <p>
-     * <em>Compact notation</em>, defined in Unicode Technical Standard #35 Part 3 Section 2.4.1, prints numbers with
-     * localized prefixes or suffixes corresponding to different powers of ten. Compact notation is similar to
-     * engineering notation in how it scales numbers.
+     * <em>Compact notation</em>, defined in Unicode Technical Standard #35 Part 3 Section 2.4.1, prints
+     * numbers with localized prefixes or suffixes corresponding to different powers of ten. Compact
+     * notation is similar to engineering notation in how it scales numbers.
      *
      * <p>
-     * Compact notation is ideal for displaying large numbers (over ~1000) to humans while at the same time minimizing
-     * screen real estate.
+     * Compact notation is ideal for displaying large numbers (over ~1000) to humans while at the same
+     * time minimizing screen real estate.
      *
      * <p>
-     * In short form, the powers of ten are abbreviated. In <em>en-US</em>, the abbreviations are "K" for thousands, "M"
-     * for millions, "B" for billions, and "T" for trillions. Example outputs in <em>en-US</em> when printing 8.765E7
-     * through 8.765E0:
+     * In short form, the powers of ten are abbreviated. In <em>en-US</em>, the abbreviations are "K" for
+     * thousands, "M" for millions, "B" for billions, and "T" for trillions. Example outputs in
+     * <em>en-US</em> when printing 8.765E7 through 8.765E0:
      *
      * <pre>
      * 88M
@@ -110,10 +117,10 @@
      * </pre>
      *
      * <p>
-     * When compact notation is specified without an explicit rounding strategy, numbers are rounded off to the closest
-     * integer after scaling the number by the corresponding power of 10, but with a digit shown after the decimal
-     * separator if there is only one digit before the decimal separator. The default compact notation rounding strategy
-     * is equivalent to:
+     * When compact notation is specified without an explicit rounding strategy, numbers are rounded off
+     * to the closest integer after scaling the number by the corresponding power of 10, but with a digit
+     * shown after the decimal separator if there is only one digit before the decimal separator. The
+     * default compact notation rounding strategy is equivalent to:
      *
      * <pre>
      * Rounder.integer().withMinDigits(2)
@@ -132,8 +139,8 @@
      * {@link #compactShort}.
      *
      * <p>
-     * In long form, the powers of ten are spelled out fully. Example outputs in <em>en-US</em> when printing 8.765E7
-     * through 8.765E0:
+     * In long form, the powers of ten are spelled out fully. Example outputs in <em>en-US</em> when
+     * printing 8.765E7 through 8.765E0:
      *
      * <pre>
      * 88 million
@@ -155,11 +162,12 @@
     }
 
     /**
-     * Print the number using simple notation without any scaling by powers of ten. This is the default behavior.
+     * Print the number using simple notation without any scaling by powers of ten. This is the default
+     * behavior.
      *
      * <p>
-     * Since this is the default behavior, this method needs to be called only when it is necessary to override a
-     * previous setting.
+     * Since this is the default behavior, this method needs to be called only when it is necessary to
+     * override a previous setting.
      *
      * <p>
      * Example outputs in <em>en-US</em> when printing 8.765E7 through 8.765E0:
diff --git a/android_icu4j/src/main/java/android/icu/number/NumberFormatter.java b/android_icu4j/src/main/java/android/icu/number/NumberFormatter.java
index 65a7fad..3b3f114 100644
--- a/android_icu4j/src/main/java/android/icu/number/NumberFormatter.java
+++ b/android_icu4j/src/main/java/android/icu/number/NumberFormatter.java
@@ -11,7 +11,8 @@
 import android.icu.util.ULocale;
 
 /**
- * The main entrypoint to the localized number formatting library introduced in ICU 60. Basic usage examples:
+ * The main entrypoint to the localized number formatting library introduced in ICU 60. Basic usage
+ * examples:
  *
  * <pre>
  * // Most basic usage:
@@ -40,21 +41,25 @@
  * </pre>
  *
  * <p>
- * This API offers more features than {@link android.icu.text.DecimalFormat} and is geared toward new users of ICU.
+ * This API offers more features than {@link android.icu.text.DecimalFormat} and is geared toward new
+ * users of ICU.
  *
  * <p>
- * NumberFormatter instances are immutable and thread safe. This means that invoking a configuration method has no
- * effect on the receiving instance; you must store and use the new number formatter instance it returns instead.
+ * NumberFormatter instances are immutable and thread safe. This means that invoking a configuration
+ * method has no effect on the receiving instance; you must store and use the new number formatter
+ * instance it returns instead.
  *
  * <pre>
- * UnlocalizedNumberFormatter formatter = UnlocalizedNumberFormatter.with().notation(Notation.scientific());
+ * UnlocalizedNumberFormatter formatter = UnlocalizedNumberFormatter.with()
+ *         .notation(Notation.scientific());
  * formatter.rounding(Rounder.maxFraction(2)); // does nothing!
  * formatter.locale(ULocale.ENGLISH).format(9.8765).toString(); // prints "9.8765E0", not "9.88E0"
  * </pre>
  *
  * <p>
- * This API is based on the <em>fluent</em> design pattern popularized by libraries such as Google's Guava. For
- * extensive details on the design of this API, read <a href="https://goo.gl/szi5VB">the design doc</a>.
+ * This API is based on the <em>fluent</em> design pattern popularized by libraries such as Google's
+ * Guava. For extensive details on the design of this API, read <a href="https://goo.gl/szi5VB">the
+ * design doc</a>.
  *
  * @author Shane Carr
  * @hide Only a subset of ICU is exposed in Android
@@ -65,8 +70,8 @@
     private static final UnlocalizedNumberFormatter BASE = new UnlocalizedNumberFormatter();
 
     /**
-     * An enum declaring how to render units, including currencies. Example outputs when formatting 123 USD and 123
-     * meters in <em>en-CA</em>:
+     * An enum declaring how to render units, including currencies. Example outputs when formatting 123
+     * USD and 123 meters in <em>en-CA</em>:
      *
      * <ul>
      * <li>NARROW: "$123.00" and "123 m"
@@ -84,13 +89,14 @@
      */
     public static enum UnitWidth {
         /**
-         * Print an abbreviated version of the unit name. Similar to SHORT, but always use the shortest available
-         * abbreviation or symbol. This option can be used when the context hints at the identity of the unit. For more
-         * information on the difference between NARROW and SHORT, see SHORT.
+         * Print an abbreviated version of the unit name. Similar to SHORT, but always use the shortest
+         * available abbreviation or symbol. This option can be used when the context hints at the
+         * identity of the unit. For more information on the difference between NARROW and SHORT, see
+         * SHORT.
          *
          * <p>
-         * In CLDR, this option corresponds to the "Narrow" format for measure units and the "¤¤¤¤¤" placeholder for
-         * currencies.
+         * In CLDR, this option corresponds to the "Narrow" format for measure units and the "¤¤¤¤¤"
+         * placeholder for currencies.
          *
          * @see NumberFormatter
          * @hide draft / provisional / internal are hidden on Android
@@ -98,16 +104,16 @@
         NARROW,
 
         /**
-         * Print an abbreviated version of the unit name. Similar to NARROW, but use a slightly wider abbreviation or
-         * symbol when there may be ambiguity. This is the default behavior.
+         * Print an abbreviated version of the unit name. Similar to NARROW, but use a slightly wider
+         * abbreviation or symbol when there may be ambiguity. This is the default behavior.
          *
          * <p>
-         * For example, in <em>es-US</em>, the SHORT form for Fahrenheit is "{0} °F", but the NARROW form is "{0}°",
-         * since Fahrenheit is the customary unit for temperature in that locale.
+         * For example, in <em>es-US</em>, the SHORT form for Fahrenheit is "{0} °F", but the NARROW form
+         * is "{0}°", since Fahrenheit is the customary unit for temperature in that locale.
          *
          * <p>
-         * In CLDR, this option corresponds to the "Short" format for measure units and the "¤" placeholder for
-         * currencies.
+         * In CLDR, this option corresponds to the "Short" format for measure units and the "¤"
+         * placeholder for currencies.
          *
          * @see NumberFormatter
          * @hide draft / provisional / internal are hidden on Android
@@ -118,8 +124,8 @@
          * Print the full name of the unit, without any abbreviations.
          *
          * <p>
-         * In CLDR, this option corresponds to the default format for measure units and the "¤¤¤" placeholder for
-         * currencies.
+         * In CLDR, this option corresponds to the default format for measure units and the "¤¤¤"
+         * placeholder for currencies.
          *
          * @see NumberFormatter
          * @hide draft / provisional / internal are hidden on Android
@@ -127,8 +133,8 @@
         FULL_NAME,
 
         /**
-         * Use the three-digit ISO XXX code in place of the symbol for displaying currencies. The behavior of this
-         * option is currently undefined for use with measure units.
+         * Use the three-digit ISO XXX code in place of the symbol for displaying currencies. The
+         * behavior of this option is currently undefined for use with measure units.
          *
          * <p>
          * In CLDR, this option corresponds to the "¤¤" placeholder for currencies.
@@ -139,9 +145,9 @@
         ISO_CODE,
 
         /**
-         * Format the number according to the specified unit, but do not display the unit. For currencies, apply
-         * monetary symbols and formats as with SHORT, but omit the currency symbol. For measure units, the behavior is
-         * equivalent to not specifying the unit at all.
+         * Format the number according to the specified unit, but do not display the unit. For
+         * currencies, apply monetary symbols and formats as with SHORT, but omit the currency symbol.
+         * For measure units, the behavior is equivalent to not specifying the unit at all.
          *
          * @see NumberFormatter
          * @hide draft / provisional / internal are hidden on Android
@@ -150,15 +156,113 @@
     }
 
     /**
-     * An enum declaring how to denote positive and negative numbers. Example outputs when formatting 123 and -123 in
-     * <em>en-US</em>:
+     * An enum declaring the strategy for when and how to display grouping separators (i.e., the
+     * separator, often a comma or period, after every 2-3 powers of ten). The choices are several
+     * pre-built strategies for different use cases that employ locale data whenever possible. Example
+     * outputs for 1234 and 1234567 in <em>en-IN</em>:
      *
      * <ul>
-     * <li>AUTO: "123" and "-123"
-     * <li>ALWAYS: "+123" and "-123"
-     * <li>NEVER: "123" and "123"
-     * <li>ACCOUNTING: "$123" and "($123)"
-     * <li>ACCOUNTING_ALWAYS: "+$123" and "($123)"
+     * <li>OFF: 1234 and 12345
+     * <li>MIN2: 1234 and 12,34,567
+     * <li>AUTO: 1,234 and 12,34,567
+     * <li>ON_ALIGNED: 1,234 and 12,34,567
+     * <li>THOUSANDS: 1,234 and 1,234,567
+     * </ul>
+     *
+     * <p>
+     * The default is AUTO, which displays grouping separators unless the locale data says that grouping
+     * is not customary. To force grouping for all numbers greater than 1000 consistently across locales,
+     * use ON_ALIGNED. On the other hand, to display grouping less frequently than the default, use MIN2
+     * or OFF. See the docs of each option for details.
+     *
+     * <p>
+     * Note: This enum specifies the strategy for grouping sizes. To set which character to use as the
+     * grouping separator, use the "symbols" setter.
+     *
+     * @see NumberFormatter
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    public static enum GroupingStrategy {
+        /**
+         * Do not display grouping separators in any locale.
+         *
+         * @see NumberFormatter
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        OFF,
+
+        /**
+         * Display grouping using locale defaults, except do not show grouping on values smaller than
+         * 10000 (such that there is a <em>minimum of two digits</em> before the first separator).
+         *
+         * <p>
+         * Note that locales may restrict grouping separators to be displayed only on 1 million or
+         * greater (for example, ee and hu) or disable grouping altogether (for example, bg currency).
+         *
+         * <p>
+         * Locale data is used to determine whether to separate larger numbers into groups of 2
+         * (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
+         *
+         * @see NumberFormatter
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        MIN2,
+
+        /**
+         * Display grouping using the default strategy for all locales. This is the default behavior.
+         *
+         * <p>
+         * Note that locales may restrict grouping separators to be displayed only on 1 million or
+         * greater (for example, ee and hu) or disable grouping altogether (for example, bg currency).
+         *
+         * <p>
+         * Locale data is used to determine whether to separate larger numbers into groups of 2
+         * (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
+         *
+         * @see NumberFormatter
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        AUTO,
+
+        /**
+         * Always display the grouping separator on values of at least 1000.
+         *
+         * <p>
+         * This option ignores the locale data that restricts or disables grouping, described in MIN2 and
+         * AUTO. This option may be useful to normalize the alignment of numbers, such as in a
+         * spreadsheet.
+         *
+         * <p>
+         * Locale data is used to determine whether to separate larger numbers into groups of 2
+         * (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
+         *
+         * @see NumberFormatter
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        ON_ALIGNED,
+
+        /**
+         * Use the Western defaults: groups of 3 and enabled for all numbers 1000 or greater. Do not use
+         * locale data for determining the grouping strategy.
+         *
+         * @see NumberFormatter
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        THOUSANDS
+    }
+
+    /**
+     * An enum declaring how to denote positive and negative numbers. Example outputs when formatting
+     * 123, 0, and -123 in <em>en-US</em>:
+     *
+     * <ul>
+     * <li>AUTO: "123", "0", and "-123"
+     * <li>ALWAYS: "+123", "+0", and "-123"
+     * <li>NEVER: "123", "0", and "123"
+     * <li>ACCOUNTING: "$123", "$0", and "($123)"
+     * <li>ACCOUNTING_ALWAYS: "+$123", "+$0", and "($123)"
+     * <li>EXCEPT_ZERO: "+123", "0", and "-123"
+     * <li>ACCOUNTING_EXCEPT_ZERO: "+$123", "$0", and "($123)"
      * </ul>
      *
      * <p>
@@ -169,8 +273,8 @@
      */
     public static enum SignDisplay {
         /**
-         * Show the minus sign on negative numbers, and do not show the sign on positive numbers. This is the default
-         * behavior.
+         * Show the minus sign on negative numbers, and do not show the sign on positive numbers. This is
+         * the default behavior.
          *
          * @see NumberFormatter
          * @hide draft / provisional / internal are hidden on Android
@@ -178,7 +282,8 @@
         AUTO,
 
         /**
-         * Show the minus sign on negative numbers and the plus sign on positive numbers.
+         * Show the minus sign on negative numbers and the plus sign on positive numbers, including zero.
+         * To hide the sign on zero, see {@link #EXCEPT_ZERO}.
          *
          * @see NumberFormatter
          * @hide draft / provisional / internal are hidden on Android
@@ -194,16 +299,17 @@
         NEVER,
 
         /**
-         * Use the locale-dependent accounting format on negative numbers, and do not show the sign on positive numbers.
+         * Use the locale-dependent accounting format on negative numbers, and do not show the sign on
+         * positive numbers.
          *
          * <p>
-         * The accounting format is defined in CLDR and varies by locale; in many Western locales, the format is a pair
-         * of parentheses around the number.
+         * The accounting format is defined in CLDR and varies by locale; in many Western locales, the
+         * format is a pair of parentheses around the number.
          *
          * <p>
-         * Note: Since CLDR defines the accounting format in the monetary context only, this option falls back to the
-         * AUTO sign display strategy when formatting without a currency unit. This limitation may be lifted in the
-         * future.
+         * Note: Since CLDR defines the accounting format in the monetary context only, this option falls
+         * back to the AUTO sign display strategy when formatting without a currency unit. This
+         * limitation may be lifted in the future.
          *
          * @see NumberFormatter
          * @hide draft / provisional / internal are hidden on Android
@@ -211,18 +317,39 @@
         ACCOUNTING,
 
         /**
-         * Use the locale-dependent accounting format on negative numbers, and show the plus sign on positive numbers.
-         * For more information on the accounting format, see the ACCOUNTING sign display strategy.
+         * Use the locale-dependent accounting format on negative numbers, and show the plus sign on
+         * positive numbers, including zero. For more information on the accounting format, see the
+         * ACCOUNTING sign display strategy. To hide the sign on zero, see
+         * {@link #ACCOUNTING_EXCEPT_ZERO}.
          *
          * @see NumberFormatter
          * @hide draft / provisional / internal are hidden on Android
          */
         ACCOUNTING_ALWAYS,
+
+        /**
+         * Show the minus sign on negative numbers and the plus sign on positive numbers. Do not show a
+         * sign on zero.
+         *
+         * @see NumberFormatter
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        EXCEPT_ZERO,
+
+        /**
+         * Use the locale-dependent accounting format on negative numbers, and show the plus sign on
+         * positive numbers. Do not show a sign on zero. For more information on the accounting format,
+         * see the ACCOUNTING sign display strategy.
+         *
+         * @see NumberFormatter
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        ACCOUNTING_EXCEPT_ZERO,
     }
 
     /**
-     * An enum declaring how to render the decimal separator. Example outputs when formatting 1 and 1.1 in
-     * <em>en-US</em>:
+     * An enum declaring how to render the decimal separator. Example outputs when formatting 1 and 1.1
+     * in <em>en-US</em>:
      *
      * <ul>
      * <li>AUTO: "1" and "1.1"
@@ -234,8 +361,8 @@
      */
     public static enum DecimalSeparatorDisplay {
         /**
-         * Show the decimal separator when there are one or more digits to display after the separator, and do not show
-         * it otherwise. This is the default behavior.
+         * Show the decimal separator when there are one or more digits to display after the separator,
+         * and do not show it otherwise. This is the default behavior.
          *
          * @see NumberFormatter
          * @hide draft / provisional / internal are hidden on Android
@@ -252,8 +379,9 @@
     }
 
     /**
-     * Use a default threshold of 3. This means that the third time .format() is called, the data structures get built
-     * using the "safe" code path. The first two calls to .format() will trigger the unsafe code path.
+     * Use a default threshold of 3. This means that the third time .format() is called, the data
+     * structures get built using the "safe" code path. The first two calls to .format() will trigger the
+     * unsafe code path.
      */
     static final long DEFAULT_THRESHOLD = 3;
 
@@ -264,8 +392,8 @@
     }
 
     /**
-     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is not currently known at
-     * the call site.
+     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is not
+     * currently known at the call site.
      *
      * @return An {@link UnlocalizedNumberFormatter}, to be used for chaining.
      * @hide draft / provisional / internal are hidden on Android
@@ -275,8 +403,8 @@
     }
 
     /**
-     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is known at the call
-     * site.
+     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is known
+     * at the call site.
      *
      * @param locale
      *            The locale from which to load formats and symbols for number formatting.
@@ -288,8 +416,8 @@
     }
 
     /**
-     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is known at the call
-     * site.
+     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is known
+     * at the call site.
      *
      * @param locale
      *            The locale from which to load formats and symbols for number formatting.
@@ -305,8 +433,10 @@
      * @hide draft / provisional / internal are hidden on Android
      */
     @Deprecated
-    public static UnlocalizedNumberFormatter fromDecimalFormat(DecimalFormatProperties properties,
-            DecimalFormatSymbols symbols, DecimalFormatProperties exportedProperties) {
+    public static UnlocalizedNumberFormatter fromDecimalFormat(
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols,
+            DecimalFormatProperties exportedProperties) {
         MacroProps macros = NumberPropertyMapper.oldToNew(properties, symbols, exportedProperties);
         return NumberFormatter.with().macros(macros);
     }
diff --git a/android_icu4j/src/main/java/android/icu/number/NumberFormatterImpl.java b/android_icu4j/src/main/java/android/icu/number/NumberFormatterImpl.java
index d675538..06acf29 100644
--- a/android_icu4j/src/main/java/android/icu/number/NumberFormatterImpl.java
+++ b/android_icu4j/src/main/java/android/icu/number/NumberFormatterImpl.java
@@ -3,9 +3,12 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 package android.icu.number;
 
+import android.icu.impl.CurrencyData;
+import android.icu.impl.CurrencyData.CurrencyFormatInfo;
 import android.icu.impl.number.CompactData.CompactType;
 import android.icu.impl.number.ConstantAffixModifier;
 import android.icu.impl.number.DecimalQuantity;
+import android.icu.impl.number.Grouper;
 import android.icu.impl.number.LongNameHandler;
 import android.icu.impl.number.MacroProps;
 import android.icu.impl.number.MicroProps;
@@ -16,6 +19,7 @@
 import android.icu.impl.number.PatternStringParser;
 import android.icu.impl.number.PatternStringParser.ParsedPatternInfo;
 import android.icu.number.NumberFormatter.DecimalSeparatorDisplay;
+import android.icu.number.NumberFormatter.GroupingStrategy;
 import android.icu.number.NumberFormatter.SignDisplay;
 import android.icu.number.NumberFormatter.UnitWidth;
 import android.icu.text.DecimalFormatSymbols;
@@ -26,12 +30,12 @@
 import android.icu.util.MeasureUnit;
 
 /**
- * This is the "brain" of the number formatting pipeline. It ties all the pieces together, taking in a MacroProps and a
- * DecimalQuantity and outputting a properly formatted number string.
+ * This is the "brain" of the number formatting pipeline. It ties all the pieces together, taking in a
+ * MacroProps and a DecimalQuantity and outputting a properly formatted number string.
  *
  * <p>
- * This class, as well as NumberPropertyMapper, could go into the impl package, but they depend on too many
- * package-private members of the public APIs.
+ * This class, as well as NumberPropertyMapper, could go into the impl package, but they depend on too
+ * many package-private members of the public APIs.
  */
 class NumberFormatterImpl {
 
@@ -41,8 +45,13 @@
         return new NumberFormatterImpl(microPropsGenerator);
     }
 
-    /** Builds and evaluates an "unsafe" MicroPropsGenerator, which is cheaper but can be used only once. */
-    public static MicroProps applyStatic(MacroProps macros, DecimalQuantity inValue, NumberStringBuilder outString) {
+    /**
+     * Builds and evaluates an "unsafe" MicroPropsGenerator, which is cheaper but can be used only once.
+     */
+    public static MicroProps applyStatic(
+            MacroProps macros,
+            DecimalQuantity inValue,
+            NumberStringBuilder outString) {
         MicroPropsGenerator microPropsGenerator = macrosToMicroGenerator(macros, false);
         MicroProps micros = microPropsGenerator.processQuantity(inValue);
         microsToString(micros, inValue, outString);
@@ -85,17 +94,17 @@
     }
 
     /**
-     * Synthesizes the MacroProps into a MicroPropsGenerator. All information, including the locale, is encoded into the
-     * MicroPropsGenerator, except for the quantity itself, which is left abstract and must be provided to the returned
-     * MicroPropsGenerator instance.
+     * Synthesizes the MacroProps into a MicroPropsGenerator. All information, including the locale, is
+     * encoded into the MicroPropsGenerator, except for the quantity itself, which is left abstract and
+     * must be provided to the returned MicroPropsGenerator instance.
      *
      * @see MicroPropsGenerator
      * @param macros
      *            The {@link MacroProps} to consume. This method does not mutate the MacroProps instance.
      * @param safe
-     *            If true, the returned MicroPropsGenerator will be thread-safe. If false, the returned value will
-     *            <em>not</em> be thread-safe, intended for a single "one-shot" use only. Building the thread-safe
-     *            object is more expensive.
+     *            If true, the returned MicroPropsGenerator will be thread-safe. If false, the returned
+     *            value will <em>not</em> be thread-safe, intended for a single "one-shot" use only.
+     *            Building the thread-safe object is more expensive.
      */
     private static MicroPropsGenerator macrosToMicroGenerator(MacroProps macros, boolean safe) {
         MicroProps micros = new MicroProps(safe);
@@ -110,7 +119,9 @@
         boolean isPercent = isNoUnit && unitIsPercent(macros.unit);
         boolean isPermille = isNoUnit && unitIsPermille(macros.unit);
         boolean isCldrUnit = !isCurrency && !isNoUnit;
-        boolean isAccounting = macros.sign == SignDisplay.ACCOUNTING || macros.sign == SignDisplay.ACCOUNTING_ALWAYS;
+        boolean isAccounting = macros.sign == SignDisplay.ACCOUNTING
+                || macros.sign == SignDisplay.ACCOUNTING_ALWAYS
+                || macros.sign == SignDisplay.ACCOUNTING_EXCEPT_ZERO;
         Currency currency = isCurrency ? (Currency) macros.unit : DEFAULT_CURRENCY;
         UnitWidth unitWidth = UnitWidth.SHORT;
         if (macros.unitWidth != null) {
@@ -128,33 +139,49 @@
         }
         String nsName = ns.getName();
 
-        // Load and parse the pattern string. It is used for grouping sizes and affixes only.
-        int patternStyle;
-        if (isPercent || isPermille) {
-            patternStyle = NumberFormat.PERCENTSTYLE;
-        } else if (!isCurrency || unitWidth == UnitWidth.FULL_NAME) {
-            patternStyle = NumberFormat.NUMBERSTYLE;
-        } else if (isAccounting) {
-            // NOTE: Although ACCOUNTING and ACCOUNTING_ALWAYS are only supported in currencies right now,
-            // the API contract allows us to add support to other units in the future.
-            patternStyle = NumberFormat.ACCOUNTINGCURRENCYSTYLE;
-        } else {
-            patternStyle = NumberFormat.CURRENCYSTYLE;
-        }
-        String pattern = NumberFormat.getPatternForStyleAndNumberingSystem(macros.loc, nsName, patternStyle);
-        ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(pattern);
-
-        /////////////////////////////////////////////////////////////////////////////////////
-        /// START POPULATING THE DEFAULT MICROPROPS AND BUILDING THE MICROPROPS GENERATOR ///
-        /////////////////////////////////////////////////////////////////////////////////////
-
-        // Symbols
+        // Resolve the symbols. Do this here because currency may need to customize them.
         if (macros.symbols instanceof DecimalFormatSymbols) {
             micros.symbols = (DecimalFormatSymbols) macros.symbols;
         } else {
             micros.symbols = DecimalFormatSymbols.forNumberingSystem(macros.loc, ns);
         }
 
+        // Load and parse the pattern string. It is used for grouping sizes and affixes only.
+        // If we are formatting currency, check for a currency-specific pattern.
+        String pattern = null;
+        if (isCurrency) {
+            CurrencyFormatInfo info = CurrencyData.provider.getInstance(macros.loc, true)
+                    .getFormatInfo(currency.getCurrencyCode());
+            if (info != null) {
+                pattern = info.currencyPattern;
+                // It's clunky to clone an object here, but this code is not frequently executed.
+                micros.symbols = (DecimalFormatSymbols) micros.symbols.clone();
+                micros.symbols.setMonetaryDecimalSeparatorString(info.monetaryDecimalSeparator);
+                micros.symbols.setMonetaryGroupingSeparatorString(info.monetaryGroupingSeparator);
+            }
+        }
+        if (pattern == null) {
+            int patternStyle;
+            if (isPercent || isPermille) {
+                patternStyle = NumberFormat.PERCENTSTYLE;
+            } else if (!isCurrency || unitWidth == UnitWidth.FULL_NAME) {
+                patternStyle = NumberFormat.NUMBERSTYLE;
+            } else if (isAccounting) {
+                // NOTE: Although ACCOUNTING and ACCOUNTING_ALWAYS are only supported in currencies
+                // right now, the API contract allows us to add support to other units in the future.
+                patternStyle = NumberFormat.ACCOUNTINGCURRENCYSTYLE;
+            } else {
+                patternStyle = NumberFormat.CURRENCYSTYLE;
+            }
+            pattern = NumberFormat
+                    .getPatternForStyleAndNumberingSystem(macros.loc, nsName, patternStyle);
+        }
+        ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(pattern);
+
+        /////////////////////////////////////////////////////////////////////////////////////
+        /// START POPULATING THE DEFAULT MICROPROPS AND BUILDING THE MICROPROPS GENERATOR ///
+        /////////////////////////////////////////////////////////////////////////////////////
+
         // Multiplier (compatibility mode value).
         if (macros.multiplier != null) {
             chain = macros.multiplier.copyAndChain(chain);
@@ -173,15 +200,17 @@
         micros.rounding = micros.rounding.withLocaleData(currency);
 
         // Grouping strategy
-        if (macros.grouper != null) {
-            micros.grouping = macros.grouper;
+        if (macros.grouping instanceof Grouper) {
+            micros.grouping = (Grouper) macros.grouping;
+        } else if (macros.grouping instanceof GroupingStrategy) {
+            micros.grouping = Grouper.forStrategy((GroupingStrategy) macros.grouping);
         } else if (macros.notation instanceof CompactNotation) {
             // Compact notation uses minGrouping by default since ICU 59
-            micros.grouping = Grouper.minTwoDigits();
+            micros.grouping = Grouper.forStrategy(GroupingStrategy.MIN2);
         } else {
-            micros.grouping = Grouper.defaults();
+            micros.grouping = Grouper.forStrategy(GroupingStrategy.AUTO);
         }
-        micros.grouping = micros.grouping.withLocaleData(patternInfo);
+        micros.grouping = micros.grouping.withLocaleData(macros.loc, patternInfo);
 
         // Padding strategy
         if (macros.padder != null) {
@@ -248,7 +277,8 @@
                 // Lazily create PluralRules
                 rules = PluralRules.forLocale(macros.loc);
             }
-            chain = LongNameHandler.forMeasureUnit(macros.loc, macros.unit, unitWidth, rules, chain);
+            chain = LongNameHandler
+                    .forMeasureUnit(macros.loc, macros.unit, macros.perUnit, unitWidth, rules, chain);
         } else if (isCurrency && unitWidth == UnitWidth.FULL_NAME) {
             if (rules == null) {
                 // Lazily create PluralRules
@@ -268,11 +298,15 @@
                 // Lazily create PluralRules
                 rules = PluralRules.forLocale(macros.loc);
             }
-            CompactType compactType = (macros.unit instanceof Currency && macros.unitWidth != UnitWidth.FULL_NAME)
-                    ? CompactType.CURRENCY
-                    : CompactType.DECIMAL;
-            chain = ((CompactNotation) macros.notation).withLocaleData(macros.loc, nsName, compactType, rules,
-                    safe ? patternMod : null, chain);
+            CompactType compactType = (macros.unit instanceof Currency
+                    && macros.unitWidth != UnitWidth.FULL_NAME) ? CompactType.CURRENCY
+                            : CompactType.DECIMAL;
+            chain = ((CompactNotation) macros.notation).withLocaleData(macros.loc,
+                    nsName,
+                    compactType,
+                    rules,
+                    safe ? patternMod : null,
+                    chain);
         }
 
         return chain;
@@ -290,7 +324,10 @@
      * @param string
      *            The output string. Will be mutated.
      */
-    private static void microsToString(MicroProps micros, DecimalQuantity quantity, NumberStringBuilder string) {
+    private static void microsToString(
+            MicroProps micros,
+            DecimalQuantity quantity,
+            NumberStringBuilder string) {
         micros.rounding.apply(quantity);
         if (micros.integerWidth.maxInt == -1) {
             quantity.setIntegerLength(micros.integerWidth.minInt, Integer.MAX_VALUE);
@@ -310,7 +347,10 @@
         }
     }
 
-    private static int writeNumber(MicroProps micros, DecimalQuantity quantity, NumberStringBuilder string) {
+    private static int writeNumber(
+            MicroProps micros,
+            DecimalQuantity quantity,
+            NumberStringBuilder string) {
         int length = 0;
         if (quantity.isInfinite()) {
             length += string.insert(length, micros.symbols.getInfinity(), NumberFormat.Field.INTEGER);
@@ -323,9 +363,12 @@
             length += writeIntegerDigits(micros, quantity, string);
 
             // Add the decimal point
-            if (quantity.getLowerDisplayMagnitude() < 0 || micros.decimal == DecimalSeparatorDisplay.ALWAYS) {
-                length += string.insert(length, micros.useCurrency ? micros.symbols.getMonetaryDecimalSeparatorString()
-                        : micros.symbols.getDecimalSeparatorString(), NumberFormat.Field.DECIMAL_SEPARATOR);
+            if (quantity.getLowerDisplayMagnitude() < 0
+                    || micros.decimal == DecimalSeparatorDisplay.ALWAYS) {
+                length += string.insert(length,
+                        micros.useCurrency ? micros.symbols.getMonetaryDecimalSeparatorString()
+                                : micros.symbols.getDecimalSeparatorString(),
+                        NumberFormat.Field.DECIMAL_SEPARATOR);
             }
 
             // Add the fraction digits
@@ -335,30 +378,40 @@
         return length;
     }
 
-    private static int writeIntegerDigits(MicroProps micros, DecimalQuantity quantity, NumberStringBuilder string) {
+    private static int writeIntegerDigits(
+            MicroProps micros,
+            DecimalQuantity quantity,
+            NumberStringBuilder string) {
         int length = 0;
         int integerCount = quantity.getUpperDisplayMagnitude() + 1;
         for (int i = 0; i < integerCount; i++) {
             // Add grouping separator
             if (micros.grouping.groupAtPosition(i, quantity)) {
-                length += string.insert(0, micros.useCurrency ? micros.symbols.getMonetaryGroupingSeparatorString()
-                        : micros.symbols.getGroupingSeparatorString(), NumberFormat.Field.GROUPING_SEPARATOR);
+                length += string.insert(0,
+                        micros.useCurrency ? micros.symbols.getMonetaryGroupingSeparatorString()
+                                : micros.symbols.getGroupingSeparatorString(),
+                        NumberFormat.Field.GROUPING_SEPARATOR);
             }
 
             // Get and append the next digit value
             byte nextDigit = quantity.getDigit(i);
             if (micros.symbols.getCodePointZero() != -1) {
-                length += string.insertCodePoint(0, micros.symbols.getCodePointZero() + nextDigit,
+                length += string.insertCodePoint(0,
+                        micros.symbols.getCodePointZero() + nextDigit,
                         NumberFormat.Field.INTEGER);
             } else {
-                length += string.insert(0, micros.symbols.getDigitStringsLocal()[nextDigit],
+                length += string.insert(0,
+                        micros.symbols.getDigitStringsLocal()[nextDigit],
                         NumberFormat.Field.INTEGER);
             }
         }
         return length;
     }
 
-    private static int writeFractionDigits(MicroProps micros, DecimalQuantity quantity, NumberStringBuilder string) {
+    private static int writeFractionDigits(
+            MicroProps micros,
+            DecimalQuantity quantity,
+            NumberStringBuilder string) {
         int length = 0;
         int fractionCount = -quantity.getLowerDisplayMagnitude();
         for (int i = 0; i < fractionCount; i++) {
@@ -368,7 +421,8 @@
                 length += string.appendCodePoint(micros.symbols.getCodePointZero() + nextDigit,
                         NumberFormat.Field.FRACTION);
             } else {
-                length += string.append(micros.symbols.getDigitStringsLocal()[nextDigit], NumberFormat.Field.FRACTION);
+                length += string.append(micros.symbols.getDigitStringsLocal()[nextDigit],
+                        NumberFormat.Field.FRACTION);
             }
         }
         return length;
diff --git a/android_icu4j/src/main/java/android/icu/number/NumberFormatterSettings.java b/android_icu4j/src/main/java/android/icu/number/NumberFormatterSettings.java
index b551b50..92d140e 100644
--- a/android_icu4j/src/main/java/android/icu/number/NumberFormatterSettings.java
+++ b/android_icu4j/src/main/java/android/icu/number/NumberFormatterSettings.java
@@ -6,6 +6,7 @@
 import android.icu.impl.number.MacroProps;
 import android.icu.impl.number.Padder;
 import android.icu.number.NumberFormatter.DecimalSeparatorDisplay;
+import android.icu.number.NumberFormatter.GroupingStrategy;
 import android.icu.number.NumberFormatter.SignDisplay;
 import android.icu.number.NumberFormatter.UnitWidth;
 import android.icu.text.DecimalFormatSymbols;
@@ -17,9 +18,9 @@
 import android.icu.util.ULocale;
 
 /**
- * An abstract base class for specifying settings related to number formatting. This class is implemented by
- * {@link UnlocalizedNumberFormatter} and {@link LocalizedNumberFormatter}. This class is not intended for public
- * subclassing.
+ * An abstract base class for specifying settings related to number formatting. This class is implemented
+ * by {@link UnlocalizedNumberFormatter} and {@link LocalizedNumberFormatter}. This class is not intended
+ * for public subclassing.
  *
  * @see NumberFormatter
  * @hide Only a subset of ICU is exposed in Android
@@ -32,7 +33,7 @@
     static final int KEY_NOTATION = 2;
     static final int KEY_UNIT = 3;
     static final int KEY_ROUNDER = 4;
-    static final int KEY_GROUPER = 5;
+    static final int KEY_GROUPING = 5;
     static final int KEY_PADDER = 6;
     static final int KEY_INTEGER = 7;
     static final int KEY_SYMBOLS = 8;
@@ -40,7 +41,8 @@
     static final int KEY_SIGN = 10;
     static final int KEY_DECIMAL = 11;
     static final int KEY_THRESHOLD = 12;
-    static final int KEY_MAX = 13;
+    static final int KEY_PER_UNIT = 13;
+    static final int KEY_MAX = 14;
 
     final NumberFormatterSettings<?> parent;
     final int key;
@@ -63,8 +65,8 @@
      * </ul>
      *
      * <p>
-     * All notation styles will be properly localized with locale data, and all notation styles are compatible with
-     * units, rounding strategies, and other number formatter settings.
+     * All notation styles will be properly localized with locale data, and all notation styles are
+     * compatible with units, rounding strategies, and other number formatter settings.
      *
      * <p>
      * Pass this method the return value of a {@link Notation} factory method. For example:
@@ -96,13 +98,13 @@
      *
      * <p>
      * <strong>Note:</strong> The unit can also be specified by passing a {@link Measure} to
-     * {@link LocalizedNumberFormatter#format(Measure)}. Units specified via the format method take precedence over
-     * units specified here. This setter is designed for situations when the unit is constant for the duration of the
-     * number formatting process.
+     * {@link LocalizedNumberFormatter#format(Measure)}. Units specified via the format method take
+     * precedence over units specified here. This setter is designed for situations when the unit is
+     * constant for the duration of the number formatting process.
      *
      * <p>
-     * All units will be properly localized with locale data, and all units are compatible with notation styles,
-     * rounding strategies, and other number formatter settings.
+     * All units will be properly localized with locale data, and all units are compatible with notation
+     * styles, rounding strategies, and other number formatter settings.
      *
      * <p>
      * Pass this method any instance of {@link MeasureUnit}. For units of measure:
@@ -123,6 +125,10 @@
      * NumberFormatter.with().unit(NoUnit.PERCENT)
      * </pre>
      *
+     * <p>
+     * See {@link #perUnit} for information on how to format strings like "5 meters per second".
+     *
+     * <p>
      * The default is to render without units (equivalent to {@link NoUnit#BASE}).
      *
      * @param unit
@@ -131,6 +137,7 @@
      * @see MeasureUnit
      * @see Currency
      * @see NoUnit
+     * @see #perUnit
      * @hide draft / provisional / internal are hidden on Android
      */
     public T unit(MeasureUnit unit) {
@@ -138,6 +145,33 @@
     }
 
     /**
+     * Sets a unit to be used in the denominator. For example, to format "3 m/s", pass METER to the unit
+     * and SECOND to the perUnit.
+     *
+     * <p>
+     * Pass this method any instance of {@link MeasureUnit}. For example:
+     *
+     * <pre>
+     * NumberFormatter.with().unit(MeasureUnit.METER).perUnit(MeasureUnit.SECOND)
+     * </pre>
+     *
+     * <p>
+     * The default is not to display any unit in the denominator.
+     *
+     * <p>
+     * If a per-unit is specified without a primary unit via {@link #unit}, the behavior is undefined.
+     *
+     * @param perUnit
+     *            The unit to render in the denominator.
+     * @return The fluent chain
+     * @see #unit
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    public T perUnit(MeasureUnit perUnit) {
+        return create(KEY_PER_UNIT, perUnit);
+    }
+
+    /**
      * Specifies the rounding strategy to use when formatting numbers.
      *
      * <ul>
@@ -156,10 +190,10 @@
      *
      * <p>
      * In most cases, the default rounding strategy is to round to 6 fraction places; i.e.,
-     * <code>Rounder.maxFraction(6)</code>. The exceptions are if compact notation is being used, then the compact
-     * notation rounding strategy is used (see {@link Notation#compactShort} for details), or if the unit is a currency,
-     * then standard currency rounding is used, which varies from currency to currency (see {@link Rounder#currency} for
-     * details).
+     * <code>Rounder.maxFraction(6)</code>. The exceptions are if compact notation is being used, then
+     * the compact notation rounding strategy is used (see {@link Notation#compactShort} for details), or
+     * if the unit is a currency, then standard currency rounding is used, which varies from currency to
+     * currency (see {@link Rounder#currency} for details).
      *
      * @param rounder
      *            The rounding strategy to use.
@@ -184,25 +218,23 @@
      * The exact grouping widths will be chosen based on the locale.
      *
      * <p>
-     * Pass this method the return value of one of the factory methods on {@link Grouper}. For example:
+     * Pass this method an element from the {@link GroupingStrategy} enum. For example:
      *
      * <pre>
-     * NumberFormatter.with().grouping(Grouper.min2())
+     * NumberFormatter.with().grouping(GroupingStrategy.MIN2)
      * </pre>
      *
-     * The default is to perform grouping without concern for the minimum grouping digits.
+     * The default is to perform grouping according to locale data; most locales, but not all locales,
+     * enable it by default.
      *
-     * @param grouper
+     * @param strategy
      *            The grouping strategy to use.
      * @return The fluent chain.
-     * @see Grouper
-     * @see Notation
-     * @deprecated ICU 60 This API is technical preview; see #7861.
+     * @see GroupingStrategy
      * @hide draft / provisional / internal are hidden on Android
      */
-    @Deprecated
-    public T grouping(Grouper grouper) {
-        return create(KEY_GROUPER, grouper);
+    public T grouping(GroupingStrategy strategy) {
+        return create(KEY_GROUPING, strategy);
     }
 
     /**
@@ -234,8 +266,8 @@
     }
 
     /**
-     * Specifies the symbols (decimal separator, grouping separator, percent sign, numerals, etc.) to use when rendering
-     * numbers.
+     * Specifies the symbols (decimal separator, grouping separator, percent sign, numerals, etc.) to use
+     * when rendering numbers.
      *
      * <ul>
      * <li><em>en_US</em> symbols: "12,345.67"
@@ -252,17 +284,17 @@
      * </pre>
      *
      * <p>
-     * <strong>Note:</strong> DecimalFormatSymbols automatically chooses the best numbering system based on the locale.
-     * In the examples above, the first three are using the Latin numbering system, and the fourth is using the Myanmar
-     * numbering system.
+     * <strong>Note:</strong> DecimalFormatSymbols automatically chooses the best numbering system based
+     * on the locale. In the examples above, the first three are using the Latin numbering system, and
+     * the fourth is using the Myanmar numbering system.
      *
      * <p>
-     * <strong>Note:</strong> The instance of DecimalFormatSymbols will be copied: changes made to the symbols object
-     * after passing it into the fluent chain will not be seen.
+     * <strong>Note:</strong> The instance of DecimalFormatSymbols will be copied: changes made to the
+     * symbols object after passing it into the fluent chain will not be seen.
      *
      * <p>
-     * <strong>Note:</strong> Calling this method will override the NumberingSystem previously specified in
-     * {@link #symbols(NumberingSystem)}.
+     * <strong>Note:</strong> Calling this method will override the NumberingSystem previously specified
+     * in {@link #symbols(NumberingSystem)}.
      *
      * <p>
      * The default is to choose the symbols based on the locale specified in the fluent chain.
@@ -288,16 +320,16 @@
      * </ul>
      *
      * <p>
-     * Pass this method an instance of {@link NumberingSystem}. For example, to force the locale to always use the Latin
-     * alphabet numbering system (ASCII digits):
+     * Pass this method an instance of {@link NumberingSystem}. For example, to force the locale to
+     * always use the Latin alphabet numbering system (ASCII digits):
      *
      * <pre>
      * NumberFormatter.with().symbols(NumberingSystem.LATIN)
      * </pre>
      *
      * <p>
-     * <strong>Note:</strong> Calling this method will override the DecimalFormatSymbols previously specified in
-     * {@link #symbols(DecimalFormatSymbols)}.
+     * <strong>Note:</strong> Calling this method will override the DecimalFormatSymbols previously
+     * specified in {@link #symbols(DecimalFormatSymbols)}.
      *
      * <p>
      * The default is to choose the best numbering system for the locale.
@@ -371,8 +403,8 @@
     }
 
     /**
-     * Sets the decimal separator display strategy. This affects integer numbers with no fraction part. Most common
-     * values:
+     * Sets the decimal separator display strategy. This affects integer numbers with no fraction part.
+     * Most common values:
      *
      * <ul>
      * <li>Auto: "1"
@@ -422,8 +454,8 @@
     }
 
     /**
-     * Internal fluent setter to support a custom regulation threshold. A threshold of 1 causes the data structures to
-     * be built right away. A threshold of 0 prevents the data structures from being built.
+     * Internal fluent setter to support a custom regulation threshold. A threshold of 1 causes the data
+     * structures to be built right away. A threshold of 0 prevents the data structures from being built.
      *
      * @deprecated ICU 60 This API is ICU internal only.
      * @hide draft / provisional / internal are hidden on Android
@@ -470,9 +502,9 @@
                     macros.rounder = (Rounder) current.value;
                 }
                 break;
-            case KEY_GROUPER:
-                if (macros.grouper == null) {
-                    macros.grouper = (Grouper) current.value;
+            case KEY_GROUPING:
+                if (macros.grouping == null) {
+                    macros.grouping = /* (Object) */ current.value;
                 }
                 break;
             case KEY_PADDER:
@@ -510,6 +542,11 @@
                     macros.threshold = (Long) current.value;
                 }
                 break;
+            case KEY_PER_UNIT:
+                if (macros.perUnit == null) {
+                    macros.perUnit = (MeasureUnit) current.value;
+                }
+                break;
             default:
                 throw new AssertionError("Unknown key: " + current.key);
             }
diff --git a/android_icu4j/src/main/java/android/icu/number/NumberPropertyMapper.java b/android_icu4j/src/main/java/android/icu/number/NumberPropertyMapper.java
index 81d6356..61cf747 100644
--- a/android_icu4j/src/main/java/android/icu/number/NumberPropertyMapper.java
+++ b/android_icu4j/src/main/java/android/icu/number/NumberPropertyMapper.java
@@ -6,16 +6,16 @@
 import java.math.BigDecimal;
 import java.math.MathContext;
 
-import android.icu.impl.StandardPlural;
 import android.icu.impl.number.AffixPatternProvider;
-import android.icu.impl.number.AffixUtils;
+import android.icu.impl.number.CurrencyPluralInfoAffixProvider;
 import android.icu.impl.number.CustomSymbolCurrency;
 import android.icu.impl.number.DecimalFormatProperties;
+import android.icu.impl.number.Grouper;
 import android.icu.impl.number.MacroProps;
 import android.icu.impl.number.MultiplierImpl;
 import android.icu.impl.number.Padder;
 import android.icu.impl.number.PatternStringParser;
-import android.icu.impl.number.PatternStringParser.ParsedPatternInfo;
+import android.icu.impl.number.PropertiesAffixPatternProvider;
 import android.icu.impl.number.RoundingUtils;
 import android.icu.number.NumberFormatter.DecimalSeparatorDisplay;
 import android.icu.number.NumberFormatter.SignDisplay;
@@ -23,7 +23,6 @@
 import android.icu.number.Rounder.IncrementRounderImpl;
 import android.icu.number.Rounder.SignificantRounderImpl;
 import android.icu.text.CompactDecimalFormat.CompactStyle;
-import android.icu.text.CurrencyPluralInfo;
 import android.icu.text.DecimalFormatSymbols;
 import android.icu.util.Currency;
 import android.icu.util.Currency.CurrencyUsage;
@@ -31,20 +30,22 @@
 
 /**
  * <p>
- * This class, as well as NumberFormatterImpl, could go into the impl package, but they depend on too many
- * package-private members of the public APIs.
+ * This class, as well as NumberFormatterImpl, could go into the impl package, but they depend on too
+ * many package-private members of the public APIs.
  */
 final class NumberPropertyMapper {
 
     /** Convenience method to create a NumberFormatter directly from Properties. */
-    public static UnlocalizedNumberFormatter create(DecimalFormatProperties properties, DecimalFormatSymbols symbols) {
+    public static UnlocalizedNumberFormatter create(
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols) {
         MacroProps macros = oldToNew(properties, symbols, null);
         return NumberFormatter.with().macros(macros);
     }
 
     /**
-     * Convenience method to create a NumberFormatter directly from a pattern string. Something like this could become
-     * public API if there is demand.
+     * Convenience method to create a NumberFormatter directly from a pattern string. Something like this
+     * could become public API if there is demand.
      */
     public static UnlocalizedNumberFormatter create(String pattern, DecimalFormatSymbols symbols) {
         DecimalFormatProperties properties = PatternStringParser.parseToProperties(pattern);
@@ -52,19 +53,22 @@
     }
 
     /**
-     * Creates a new {@link MacroProps} object based on the content of a {@link DecimalFormatProperties} object. In
-     * other words, maps Properties to MacroProps. This function is used by the JDK-compatibility API to call into the
-     * ICU 60 fluent number formatting pipeline.
+     * Creates a new {@link MacroProps} object based on the content of a {@link DecimalFormatProperties}
+     * object. In other words, maps Properties to MacroProps. This function is used by the
+     * JDK-compatibility API to call into the ICU 60 fluent number formatting pipeline.
      *
      * @param properties
      *            The property bag to be mapped.
      * @param symbols
      *            The symbols associated with the property bag.
      * @param exportedProperties
-     *            A property bag in which to store validated properties.
+     *            A property bag in which to store validated properties. Used by some DecimalFormat
+     *            getters.
      * @return A new MacroProps containing all of the information in the Properties.
      */
-    public static MacroProps oldToNew(DecimalFormatProperties properties, DecimalFormatSymbols symbols,
+    public static MacroProps oldToNew(
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols,
             DecimalFormatProperties exportedProperties) {
         MacroProps macros = new MacroProps();
         ULocale locale = symbols.getULocale();
@@ -97,8 +101,10 @@
         // UNITS //
         ///////////
 
-        boolean useCurrency = ((properties.getCurrency() != null) || properties.getCurrencyPluralInfo() != null
-                || properties.getCurrencyUsage() != null || affixProvider.hasCurrencySign());
+        boolean useCurrency = ((properties.getCurrency() != null)
+                || properties.getCurrencyPluralInfo() != null
+                || properties.getCurrencyUsage() != null
+                || affixProvider.hasCurrencySign());
         Currency currency = CustomSymbolCurrency.resolve(properties.getCurrency(), locale, symbols);
         CurrencyUsage currencyUsage = properties.getCurrencyUsage();
         boolean explicitCurrencyUsage = currencyUsage != null;
@@ -123,7 +129,8 @@
         MathContext mathContext = RoundingUtils.getMathContextOrUnlimited(properties);
         boolean explicitMinMaxFrac = minFrac != -1 || maxFrac != -1;
         boolean explicitMinMaxSig = minSig != -1 || maxSig != -1;
-        // Resolve min/max frac for currencies, required for the validation logic and for when minFrac or maxFrac was
+        // Resolve min/max frac for currencies, required for the validation logic and for when minFrac or
+        // maxFrac was
         // set (but not both) on a currency instance.
         // NOTE: Increments are handled in "Rounder.constructCurrency()".
         if (useCurrency) {
@@ -152,7 +159,8 @@
             minFrac = minFrac < 0 ? 0 : minFrac;
             maxFrac = maxFrac < 0 ? Integer.MAX_VALUE : maxFrac < minFrac ? minFrac : maxFrac;
             minInt = minInt <= 0 ? 1 : minInt > RoundingUtils.MAX_INT_FRAC_SIG ? 1 : minInt;
-            maxInt = maxInt < 0 ? -1 : maxInt < minInt ? minInt : maxInt > RoundingUtils.MAX_INT_FRAC_SIG ? -1 : maxInt;
+            maxInt = maxInt < 0 ? -1
+                    : maxInt < minInt ? minInt : maxInt > RoundingUtils.MAX_INT_FRAC_SIG ? -1 : maxInt;
         }
         Rounder rounding = null;
         if (explicitCurrencyUsage) {
@@ -160,10 +168,12 @@
         } else if (roundingIncrement != null) {
             rounding = Rounder.constructIncrement(roundingIncrement);
         } else if (explicitMinMaxSig) {
-            minSig = minSig < 1 ? 1 : minSig > RoundingUtils.MAX_INT_FRAC_SIG ? RoundingUtils.MAX_INT_FRAC_SIG : minSig;
+            minSig = minSig < 1 ? 1
+                    : minSig > RoundingUtils.MAX_INT_FRAC_SIG ? RoundingUtils.MAX_INT_FRAC_SIG : minSig;
             maxSig = maxSig < 0 ? RoundingUtils.MAX_INT_FRAC_SIG
                     : maxSig < minSig ? minSig
-                            : maxSig > RoundingUtils.MAX_INT_FRAC_SIG ? RoundingUtils.MAX_INT_FRAC_SIG : maxSig;
+                            : maxSig > RoundingUtils.MAX_INT_FRAC_SIG ? RoundingUtils.MAX_INT_FRAC_SIG
+                                    : maxSig;
             rounding = Rounder.constructSignificant(minSig, maxSig);
         } else if (explicitMinMaxFrac) {
             rounding = Rounder.constructFraction(minFrac, maxFrac);
@@ -185,21 +195,15 @@
         // GROUPING STRATEGY //
         ///////////////////////
 
-        int grouping1 = properties.getGroupingSize();
-        int grouping2 = properties.getSecondaryGroupingSize();
-        int minGrouping = properties.getMinimumGroupingDigits();
-        assert grouping1 >= -2; // value of -2 means to forward no grouping information
-        grouping1 = grouping1 > 0 ? grouping1 : grouping2 > 0 ? grouping2 : grouping1;
-        grouping2 = grouping2 > 0 ? grouping2 : grouping1;
-        // TODO: Is it important to handle minGrouping > 2?
-        macros.grouper = Grouper.getInstance((byte) grouping1, (byte) grouping2, minGrouping == 2);
+        macros.grouping = Grouper.forProperties(properties);
 
         /////////////
         // PADDING //
         /////////////
 
         if (properties.getFormatWidth() != -1) {
-            macros.padder = new Padder(properties.getPadString(), properties.getFormatWidth(),
+            macros.padder = new Padder(properties.getPadString(),
+                    properties.getFormatWidth(),
                     properties.getPadPosition());
         }
 
@@ -247,7 +251,8 @@
             // Scientific notation also involves overriding the rounding mode.
             // TODO: Overriding here is a bit of a hack. Should this logic go earlier?
             if (macros.rounder instanceof FractionRounder) {
-                // For the purposes of rounding, get the original min/max int/frac, since the local variables
+                // For the purposes of rounding, get the original min/max int/frac, since the local
+                // variables
                 // have been manipulated for display purposes.
                 int minInt_ = properties.getMinimumIntegerDigits();
                 int minFrac_ = properties.getMinimumFractionDigits();
@@ -335,178 +340,4 @@
 
         return macros;
     }
-
-    private static class PropertiesAffixPatternProvider implements AffixPatternProvider {
-        private final String posPrefix;
-        private final String posSuffix;
-        private final String negPrefix;
-        private final String negSuffix;
-
-        public PropertiesAffixPatternProvider(DecimalFormatProperties properties) {
-            // There are two ways to set affixes in DecimalFormat: via the pattern string (applyPattern), and via the
-            // explicit setters (setPositivePrefix and friends).  The way to resolve the settings is as follows:
-            //
-            // 1) If the explicit setting is present for the field, use it.
-            // 2) Otherwise, follows UTS 35 rules based on the pattern string.
-            //
-            // Importantly, the explicit setters affect only the one field they override.  If you set the positive
-            // prefix, that should not affect the negative prefix.  Since it is impossible for the user of this class
-            // to know whether the origin for a string was the override or the pattern, we have to say that we always
-            // have a negative subpattern and perform all resolution logic here.
-
-            // Convenience: Extract the properties into local variables.
-            // Variables are named with three chars: [p/n][p/s][o/p]
-            // [p/n] => p for positive, n for negative
-            // [p/s] => p for prefix, s for suffix
-            // [o/p] => o for escaped custom override string, p for pattern string
-            String ppo = AffixUtils.escape(properties.getPositivePrefix());
-            String pso = AffixUtils.escape(properties.getPositiveSuffix());
-            String npo = AffixUtils.escape(properties.getNegativePrefix());
-            String nso = AffixUtils.escape(properties.getNegativeSuffix());
-            String ppp = properties.getPositivePrefixPattern();
-            String psp = properties.getPositiveSuffixPattern();
-            String npp = properties.getNegativePrefixPattern();
-            String nsp = properties.getNegativeSuffixPattern();
-
-            if (ppo != null) {
-                posPrefix = ppo;
-            } else if (ppp != null) {
-                posPrefix = ppp;
-            } else {
-                // UTS 35: Default positive prefix is empty string.
-                posPrefix = "";
-            }
-
-            if (pso != null) {
-                posSuffix = pso;
-            } else if (psp != null) {
-                posSuffix = psp;
-            } else {
-                // UTS 35: Default positive suffix is empty string.
-                posSuffix = "";
-            }
-
-            if (npo != null) {
-                negPrefix = npo;
-            } else if (npp != null) {
-                negPrefix = npp;
-            } else {
-                // UTS 35: Default negative prefix is "-" with positive prefix.
-                // Important: We prepend the "-" to the pattern, not the override!
-                negPrefix = ppp == null ? "-" : "-" + ppp;
-            }
-
-            if (nso != null) {
-                negSuffix = nso;
-            } else if (nsp != null) {
-                negSuffix = nsp;
-            } else {
-                // UTS 35: Default negative prefix is the positive prefix.
-                negSuffix = psp == null ? "" : psp;
-            }
-        }
-
-        @Override
-        public char charAt(int flags, int i) {
-            return getStringForFlags(flags).charAt(i);
-        }
-
-        @Override
-        public int length(int flags) {
-            return getStringForFlags(flags).length();
-        }
-
-        private String getStringForFlags(int flags) {
-            boolean prefix = (flags & Flags.PREFIX) != 0;
-            boolean negative = (flags & Flags.NEGATIVE_SUBPATTERN) != 0;
-            if (prefix && negative) {
-                return negPrefix;
-            } else if (prefix) {
-                return posPrefix;
-            } else if (negative) {
-                return negSuffix;
-            } else {
-                return posSuffix;
-            }
-        }
-
-        @Override
-        public boolean positiveHasPlusSign() {
-            return AffixUtils.containsType(posPrefix, AffixUtils.TYPE_PLUS_SIGN)
-                    || AffixUtils.containsType(posSuffix, AffixUtils.TYPE_PLUS_SIGN);
-        }
-
-        @Override
-        public boolean hasNegativeSubpattern() {
-            // See comments in the constructor for more information on why this is always true.
-            return true;
-        }
-
-        @Override
-        public boolean negativeHasMinusSign() {
-            return AffixUtils.containsType(negPrefix, AffixUtils.TYPE_MINUS_SIGN)
-                    || AffixUtils.containsType(negSuffix, AffixUtils.TYPE_MINUS_SIGN);
-        }
-
-        @Override
-        public boolean hasCurrencySign() {
-            return AffixUtils.hasCurrencySymbols(posPrefix) || AffixUtils.hasCurrencySymbols(posSuffix)
-                    || AffixUtils.hasCurrencySymbols(negPrefix) || AffixUtils.hasCurrencySymbols(negSuffix);
-        }
-
-        @Override
-        public boolean containsSymbolType(int type) {
-            return AffixUtils.containsType(posPrefix, type) || AffixUtils.containsType(posSuffix, type)
-                    || AffixUtils.containsType(negPrefix, type) || AffixUtils.containsType(negSuffix, type);
-        }
-    }
-
-    private static class CurrencyPluralInfoAffixProvider implements AffixPatternProvider {
-        private final AffixPatternProvider[] affixesByPlural;
-
-        public CurrencyPluralInfoAffixProvider(CurrencyPluralInfo cpi) {
-            affixesByPlural = new ParsedPatternInfo[StandardPlural.COUNT];
-            for (StandardPlural plural : StandardPlural.VALUES) {
-                affixesByPlural[plural.ordinal()] = PatternStringParser
-                        .parseToPatternInfo(cpi.getCurrencyPluralPattern(plural.getKeyword()));
-            }
-        }
-
-        @Override
-        public char charAt(int flags, int i) {
-            int pluralOrdinal = (flags & Flags.PLURAL_MASK);
-            return affixesByPlural[pluralOrdinal].charAt(flags, i);
-        }
-
-        @Override
-        public int length(int flags) {
-            int pluralOrdinal = (flags & Flags.PLURAL_MASK);
-            return affixesByPlural[pluralOrdinal].length(flags);
-        }
-
-        @Override
-        public boolean positiveHasPlusSign() {
-            return affixesByPlural[StandardPlural.OTHER.ordinal()].positiveHasPlusSign();
-        }
-
-        @Override
-        public boolean hasNegativeSubpattern() {
-            return affixesByPlural[StandardPlural.OTHER.ordinal()].hasNegativeSubpattern();
-        }
-
-        @Override
-        public boolean negativeHasMinusSign() {
-            return affixesByPlural[StandardPlural.OTHER.ordinal()].negativeHasMinusSign();
-        }
-
-        @Override
-        public boolean hasCurrencySign() {
-            return affixesByPlural[StandardPlural.OTHER.ordinal()].hasCurrencySign();
-        }
-
-        @Override
-        public boolean containsSymbolType(int type) {
-            return affixesByPlural[StandardPlural.OTHER.ordinal()].containsSymbolType(type);
-        }
-    }
 }
diff --git a/android_icu4j/src/main/java/android/icu/number/Rounder.java b/android_icu4j/src/main/java/android/icu/number/Rounder.java
index 090502c..d98e31f 100644
--- a/android_icu4j/src/main/java/android/icu/number/Rounder.java
+++ b/android_icu4j/src/main/java/android/icu/number/Rounder.java
@@ -35,11 +35,12 @@
      * Show all available digits to full precision.
      *
      * <p>
-     * <strong>NOTE:</strong> When formatting a <em>double</em>, this method, along with {@link #minFraction} and
-     * {@link #minDigits}, will trigger complex algorithm similar to <em>Dragon4</em> to determine the low-order digits
-     * and the number of digits to display based on the value of the double. If the number of fraction places or
-     * significant digits can be bounded, consider using {@link #maxFraction} or {@link #maxDigits} instead to maximize
-     * performance. For more information, read the following blog post.
+     * <strong>NOTE:</strong> When formatting a <em>double</em>, this method, along with
+     * {@link #minFraction} and {@link #minDigits}, will trigger complex algorithm similar to
+     * <em>Dragon4</em> to determine the low-order digits and the number of digits to display based on
+     * the value of the double. If the number of fraction places or significant digits can be bounded,
+     * consider using {@link #maxFraction} or {@link #maxDigits} instead to maximize performance. For
+     * more information, read the following blog post.
      *
      * <p>
      * http://www.serpentine.com/blog/2011/06/29/here-be-dragons-advances-in-problems-you-didnt-even-know-you-had/
@@ -64,8 +65,9 @@
     }
 
     /**
-     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator).
-     * Additionally, pad with zeros to ensure that this number of places are always shown.
+     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the
+     * decimal separator). Additionally, pad with zeros to ensure that this number of places are always
+     * shown.
      *
      * <p>
      * Example output with minMaxFractionPlaces = 3:
@@ -85,8 +87,8 @@
      * This method is equivalent to {@link #minMaxFraction} with both arguments equal.
      *
      * @param minMaxFractionPlaces
-     *            The minimum and maximum number of numerals to display after the decimal separator (rounding if too
-     *            long or padding with zeros if too short).
+     *            The minimum and maximum number of numerals to display after the decimal separator
+     *            (rounding if too long or padding with zeros if too short).
      * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter.
      * @see NumberFormatter
      * @hide draft / provisional / internal are hidden on Android
@@ -95,107 +97,118 @@
         if (minMaxFractionPlaces >= 0 && minMaxFractionPlaces <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructFraction(minMaxFractionPlaces, minMaxFractionPlaces);
         } else {
-            throw new IllegalArgumentException(
-                    "Fraction length must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Fraction length must be between 0 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Always show at least a certain number of fraction places after the decimal separator, padding with zeros if
-     * necessary. Do not perform rounding (display numbers to their full precision).
+     * Always show at least a certain number of fraction places after the decimal separator, padding with
+     * zeros if necessary. Do not perform rounding (display numbers to their full precision).
      *
      * <p>
-     * <strong>NOTE:</strong> If you are formatting <em>doubles</em>, see the performance note in {@link #unlimited}.
+     * <strong>NOTE:</strong> If you are formatting <em>doubles</em>, see the performance note in
+     * {@link #unlimited}.
      *
      * @param minFractionPlaces
-     *            The minimum number of numerals to display after the decimal separator (padding with zeros if
-     *            necessary).
+     *            The minimum number of numerals to display after the decimal separator (padding with
+     *            zeros if necessary).
      * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter.
      * @see NumberFormatter
      * @hide draft / provisional / internal are hidden on Android
      */
     public static FractionRounder minFraction(int minFractionPlaces) {
-        if (minFractionPlaces >= 0 && minFractionPlaces < RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (minFractionPlaces >= 0 && minFractionPlaces <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructFraction(minFractionPlaces, -1);
         } else {
-            throw new IllegalArgumentException(
-                    "Fraction length must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Fraction length must be between 0 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator).
-     * Unlike the other fraction rounding strategies, this strategy does <em>not</em> pad zeros to the end of the
-     * number.
+     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the
+     * decimal separator). Unlike the other fraction rounding strategies, this strategy does <em>not</em>
+     * pad zeros to the end of the number.
      *
      * @param maxFractionPlaces
-     *            The maximum number of numerals to display after the decimal mark (rounding if necessary).
+     *            The maximum number of numerals to display after the decimal mark (rounding if
+     *            necessary).
      * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter.
      * @see NumberFormatter
      * @hide draft / provisional / internal are hidden on Android
      */
     public static FractionRounder maxFraction(int maxFractionPlaces) {
-        if (maxFractionPlaces >= 0 && maxFractionPlaces < RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (maxFractionPlaces >= 0 && maxFractionPlaces <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructFraction(0, maxFractionPlaces);
         } else {
-            throw new IllegalArgumentException(
-                    "Fraction length must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Fraction length must be between 0 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator);
-     * in addition, always show at least a certain number of places after the decimal separator, padding with zeros if
-     * necessary.
+     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the
+     * decimal separator); in addition, always show at least a certain number of places after the decimal
+     * separator, padding with zeros if necessary.
      *
      * @param minFractionPlaces
-     *            The minimum number of numerals to display after the decimal separator (padding with zeros if
-     *            necessary).
+     *            The minimum number of numerals to display after the decimal separator (padding with
+     *            zeros if necessary).
      * @param maxFractionPlaces
-     *            The maximum number of numerals to display after the decimal separator (rounding if necessary).
+     *            The maximum number of numerals to display after the decimal separator (rounding if
+     *            necessary).
      * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter.
      * @see NumberFormatter
      * @hide draft / provisional / internal are hidden on Android
      */
     public static FractionRounder minMaxFraction(int minFractionPlaces, int maxFractionPlaces) {
-        if (minFractionPlaces >= 0 && maxFractionPlaces <= RoundingUtils.MAX_INT_FRAC_SIG
+        if (minFractionPlaces >= 0
+                && maxFractionPlaces <= RoundingUtils.MAX_INT_FRAC_SIG
                 && minFractionPlaces <= maxFractionPlaces) {
             return constructFraction(minFractionPlaces, maxFractionPlaces);
         } else {
-            throw new IllegalArgumentException(
-                    "Fraction length must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Fraction length must be between 0 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Show numbers rounded if necessary to a certain number of significant digits or significant figures. Additionally,
-     * pad with zeros to ensure that this number of significant digits/figures are always shown.
+     * Show numbers rounded if necessary to a certain number of significant digits or significant
+     * figures. Additionally, pad with zeros to ensure that this number of significant digits/figures are
+     * always shown.
      *
      * <p>
      * This method is equivalent to {@link #minMaxDigits} with both arguments equal.
      *
      * @param minMaxSignificantDigits
-     *            The minimum and maximum number of significant digits to display (rounding if too long or padding with
-     *            zeros if too short).
+     *            The minimum and maximum number of significant digits to display (rounding if too long
+     *            or padding with zeros if too short).
      * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter.
      * @see NumberFormatter
      * @hide draft / provisional / internal are hidden on Android
      */
     public static Rounder fixedDigits(int minMaxSignificantDigits) {
-        if (minMaxSignificantDigits > 0 && minMaxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (minMaxSignificantDigits >= 1 && minMaxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructSignificant(minMaxSignificantDigits, minMaxSignificantDigits);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Always show at least a certain number of significant digits/figures, padding with zeros if necessary. Do not
-     * perform rounding (display numbers to their full precision).
+     * Always show at least a certain number of significant digits/figures, padding with zeros if
+     * necessary. Do not perform rounding (display numbers to their full precision).
      *
      * <p>
-     * <strong>NOTE:</strong> If you are formatting <em>doubles</em>, see the performance note in {@link #unlimited}.
+     * <strong>NOTE:</strong> If you are formatting <em>doubles</em>, see the performance note in
+     * {@link #unlimited}.
      *
      * @param minSignificantDigits
      *            The minimum number of significant digits to display (padding with zeros if too short).
@@ -204,11 +217,12 @@
      * @hide draft / provisional / internal are hidden on Android
      */
     public static Rounder minDigits(int minSignificantDigits) {
-        if (minSignificantDigits > 0 && minSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (minSignificantDigits >= 1 && minSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructSignificant(minSignificantDigits, -1);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
@@ -222,17 +236,18 @@
      * @hide draft / provisional / internal are hidden on Android
      */
     public static Rounder maxDigits(int maxSignificantDigits) {
-        if (maxSignificantDigits > 0 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (maxSignificantDigits >= 1 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructSignificant(0, maxSignificantDigits);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Show numbers rounded if necessary to a certain number of significant digits/figures; in addition, always show at
-     * least a certain number of significant digits, padding with zeros if necessary.
+     * Show numbers rounded if necessary to a certain number of significant digits/figures; in addition,
+     * always show at least a certain number of significant digits, padding with zeros if necessary.
      *
      * @param minSignificantDigits
      *            The minimum number of significant digits to display (padding with zeros if necessary).
@@ -243,23 +258,26 @@
      * @hide draft / provisional / internal are hidden on Android
      */
     public static Rounder minMaxDigits(int minSignificantDigits, int maxSignificantDigits) {
-        if (minSignificantDigits > 0 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG
+        if (minSignificantDigits >= 1
+                && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG
                 && minSignificantDigits <= maxSignificantDigits) {
             return constructSignificant(minSignificantDigits, maxSignificantDigits);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Show numbers rounded if necessary to the closest multiple of a certain rounding increment. For example, if the
-     * rounding increment is 0.5, then round 1.2 to 1 and round 1.3 to 1.5.
+     * Show numbers rounded if necessary to the closest multiple of a certain rounding increment. For
+     * example, if the rounding increment is 0.5, then round 1.2 to 1 and round 1.3 to 1.5.
      *
      * <p>
-     * In order to ensure that numbers are padded to the appropriate number of fraction places, set the scale on the
-     * rounding increment BigDecimal. For example, to round to the nearest 0.5 and always display 2 numerals after the
-     * decimal separator (to display 1.2 as "1.00" and 1.3 as "1.50"), you can run:
+     * In order to ensure that numbers are padded to the appropriate number of fraction places, set the
+     * scale on the rounding increment BigDecimal. For example, to round to the nearest 0.5 and always
+     * display 2 numerals after the decimal separator (to display 1.2 as "1.00" and 1.3 as "1.50"), you
+     * can run:
      *
      * <pre>
      * Rounder.increment(new BigDecimal("0.50"))
@@ -283,18 +301,20 @@
     }
 
     /**
-     * Show numbers rounded and padded according to the rules for the currency unit. The most common rounding settings
-     * for currencies include <code>Rounder.fixedFraction(2)</code>, <code>Rounder.integer()</code>, and
-     * <code>Rounder.increment(0.05)</code> for cash transactions ("nickel rounding").
+     * Show numbers rounded and padded according to the rules for the currency unit. The most common
+     * rounding settings for currencies include <code>Rounder.fixedFraction(2)</code>,
+     * <code>Rounder.integer()</code>, and <code>Rounder.increment(0.05)</code> for cash transactions
+     * ("nickel rounding").
      *
      * <p>
      * The exact rounding details will be resolved at runtime based on the currency unit specified in the
-     * NumberFormatter chain. To round according to the rules for one currency while displaying the symbol for another
-     * currency, the withCurrency() method can be called on the return value of this method.
+     * NumberFormatter chain. To round according to the rules for one currency while displaying the
+     * symbol for another currency, the withCurrency() method can be called on the return value of this
+     * method.
      *
      * @param currencyUsage
-     *            Either STANDARD (for digital transactions) or CASH (for transactions where the rounding increment may
-     *            be limited by the available denominations of cash or coins).
+     *            Either STANDARD (for digital transactions) or CASH (for transactions where the rounding
+     *            increment may be limited by the available denominations of cash or coins).
      * @return A CurrencyRounder for chaining or passing to the NumberFormatter rounding() setter.
      * @see NumberFormatter
      * @hide draft / provisional / internal are hidden on Android
@@ -308,8 +328,8 @@
     }
 
     /**
-     * Sets the {@link java.math.RoundingMode} to use when picking the direction to round (up or down). Common values
-     * include HALF_EVEN, HALF_UP, and FLOOR. The default is HALF_EVEN.
+     * Sets the {@link java.math.RoundingMode} to use when picking the direction to round (up or down).
+     * Common values include HALF_EVEN, HALF_UP, and FLOOR. The default is HALF_EVEN.
      *
      * @param roundingMode
      *            The RoundingMode to use.
@@ -458,8 +478,8 @@
     }
 
     /**
-     * Returns a valid working Rounder. If the Rounder is a CurrencyRounder, applies the given currency. Otherwise,
-     * simply passes through the argument.
+     * Returns a valid working Rounder. If the Rounder is a CurrencyRounder, applies the given currency.
+     * Otherwise, simply passes through the argument.
      *
      * @param currency
      *            A currency object to use in case the input object needs it.
@@ -473,29 +493,58 @@
         }
     }
 
+    /**
+     * Rounding endpoint used by Engineering and Compact notation. Chooses the most appropriate
+     * multiplier (magnitude adjustment), applies the adjustment, rounds, and returns the chosen
+     * multiplier.
+     *
+     * <p>
+     * In most cases, this is simple. However, when rounding the number causes it to cross a multiplier
+     * boundary, we need to re-do the rounding. For example, to display 999,999 in Engineering notation
+     * with 2 sigfigs, first you guess the multiplier to be -3. However, then you end up getting 1000E3,
+     * which is not the correct output. You then change your multiplier to be -6, and you get 1.0E6,
+     * which is correct.
+     *
+     * @param input
+     *            The quantity to process.
+     * @param producer
+     *            Function to call to return a multiplier based on a magnitude.
+     * @return The number of orders of magnitude the input was adjusted by this method.
+     */
     int chooseMultiplierAndApply(DecimalQuantity input, MultiplierProducer producer) {
-        // TODO: Make a better and more efficient implementation.
-        // TODO: Avoid the object creation here.
-        DecimalQuantity copy = input.createCopy();
-
+        // Do not call this method with zero.
         assert !input.isZero();
+
+        // Perform the first attempt at rounding.
         int magnitude = input.getMagnitude();
         int multiplier = producer.getMultiplier(magnitude);
         input.adjustMagnitude(multiplier);
         apply(input);
 
-        // If the number turned to zero when rounding, do not re-attempt the rounding.
-        if (!input.isZero() && input.getMagnitude() == magnitude + multiplier + 1) {
-            magnitude += 1;
-            input.copyFrom(copy);
-            multiplier = producer.getMultiplier(magnitude);
-            input.adjustMagnitude(multiplier);
-            assert input.getMagnitude() == magnitude + multiplier - 1;
-            apply(input);
-            assert input.getMagnitude() == magnitude + multiplier;
+        // If the number rounded to zero, exit.
+        if (input.isZero()) {
+            return multiplier;
         }
 
-        return multiplier;
+        // If the new magnitude after rounding is the same as it was before rounding, then we are done.
+        // This case applies to most numbers.
+        if (input.getMagnitude() == magnitude + multiplier) {
+            return multiplier;
+        }
+
+        // If the above case DIDN'T apply, then we have a case like 99.9 -> 100 or 999.9 -> 1000:
+        // The number rounded up to the next magnitude. Check if the multiplier changes; if it doesn't,
+        // we do not need to make any more adjustments.
+        int _multiplier = producer.getMultiplier(magnitude + 1);
+        if (multiplier == _multiplier) {
+            return multiplier;
+        }
+
+        // We have a case like 999.9 -> 1000, where the correct output is "1K", not "1000".
+        // Fix the magnitude and re-apply the rounding strategy.
+        input.adjustMagnitude(_multiplier - multiplier);
+        apply(input);
+        return _multiplier;
     }
 
     ///////////////
@@ -526,7 +575,8 @@
         @Override
         public void apply(DecimalQuantity value) {
             value.roundToMagnitude(getRoundingMagnitudeFraction(maxFrac), mathContext);
-            value.setFractionLength(Math.max(0, -getDisplayMagnitudeFraction(minFrac)), Integer.MAX_VALUE);
+            value.setFractionLength(Math.max(0, -getDisplayMagnitudeFraction(minFrac)),
+                    Integer.MAX_VALUE);
         }
     }
 
@@ -542,10 +592,14 @@
         @Override
         public void apply(DecimalQuantity value) {
             value.roundToMagnitude(getRoundingMagnitudeSignificant(value, maxSig), mathContext);
-            value.setFractionLength(Math.max(0, -getDisplayMagnitudeSignificant(value, minSig)), Integer.MAX_VALUE);
+            value.setFractionLength(Math.max(0, -getDisplayMagnitudeSignificant(value, minSig)),
+                    Integer.MAX_VALUE);
         }
 
-        /** Version of {@link #apply} that obeys minInt constraints. Used for scientific notation compatibility mode. */
+        /**
+         * Version of {@link #apply} that obeys minInt constraints. Used for scientific notation
+         * compatibility mode.
+         */
         public void apply(DecimalQuantity quantity, int minInt) {
             assert quantity.isZero();
             quantity.setFractionLength(minSig - minInt, Integer.MAX_VALUE);
diff --git a/android_icu4j/src/main/java/android/icu/number/ScientificNotation.java b/android_icu4j/src/main/java/android/icu/number/ScientificNotation.java
index 18a0ea7..53cea9a 100644
--- a/android_icu4j/src/main/java/android/icu/number/ScientificNotation.java
+++ b/android_icu4j/src/main/java/android/icu/number/ScientificNotation.java
@@ -16,7 +16,8 @@
 import android.icu.text.NumberFormat;
 
 /**
- * A class that defines the scientific notation style to be used when formatting numbers in NumberFormatter.
+ * A class that defines the scientific notation style to be used when formatting numbers in
+ * NumberFormatter.
  *
  * <p>
  * To create a ScientificNotation, use one of the factory methods in {@link Notation}.
@@ -32,7 +33,10 @@
     int minExponentDigits;
     SignDisplay exponentSignDisplay;
 
-    /* package-private */ ScientificNotation(int engineeringInterval, boolean requireMinInt, int minExponentDigits,
+    /* package-private */ ScientificNotation(
+            int engineeringInterval,
+            boolean requireMinInt,
+            int minExponentDigits,
             SignDisplay exponentSignDisplay) {
         this.engineeringInterval = engineeringInterval;
         this.requireMinInt = requireMinInt;
@@ -41,12 +45,12 @@
     }
 
     /**
-     * Sets the minimum number of digits to show in the exponent of scientific notation, padding with zeros if
-     * necessary. Useful for fixed-width display.
+     * Sets the minimum number of digits to show in the exponent of scientific notation, padding with
+     * zeros if necessary. Useful for fixed-width display.
      *
      * <p>
-     * For example, with minExponentDigits=2, the number 123 will be printed as "1.23E02" in <em>en-US</em> instead of
-     * the default "1.23E2".
+     * For example, with minExponentDigits=2, the number 123 will be printed as "1.23E02" in
+     * <em>en-US</em> instead of the default "1.23E2".
      *
      * @param minExponentDigits
      *            The minimum number of digits to show in the exponent.
@@ -55,23 +59,24 @@
      * @hide draft / provisional / internal are hidden on Android
      */
     public ScientificNotation withMinExponentDigits(int minExponentDigits) {
-        if (minExponentDigits >= 0 && minExponentDigits < RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (minExponentDigits >= 1 && minExponentDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             ScientificNotation other = (ScientificNotation) this.clone();
             other.minExponentDigits = minExponentDigits;
             return other;
         } else {
-            throw new IllegalArgumentException(
-                    "Integer digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Integer digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Sets whether to show the sign on positive and negative exponents in scientific notation. The default is AUTO,
-     * showing the minus sign but not the plus sign.
+     * Sets whether to show the sign on positive and negative exponents in scientific notation. The
+     * default is AUTO, showing the minus sign but not the plus sign.
      *
      * <p>
-     * For example, with exponentSignDisplay=ALWAYS, the number 123 will be printed as "1.23E+2" in <em>en-US</em>
-     * instead of the default "1.23E2".
+     * For example, with exponentSignDisplay=ALWAYS, the number 123 will be printed as "1.23E+2" in
+     * <em>en-US</em> instead of the default "1.23E2".
      *
      * @param exponentSignDisplay
      *            The strategy for displaying the sign in the exponent.
@@ -100,21 +105,27 @@
         }
     }
 
-    /* package-private */ MicroPropsGenerator withLocaleData(DecimalFormatSymbols symbols, boolean build,
+    /* package-private */ MicroPropsGenerator withLocaleData(
+            DecimalFormatSymbols symbols,
+            boolean build,
             MicroPropsGenerator parent) {
         return new ScientificHandler(this, symbols, build, parent);
     }
 
-    // NOTE: The object lifecycle of ScientificModifier and ScientificHandler differ greatly in Java and C++.
+    // NOTE: The object lifecycle of ScientificModifier and ScientificHandler differ greatly in Java and
+    // C++.
     //
     // During formatting, we need to provide an object with state (the exponent) as the inner modifier.
     //
     // In Java, where the priority is put on reducing object creations, the unsafe code path re-uses the
-    // ScientificHandler as a ScientificModifier, and the safe code path pre-computes 25 ScientificModifier
+    // ScientificHandler as a ScientificModifier, and the safe code path pre-computes 25
+    // ScientificModifier
     // instances. This scheme reduces the number of object creations by 1 in both safe and unsafe.
     //
-    // In C++, MicroProps provides a pre-allocated ScientificModifier, and ScientificHandler simply populates
-    // the state (the exponent) into that ScientificModifier. There is no difference between safe and unsafe.
+    // In C++, MicroProps provides a pre-allocated ScientificModifier, and ScientificHandler simply
+    // populates
+    // the state (the exponent) into that ScientificModifier. There is no difference between safe and
+    // unsafe.
 
     private static class ScientificHandler implements MicroPropsGenerator, MultiplierProducer, Modifier {
 
@@ -124,7 +135,10 @@
         final MicroPropsGenerator parent;
         /* unsafe */ int exponent;
 
-        private ScientificHandler(ScientificNotation notation, DecimalFormatSymbols symbols, boolean safe,
+        private ScientificHandler(
+                ScientificNotation notation,
+                DecimalFormatSymbols symbols,
+                boolean safe,
                 MicroPropsGenerator parent) {
             this.notation = notation;
             this.symbols = symbols;
@@ -151,7 +165,8 @@
             if (quantity.isZero()) {
                 if (notation.requireMinInt && micros.rounding instanceof SignificantRounderImpl) {
                     // Show "00.000E0" on pattern "00.000E0"
-                    ((SignificantRounderImpl) micros.rounding).apply(quantity, notation.engineeringInterval);
+                    ((SignificantRounderImpl) micros.rounding).apply(quantity,
+                            notation.engineeringInterval);
                     exponent = 0;
                 } else {
                     micros.rounding.apply(quantity);
diff --git a/android_icu4j/src/main/java/android/icu/number/SimpleNotation.java b/android_icu4j/src/main/java/android/icu/number/SimpleNotation.java
index d83d2e5..28f143f 100644
--- a/android_icu4j/src/main/java/android/icu/number/SimpleNotation.java
+++ b/android_icu4j/src/main/java/android/icu/number/SimpleNotation.java
@@ -7,8 +7,8 @@
  * A class that defines the simple notation style to be used when formatting numbers in NumberFormatter.
  *
  * <p>
- * This class exposes no public functionality. To create a SimpleNotation, use one of the factory methods in
- * {@link Notation}.
+ * This class exposes no public functionality. To create a SimpleNotation, use one of the factory methods
+ * in {@link Notation}.
  *
  * @see NumberFormatter
  * @hide Only a subset of ICU is exposed in Android
diff --git a/android_icu4j/src/main/java/android/icu/number/UnlocalizedNumberFormatter.java b/android_icu4j/src/main/java/android/icu/number/UnlocalizedNumberFormatter.java
index 90292d8..32cedd4 100644
--- a/android_icu4j/src/main/java/android/icu/number/UnlocalizedNumberFormatter.java
+++ b/android_icu4j/src/main/java/android/icu/number/UnlocalizedNumberFormatter.java
@@ -8,7 +8,8 @@
 import android.icu.util.ULocale;
 
 /**
- * A NumberFormatter that does not yet have a locale. In order to format numbers, a locale must be specified.
+ * A NumberFormatter that does not yet have a locale. In order to format numbers, a locale must be
+ * specified.
  *
  * @see NumberFormatter
  * @hide Only a subset of ICU is exposed in Android
@@ -26,8 +27,8 @@
     }
 
     /**
-     * Associate the given locale with the number formatter. The locale is used for picking the appropriate symbols,
-     * formats, and other data for number display.
+     * Associate the given locale with the number formatter. The locale is used for picking the
+     * appropriate symbols, formats, and other data for number display.
      *
      * <p>
      * To use the Java default locale, call Locale.getDefault():
diff --git a/android_icu4j/src/main/java/android/icu/text/AlphabeticIndex.java b/android_icu4j/src/main/java/android/icu/text/AlphabeticIndex.java
index 68e9a2c..e2aecfb 100644
--- a/android_icu4j/src/main/java/android/icu/text/AlphabeticIndex.java
+++ b/android_icu4j/src/main/java/android/icu/text/AlphabeticIndex.java
@@ -504,7 +504,6 @@
      */
     private void addIndexExemplars(ULocale locale) {
         UnicodeSet exemplars = LocaleData.getExemplarSet(locale, 0, LocaleData.ES_INDEX);
-        // Android-changed: check for empty exemplar sets (http://b/64953401).
         if (exemplars != null && !exemplars.isEmpty()) {
             initialLabels.addAll(exemplars);
             return;
@@ -516,7 +515,7 @@
 
         exemplars = exemplars.cloneAsThawed();
         // question: should we add auxiliary exemplars?
-        if (exemplars.containsSome('a', 'z') || exemplars.size() == 0) {
+        if (exemplars.containsSome('a', 'z') || exemplars.isEmpty()) {
             exemplars.addAll('a', 'z');
         }
         if (exemplars.containsSome(0xAC00, 0xD7A3)) {  // Hangul syllables
@@ -531,13 +530,9 @@
             // cut down to small list
             // make use of the fact that Ethiopic is allocated in 8's, where
             // the base is 0 mod 8.
-            UnicodeSet ethiopic = new UnicodeSet("[[:Block=Ethiopic:]&[:Script=Ethiopic:]]");
-            UnicodeSetIterator it = new UnicodeSetIterator(ethiopic);
-            while (it.next() && it.codepoint != UnicodeSetIterator.IS_STRING) {
-                if ((it.codepoint & 0x7) != 0) {
-                    exemplars.remove(it.codepoint);
-                }
-            }
+            UnicodeSet ethiopic = new UnicodeSet("[ሀለሐመሠረሰሸቀቈቐቘበቨተቸኀኈነኘአከኰኸዀወዐዘዠየደዸጀገጐጘጠጨጰጸፀፈፐፘ]");
+            ethiopic.retainAll(exemplars);
+            exemplars.remove('ሀ', 0x137F).addAll(ethiopic);
         }
 
         // Upper-case any that aren't already so.
diff --git a/android_icu4j/src/main/java/android/icu/text/BreakIterator.java b/android_icu4j/src/main/java/android/icu/text/BreakIterator.java
index 3e391f6..e9a3d24 100644
--- a/android_icu4j/src/main/java/android/icu/text/BreakIterator.java
+++ b/android_icu4j/src/main/java/android/icu/text/BreakIterator.java
@@ -423,14 +423,13 @@
 
     /**
      * For RuleBasedBreakIterators, return the status tag from the
-     * break rule that determined the most recently
-     * returned break position.
+     * break rule that determined the boundary at the current iteration position.
      * <p>
      * For break iterator types that do not support a rule status,
      * a default value of 0 is returned.
      * <p>
-     * @return The status from the break rule that determined the most recently
-     *         returned break position.
+     * @return The status from the break rule that determined the boundary
+     * at the current iteration position.
      */
 
     public int  getRuleStatus() {
@@ -439,7 +438,7 @@
 
     /**
      * For RuleBasedBreakIterators, get the status (tag) values from the break rule(s)
-     * that determined the most recently returned break position.
+     * that determined the the boundary at the current iteration position.
      * <p>
      * For break iterator types that do not support rule status,
      * no values are returned.
@@ -450,7 +449,7 @@
      *
      * @param fillInArray an array to be filled in with the status values.
      * @return          The number of rule status values from rules that determined
-     *                  the most recent boundary returned by the break iterator.
+     *                  the the boundary at the current iteration position.
      *                  In the event that the array is too small, the return value
      *                  is the total number of status values that were available,
      *                  not the reduced number that were actually returned.
@@ -834,10 +833,6 @@
 
         BreakIteratorCache cache = new BreakIteratorCache(where, result);
         iterCache[kind] = CacheValue.getInstance(cache);
-        if (result instanceof RuleBasedBreakIterator) {
-            RuleBasedBreakIterator rbbi = (RuleBasedBreakIterator)result;
-            rbbi.setBreakType(kind);
-        }
 
         return result;
     }
diff --git a/android_icu4j/src/main/java/android/icu/text/BreakIteratorFactory.java b/android_icu4j/src/main/java/android/icu/text/BreakIteratorFactory.java
index c8a022e..fb80659 100644
--- a/android_icu4j/src/main/java/android/icu/text/BreakIteratorFactory.java
+++ b/android_icu4j/src/main/java/android/icu/text/BreakIteratorFactory.java
@@ -162,7 +162,6 @@
         // TODO: Determine valid and actual locale correctly.
         ULocale uloc = ULocale.forLocale(rb.getLocale());
         iter.setLocale(uloc, uloc);
-        iter.setBreakType(kind);
 
         // filtered break
         if (kind == BreakIterator.KIND_SENTENCE) {
diff --git a/android_icu4j/src/main/java/android/icu/text/BurmeseBreakEngine.java b/android_icu4j/src/main/java/android/icu/text/BurmeseBreakEngine.java
index 621af60..1fdc103 100644
--- a/android_icu4j/src/main/java/android/icu/text/BurmeseBreakEngine.java
+++ b/android_icu4j/src/main/java/android/icu/text/BurmeseBreakEngine.java
@@ -62,7 +62,6 @@
     }
 
     public BurmeseBreakEngine() throws IOException {
-        super(BreakIterator.KIND_WORD, BreakIterator.KIND_LINE);
         setCharacters(fBurmeseWordSet);
         // Initialize dictionary
         fDictionary = DictionaryData.loadDictionaryFor("Mymr");
@@ -81,12 +80,9 @@
     }
 
     @Override
-    public boolean handles(int c, int breakType) {
-        if (breakType == BreakIterator.KIND_WORD || breakType == BreakIterator.KIND_LINE) {
-            int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
-            return (script == UScript.MYANMAR);
-        }
-        return false;
+    public boolean handles(int c) {
+        int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
+        return (script == UScript.MYANMAR);
     }
 
     @Override
diff --git a/android_icu4j/src/main/java/android/icu/text/CaseMap.java b/android_icu4j/src/main/java/android/icu/text/CaseMap.java
index eb1d6e6..0c4b8c0 100644
--- a/android_icu4j/src/main/java/android/icu/text/CaseMap.java
+++ b/android_icu4j/src/main/java/android/icu/text/CaseMap.java
@@ -17,7 +17,6 @@
  * This class is not intended for public subclassing.
  *
  * @hide Only a subset of ICU is exposed in Android
- * @hide draft / provisional / internal are hidden on Android
  */
 public abstract class CaseMap {
     /**
@@ -38,22 +37,18 @@
 
     /**
      * @return Lowercasing object with default options.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public static Lower toLower() { return Lower.DEFAULT; }
     /**
      * @return Uppercasing object with default options.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public static Upper toUpper() { return Upper.DEFAULT; }
     /**
      * @return Titlecasing object with default options.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public static Title toTitle() { return Title.DEFAULT; }
     /**
      * @return Case folding object with default options.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public static Fold fold() { return Fold.DEFAULT; }
 
@@ -62,7 +57,6 @@
      * omits unchanged text when case-mapping with {@link Edits}.
      *
      * @return an options object with this option.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public abstract CaseMap omitUnchangedText();
 
@@ -70,7 +64,6 @@
      * Lowercasing options and methods. Immutable.
      *
      * @see #toLower()
-     * @hide draft / provisional / internal are hidden on Android
      */
     public static final class Lower extends CaseMap {
         private static final Lower DEFAULT = new Lower(0);
@@ -79,7 +72,6 @@
 
         /**
          * {@inheritDoc}
-         * @hide draft / provisional / internal are hidden on Android
          */
         @Override
         public Lower omitUnchangedText() {
@@ -118,7 +110,6 @@
          * @return dest with the result string (or only changes) appended.
          *
          * @see UCharacter#toLowerCase(Locale, String)
-         * @hide draft / provisional / internal are hidden on Android
          */
          public <A extends Appendable> A apply(
                  Locale locale, CharSequence src, A dest, Edits edits) {
@@ -130,7 +121,6 @@
      * Uppercasing options and methods. Immutable.
      *
      * @see #toUpper()
-     * @hide draft / provisional / internal are hidden on Android
      */
     public static final class Upper extends CaseMap {
         private static final Upper DEFAULT = new Upper(0);
@@ -139,7 +129,6 @@
 
         /**
          * {@inheritDoc}
-         * @hide draft / provisional / internal are hidden on Android
          */
         @Override
         public Upper omitUnchangedText() {
@@ -178,7 +167,6 @@
          * @return dest with the result string (or only changes) appended.
          *
          * @see UCharacter#toUpperCase(Locale, String)
-         * @hide draft / provisional / internal are hidden on Android
          */
          public <A extends Appendable> A apply(
                  Locale locale, CharSequence src, A dest, Edits edits) {
@@ -190,7 +178,6 @@
      * Titlecasing options and methods. Immutable.
      *
      * @see #toTitle()
-     * @hide draft / provisional / internal are hidden on Android
      */
     public static final class Title extends CaseMap {
         private static final Title DEFAULT = new Title(0);
@@ -233,7 +220,6 @@
 
         /**
          * {@inheritDoc}
-         * @hide draft / provisional / internal are hidden on Android
          */
         @Override
         public Title omitUnchangedText() {
@@ -255,7 +241,6 @@
          * @return an options object with this option.
          * @see UCharacter#TITLECASE_NO_LOWERCASE
          * @see #adjustToCased()
-         * @hide draft / provisional / internal are hidden on Android
          */
         public Title noLowercase() {
             return new Title(internalOptions | UCharacter.TITLECASE_NO_LOWERCASE);
@@ -274,7 +259,6 @@
          *
          * @return an options object with this option.
          * @see UCharacter#TITLECASE_NO_BREAK_ADJUSTMENT
-         * @hide draft / provisional / internal are hidden on Android
          */
         public Title noBreakAdjustment() {
             return new Title(CaseMapImpl.addTitleAdjustmentOption(
@@ -360,7 +344,6 @@
          * @return dest with the result string (or only changes) appended.
          *
          * @see UCharacter#toTitleCase(Locale, String, BreakIterator, int)
-         * @hide draft / provisional / internal are hidden on Android
          */
          public <A extends Appendable> A apply(
                  Locale locale, BreakIterator iter, CharSequence src, A dest, Edits edits) {
@@ -378,7 +361,6 @@
      * Case folding options and methods. Immutable.
      *
      * @see #fold()
-     * @hide draft / provisional / internal are hidden on Android
      */
     public static final class Fold extends CaseMap {
         private static final Fold DEFAULT = new Fold(0);
@@ -390,7 +372,6 @@
 
         /**
          * {@inheritDoc}
-         * @hide draft / provisional / internal are hidden on Android
          */
         @Override
         public Fold omitUnchangedText() {
@@ -408,7 +389,6 @@
          *
          * @return an options object with this option.
          * @see UCharacter#FOLD_CASE_EXCLUDE_SPECIAL_I
-         * @hide draft / provisional / internal are hidden on Android
          */
         public Fold turkic() {
             return (internalOptions & CaseMapImpl.OMIT_UNCHANGED_TEXT) == 0 ?
@@ -449,7 +429,6 @@
          * @return dest with the result string (or only changes) appended.
          *
          * @see UCharacter#foldCase(String, int)
-         * @hide draft / provisional / internal are hidden on Android
          */
          public <A extends Appendable> A apply(CharSequence src, A dest, Edits edits) {
              return CaseMapImpl.fold(internalOptions, src, dest, edits);
diff --git a/android_icu4j/src/main/java/android/icu/text/CjkBreakEngine.java b/android_icu4j/src/main/java/android/icu/text/CjkBreakEngine.java
index a491ec2..f26fc77 100644
--- a/android_icu4j/src/main/java/android/icu/text/CjkBreakEngine.java
+++ b/android_icu4j/src/main/java/android/icu/text/CjkBreakEngine.java
@@ -39,7 +39,6 @@
     private DictionaryMatcher fDictionary = null;
 
     public CjkBreakEngine(boolean korean) throws IOException {
-        super(BreakIterator.KIND_WORD);
         fDictionary = DictionaryData.loadDictionaryFor("Hira");
         if (korean) {
             setCharacters(fHangulWordSet);
@@ -103,7 +102,7 @@
         boolean isNormalized = Normalizer.quickCheck(prenormstr, Normalizer.NFKC) == Normalizer.YES ||
                                Normalizer.isNormalized(prenormstr, Normalizer.NFKC, 0);
         CharacterIterator text;
-        int numChars = 0;
+        int numCodePts = 0;
         if (isNormalized) {
             text = new java.text.StringCharacterIterator(prenormstr);
             int index = 0;
@@ -111,8 +110,8 @@
             while (index < prenormstr.length()) {
                 int codepoint = prenormstr.codePointAt(index);
                 index += Character.charCount(codepoint);
-                numChars++;
-                charPositions[numChars] = index;
+                numCodePts++;
+                charPositions[numCodePts] = index;
             }
         } else {
             String normStr = Normalizer.normalize(prenormstr, Normalizer.NFKC);
@@ -123,37 +122,43 @@
             charPositions[0] = 0;
             while (index < normalizer.endIndex()) {
                 normalizer.next();
-                numChars++;
+                numCodePts++;
                 index = normalizer.getIndex();
-                charPositions[numChars] = index;
+                charPositions[numCodePts] = index;
             }
         }
 
         // From here on out, do the algorithm. Note that our indices
         // refer to indices within the normalized string.
-        int[] bestSnlp = new int[numChars + 1];
+        int[] bestSnlp = new int[numCodePts + 1];
         bestSnlp[0] = 0;
-        for (int i = 1; i <= numChars; i++) {
+        for (int i = 1; i <= numCodePts; i++) {
             bestSnlp[i] = kint32max;
         }
 
-        int[] prev = new int[numChars + 1];
-        for (int i = 0; i <= numChars; i++) {
+        int[] prev = new int[numCodePts + 1];
+        for (int i = 0; i <= numCodePts; i++) {
             prev[i] = -1;
         }
 
         final int maxWordSize = 20;
-        int values[] = new int[numChars];
-        int lengths[] = new int[numChars];
+        int values[] = new int[numCodePts];
+        int lengths[] = new int[numCodePts];
         // dynamic programming to find the best segmentation
+
+        // In outer loop, i  is the code point index,
+        //                ix is the corresponding code unit index.
+        //    They differ when the string contains supplementary characters.
+        int ix = 0;
+        text.setIndex(ix);
         boolean is_prev_katakana = false;
-        for (int i = 0; i < numChars; i++) {
-            text.setIndex(i);
+        for (int i = 0; i < numCodePts; i++, text.setIndex(ix), next32(text)) {
+            ix = text.getIndex();
             if (bestSnlp[i] == kint32max) {
                 continue;
             }
 
-            int maxSearchLength = (i + maxWordSize < numChars) ? maxWordSize : (numChars - i);
+            int maxSearchLength = (i + maxWordSize < numCodePts) ? maxWordSize : (numCodePts - i);
             int[] count_ = new int[1];
             fDictionary.matches(text, maxSearchLength, lengths, count_, maxSearchLength, values);
             int count = count_[0];
@@ -163,7 +168,7 @@
             // with the highest value possible (i.e. the least likely to occur).
             // Exclude Korean characters from this treatment, as they should be
             // left together by default.
-            text.setIndex(i);  // fDictionary.matches() advances the text position; undo that.
+            text.setIndex(ix);  // fDictionary.matches() advances the text position; undo that.
             if ((count == 0 || lengths[0] != 1) && current32(text) != DONE32 && !fHangulWordSet.contains(current32(text))) {
                 values[count] = maxSnlp;
                 lengths[count] = 1;
@@ -187,7 +192,7 @@
             if (!is_prev_katakana && is_katakana) {
                 int j = i + 1;
                 next32(text);
-                while (j < numChars && (j - i) < kMaxKatakanaGroupLength && isKatakana(current32(text))) {
+                while (j < numCodePts && (j - i) < kMaxKatakanaGroupLength && isKatakana(current32(text))) {
                     next32(text);
                     ++j;
                 }
@@ -203,13 +208,13 @@
             is_prev_katakana = is_katakana;
         }
 
-        int t_boundary[] = new int[numChars + 1];
+        int t_boundary[] = new int[numCodePts + 1];
         int numBreaks = 0;
-        if (bestSnlp[numChars] == kint32max) {
-            t_boundary[numBreaks] = numChars;
+        if (bestSnlp[numCodePts] == kint32max) {
+            t_boundary[numBreaks] = numCodePts;
             numBreaks++;
         } else {
-            for (int i = numChars; i > 0; i = prev[i]) {
+            for (int i = numCodePts; i > 0; i = prev[i]) {
                 t_boundary[numBreaks] = i;
                 numBreaks++;
             }
diff --git a/android_icu4j/src/main/java/android/icu/text/CompactDecimalFormat.java b/android_icu4j/src/main/java/android/icu/text/CompactDecimalFormat.java
index aa92e2f..03bac88 100644
--- a/android_icu4j/src/main/java/android/icu/text/CompactDecimalFormat.java
+++ b/android_icu4j/src/main/java/android/icu/text/CompactDecimalFormat.java
@@ -14,10 +14,19 @@
 import java.util.Locale;
 
 import android.icu.impl.number.DecimalFormatProperties;
+import android.icu.number.NumberFormatter;
 import android.icu.util.CurrencyAmount;
 import android.icu.util.ULocale;
 
 /**
+ * Formats numbers in compact (abbreviated) notation, like "1.2K" instead of "1200".
+ *
+ * <p>
+ * <strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * {@link NumberFormatter} fits their use case.  Although not deprecated, this
+ * class, CompactDecimalFormat, is provided for backwards compatibility only.
+ * <hr>
+ *
  * The CompactDecimalFormat produces abbreviated numbers, suitable for display in environments will
  * limited real estate. For example, 'Hits: 1.2B' instead of 'Hits: 1,200,000,000'. The format will
  * be appropriate for the given language, such as "1,2 Mrd." for German.
@@ -64,6 +73,9 @@
   }
 
   /**
+   * <strong>NOTE:</strong> New users are strongly encouraged to use
+   * {@link NumberFormatter} instead of NumberFormat.
+   * <hr>
    * Creates a CompactDecimalFormat appropriate for a locale. The result may be affected by the
    * number system in the locale, such as ar-u-nu-latn.
    *
@@ -75,6 +87,9 @@
   }
 
   /**
+   * <strong>NOTE:</strong> New users are strongly encouraged to use
+   * {@link NumberFormatter} instead of NumberFormat.
+   * <hr>
    * Creates a CompactDecimalFormat appropriate for a locale. The result may be affected by the
    * number system in the locale, such as ar-u-nu-latn.
    *
diff --git a/android_icu4j/src/main/java/android/icu/text/CurrencyDisplayNames.java b/android_icu4j/src/main/java/android/icu/text/CurrencyDisplayNames.java
index 040e91b..9ee3fdf 100644
--- a/android_icu4j/src/main/java/android/icu/text/CurrencyDisplayNames.java
+++ b/android_icu4j/src/main/java/android/icu/text/CurrencyDisplayNames.java
@@ -107,16 +107,29 @@
 
     /**
      * Returns the symbol for the currency with the provided ISO code.  If
-     * there is no data for the ISO code, substitutes isoCode or returns null.
+     * there is no data for the ISO code, substitutes isoCode, or returns null
+     * if noSubstitute was set in the factory method.
      *
      * @param isoCode the three-letter ISO code.
-     * @return the display name.
+     * @return the symbol.
      */
     public abstract String getSymbol(String isoCode);
 
     /**
+     * Returns the narrow symbol for the currency with the provided ISO code.
+     * If there is no data for narrow symbol, substitutes isoCode, or returns
+     * null if noSubstitute was set in the factory method.
+     *
+     * @param isoCode the three-letter ISO code.
+     * @return the narrow symbol.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    public abstract String getNarrowSymbol(String isoCode);
+
+    /**
      * Returns the 'long name' for the currency with the provided ISO code.
-     * If there is no data for the ISO code, substitutes isoCode or returns null.
+     * If there is no data for the ISO code, substitutes isoCode, or returns null
+     * if noSubstitute was set in the factory method.
      *
      * @param isoCode the three-letter ISO code
      * @return the display name
diff --git a/android_icu4j/src/main/java/android/icu/text/CurrencyFormat.java b/android_icu4j/src/main/java/android/icu/text/CurrencyFormat.java
index 850478d..2726eea 100644
--- a/android_icu4j/src/main/java/android/icu/text/CurrencyFormat.java
+++ b/android_icu4j/src/main/java/android/icu/text/CurrencyFormat.java
@@ -18,16 +18,14 @@
 import java.text.ParsePosition;
 
 import android.icu.util.CurrencyAmount;
-import android.icu.util.Measure;
 import android.icu.util.ULocale;
 
 /**
- * Temporary internal concrete subclass of MeasureFormat implementing
- * parsing and formatting of CurrencyAmount objects.  This class is
- * likely to be redesigned and rewritten in the near future.
+ * Temporary internal concrete subclass of MeasureFormat implementing parsing and formatting of
+ * CurrencyAmount objects. This class is likely to be redesigned and rewritten in the near future.
  *
- * <p>This class currently delegates to DecimalFormat for parsing and
- * formatting.
+ * <p>
+ * This class currently delegates to DecimalFormat for parsing and formatting.
  *
  * @see android.icu.text.UFormat
  * @see android.icu.text.DecimalFormat
@@ -36,88 +34,42 @@
 class CurrencyFormat extends MeasureFormat {
     // Generated by serialver from JDK 1.4.1_01
     static final long serialVersionUID = -931679363692504634L;
-    
-    private NumberFormat fmt;
-    private transient final MeasureFormat mf;
 
     public CurrencyFormat(ULocale locale) {
-        // Needed for getLocale(ULocale.VALID_LOCALE).
-        setLocale(locale, locale);
-        mf = MeasureFormat.getInstance(locale, FormatWidth.WIDE);
-        fmt = NumberFormat.getCurrencyInstance(locale.toLocale());
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Object clone() {
-        CurrencyFormat result = (CurrencyFormat) super.clone();
-        result.fmt = (NumberFormat) fmt.clone();
-        return result;
+        super(locale, FormatWidth.DEFAULT_CURRENCY);
     }
 
     /**
      * Override Format.format().
+     *
      * @see java.text.Format#format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition)
      */
+    @Override
     public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
         if (!(obj instanceof CurrencyAmount)) {
             throw new IllegalArgumentException("Invalid type: " + obj.getClass().getName());
         }
-        CurrencyAmount currency = (CurrencyAmount) obj;
-            
-        fmt.setCurrency(currency.getCurrency());
-        return fmt.format(currency.getNumber(), toAppendTo, pos);
+        return super.format(obj, toAppendTo, pos);
     }
 
     /**
      * Override Format.parseObject().
+     *
      * @see java.text.Format#parseObject(java.lang.String, java.text.ParsePosition)
      */
     @Override
     public CurrencyAmount parseObject(String source, ParsePosition pos) {
-        return fmt.parseCurrency(source, pos);
+        return getNumberFormatInternal().parseCurrency(source, pos);
     }
-    
-    // boilerplate code to make CurrencyFormat otherwise follow the contract of
-    // MeasureFormat
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public StringBuilder formatMeasures(
-            StringBuilder appendTo, FieldPosition fieldPosition, Measure... measures) {
-        return mf.formatMeasures(appendTo, fieldPosition, measures);
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public MeasureFormat.FormatWidth getWidth() {
-        return mf.getWidth();
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public NumberFormat getNumberFormat() {
-        return mf.getNumberFormat();
-    }
-    
-    // End boilerplate.
-    
+
     // Serialization
-    
+
     private Object writeReplace() throws ObjectStreamException {
-        return mf.toCurrencyProxy();
+        return toCurrencyProxy();
     }
-    
+
     // Preserve backward serialize backward compatibility.
     private Object readResolve() throws ObjectStreamException {
-        return new CurrencyFormat(fmt.getLocale(ULocale.ACTUAL_LOCALE));
+        return new CurrencyFormat(getLocale(ULocale.ACTUAL_LOCALE));
     }
 }
diff --git a/android_icu4j/src/main/java/android/icu/text/CurrencyPluralInfo.java b/android_icu4j/src/main/java/android/icu/text/CurrencyPluralInfo.java
index eaf2ccc..f14d3f4 100644
--- a/android_icu4j/src/main/java/android/icu/text/CurrencyPluralInfo.java
+++ b/android_icu4j/src/main/java/android/icu/text/CurrencyPluralInfo.java
@@ -243,7 +243,7 @@
      * @hide draft / provisional / internal are hidden on Android
      */
     @Deprecated
-    String select(PluralRules.FixedDecimal numberInfo) {
+    public String select(PluralRules.FixedDecimal numberInfo) {
         return pluralRules.select(numberInfo);
     }
 
@@ -251,8 +251,11 @@
      * Currency plural pattern iterator.
      *
      * @return a iterator on the currency plural pattern key set.
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
      */
-    Iterator<String> pluralPatternIterator() {
+    @Deprecated
+    public Iterator<String> pluralPatternIterator() {
         return pluralCountToCurrencyUnitPattern.keySet().iterator();
     }
 
diff --git a/android_icu4j/src/main/java/android/icu/text/DateTimePatternGenerator.java b/android_icu4j/src/main/java/android/icu/text/DateTimePatternGenerator.java
index 74fbd23..2314352 100644
--- a/android_icu4j/src/main/java/android/icu/text/DateTimePatternGenerator.java
+++ b/android_icu4j/src/main/java/android/icu/text/DateTimePatternGenerator.java
@@ -213,13 +213,22 @@
         public void put(UResource.Key key, UResource.Value value, boolean noFallback) {
             UResource.Table itemsTable = value.getTable();
             for (int i = 0; itemsTable.getKeyAndValue(i, key, value); ++i) {
-                int field = getCLDRFieldNumber(key);
-                if (field == -1) { continue; }
+                if (value.getType() != UResourceBundle.TABLE) {
+                    // Typically get either UResourceBundle.TABLE = 2 or ICUResourceBundle.ALIAS = 3.
+                    // Currently fillInMissing() is being used instead of following the ALIAS, so
+                    // skip ALIAS entries which cause UResourceTypeMismatchException in the line
+                    // UResource.Table detailsTable = value.getTable()
+                    continue;
+                }
+                int fieldAndWidth = getCLDRFieldAndWidthNumber(key);
+                if (fieldAndWidth == -1) { continue; }
+                int field = fieldAndWidth / DisplayWidth.COUNT;
+                DisplayWidth width = CLDR_FIELD_WIDTH[fieldAndWidth % DisplayWidth.COUNT];
                 UResource.Table detailsTable = value.getTable();
                 for (int j = 0; detailsTable.getKeyAndValue(j, key, value); ++j) {
                     if (!key.contentEquals("dn")) continue;
-                    if (getAppendItemName(field) == null) {
-                        setAppendItemName(field, value.toString());
+                    if (getFieldDisplayName(field, width) == null) {
+                        setFieldDisplayName(field, width, value.toString());
                     }
                     break;
                 }
@@ -232,10 +241,16 @@
             if (getAppendItemFormat(i) == null) {
                 setAppendItemFormat(i, "{0} \u251C{2}: {1}\u2524");
             }
-            if (getAppendItemName(i) == null) {
-                setAppendItemName(i, "F" + i);
+            if (getFieldDisplayName(i, DisplayWidth.WIDE) == null) {
+                setFieldDisplayName(i, DisplayWidth.WIDE, "F" + i);
             }
-        }
+            if (getFieldDisplayName(i, DisplayWidth.ABBREVIATED) == null) {
+                setFieldDisplayName(i, DisplayWidth.ABBREVIATED, getFieldDisplayName(i, DisplayWidth.WIDE));
+            }
+            if (getFieldDisplayName(i, DisplayWidth.NARROW) == null) {
+                setFieldDisplayName(i, DisplayWidth.NARROW, getFieldDisplayName(i, DisplayWidth.ABBREVIATED));
+            }
+       }
     }
 
     private class AvailableFormatsSink extends UResource.Sink {
@@ -504,10 +519,13 @@
         return -1;
     }
 
-    private static int getCLDRFieldNumber(UResource.Key key) {
+    private static int getCLDRFieldAndWidthNumber(UResource.Key key) {
         for (int i = 0; i < CLDR_FIELD_NAME.length; ++i) {
-            if (key.contentEquals(CLDR_FIELD_NAME[i])) {
-                return i;
+            for (int j = 0; j < DisplayWidth.COUNT; ++j) {
+                String fullKey = CLDR_FIELD_NAME[i].concat(CLDR_FIELD_WIDTH[j].cldrKey());
+                if (key.contentEquals(fullKey)) {
+                    return i * DisplayWidth.COUNT + j;
+                }
             }
         }
         return -1;
@@ -1069,6 +1087,52 @@
     @Deprecated
     public static final int TYPE_LIMIT = 16;
 
+    /**
+     * Field display name width constants for getFieldDisplayName
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    public enum DisplayWidth {
+        /**
+         * The full field name
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        WIDE(""),
+        /**
+         * An abbreviated field name
+         * (may be the same as the wide version, if short enough)
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        ABBREVIATED("-short"),
+        /**
+         * The shortest possible field name
+         * (may be the same as the abbreviated version)
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        NARROW("-narrow");
+        /**
+         * The count of available widths
+         * @deprecated This API is ICU internal only.
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        @Deprecated
+        private static int COUNT = DisplayWidth.values().length;
+        private final String cldrKey;
+        DisplayWidth(String cldrKey) {
+            this.cldrKey = cldrKey;
+        }
+        private String cldrKey() {
+            return cldrKey;
+        }
+    }
+
+    /**
+     * The field name width for use in appendItems
+     */
+    private static final DisplayWidth APPENDITEM_WIDTH = DisplayWidth.WIDE;
+    private static final int APPENDITEM_WIDTH_INT = APPENDITEM_WIDTH.ordinal();
+    private static final DisplayWidth[] CLDR_FIELD_WIDTH = DisplayWidth.values();
+
+
     // Option masks for getBestPattern, replaceFieldTypes (individual masks may be ORed together)
 
     /**
@@ -1155,19 +1219,54 @@
      * @param value The value to set the item to.
      */
     public void setAppendItemName(int field, String value) {
-        checkFrozen();
-        appendItemNames[field] = value;
+        setFieldDisplayName(field, APPENDITEM_WIDTH, value);
     }
 
     /**
-     * Getter corresponding to setAppendItemNames. Values below 0 or at or above
-     * TYPE_LIMIT are illegal arguments.
+     * Getter corresponding to setAppendItemName. Values below 0 or at or above
+     * TYPE_LIMIT are illegal arguments. Note: The more general method
+     * for getting date/time field display names is getFieldDisplayName.
      *
      * @param field The index to get the append item name.
      * @return name for field
+     * @see #getFieldDisplayName(int, DisplayWidth)
      */
     public String getAppendItemName(int field) {
-        return appendItemNames[field];
+        return getFieldDisplayName(field, APPENDITEM_WIDTH);
+    }
+
+    /**
+     * The private interface to set a display name for a particular date/time field,
+     * in one of several possible display widths.
+     *
+     * @param field The field type, such as ERA.
+     * @param width The desired DisplayWidth, such as DisplayWidth.ABBREVIATED.
+     * @param value The display name to set
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    private void setFieldDisplayName(int field, DisplayWidth width, String value) {
+        checkFrozen();
+        if (field < TYPE_LIMIT && field >= 0) {
+            fieldDisplayNames[field][width.ordinal()] = value;
+        }
+    }
+
+    /**
+     * The general interface to get a display name for a particular date/time field,
+     * in one of several possible display widths.
+     *
+     * @param field The field type, such as ERA.
+     * @param width The desired DisplayWidth, such as DisplayWidth.ABBREVIATED.
+     * @return.     The display name for the field
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    public String getFieldDisplayName(int field, DisplayWidth width) {
+        if (field >= TYPE_LIMIT || field < 0) {
+            return "";
+        }
+        return fieldDisplayNames[field][width.ordinal()];
     }
 
     /**
@@ -1251,7 +1350,7 @@
             result.skeleton2pattern = (TreeMap<DateTimeMatcher, PatternWithSkeletonFlag>) skeleton2pattern.clone();
             result.basePattern_pattern = (TreeMap<String, PatternWithSkeletonFlag>) basePattern_pattern.clone();
             result.appendItemFormats = appendItemFormats.clone();
-            result.appendItemNames = appendItemNames.clone();
+            result.fieldDisplayNames = fieldDisplayNames.clone();
             result.current = new DateTimeMatcher();
             result.fp = new FormatParser();
             result._distanceInfo = new DistanceInfo();
@@ -1770,7 +1869,7 @@
     private String decimal = "?";
     private String dateTimeFormat = "{1} {0}";
     private String[] appendItemFormats = new String[TYPE_LIMIT];
-    private String[] appendItemNames = new String[TYPE_LIMIT];
+    private String[][] fieldDisplayNames = new String[TYPE_LIMIT][DisplayWidth.COUNT];
     private char defaultHourFormatChar = 'H';
     //private boolean chineseMonthHack = false;
     //private boolean isComplete = false;
@@ -1831,7 +1930,7 @@
     }
 
     private String getAppendName(int foundMask) {
-        return "'" + appendItemNames[foundMask] + "'";
+        return "'" + fieldDisplayNames[foundMask][APPENDITEM_WIDTH_INT] + "'";
     }
     private String getAppendFormat(int foundMask) {
         return appendItemFormats[foundMask];
diff --git a/android_icu4j/src/main/java/android/icu/text/DecimalFormat.java b/android_icu4j/src/main/java/android/icu/text/DecimalFormat.java
index 2dbb11b..cf9b482 100644
--- a/android_icu4j/src/main/java/android/icu/text/DecimalFormat.java
+++ b/android_icu4j/src/main/java/android/icu/text/DecimalFormat.java
@@ -11,15 +11,16 @@
 import java.math.RoundingMode;
 import java.text.AttributedCharacterIterator;
 import java.text.FieldPosition;
-import java.text.ParseException;
 import java.text.ParsePosition;
 
 import android.icu.impl.number.AffixUtils;
 import android.icu.impl.number.DecimalFormatProperties;
 import android.icu.impl.number.Padder.PadPosition;
-import android.icu.impl.number.Parse;
 import android.icu.impl.number.PatternStringParser;
 import android.icu.impl.number.PatternStringUtils;
+import android.icu.impl.number.parse.NumberParserImpl;
+import android.icu.impl.number.parse.NumberParserImpl.ParseMode;
+import android.icu.impl.number.parse.ParsedNumber;
 import android.icu.lang.UCharacter;
 import android.icu.math.BigDecimal;
 import android.icu.math.MathContext;
@@ -34,7 +35,15 @@
 import android.icu.util.ULocale.Category;
 
 /**
- * <strong>[icu enhancement]</strong> ICU's replacement for {@link java.text.DecimalFormat}.&nbsp;Methods, fields, and other functionality specific to ICU are labeled '<strong>[icu]</strong>'. <code>DecimalFormat</code> is the primary
+ * <strong>[icu enhancement]</strong> ICU's replacement for {@link java.text.DecimalFormat}.&nbsp;Methods, fields, and other functionality specific to ICU are labeled '<strong>[icu]</strong>'.
+ *
+ * <p>
+ * <strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * {@link NumberFormatter} fits their use case.  Although not deprecated, this
+ * class, DecimalFormat, is only provided for java.text.DecimalFormat compatibility.
+ * <hr>
+ *
+ * <code>DecimalFormat</code> is the primary
  * concrete subclass of {@link NumberFormat}. It has a variety of features designed to make it
  * possible to parse and format numbers in any locale, including support for Western, Arabic, or
  * Indic digits. It supports different flavors of numbers, including integers ("123"), fixed-point
@@ -277,6 +286,9 @@
    */
   transient volatile DecimalFormatProperties exportedProperties;
 
+  transient volatile NumberParserImpl parser;
+  transient volatile NumberParserImpl parserWithCurrency;
+
   //=====================================================================================//
   //                                    CONSTRUCTORS                                     //
   //=====================================================================================//
@@ -763,17 +775,38 @@
    */
   @Override
   public Number parse(String text, ParsePosition parsePosition) {
-    DecimalFormatProperties pprops = threadLocalProperties.get();
-    synchronized (this) {
-      pprops.copyFrom(properties);
-    }
-    // Backwards compatibility: use currency parse mode if this is a currency instance
-    Number result = Parse.parse(text, parsePosition, pprops, symbols);
-    // Backwards compatibility: return android.icu.math.BigDecimal
-    if (result instanceof java.math.BigDecimal) {
-      result = safeConvertBigDecimal((java.math.BigDecimal) result);
-    }
-    return result;
+      if (text == null) {
+          throw new IllegalArgumentException("Text cannot be null");
+      }
+      if (parsePosition == null) {
+          parsePosition = new ParsePosition(0);
+      }
+      if (parsePosition.getIndex() < 0) {
+          throw new IllegalArgumentException("Cannot start parsing at a negative offset");
+      }
+      if (parsePosition.getIndex() >= text.length()) {
+          // For backwards compatibility, this is not an exception, just an empty result.
+          return null;
+      }
+
+      ParsedNumber result = new ParsedNumber();
+      // Note: if this is a currency instance, currencies will be matched despite the fact that we are not in the
+      // parseCurrency method (backwards compatibility)
+      int startIndex = parsePosition.getIndex();
+      parser.parse(text, startIndex, true, result);
+      if (result.success()) {
+          parsePosition.setIndex(result.charEnd);
+          // TODO: Accessing properties here is technically not thread-safe
+          Number number = result.getNumber(properties.getParseToBigDecimal());
+          // Backwards compatibility: return android.icu.math.BigDecimal
+          if (number instanceof java.math.BigDecimal) {
+              number = safeConvertBigDecimal((java.math.BigDecimal) number);
+          }
+          return number;
+      } else {
+          parsePosition.setErrorIndex(startIndex + result.charEnd);
+          return null;
+      }
   }
 
   /**
@@ -781,23 +814,37 @@
    */
   @Override
   public CurrencyAmount parseCurrency(CharSequence text, ParsePosition parsePosition) {
-    try {
-      DecimalFormatProperties pprops = threadLocalProperties.get();
-      synchronized (this) {
-        pprops.copyFrom(properties);
+      if (text == null) {
+          throw new IllegalArgumentException("Text cannot be null");
       }
-      CurrencyAmount result = Parse.parseCurrency(text, parsePosition, pprops, symbols);
-      if (result == null) return null;
-      Number number = result.getNumber();
-      // Backwards compatibility: return android.icu.math.BigDecimal
-      if (number instanceof java.math.BigDecimal) {
-        number = safeConvertBigDecimal((java.math.BigDecimal) number);
-        result = new CurrencyAmount(number, result.getCurrency());
+      if (parsePosition == null) {
+          parsePosition = new ParsePosition(0);
       }
-      return result;
-    } catch (ParseException e) {
-      return null;
-    }
+      if (parsePosition.getIndex() < 0) {
+          throw new IllegalArgumentException("Cannot start parsing at a negative offset");
+      }
+      if (parsePosition.getIndex() >= text.length()) {
+          // For backwards compatibility, this is not an exception, just an empty result.
+          return null;
+      }
+
+      ParsedNumber result = new ParsedNumber();
+      int startIndex = parsePosition.getIndex();
+      parserWithCurrency.parse(text.toString(), startIndex, true, result);
+      if (result.success()) {
+          parsePosition.setIndex(result.charEnd);
+          // TODO: Accessing properties here is technically not thread-safe
+          Number number = result.getNumber(properties.getParseToBigDecimal());
+          // Backwards compatibility: return android.icu.math.BigDecimal
+          if (number instanceof java.math.BigDecimal) {
+              number = safeConvertBigDecimal((java.math.BigDecimal) number);
+          }
+          Currency currency = Currency.getInstance(result.currencyCode);
+          return new CurrencyAmount(number, currency);
+      } else {
+          parsePosition.setErrorIndex(startIndex + result.charEnd);
+          return null;
+      }
   }
 
   //=====================================================================================//
@@ -1937,7 +1984,7 @@
    */
   public synchronized void setParseBigDecimal(boolean value) {
     properties.setParseToBigDecimal(value);
-    // refreshFormatter() not needed
+    refreshFormatter();
   }
 
   /**
@@ -1963,7 +2010,7 @@
    */
   @Override
   public synchronized boolean isParseStrict() {
-    return properties.getParseMode() == Parse.ParseMode.STRICT;
+    return properties.getParseMode() == ParseMode.STRICT;
   }
 
   /**
@@ -1971,9 +2018,9 @@
    */
   @Override
   public synchronized void setParseStrict(boolean parseStrict) {
-    Parse.ParseMode mode = parseStrict ? Parse.ParseMode.STRICT : Parse.ParseMode.LENIENT;
+    ParseMode mode = parseStrict ? ParseMode.STRICT : ParseMode.LENIENT;
     properties.setParseMode(mode);
-    // refreshFormatter() not needed
+    refreshFormatter();
   }
 
   /**
@@ -1998,7 +2045,7 @@
   @Override
   public synchronized void setParseIntegerOnly(boolean parseIntegerOnly) {
     properties.setParseIntegerOnly(parseIntegerOnly);
-    // refreshFormatter() not needed
+    refreshFormatter();
   }
 
   /**
@@ -2275,6 +2322,8 @@
     }
     assert locale != null;
     formatter = NumberFormatter.fromDecimalFormat(properties, symbols, exportedProperties).locale(locale);
+    parser = NumberParserImpl.createParserFromProperties(properties, symbols, false, false);
+    parserWithCurrency = NumberParserImpl.createParserFromProperties(properties, symbols, true, false);
   }
 
   /**
diff --git a/android_icu4j/src/main/java/android/icu/text/DictionaryBreakEngine.java b/android_icu4j/src/main/java/android/icu/text/DictionaryBreakEngine.java
index 9d7d2a5..1012ad5 100644
--- a/android_icu4j/src/main/java/android/icu/text/DictionaryBreakEngine.java
+++ b/android_icu4j/src/main/java/android/icu/text/DictionaryBreakEngine.java
@@ -10,7 +10,6 @@
 package android.icu.text;
 
 import java.text.CharacterIterator;
-import java.util.BitSet;
 
 import android.icu.impl.CharacterIteration;
 
@@ -170,27 +169,21 @@
     }
 
     UnicodeSet fSet = new UnicodeSet();
-    private BitSet fTypes = new BitSet(32);
 
     /**
-     * @param breakTypes The types of break iterators that can use this engine.
-     *  For example, BreakIterator.KIND_LINE
+     *  Constructor
      */
-    public DictionaryBreakEngine(Integer... breakTypes) {
-        for (Integer type: breakTypes) {
-            fTypes.set(type);
-        }
+    public DictionaryBreakEngine() {
     }
 
     @Override
-    public boolean handles(int c, int breakType) {
-        return fTypes.get(breakType) &&  // this type can use us
-                fSet.contains(c);        // we recognize the character
+    public boolean handles(int c) {
+        return fSet.contains(c);        // we recognize the character
     }
 
     @Override
     public int findBreaks(CharacterIterator text, int startPos, int endPos,
-            int breakType, DequeI foundBreaks) {
+            DequeI foundBreaks) {
         int result = 0;
 
          // Find the span of characters included in the set.
@@ -209,8 +202,6 @@
         rangeStart = start;
         rangeEnd = current;
 
-        // if (breakType >= 0 && breakType < 32 && (((uint32_t)1 << breakType) & fTypes)) {
-        // TODO: Why does icu4c have this?
         result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks);
         text.setIndex(current);
 
diff --git a/android_icu4j/src/main/java/android/icu/text/Edits.java b/android_icu4j/src/main/java/android/icu/text/Edits.java
index ed2818f..2212f4e 100644
--- a/android_icu4j/src/main/java/android/icu/text/Edits.java
+++ b/android_icu4j/src/main/java/android/icu/text/Edits.java
@@ -12,7 +12,6 @@
  * Does not support moving/reordering of text.
  *
  * @hide Only a subset of ICU is exposed in Android
- * @hide draft / provisional / internal are hidden on Android
  */
 public final class Edits {
     // 0000uuuuuuuuuuuu records u+1 unchanged text units.
@@ -41,7 +40,6 @@
 
     /**
      * Constructs an empty object.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public Edits() {
         array = new char[STACK_CAPACITY];
@@ -49,7 +47,6 @@
 
     /**
      * Resets the data but may not release memory.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public void reset() {
         length = delta = numChanges = 0;
@@ -65,7 +62,6 @@
     /**
      * Adds a record for an unchanged segment of text.
      * Normally called from inside ICU string transformation functions, not user code.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public void addUnchanged(int unchangedLength) {
         if(unchangedLength < 0) {
@@ -97,7 +93,6 @@
     /**
      * Adds a record for a text replacement/insertion/deletion.
      * Normally called from inside ICU string transformation functions, not user code.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public void addReplace(int oldLength, int newLength) {
         if(oldLength < 0 || newLength < 0) {
@@ -194,12 +189,10 @@
     /**
      * How much longer is the new text compared with the old text?
      * @return new length minus old length
-     * @hide draft / provisional / internal are hidden on Android
      */
     public int lengthDelta() { return delta; }
     /**
      * @return true if there are any change edits
-     * @hide draft / provisional / internal are hidden on Android
      */
     public boolean hasChanges()  { return numChanges != 0; }
 
@@ -213,7 +206,6 @@
      * Access to the list of edits.
      * @see #getCoarseIterator
      * @see #getFineIterator
-     * @hide draft / provisional / internal are hidden on Android
      */
     public static final class Iterator {
         private final char[] array;
@@ -284,7 +276,6 @@
         /**
          * Advances to the next edit.
          * @return true if there is another edit
-         * @hide draft / provisional / internal are hidden on Android
          */
         public boolean next() {
             return next(onlyChanges_);
@@ -503,7 +494,6 @@
          *
          * @param i source index
          * @return true if the edit for the source index was found
-         * @hide draft / provisional / internal are hidden on Android
          */
         public boolean findSourceIndex(int i) {
             return findIndex(i, true) == 0;
@@ -695,35 +685,29 @@
         /**
          * @return true if this edit replaces oldLength() units with newLength() different ones.
          *         false if oldLength units remain unchanged.
-         * @hide draft / provisional / internal are hidden on Android
          */
         public boolean hasChange() { return changed; }
         /**
          * @return the number of units in the original string which are replaced or remain unchanged.
-         * @hide draft / provisional / internal are hidden on Android
          */
         public int oldLength() { return oldLength_; }
         /**
          * @return the number of units in the modified string, if hasChange() is true.
          *         Same as oldLength if hasChange() is false.
-         * @hide draft / provisional / internal are hidden on Android
          */
         public int newLength() { return newLength_; }
 
         /**
          * @return the current index into the source string
-         * @hide draft / provisional / internal are hidden on Android
          */
         public int sourceIndex() { return srcIndex; }
         /**
          * @return the current index into the replacement-characters-only string,
          *         not counting unchanged spans
-         * @hide draft / provisional / internal are hidden on Android
          */
         public int replacementIndex() { return replIndex; }
         /**
          * @return the current index into the full destination string
-         * @hide draft / provisional / internal are hidden on Android
          */
         public int destinationIndex() { return destIndex; }
     };
@@ -732,7 +716,6 @@
      * Returns an Iterator for coarse-grained changes for simple string updates.
      * Skips non-changes.
      * @return an Iterator that merges adjacent changes.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public Iterator getCoarseChangesIterator() {
         return new Iterator(array, length, true, true);
@@ -741,7 +724,6 @@
     /**
      * Returns an Iterator for coarse-grained changes and non-changes for simple string updates.
      * @return an Iterator that merges adjacent changes.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public Iterator getCoarseIterator() {
         return new Iterator(array, length, false, true);
@@ -751,7 +733,6 @@
      * Returns an Iterator for fine-grained changes for modifying styled text.
      * Skips non-changes.
      * @return an Iterator that separates adjacent changes.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public Iterator getFineChangesIterator() {
         return new Iterator(array, length, true, false);
@@ -760,7 +741,6 @@
     /**
      * Returns an Iterator for fine-grained changes and non-changes for modifying styled text.
      * @return an Iterator that separates adjacent changes.
-     * @hide draft / provisional / internal are hidden on Android
      */
     public Iterator getFineIterator() {
         return new Iterator(array, length, false, false);
diff --git a/android_icu4j/src/main/java/android/icu/text/KhmerBreakEngine.java b/android_icu4j/src/main/java/android/icu/text/KhmerBreakEngine.java
index 9bdc4b4..dabaf68 100644
--- a/android_icu4j/src/main/java/android/icu/text/KhmerBreakEngine.java
+++ b/android_icu4j/src/main/java/android/icu/text/KhmerBreakEngine.java
@@ -17,7 +17,7 @@
 import android.icu.lang.UScript;
 
 class KhmerBreakEngine extends DictionaryBreakEngine {
-    
+
     // Constants for KhmerBreakIterator
     // How many words in a row are "good enough"?
     private static final byte KHMER_LOOKAHEAD = 3;
@@ -30,14 +30,14 @@
     private static final byte KHMER_MIN_WORD = 2;
     // Minimum number of characters for two words
     private static final byte KHMER_MIN_WORD_SPAN = KHMER_MIN_WORD * 2;
-    
-    
+
+
     private DictionaryMatcher fDictionary;
     private static UnicodeSet fKhmerWordSet;
     private static UnicodeSet fEndWordSet;
     private static UnicodeSet fBeginWordSet;
     private static UnicodeSet fMarkSet;
-    
+
     static {
         // Initialize UnicodeSets
         fKhmerWordSet = new UnicodeSet();
@@ -57,42 +57,42 @@
         fMarkSet.compact();
         fEndWordSet.compact();
         fBeginWordSet.compact();
-        
+
         // Freeze the static UnicodeSet
         fKhmerWordSet.freeze();
         fMarkSet.freeze();
         fEndWordSet.freeze();
         fBeginWordSet.freeze();
     }
-    
+
     public KhmerBreakEngine() throws IOException {
-        super(BreakIterator.KIND_WORD, BreakIterator.KIND_LINE);
         setCharacters(fKhmerWordSet);
         // Initialize dictionary
         fDictionary = DictionaryData.loadDictionaryFor("Khmr");
     }
 
+    @Override
     public boolean equals(Object obj) {
         // Normally is a singleton, but it's possible to have duplicates
         //   during initialization. All are equivalent.
         return obj instanceof KhmerBreakEngine;
     }
 
+    @Override
     public int hashCode() {
         return getClass().hashCode();
     }
- 
-    public boolean handles(int c, int breakType) {
-        if (breakType == BreakIterator.KIND_WORD || breakType == BreakIterator.KIND_LINE) {
-            int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
-            return (script == UScript.KHMER);
-        }
-        return false;
+
+    @Override
+    public boolean handles(int c) {
+        int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
+        return (script == UScript.KHMER);
     }
 
-    public int divideUpDictionaryRange(CharacterIterator fIter, int rangeStart, int rangeEnd, 
+    @Override
+    public int divideUpDictionaryRange(CharacterIterator fIter, int rangeStart, int rangeEnd,
             DequeI foundBreaks) {
-               
+
         if ((rangeEnd - rangeStart) < KHMER_MIN_WORD_SPAN) {
             return 0;  // Not enough characters for word
         }
@@ -164,7 +164,7 @@
                 // no preceding word, or the non-word shares less than the minimum threshold
                 // of characters with a dictionary word, then scan to resynchronize
                 if (words[wordsFound%KHMER_LOOKAHEAD].candidates(fIter, fDictionary, rangeEnd) <= 0 &&
-                        (wordLength == 0 || 
+                        (wordLength == 0 ||
                                 words[wordsFound%KHMER_LOOKAHEAD].longestPrefix() < KHMER_PREFIX_COMBINE_THRESHOLD)) {
                     // Look for a plausible word boundary
                     int remaining = rangeEnd - (current + wordLength);
@@ -210,7 +210,7 @@
 
             // Look ahead for possible suffixes if a dictionary word does not follow.
             // We do this in code rather than using a rule so that the heuristic
-            // resynch continues to function. For example, one of the suffix characters 
+            // resynch continues to function. For example, one of the suffix characters
             // could be a typo in the middle of a word.
             // NOT CURRENTLY APPLICABLE TO KHMER
 
diff --git a/android_icu4j/src/main/java/android/icu/text/LanguageBreakEngine.java b/android_icu4j/src/main/java/android/icu/text/LanguageBreakEngine.java
index 20e7391..d589048 100644
--- a/android_icu4j/src/main/java/android/icu/text/LanguageBreakEngine.java
+++ b/android_icu4j/src/main/java/android/icu/text/LanguageBreakEngine.java
@@ -18,11 +18,9 @@
 interface LanguageBreakEngine {
     /**
      * @param c A Unicode codepoint value
-     * @param breakType The kind of break iterator that is wanting to make use
-     *  of this engine - character, word, line, sentence
      * @return true if the engine can handle this character, false otherwise
      */
-    boolean handles(int c, int breakType);
+    boolean handles(int c);
 
     /**
      * Implements the actual breaking logic. Find any breaks within a run in the supplied text.
@@ -31,13 +29,11 @@
      * @param startPos The index of the beginning of the range
      * @param endPos The index of the possible end of our range. It is possible,
      *  however, that the range ends earlier
-     * @param breakType The kind of break iterator that is wanting to make use
-     *  of this engine - character, word, line, sentence
      * @param foundBreaks A data structure to receive the break positions.
      * @return the number of breaks found
      */
     int findBreaks(CharacterIterator text, int startPos, int endPos,
-            int breakType, DictionaryBreakEngine.DequeI foundBreaks);
+            DictionaryBreakEngine.DequeI foundBreaks);
 }
 
 
diff --git a/android_icu4j/src/main/java/android/icu/text/LaoBreakEngine.java b/android_icu4j/src/main/java/android/icu/text/LaoBreakEngine.java
index 1ab8e15..4b377a5 100644
--- a/android_icu4j/src/main/java/android/icu/text/LaoBreakEngine.java
+++ b/android_icu4j/src/main/java/android/icu/text/LaoBreakEngine.java
@@ -17,7 +17,7 @@
 import android.icu.lang.UScript;
 
 class LaoBreakEngine extends DictionaryBreakEngine {
-    
+
     // Constants for LaoBreakIterator
     // How many words in a row are "good enough"?
     private static final byte LAO_LOOKAHEAD = 3;
@@ -28,13 +28,13 @@
     private static final byte LAO_PREFIX_COMBINE_THRESHOLD = 3;
     // Minimum word size
     private static final byte LAO_MIN_WORD = 2;
-    
+
     private DictionaryMatcher fDictionary;
     private static UnicodeSet fLaoWordSet;
     private static UnicodeSet fEndWordSet;
     private static UnicodeSet fBeginWordSet;
     private static UnicodeSet fMarkSet;
-    
+
     static {
         // Initialize UnicodeSets
         fLaoWordSet = new UnicodeSet();
@@ -56,43 +56,43 @@
         fMarkSet.compact();
         fEndWordSet.compact();
         fBeginWordSet.compact();
-        
+
         // Freeze the static UnicodeSet
         fLaoWordSet.freeze();
         fMarkSet.freeze();
         fEndWordSet.freeze();
         fBeginWordSet.freeze();
     }
-    
+
     public LaoBreakEngine() throws IOException {
-        super(BreakIterator.KIND_WORD, BreakIterator.KIND_LINE);
         setCharacters(fLaoWordSet);
         // Initialize dictionary
         fDictionary = DictionaryData.loadDictionaryFor("Laoo");
     }
 
+    @Override
     public boolean equals(Object obj) {
         // Normally is a singleton, but it's possible to have duplicates
         //   during initialization. All are equivalent.
         return obj instanceof LaoBreakEngine;
     }
 
+    @Override
     public int hashCode() {
         return getClass().hashCode();
     }
-    
-    public boolean handles(int c, int breakType) {
-        if (breakType == BreakIterator.KIND_WORD || breakType == BreakIterator.KIND_LINE) {
-            int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
-            return (script == UScript.LAO);
-        }
-        return false;
+
+    @Override
+    public boolean handles(int c) {
+        int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
+        return (script == UScript.LAO);
     }
 
+    @Override
     public int divideUpDictionaryRange(CharacterIterator fIter, int rangeStart, int rangeEnd,
             DequeI foundBreaks) {
-        
-        
+
+
         if ((rangeEnd - rangeStart) < LAO_MIN_WORD) {
             return 0;  // Not enough characters for word
         }
@@ -163,7 +163,7 @@
                 // no preceding word, or the non-word shares less than the minimum threshold
                 // of characters with a dictionary word, then scan to resynchronize
                 if (words[wordsFound%LAO_LOOKAHEAD].candidates(fIter, fDictionary, rangeEnd) <= 0 &&
-                        (wordLength == 0 || 
+                        (wordLength == 0 ||
                                 words[wordsFound%LAO_LOOKAHEAD].longestPrefix() < LAO_PREFIX_COMBINE_THRESHOLD)) {
                     // Look for a plausible word boundary
                     int remaining = rangeEnd - (current + wordLength);
@@ -209,7 +209,7 @@
 
             // Look ahead for possible suffixes if a dictionary word does not follow.
             // We do this in code rather than using a rule so that the heuristic
-            // resynch continues to function. For example, one of the suffix characters 
+            // resynch continues to function. For example, one of the suffix characters
             // could be a typo in the middle of a word.
             // NOT CURRENTLY APPLICABLE TO LAO
 
diff --git a/android_icu4j/src/main/java/android/icu/text/ListFormatter.java b/android_icu4j/src/main/java/android/icu/text/ListFormatter.java
index c8d5d26..3426648 100644
--- a/android_icu4j/src/main/java/android/icu/text/ListFormatter.java
+++ b/android_icu4j/src/main/java/android/icu/text/ListFormatter.java
@@ -9,6 +9,7 @@
  */
 package android.icu.text;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -20,6 +21,7 @@
 import android.icu.impl.ICUResourceBundle;
 import android.icu.impl.SimpleCache;
 import android.icu.impl.SimpleFormatterImpl;
+import android.icu.util.ICUUncheckedIOException;
 import android.icu.util.ULocale;
 import android.icu.util.UResourceBundle;
 
@@ -36,7 +38,7 @@
     private final String middle;
     private final String end;
     private final ULocale locale;
-    
+
     /**
      * Indicates the style of Listformatter
      * @deprecated This API is ICU internal only.
@@ -72,9 +74,9 @@
          */
         @Deprecated
         DURATION_NARROW("unit-narrow");
-        
+
         private final String name;
-        
+
         Style(String name) {
             this.name = name;
         }
@@ -86,7 +88,7 @@
         public String getName() {
             return name;
         }
-        
+
     }
 
     /**
@@ -151,7 +153,7 @@
     public static ListFormatter getInstance(Locale locale) {
         return getInstance(ULocale.forLocale(locale), Style.STANDARD);
     }
-    
+
     /**
      * Create a list formatter that is appropriate for a locale and style.
      *
@@ -196,7 +198,7 @@
     public String format(Collection<?> items) {
         return format(items, -1).toString();
     }
-    
+
     // Formats a collection of objects and returns the formatted string plus the offset
     // in the string where the index th element appears. index is zero based. If index is
     // negative or greater than or equal to the size of items then this function returns -1 for
@@ -219,7 +221,7 @@
         }
         return builder.append(end, it.next(), index == count - 1);
     }
-    
+
     /**
      * Returns the pattern to use for a particular item count.
      * @param count the item count.
@@ -237,7 +239,7 @@
         }
         return format(list);
     }
-    
+
     /**
      * Returns the locale of this object.
      * @deprecated This API is ICU internal only.
@@ -247,19 +249,19 @@
     public ULocale getLocale() {
         return locale;
     }
-    
+
     // Builds a formatted list
     static class FormattedListBuilder {
         private StringBuilder current;
         private int offset;
-        
+
         // Start is the first object in the list; If recordOffset is true, records the offset of
         // this first object.
         public FormattedListBuilder(Object start, boolean recordOffset) {
             this.current = new StringBuilder(start.toString());
             this.offset = recordOffset ? 0 : -1;
         }
-        
+
         // Appends additional object. pattern is a template indicating where the new object gets
         // added in relation to the rest of the list. {0} represents the rest of the list; {1}
         // represents the new object in pattern. next is the object to be added. If recordOffset
@@ -282,16 +284,24 @@
             return this;
         }
 
+        public void appendTo(Appendable appendable) {
+            try {
+                appendable.append(current);
+            } catch(IOException e) {
+                throw new ICUUncheckedIOException(e);
+            }
+        }
+
         @Override
         public String toString() {
             return current.toString();
         }
-        
+
         // Gets the last recorded offset or -1 if no offset recorded.
         public int getOffset() {
             return offset;
         }
-        
+
         private boolean offsetRecorded() {
             return offset >= 0;
         }
diff --git a/android_icu4j/src/main/java/android/icu/text/MeasureFormat.java b/android_icu4j/src/main/java/android/icu/text/MeasureFormat.java
index 4336995..9129b41 100644
--- a/android_icu4j/src/main/java/android/icu/text/MeasureFormat.java
+++ b/android_icu4j/src/main/java/android/icu/text/MeasureFormat.java
@@ -19,12 +19,12 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.ObjectStreamException;
+import java.math.RoundingMode;
 import java.text.FieldPosition;
 import java.text.ParsePosition;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
-import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
@@ -36,13 +36,15 @@
 import android.icu.impl.ICUResourceBundle;
 import android.icu.impl.SimpleCache;
 import android.icu.impl.SimpleFormatterImpl;
-import android.icu.impl.StandardPlural;
-import android.icu.impl.UResource;
-import android.icu.math.BigDecimal;
-import android.icu.text.PluralRules.Factory;
+import android.icu.impl.number.LongNameHandler;
+import android.icu.number.FormattedNumber;
+import android.icu.number.LocalizedNumberFormatter;
+import android.icu.number.NumberFormatter;
+import android.icu.number.NumberFormatter.UnitWidth;
+import android.icu.number.Rounder;
+import android.icu.text.ListFormatter.FormattedListBuilder;
 import android.icu.util.Currency;
-import android.icu.util.CurrencyAmount;
-import android.icu.util.ICUException;
+import android.icu.util.ICUUncheckedIOException;
 import android.icu.util.Measure;
 import android.icu.util.MeasureUnit;
 import android.icu.util.TimeZone;
@@ -54,73 +56,65 @@
 /**
  * A formatter for Measure objects.
  *
- * <p>To format a Measure object, first create a formatter
- * object using a MeasureFormat factory method.  Then use that
- * object's format or formatMeasures methods.
+ * <p>
+ * <strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * {@link NumberFormatter} fits their use case.  Although not deprecated, this
+ * class, MeasureFormat, is provided for backwards compatibility only.
+ * <hr>
+ *
+ * <p>
+ * To format a Measure object, first create a formatter object using a MeasureFormat factory method. Then
+ * use that object's format or formatMeasures methods.
  *
  * Here is sample code:
+ *
  * <pre>
- *      MeasureFormat fmtFr = MeasureFormat.getInstance(
- *              ULocale.FRENCH, FormatWidth.SHORT);
- *      Measure measure = new Measure(23, MeasureUnit.CELSIUS);
+ * MeasureFormat fmtFr = MeasureFormat.getInstance(ULocale.FRENCH, FormatWidth.SHORT);
+ * Measure measure = new Measure(23, MeasureUnit.CELSIUS);
  *
- *      // Output: 23 °C
- *      System.out.println(fmtFr.format(measure));
+ * // Output: 23 °C
+ * System.out.println(fmtFr.format(measure));
  *
- *      Measure measureF = new Measure(70, MeasureUnit.FAHRENHEIT);
+ * Measure measureF = new Measure(70, MeasureUnit.FAHRENHEIT);
  *
- *      // Output: 70 °F
- *      System.out.println(fmtFr.format(measureF));
+ * // Output: 70 °F
+ * System.out.println(fmtFr.format(measureF));
  *
- *      MeasureFormat fmtFrFull = MeasureFormat.getInstance(
- *              ULocale.FRENCH, FormatWidth.WIDE);
- *      // Output: 70 pieds et 5,3 pouces
- *      System.out.println(fmtFrFull.formatMeasures(
- *              new Measure(70, MeasureUnit.FOOT),
- *              new Measure(5.3, MeasureUnit.INCH)));
+ * MeasureFormat fmtFrFull = MeasureFormat.getInstance(ULocale.FRENCH, FormatWidth.WIDE);
+ * // Output: 70 pieds et 5,3 pouces
+ * System.out.println(fmtFrFull.formatMeasures(new Measure(70, MeasureUnit.FOOT),
+ *         new Measure(5.3, MeasureUnit.INCH)));
  *
- *      // Output: 1 pied et 1 pouce
- *      System.out.println(fmtFrFull.formatMeasures(
- *              new Measure(1, MeasureUnit.FOOT),
- *              new Measure(1, MeasureUnit.INCH)));
+ * // Output: 1 pied et 1 pouce
+ * System.out.println(
+ *         fmtFrFull.formatMeasures(new Measure(1, MeasureUnit.FOOT), new Measure(1, MeasureUnit.INCH)));
  *
- *      MeasureFormat fmtFrNarrow = MeasureFormat.getInstance(
-                ULocale.FRENCH, FormatWidth.NARROW);
- *      // Output: 1′ 1″
- *      System.out.println(fmtFrNarrow.formatMeasures(
- *              new Measure(1, MeasureUnit.FOOT),
- *              new Measure(1, MeasureUnit.INCH)));
+ * MeasureFormat fmtFrNarrow = MeasureFormat.getInstance(ULocale.FRENCH, FormatWidth.NARROW);
+ * // Output: 1′ 1″
+ * System.out.println(fmtFrNarrow.formatMeasures(new Measure(1, MeasureUnit.FOOT),
+ *         new Measure(1, MeasureUnit.INCH)));
  *
+ * MeasureFormat fmtEn = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
  *
- *      MeasureFormat fmtEn = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
- *
- *      // Output: 1 inch, 2 feet
- *      fmtEn.formatMeasures(
- *              new Measure(1, MeasureUnit.INCH),
- *              new Measure(2, MeasureUnit.FOOT));
+ * // Output: 1 inch, 2 feet
+ * fmtEn.formatMeasures(new Measure(1, MeasureUnit.INCH), new Measure(2, MeasureUnit.FOOT));
  * </pre>
  * <p>
- * This class does not do conversions from one unit to another. It simply formats
- * whatever units it is given
+ * This class does not do conversions from one unit to another. It simply formats whatever units it is
+ * given
  * <p>
- * This class is immutable and thread-safe so long as its deprecated subclass,
- * TimeUnitFormat, is never used. TimeUnitFormat is not thread-safe, and is
- * mutable. Although this class has existing subclasses, this class does not support new
- * sub-classes.
+ * This class is immutable and thread-safe so long as its deprecated subclass, TimeUnitFormat, is never
+ * used. TimeUnitFormat is not thread-safe, and is mutable. Although this class has existing subclasses,
+ * this class does not support new sub-classes.
  *
  * @see android.icu.text.UFormat
  * @author Alan Liu
  */
 public class MeasureFormat extends UFormat {
 
-
     // Generated by serialver from JDK 1.4.1_01
     static final long serialVersionUID = -7182021401701778240L;
 
-    private final transient MeasureFormatData cache;
-
-    private final transient ImmutableNumberFormat numberFormat;
-
     private final transient FormatWidth formatWidth;
 
     // PluralRules is documented as being immutable which implies thread-safety.
@@ -128,18 +122,13 @@
 
     private final transient NumericFormatters numericFormatters;
 
-    private final transient ImmutableNumberFormat currencyFormat;
+    private final transient NumberFormat numberFormat;
 
-    private final transient ImmutableNumberFormat integerFormat;
+    private final transient LocalizedNumberFormatter numberFormatter;
 
-    private static final SimpleCache<ULocale, MeasureFormatData> localeMeasureFormatData
-    = new SimpleCache<ULocale, MeasureFormatData>();
+    private static final SimpleCache<ULocale, NumericFormatters> localeToNumericDurationFormatters = new SimpleCache<ULocale, NumericFormatters>();
 
-    private static final SimpleCache<ULocale, NumericFormatters> localeToNumericDurationFormatters
-    = new SimpleCache<ULocale,NumericFormatters>();
-
-    private static final Map<MeasureUnit, Integer> hmsTo012 =
-            new HashMap<MeasureUnit, Integer>();
+    private static final Map<MeasureUnit, Integer> hmsTo012 = new HashMap<MeasureUnit, Integer>();
 
     static {
         hmsTo012.put(MeasureUnit.HOUR, 0);
@@ -162,51 +151,67 @@
         /**
          * Spell out everything.
          */
-        WIDE(ListFormatter.Style.DURATION, NumberFormat.PLURALCURRENCYSTYLE),
+        WIDE(ListFormatter.Style.DURATION, UnitWidth.FULL_NAME, UnitWidth.FULL_NAME),
 
         /**
          * Abbreviate when possible.
          */
-        SHORT(ListFormatter.Style.DURATION_SHORT, NumberFormat.ISOCURRENCYSTYLE),
+        SHORT(ListFormatter.Style.DURATION_SHORT, UnitWidth.SHORT, UnitWidth.ISO_CODE),
 
         /**
          * Brief. Use only a symbol for the unit when possible.
          */
-        NARROW(ListFormatter.Style.DURATION_NARROW, NumberFormat.CURRENCYSTYLE),
+        NARROW(ListFormatter.Style.DURATION_NARROW, UnitWidth.NARROW, UnitWidth.SHORT),
 
         /**
-         * Identical to NARROW except when formatMeasures is called with
-         * an hour and minute; minute and second; or hour, minute, and second Measures.
-         * In these cases formatMeasures formats as 5:37:23 instead of 5h, 37m, 23s.
+         * Identical to NARROW except when formatMeasures is called with an hour and minute; minute and
+         * second; or hour, minute, and second Measures. In these cases formatMeasures formats as 5:37:23
+         * instead of 5h, 37m, 23s.
          */
-        NUMERIC(ListFormatter.Style.DURATION_NARROW, NumberFormat.CURRENCYSTYLE);
+        NUMERIC(ListFormatter.Style.DURATION_NARROW, UnitWidth.NARROW, UnitWidth.SHORT),
 
-        // Be sure to update the toFormatWidth and fromFormatWidth() functions
-        // when adding an enum value.
-        private static final int INDEX_COUNT = 3;  // NARROW.ordinal() + 1
+        /**
+         * The default format width for getCurrencyFormat(), which is to show the symbol for currency
+         * (UnitWidth.SHORT) but wide for other units.
+         *
+         * @deprecated ICU 61 This API is ICU internal only.
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        @Deprecated
+        DEFAULT_CURRENCY(ListFormatter.Style.DURATION, UnitWidth.FULL_NAME, UnitWidth.SHORT);
 
         private final ListFormatter.Style listFormatterStyle;
-        private final int currencyStyle;
 
-        private FormatWidth(ListFormatter.Style style, int currencyStyle) {
+        /**
+         * The {@link UnitWidth} (used for newer NumberFormatter API) that corresponds to this
+         * FormatWidth (used for the older APIs) for all units except currencies.
+         */
+        final UnitWidth unitWidth;
+
+        /**
+         * The {@link UnitWidth} (used for newer NumberFormatter API) that corresponds to this
+         * FormatWidth (used for the older APIs) for currencies.
+         */
+        final UnitWidth currencyWidth;
+
+        private FormatWidth(ListFormatter.Style style, UnitWidth unitWidth, UnitWidth currencyWidth) {
             this.listFormatterStyle = style;
-            this.currencyStyle = currencyStyle;
+            this.unitWidth = unitWidth;
+            this.currencyWidth = currencyWidth;
         }
 
         ListFormatter.Style getListFormatterStyle() {
             return listFormatterStyle;
         }
-
-        int getCurrencyStyle() {
-            return currencyStyle;
-        }
     }
 
     /**
      * Create a format from the locale, formatWidth, and format.
      *
-     * @param locale the locale.
-     * @param formatWidth hints how long formatted strings should be.
+     * @param locale
+     *            the locale.
+     * @param formatWidth
+     *            hints how long formatted strings should be.
      * @return The new MeasureFormat object.
      */
     public static MeasureFormat getInstance(ULocale locale, FormatWidth formatWidth) {
@@ -216,8 +221,10 @@
     /**
      * Create a format from the {@link java.util.Locale} and formatWidth.
      *
-     * @param locale the {@link java.util.Locale}.
-     * @param formatWidth hints how long formatted strings should be.
+     * @param locale
+     *            the {@link java.util.Locale}.
+     * @param formatWidth
+     *            hints how long formatted strings should be.
      * @return The new MeasureFormat object.
      */
     public static MeasureFormat getInstance(Locale locale, FormatWidth formatWidth) {
@@ -227,74 +234,61 @@
     /**
      * Create a format from the locale, formatWidth, and format.
      *
-     * @param locale the locale.
-     * @param formatWidth hints how long formatted strings should be.
-     * @param format This is defensively copied.
+     * @param locale
+     *            the locale.
+     * @param formatWidth
+     *            hints how long formatted strings should be.
+     * @param format
+     *            This is defensively copied.
      * @return The new MeasureFormat object.
      */
-    public static MeasureFormat getInstance(ULocale locale, FormatWidth formatWidth, NumberFormat format) {
-        PluralRules rules = PluralRules.forLocale(locale);
-        NumericFormatters formatters = null;
-        MeasureFormatData data = localeMeasureFormatData.get(locale);
-        if (data == null) {
-            data = loadLocaleData(locale);
-            localeMeasureFormatData.put(locale, data);
-        }
-        if (formatWidth == FormatWidth.NUMERIC) {
-            formatters = localeToNumericDurationFormatters.get(locale);
-            if (formatters == null) {
-                formatters = loadNumericFormatters(locale);
-                localeToNumericDurationFormatters.put(locale, formatters);
-            }
-        }
-        NumberFormat intFormat = NumberFormat.getInstance(locale);
-        intFormat.setMaximumFractionDigits(0);
-        intFormat.setMinimumFractionDigits(0);
-        intFormat.setRoundingMode(BigDecimal.ROUND_DOWN);
-        return new MeasureFormat(
-                locale,
-                data,
-                formatWidth,
-                new ImmutableNumberFormat(format),
-                rules,
-                formatters,
-                new ImmutableNumberFormat(NumberFormat.getInstance(locale, formatWidth.getCurrencyStyle())),
-                new ImmutableNumberFormat(intFormat));
+    public static MeasureFormat getInstance(
+            ULocale locale,
+            FormatWidth formatWidth,
+            NumberFormat format) {
+        return new MeasureFormat(locale, formatWidth, format, null, null);
     }
 
     /**
      * Create a format from the {@link java.util.Locale}, formatWidth, and format.
      *
-     * @param locale the {@link java.util.Locale}.
-     * @param formatWidth hints how long formatted strings should be.
-     * @param format This is defensively copied.
+     * @param locale
+     *            the {@link java.util.Locale}.
+     * @param formatWidth
+     *            hints how long formatted strings should be.
+     * @param format
+     *            This is defensively copied.
      * @return The new MeasureFormat object.
      */
-    public static MeasureFormat getInstance(Locale locale, FormatWidth formatWidth, NumberFormat format) {
+    public static MeasureFormat getInstance(
+            Locale locale,
+            FormatWidth formatWidth,
+            NumberFormat format) {
         return getInstance(ULocale.forLocale(locale), formatWidth, format);
     }
 
     /**
-     * Able to format Collection&lt;? extends Measure&gt;, Measure[], and Measure
-     * by delegating to formatMeasures.
-     * If the pos argument identifies a NumberFormat field,
-     * then its indices are set to the beginning and end of the first such field
-     * encountered. MeasureFormat itself does not supply any fields.
+     * Able to format Collection&lt;? extends Measure&gt;, Measure[], and Measure by delegating to
+     * formatMeasures. If the pos argument identifies a NumberFormat field, then its indices are set to
+     * the beginning and end of the first such field encountered. MeasureFormat itself does not supply
+     * any fields.
      *
-     * Calling a
-     * <code>formatMeasures</code> method is preferred over calling
-     * this method as they give better performance.
+     * Calling a <code>formatMeasures</code> method is preferred over calling this method as they give
+     * better performance.
      *
-     * @param obj must be a Collection&lt;? extends Measure&gt;, Measure[], or Measure object.
-     * @param toAppendTo Formatted string appended here.
-     * @param pos Identifies a field in the formatted text.
+     * @param obj
+     *            must be a Collection&lt;? extends Measure&gt;, Measure[], or Measure object.
+     * @param toAppendTo
+     *            Formatted string appended here.
+     * @param fpos
+     *            Identifies a field in the formatted text.
      * @see java.text.Format#format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition)
      */
     @Override
-    public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
+    public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition fpos) {
         int prevLength = toAppendTo.length();
-        FieldPosition fpos =
-                new FieldPosition(pos.getFieldAttribute(), pos.getField());
+        fpos.setBeginIndex(0);
+        fpos.setEndIndex(0);
         if (obj instanceof Collection) {
             Collection<?> coll = (Collection<?>) obj;
             Measure[] measures = new Measure[coll.size()];
@@ -305,25 +299,29 @@
                 }
                 measures[idx++] = (Measure) o;
             }
-            toAppendTo.append(formatMeasures(new StringBuilder(), fpos, measures));
+            formatMeasuresInternal(toAppendTo, fpos, measures);
         } else if (obj instanceof Measure[]) {
-            toAppendTo.append(formatMeasures(new StringBuilder(), fpos, (Measure[]) obj));
-        } else if (obj instanceof Measure){
-            toAppendTo.append(formatMeasure((Measure) obj, numberFormat, new StringBuilder(), fpos));
+            formatMeasuresInternal(toAppendTo, fpos, (Measure[]) obj);
+        } else if (obj instanceof Measure) {
+            FormattedNumber result = formatMeasure((Measure) obj);
+            result.populateFieldPosition(fpos); // No offset: toAppendTo.length() is considered below
+            result.appendTo(toAppendTo);
         } else {
             throw new IllegalArgumentException(obj.toString());
         }
-        if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) {
-            pos.setBeginIndex(fpos.getBeginIndex() + prevLength);
-            pos.setEndIndex(fpos.getEndIndex() + prevLength);
+        if (prevLength > 0 && fpos.getEndIndex() != 0) {
+            fpos.setBeginIndex(fpos.getBeginIndex() + prevLength);
+            fpos.setEndIndex(fpos.getEndIndex() + prevLength);
         }
         return toAppendTo;
     }
 
     /**
      * Parses text from a string to produce a <code>Measure</code>.
+     *
      * @see java.text.Format#parseObject(java.lang.String, java.text.ParsePosition)
-     * @throws UnsupportedOperationException Not supported.
+     * @throws UnsupportedOperationException
+     *             Not supported.
      * @hide draft / provisional / internal are hidden on Android
      */
     @Override
@@ -332,149 +330,35 @@
     }
 
     /**
-     * Format a sequence of measures. Uses the ListFormatter unit lists.
-     * So, for example, one could format “3 feet, 2 inches”.
-     * Zero values are formatted (eg, “3 feet, 0 inches”). It is the caller’s
-     * responsibility to have the appropriate values in appropriate order,
-     * and using the appropriate Number values. Typically the units should be
-     * in descending order, with all but the last Measure having integer values
-     * (eg, not “3.2 feet, 2 inches”).
+     * Format a sequence of measures. Uses the ListFormatter unit lists. So, for example, one could
+     * format “3 feet, 2 inches”. Zero values are formatted (eg, “3 feet, 0 inches”). It is the caller’s
+     * responsibility to have the appropriate values in appropriate order, and using the appropriate
+     * Number values. Typically the units should be in descending order, with all but the last Measure
+     * having integer values (eg, not “3.2 feet, 2 inches”).
      *
-     * @param measures a sequence of one or more measures.
+     * @param measures
+     *            a sequence of one or more measures.
      * @return the formatted string.
      */
     public final String formatMeasures(Measure... measures) {
-        return formatMeasures(
-                new StringBuilder(),
-                DontCareFieldPosition.INSTANCE,
-                measures).toString();
+        return formatMeasures(new StringBuilder(), DontCareFieldPosition.INSTANCE, measures).toString();
     }
 
-    /**
-     * Format a range of measures, such as "3.4-5.1 meters". It is the caller’s
-     * responsibility to have the appropriate values in appropriate order,
-     * and using the appropriate Number values.
-     * <br>Note: If the format doesn’t have enough decimals, or lowValue ≥ highValue,
-     * the result will be a degenerate range, like “5-5 meters”.
-     * <br>Currency Units are not yet supported.
-     *
-     * @param lowValue low value in range
-     * @param highValue high value in range
-     * @return the formatted string.
-     * @deprecated This API is ICU internal only.
-     * @hide original deprecated declaration
-     * @hide draft / provisional / internal are hidden on Android
-     */
-    @Deprecated
-    public final String formatMeasureRange(Measure lowValue, Measure highValue) {
-        MeasureUnit unit = lowValue.getUnit();
-        if (!unit.equals(highValue.getUnit())) {
-            throw new IllegalArgumentException("Units must match: " + unit + " ≠ " + highValue.getUnit());
-        }
-        Number lowNumber = lowValue.getNumber();
-        Number highNumber = highValue.getNumber();
-        final boolean isCurrency = unit instanceof Currency;
-
-        UFieldPosition lowFpos = new UFieldPosition();
-        UFieldPosition highFpos = new UFieldPosition();
-        StringBuffer lowFormatted = null;
-        StringBuffer highFormatted = null;
-
-        if (isCurrency) {
-            Currency currency = (Currency) unit;
-            int fracDigits = currency.getDefaultFractionDigits();
-            int maxFrac = numberFormat.nf.getMaximumFractionDigits();
-            int minFrac = numberFormat.nf.getMinimumFractionDigits();
-            if (fracDigits != maxFrac || fracDigits != minFrac) {
-                DecimalFormat currentNumberFormat = (DecimalFormat) numberFormat.get();
-                currentNumberFormat.setMaximumFractionDigits(fracDigits);
-                currentNumberFormat.setMinimumFractionDigits(fracDigits);
-                lowFormatted = currentNumberFormat.format(lowNumber, new StringBuffer(), lowFpos);
-                highFormatted = currentNumberFormat.format(highNumber, new StringBuffer(), highFpos);
-            }
-        }
-        if (lowFormatted == null) {
-            lowFormatted = numberFormat.format(lowNumber, new StringBuffer(), lowFpos);
-            highFormatted = numberFormat.format(highNumber, new StringBuffer(), highFpos);
-        }
-
-        final double lowDouble = lowNumber.doubleValue();
-        String keywordLow = rules.select(new PluralRules.FixedDecimal(lowDouble,
-                lowFpos.getCountVisibleFractionDigits(), lowFpos.getFractionDigits()));
-
-        final double highDouble = highNumber.doubleValue();
-        String keywordHigh = rules.select(new PluralRules.FixedDecimal(highDouble,
-                highFpos.getCountVisibleFractionDigits(), highFpos.getFractionDigits()));
-
-        final PluralRanges pluralRanges = Factory.getDefaultFactory().getPluralRanges(getLocale());
-        StandardPlural resolvedPlural = pluralRanges.get(
-                StandardPlural.fromString(keywordLow),
-                StandardPlural.fromString(keywordHigh));
-
-        String rangeFormatter = getRangeFormat(getLocale(), formatWidth);
-        String formattedNumber = SimpleFormatterImpl.formatCompiledPattern(
-                rangeFormatter, lowFormatted, highFormatted);
-
-        if (isCurrency) {
-            // Nasty hack
-            currencyFormat.format(1d); // have to call this for the side effect
-
-            Currency currencyUnit = (Currency) unit;
-            StringBuilder result = new StringBuilder();
-            appendReplacingCurrency(currencyFormat.getPrefix(lowDouble >= 0), currencyUnit, resolvedPlural, result);
-            result.append(formattedNumber);
-            appendReplacingCurrency(currencyFormat.getSuffix(highDouble >= 0), currencyUnit, resolvedPlural, result);
-            return result.toString();
-            //            StringBuffer buffer = new StringBuffer();
-            //            CurrencyAmount currencyLow = (CurrencyAmount) lowValue;
-            //            CurrencyAmount currencyHigh = (CurrencyAmount) highValue;
-            //            FieldPosition pos = new FieldPosition(NumberFormat.INTEGER_FIELD);
-            //            currencyFormat.format(currencyLow, buffer, pos);
-            //            int startOfInteger = pos.getBeginIndex();
-            //            StringBuffer buffer2 = new StringBuffer();
-            //            FieldPosition pos2 = new FieldPosition(0);
-            //            currencyFormat.format(currencyHigh, buffer2, pos2);
-        } else {
-            String formatter =
-                    getPluralFormatter(lowValue.getUnit(), formatWidth, resolvedPlural.ordinal());
-            return SimpleFormatterImpl.formatCompiledPattern(formatter, formattedNumber);
-        }
-    }
-
-    private void appendReplacingCurrency(String affix, Currency unit, StandardPlural resolvedPlural, StringBuilder result) {
-        String replacement = "¤";
-        int pos = affix.indexOf(replacement);
-        if (pos < 0) {
-            replacement = "XXX";
-            pos = affix.indexOf(replacement);
-        }
-        if (pos < 0) {
-            result.append(affix);
-        } else {
-            // for now, just assume single
-            result.append(affix.substring(0,pos));
-            // we have a mismatch between the number style and the currency style, so remap
-            int currentStyle = formatWidth.getCurrencyStyle();
-            if (currentStyle == NumberFormat.ISOCURRENCYSTYLE) {
-                result.append(unit.getCurrencyCode());
-            } else {
-                result.append(unit.getName(currencyFormat.nf.getLocale(ULocale.ACTUAL_LOCALE),
-                        currentStyle == NumberFormat.CURRENCYSTYLE ? Currency.SYMBOL_NAME :  Currency.PLURAL_LONG_NAME,
-                                resolvedPlural.getKeyword(), null));
-            }
-            result.append(affix.substring(pos+replacement.length()));
-        }
-    }
+    // NOTE: For formatMeasureRange(), see http://bugs.icu-project.org/trac/ticket/12454
 
     /**
      * Formats a single measure per unit.
      *
      * An example of such a formatted string is "3.5 meters per second."
      *
-     * @param measure  the measure object. In above example, 3.5 meters.
-     * @param perUnit  the per unit. In above example, it is MeasureUnit.SECOND
-     * @param appendTo formatted string appended here.
-     * @param pos      The field position.
+     * @param measure
+     *            the measure object. In above example, 3.5 meters.
+     * @param perUnit
+     *            the per unit. In above example, it is MeasureUnit.SECOND
+     * @param appendTo
+     *            formatted string appended here.
+     * @param pos
+     *            The field position.
      * @return appendTo.
      */
     public StringBuilder formatMeasurePerUnit(
@@ -482,46 +366,56 @@
             MeasureUnit perUnit,
             StringBuilder appendTo,
             FieldPosition pos) {
-        MeasureUnit resolvedUnit = MeasureUnit.resolveUnitPerUnit(
-                measure.getUnit(), perUnit);
-        if (resolvedUnit != null) {
-            Measure newMeasure = new Measure(measure.getNumber(), resolvedUnit);
-            return formatMeasure(newMeasure, numberFormat, appendTo, pos);
-        }
-        FieldPosition fpos = new FieldPosition(
-                pos.getFieldAttribute(), pos.getField());
-        int offset = withPerUnitAndAppend(
-                formatMeasure(measure, numberFormat, new StringBuilder(), fpos),
-                perUnit,
-                appendTo);
-        if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) {
-            pos.setBeginIndex(fpos.getBeginIndex() + offset);
-            pos.setEndIndex(fpos.getEndIndex() + offset);
-        }
+        FormattedNumber result = getUnitFormatterFromCache(NUMBER_FORMATTER_STANDARD,
+                measure.getUnit(),
+                perUnit).format(measure.getNumber());
+        result.populateFieldPosition(pos, appendTo.length());
+        result.appendTo(appendTo);
         return appendTo;
     }
 
     /**
      * Formats a sequence of measures.
      *
-     * If the fieldPosition argument identifies a NumberFormat field,
-     * then its indices are set to the beginning and end of the first such field
-     * encountered. MeasureFormat itself does not supply any fields.
+     * If the fieldPosition argument identifies a NumberFormat field, then its indices are set to the
+     * beginning and end of the first such field encountered. MeasureFormat itself does not supply any
+     * fields.
      *
-     * @param appendTo the formatted string appended here.
-     * @param fieldPosition Identifies a field in the formatted text.
-     * @param measures the measures to format.
+     * @param appendTo
+     *            the formatted string appended here.
+     * @param fpos
+     *            Identifies a field in the formatted text.
+     * @param measures
+     *            the measures to format.
      * @return appendTo.
      * @see MeasureFormat#formatMeasures(Measure...)
      */
     public StringBuilder formatMeasures(
-            StringBuilder appendTo, FieldPosition fieldPosition, Measure... measures) {
+            StringBuilder appendTo,
+            FieldPosition fpos,
+            Measure... measures) {
+        int prevLength = appendTo.length();
+        formatMeasuresInternal(appendTo, fpos, measures);
+        if (prevLength > 0 && fpos.getEndIndex() > 0) {
+            fpos.setBeginIndex(fpos.getBeginIndex() + prevLength);
+            fpos.setEndIndex(fpos.getEndIndex() + prevLength);
+        }
+        return appendTo;
+    }
+
+    private void formatMeasuresInternal(
+            Appendable appendTo,
+            FieldPosition fieldPosition,
+            Measure... measures) {
         // fast track for trivial cases
         if (measures.length == 0) {
-            return appendTo;
+            return;
         }
         if (measures.length == 1) {
-            return formatMeasure(measures[0], numberFormat, appendTo, fieldPosition);
+            FormattedNumber result = formatMeasure(measures[0]);
+            result.populateFieldPosition(fieldPosition);
+            result.appendTo(appendTo);
+            return;
         }
 
         if (formatWidth == FormatWidth.NUMERIC) {
@@ -529,55 +423,46 @@
             // track.
             Number[] hms = toHMS(measures);
             if (hms != null) {
-                return formatNumeric(hms, appendTo);
+                formatNumeric(hms, appendTo);
+                return;
             }
         }
 
-        ListFormatter listFormatter = ListFormatter.getInstance(
-                getLocale(), formatWidth.getListFormatterStyle());
+        ListFormatter listFormatter = ListFormatter.getInstance(getLocale(),
+                formatWidth.getListFormatterStyle());
         if (fieldPosition != DontCareFieldPosition.INSTANCE) {
-            return formatMeasuresSlowTrack(listFormatter, appendTo, fieldPosition, measures);
+            formatMeasuresSlowTrack(listFormatter, appendTo, fieldPosition, measures);
+            return;
         }
         // Fast track: No field position.
         String[] results = new String[measures.length];
         for (int i = 0; i < measures.length; i++) {
-            results[i] = formatMeasure(
-                    measures[i],
-                    i == measures.length - 1 ? numberFormat : integerFormat);
+            if (i == measures.length - 1) {
+                results[i] = formatMeasure(measures[i]).toString();
+            } else {
+                results[i] = formatMeasureInteger(measures[i]).toString();
+            }
         }
-        return appendTo.append(listFormatter.format((Object[]) results));
-
+        FormattedListBuilder builder = listFormatter.format(Arrays.asList(results), -1);
+        builder.appendTo(appendTo);
     }
 
     /**
-     * Gets the display name of the specified {@link MeasureUnit} corresponding to the current
-     * locale and format width.
-     * @param unit  The unit for which to get a display name.
-     * @return  The display name in the locale and width specified in
-     *          {@link MeasureFormat#getInstance}, or null if there is no display name available
-     *          for the specified unit.
+     * Gets the display name of the specified {@link MeasureUnit} corresponding to the current locale and
+     * format width.
+     *
+     * @param unit
+     *            The unit for which to get a display name.
+     * @return The display name in the locale and width specified in {@link MeasureFormat#getInstance},
+     *         or null if there is no display name available for the specified unit.
      */
     public String getUnitDisplayName(MeasureUnit unit) {
-        FormatWidth width = getRegularWidth(formatWidth);
-        Map<FormatWidth, String> styleToDnam = cache.unitToStyleToDnam.get(unit);
-        if (styleToDnam == null) {
-            return null;
-        }
-
-        String dnam = styleToDnam.get(width);
-        if (dnam != null) {
-            return dnam;
-        }
-        FormatWidth fallbackWidth = cache.widthFallback[width.ordinal()];
-        if (fallbackWidth != null) {
-            dnam = styleToDnam.get(fallbackWidth);
-        }
-        return dnam;
+        return LongNameHandler.getUnitDisplayName(getLocale(), unit, formatWidth.unitWidth);
     }
 
     /**
-     * Two MeasureFormats, a and b, are equal if and only if they have the same formatWidth,
-     * locale, and equal number formats.
+     * Two MeasureFormats, a and b, are equal if and only if they have the same formatWidth, locale, and
+     * equal number formats.
      */
     @Override
     public final boolean equals(Object other) {
@@ -591,7 +476,7 @@
         // A very slow but safe implementation.
         return getWidth() == rhs.getWidth()
                 && getLocale().equals(rhs.getLocale())
-                && getNumberFormat().equals(rhs.getNumberFormat());
+                && getNumberFormatInternal().equals(rhs.getNumberFormatInternal());
     }
 
     /**
@@ -600,8 +485,7 @@
     @Override
     public final int hashCode() {
         // A very slow but safe implementation.
-        return (getLocale().hashCode() * 31
-                + getNumberFormat().hashCode()) * 31 + getWidth().hashCode();
+        return (getLocale().hashCode() * 31 + getNumberFormatInternal().hashCode()) * 31 + getWidth().hashCode();
     }
 
     /**
@@ -622,13 +506,21 @@
      * Get a copy of the number format.
      */
     public NumberFormat getNumberFormat() {
-        return numberFormat.get();
+        return (NumberFormat) numberFormat.clone();
     }
 
     /**
-     * Return a formatter for CurrencyAmount objects in the given
-     * locale.
-     * @param locale desired locale
+     * Get a copy of the number format without cloning. Internal method.
+     */
+    NumberFormat getNumberFormatInternal() {
+        return numberFormat;
+    }
+
+    /**
+     * Return a formatter for CurrencyAmount objects in the given locale.
+     *
+     * @param locale
+     *            desired locale
      * @return a formatter object
      */
     public static MeasureFormat getCurrencyFormat(ULocale locale) {
@@ -636,9 +528,10 @@
     }
 
     /**
-     * Return a formatter for CurrencyAmount objects in the given
-     * {@link java.util.Locale}.
-     * @param locale desired {@link java.util.Locale}
+     * Return a formatter for CurrencyAmount objects in the given {@link java.util.Locale}.
+     *
+     * @param locale
+     *            desired {@link java.util.Locale}
      * @return a formatter object
      */
     public static MeasureFormat getCurrencyFormat(Locale locale) {
@@ -646,8 +539,8 @@
     }
 
     /**
-     * Return a formatter for CurrencyAmount objects in the default
-     * <code>FORMAT</code> locale.
+     * Return a formatter for CurrencyAmount objects in the default <code>FORMAT</code> locale.
+     *
      * @return a formatter object
      * @see Category#FORMAT
      */
@@ -661,45 +554,65 @@
     }
 
     MeasureFormat withNumberFormat(NumberFormat format) {
-        return new MeasureFormat(
-                getLocale(),
-                this.cache,
+        return new MeasureFormat(getLocale(),
                 this.formatWidth,
-                new ImmutableNumberFormat(format),
+                format,
                 this.rules,
-                this.numericFormatters,
-                this.currencyFormat,
-                this.integerFormat);
+                this.numericFormatters);
+    }
+
+    MeasureFormat(ULocale locale, FormatWidth formatWidth) {
+        this(locale, formatWidth, null, null, null);
     }
 
     private MeasureFormat(
             ULocale locale,
-            MeasureFormatData data,
             FormatWidth formatWidth,
-            ImmutableNumberFormat format,
+            NumberFormat numberFormat,
             PluralRules rules,
-            NumericFormatters formatters,
-            ImmutableNumberFormat currencyFormat,
-            ImmutableNumberFormat integerFormat) {
+            NumericFormatters formatters) {
+        // Needed for getLocale(ULocale.VALID_LOCALE).
         setLocale(locale, locale);
-        this.cache = data;
         this.formatWidth = formatWidth;
-        this.numberFormat = format;
+
+        if (rules == null) {
+            rules = PluralRules.forLocale(locale);
+        }
         this.rules = rules;
+
+        if (numberFormat == null) {
+            numberFormat = NumberFormat.getInstance(locale);
+        } else {
+            numberFormat = (NumberFormat) numberFormat.clone();
+        }
+        this.numberFormat = numberFormat;
+
+        if (formatters == null && formatWidth == FormatWidth.NUMERIC) {
+            formatters = localeToNumericDurationFormatters.get(locale);
+            if (formatters == null) {
+                formatters = loadNumericFormatters(locale);
+                localeToNumericDurationFormatters.put(locale, formatters);
+            }
+        }
         this.numericFormatters = formatters;
-        this.currencyFormat = currencyFormat;
-        this.integerFormat = integerFormat;
+
+        if (!(numberFormat instanceof DecimalFormat)) {
+            throw new IllegalArgumentException();
+        }
+        numberFormatter = ((DecimalFormat) numberFormat).toNumberFormatter()
+                .unitWidth(formatWidth.unitWidth);
     }
 
-    MeasureFormat() {
-        // Make compiler happy by setting final fields to null.
-        this.cache = null;
-        this.formatWidth = null;
-        this.numberFormat = null;
-        this.rules = null;
-        this.numericFormatters = null;
-        this.currencyFormat = null;
-        this.integerFormat = null;
+    MeasureFormat(
+            ULocale locale,
+            FormatWidth formatWidth,
+            NumberFormat numberFormat,
+            PluralRules rules) {
+        this(locale, formatWidth, numberFormat, rules, null);
+        if (formatWidth == FormatWidth.NUMERIC) {
+            throw new IllegalArgumentException(
+                    "The format width 'numeric' is not allowed by this constructor");
+        }
     }
 
     static class NumericFormatters {
@@ -716,488 +629,161 @@
             this.hourMinuteSecond = hourMinuteSecond;
         }
 
-        public DateFormat getHourMinute() { return hourMinute; }
-        public DateFormat getMinuteSecond() { return minuteSecond; }
-        public DateFormat getHourMinuteSecond() { return hourMinuteSecond; }
+        public DateFormat getHourMinute() {
+            return hourMinute;
+        }
+
+        public DateFormat getMinuteSecond() {
+            return minuteSecond;
+        }
+
+        public DateFormat getHourMinuteSecond() {
+            return hourMinuteSecond;
+        }
     }
 
-    private static NumericFormatters loadNumericFormatters(
-            ULocale locale) {
-        ICUResourceBundle r = (ICUResourceBundle)UResourceBundle.
-                getBundleInstance(ICUData.ICU_UNIT_BASE_NAME, locale);
-        return new NumericFormatters(
-                loadNumericDurationFormat(r, "hm"),
+    private static NumericFormatters loadNumericFormatters(ULocale locale) {
+        ICUResourceBundle r = (ICUResourceBundle) UResourceBundle
+                .getBundleInstance(ICUData.ICU_UNIT_BASE_NAME, locale);
+        return new NumericFormatters(loadNumericDurationFormat(r, "hm"),
                 loadNumericDurationFormat(r, "ms"),
                 loadNumericDurationFormat(r, "hms"));
     }
 
-    /**
-     * Sink for enumerating all of the measurement unit display names.
-     * Contains inner sink classes, each one corresponding to a type of resource table.
-     * The outer sink handles the top-level units, unitsNarrow, and unitsShort tables.
-     *
-     * More specific bundles (en_GB) are enumerated before their parents (en_001, en, root):
-     * Only store a value if it is still missing, that is, it has not been overridden.
-     *
-     * C++: Each inner sink class has a reference to the main outer sink.
-     * Java: Use non-static inner classes instead.
-     */
-    private static final class UnitDataSink extends UResource.Sink {
-        void setFormatterIfAbsent(int index, UResource.Value value, int minPlaceholders) {
-            if (patterns == null) {
-                EnumMap<FormatWidth, String[]> styleToPatterns =
-                        cacheData.unitToStyleToPatterns.get(unit);
-                if (styleToPatterns == null) {
-                    styleToPatterns =
-                            new EnumMap<FormatWidth, String[]>(FormatWidth.class);
-                    cacheData.unitToStyleToPatterns.put(unit, styleToPatterns);
-                } else {
-                    patterns = styleToPatterns.get(width);
+    /// BEGIN NUMBER FORMATTER CACHING MACHINERY ///
+
+    static final int NUMBER_FORMATTER_STANDARD = 1;
+    static final int NUMBER_FORMATTER_CURRENCY = 2;
+    static final int NUMBER_FORMATTER_INTEGER = 3;
+
+    static class NumberFormatterCacheEntry {
+        int type;
+        MeasureUnit unit;
+        MeasureUnit perUnit;
+        LocalizedNumberFormatter formatter;
+    }
+
+    // formatter1 is most recently used.
+    private transient NumberFormatterCacheEntry formatter1 = null;
+    private transient NumberFormatterCacheEntry formatter2 = null;
+    private transient NumberFormatterCacheEntry formatter3 = null;
+
+    private synchronized LocalizedNumberFormatter getUnitFormatterFromCache(
+            int type,
+            MeasureUnit unit,
+            MeasureUnit perUnit) {
+        if (formatter1 != null) {
+            if (formatter1.type == type && formatter1.unit == unit && formatter1.perUnit == perUnit) {
+                return formatter1.formatter;
+            }
+            if (formatter2 != null) {
+                if (formatter2.type == type
+                        && formatter2.unit == unit
+                        && formatter2.perUnit == perUnit) {
+                    return formatter2.formatter;
                 }
-                if (patterns == null) {
-                    patterns = new String[MeasureFormatData.PATTERN_COUNT];
-                    styleToPatterns.put(width, patterns);
-                }
-            }
-            if (patterns[index] == null) {
-                patterns[index] = SimpleFormatterImpl.compileToStringMinMaxArguments(
-                        value.getString(), sb, minPlaceholders, 1);
-            }
-        }
-
-        void setDnamIfAbsent(UResource.Value value) {
-            EnumMap<FormatWidth, String> styleToDnam = cacheData.unitToStyleToDnam.get(unit);
-            if (styleToDnam == null) {
-                styleToDnam = new EnumMap<FormatWidth, String>(FormatWidth.class);
-                cacheData.unitToStyleToDnam.put(unit, styleToDnam);
-            }
-            if (styleToDnam.get(width) == null) {
-                styleToDnam.put(width, value.getString());
-            }
-        }
-
-        /**
-         * Consume a display pattern. For example,
-         * unitsShort/duration/hour contains other{"{0} hrs"}.
-         */
-        void consumePattern(UResource.Key key, UResource.Value value) {
-            if (key.contentEquals("dnam")) {
-                // The display name for the unit in the current width.
-                setDnamIfAbsent(value);
-            } else if (key.contentEquals("per")) {
-                // For example, "{0}/h".
-                setFormatterIfAbsent(MeasureFormatData.PER_UNIT_INDEX, value, 1);
-            } else {
-                // The key must be one of the plural form strings. For example:
-                // one{"{0} hr"}
-                // other{"{0} hrs"}
-                setFormatterIfAbsent(StandardPlural.indexFromString(key), value, 0);
-            }
-        }
-
-        /**
-         * Consume a table of per-unit tables. For example,
-         * unitsShort/duration contains tables for duration-unit subtypes day & hour.
-         */
-        void consumeSubtypeTable(UResource.Key key, UResource.Value value) {
-            unit = MeasureUnit.internalGetInstance(type, key.toString());  // never null
-            // Trigger a fresh lookup of the patterns for this unit+width.
-            patterns = null;
-
-            // We no longer handle units like "coordinate" here (which do not have plural variants)
-            if (value.getType() == ICUResourceBundle.TABLE) {
-                // Units that have plural variants
-                UResource.Table patternTableTable = value.getTable();
-                for (int i = 0; patternTableTable.getKeyAndValue(i, key, value); i++) {
-                    consumePattern(key, value);
-                }
-            } else {
-                throw new ICUException("Data for unit '" + unit + "' is in an unknown format");
-            }
-        }
-
-        /**
-         * Consume compound x-per-y display pattern. For example,
-         * unitsShort/compound/per may be "{0}/{1}".
-         */
-        void consumeCompoundPattern(UResource.Key key, UResource.Value value) {
-            if (key.contentEquals("per")) {
-                cacheData.styleToPerPattern.put(width,
-                        SimpleFormatterImpl.compileToStringMinMaxArguments(
-                                value.getString(), sb, 2, 2));
-            }
-        }
-
-        /**
-         * Consume a table of unit type tables. For example,
-         * unitsShort contains tables for area & duration.
-         * It also contains a table for the compound/per pattern.
-         */
-        void consumeUnitTypesTable(UResource.Key key, UResource.Value value) {
-            if (key.contentEquals("currency")) {
-                // Skip.
-            } else if (key.contentEquals("compound")) {
-                if (!cacheData.hasPerFormatter(width)) {
-                    UResource.Table compoundTable = value.getTable();
-                    for (int i = 0; compoundTable.getKeyAndValue(i, key, value); i++) {
-                        consumeCompoundPattern(key, value);
+                if (formatter3 != null) {
+                    if (formatter3.type == type
+                            && formatter3.unit == unit
+                            && formatter3.perUnit == perUnit) {
+                        return formatter3.formatter;
                     }
                 }
-            } else if (key.contentEquals("coordinate")) {
-                // special handling but we need to determine what that is
-            } else {
-                type = key.toString();
-                UResource.Table subtypeTable = value.getTable();
-                for (int i = 0; subtypeTable.getKeyAndValue(i, key, value); i++) {
-                    consumeSubtypeTable(key, value);
-                }
             }
         }
 
-        UnitDataSink(MeasureFormatData outputData) {
-            cacheData = outputData;
+        // No hit; create a new formatter.
+        LocalizedNumberFormatter formatter;
+        if (type == NUMBER_FORMATTER_STANDARD) {
+            formatter = getNumberFormatter().unit(unit).perUnit(perUnit)
+                    .unitWidth(formatWidth.unitWidth);
+        } else if (type == NUMBER_FORMATTER_CURRENCY) {
+            formatter = NumberFormatter.withLocale(getLocale()).unit(unit).perUnit(perUnit)
+                    .unitWidth(formatWidth.currencyWidth);
+        } else {
+            assert type == NUMBER_FORMATTER_INTEGER;
+            formatter = getNumberFormatter().unit(unit).perUnit(perUnit).unitWidth(formatWidth.unitWidth)
+                    .rounding(Rounder.integer().withMode(RoundingMode.DOWN));
         }
-
-        void consumeAlias(UResource.Key key, UResource.Value value) {
-            // Handle aliases like
-            // units:alias{"/LOCALE/unitsShort"}
-            // which should only occur in the root bundle.
-            FormatWidth sourceWidth = widthFromKey(key);
-            if (sourceWidth == null) {
-                // Alias from something we don't care about.
-                return;
-            }
-            FormatWidth targetWidth = widthFromAlias(value);
-            if (targetWidth == null) {
-                // We do not recognize what to fall back to.
-                throw new ICUException("Units data fallback from " + key +
-                        " to unknown " + value.getAliasString());
-            }
-            // Check that we do not fall back to another fallback.
-            if (cacheData.widthFallback[targetWidth.ordinal()] != null) {
-                throw new ICUException("Units data fallback from " + key +
-                        " to " + value.getAliasString() + " which falls back to something else");
-            }
-            cacheData.widthFallback[sourceWidth.ordinal()] = targetWidth;
-        }
-
-        public void consumeTable(UResource.Key key, UResource.Value value) {
-            if ((width = widthFromKey(key)) != null) {
-                UResource.Table unitTypesTable = value.getTable();
-                for (int i = 0; unitTypesTable.getKeyAndValue(i, key, value); i++) {
-                    consumeUnitTypesTable(key, value);
-                }
-            }
-        }
-
-        static FormatWidth widthFromKey(UResource.Key key) {
-            if (key.startsWith("units")) {
-                if (key.length() == 5) {
-                    return FormatWidth.WIDE;
-                } else if (key.regionMatches(5, "Short")) {
-                    return FormatWidth.SHORT;
-                } else if (key.regionMatches(5, "Narrow")) {
-                    return FormatWidth.NARROW;
-                }
-            }
-            return null;
-        }
-
-        static FormatWidth widthFromAlias(UResource.Value value) {
-            String s = value.getAliasString();
-            // For example: "/LOCALE/unitsShort"
-            if (s.startsWith("/LOCALE/units")) {
-                if (s.length() == 13) {
-                    return FormatWidth.WIDE;
-                } else if (s.length() == 18 && s.endsWith("Short")) {
-                    return FormatWidth.SHORT;
-                } else if (s.length() == 19 && s.endsWith("Narrow")) {
-                    return FormatWidth.NARROW;
-                }
-            }
-            return null;
-        }
-
-        @Override
-        public void put(UResource.Key key, UResource.Value value, boolean noFallback) {
-            // Main entry point to sink
-            UResource.Table widthsTable = value.getTable();
-            for (int i = 0; widthsTable.getKeyAndValue(i, key, value); i++) {
-                if (value.getType() == ICUResourceBundle.ALIAS) {
-                    consumeAlias(key, value);
-                } else {
-                    consumeTable(key, value);
-                }
-            }
-        }
-
-        // Output data.
-        MeasureFormatData cacheData;
-
-        // Path to current data.
-        FormatWidth width;
-        String type;
-        MeasureUnit unit;
-
-        // Temporary
-        StringBuilder sb = new StringBuilder();
-        String[] patterns;
+        formatter3 = formatter2;
+        formatter2 = formatter1;
+        formatter1 = new NumberFormatterCacheEntry();
+        formatter1.type = type;
+        formatter1.unit = unit;
+        formatter1.perUnit = perUnit;
+        formatter1.formatter = formatter;
+        return formatter;
     }
 
-    /**
-     * Returns formatting data for all MeasureUnits except for currency ones.
-     */
-    private static MeasureFormatData loadLocaleData(ULocale locale) {
-        ICUResourceBundle resource =
-                (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUData.ICU_UNIT_BASE_NAME, locale);
-        MeasureFormatData cacheData = new MeasureFormatData();
-        UnitDataSink sink = new UnitDataSink(cacheData);
-        resource.getAllItemsWithFallback("", sink);
-        return cacheData;
+    synchronized void clearCache() {
+        formatter1 = null;
+        formatter2 = null;
+        formatter3 = null;
     }
 
-    private static final FormatWidth getRegularWidth(FormatWidth width) {
-        if (width == FormatWidth.NUMERIC) {
-            return FormatWidth.NARROW;
-        }
-        return width;
+    // Can be overridden by subclasses:
+    LocalizedNumberFormatter getNumberFormatter() {
+        return numberFormatter;
     }
 
-    private String getFormatterOrNull(MeasureUnit unit, FormatWidth width, int index) {
-        width = getRegularWidth(width);
-        Map<FormatWidth, String[]> styleToPatterns = cache.unitToStyleToPatterns.get(unit);
-        String[] patterns = styleToPatterns.get(width);
-        if (patterns != null && patterns[index] != null) {
-            return patterns[index];
-        }
-        FormatWidth fallbackWidth = cache.widthFallback[width.ordinal()];
-        if (fallbackWidth != null) {
-            patterns = styleToPatterns.get(fallbackWidth);
-            if (patterns != null && patterns[index] != null) {
-                return patterns[index];
-            }
-        }
-        return null;
-    }
+    /// END NUMBER FORMATTER CACHING MACHINERY ///
 
-    private String getFormatter(MeasureUnit unit, FormatWidth width, int index) {
-        String pattern = getFormatterOrNull(unit, width, index);
-        if (pattern == null) {
-            throw new MissingResourceException(
-                    "no formatting pattern for " + unit + ", width " + width + ", index " + index,
-                    null, null);
-        }
-        return pattern;
-    }
-
-    /**
-     * @deprecated This API is ICU internal only.
-     * @hide draft / provisional / internal are hidden on Android
-     */
-    @Deprecated
-    public String getPluralFormatter(MeasureUnit unit, FormatWidth width, int index) {
-        if (index != StandardPlural.OTHER_INDEX) {
-            String pattern = getFormatterOrNull(unit, width, index);
-            if (pattern != null) {
-                return pattern;
-            }
-        }
-        return getFormatter(unit, width, StandardPlural.OTHER_INDEX);
-    }
-
-    private String getPerFormatter(FormatWidth width) {
-        width = getRegularWidth(width);
-        String perPattern = cache.styleToPerPattern.get(width);
-        if (perPattern != null) {
-            return perPattern;
-        }
-        FormatWidth fallbackWidth = cache.widthFallback[width.ordinal()];
-        if (fallbackWidth != null) {
-            perPattern = cache.styleToPerPattern.get(fallbackWidth);
-            if (perPattern != null) {
-                return perPattern;
-            }
-        }
-        throw new MissingResourceException("no x-per-y pattern for width " + width, null, null);
-    }
-
-    private int withPerUnitAndAppend(
-            CharSequence formatted, MeasureUnit perUnit, StringBuilder appendTo) {
-        int[] offsets = new int[1];
-        String perUnitPattern =
-                getFormatterOrNull(perUnit, formatWidth, MeasureFormatData.PER_UNIT_INDEX);
-        if (perUnitPattern != null) {
-            SimpleFormatterImpl.formatAndAppend(perUnitPattern, appendTo, offsets, formatted);
-            return offsets[0];
-        }
-        String perPattern = getPerFormatter(formatWidth);
-        String pattern = getPluralFormatter(perUnit, formatWidth, StandardPlural.ONE.ordinal());
-        String perUnitString = SimpleFormatterImpl.getTextWithNoArguments(pattern).trim();
-        SimpleFormatterImpl.formatAndAppend(
-                perPattern, appendTo, offsets, formatted, perUnitString);
-        return offsets[0];
-    }
-
-    private String formatMeasure(Measure measure, ImmutableNumberFormat nf) {
-        return formatMeasure(
-                measure, nf, new StringBuilder(),
-                DontCareFieldPosition.INSTANCE).toString();
-    }
-
-    private StringBuilder formatMeasure(
-            Measure measure,
-            ImmutableNumberFormat nf,
-            StringBuilder appendTo,
-            FieldPosition fieldPosition) {
-        Number n = measure.getNumber();
+    private FormattedNumber formatMeasure(Measure measure) {
         MeasureUnit unit = measure.getUnit();
         if (unit instanceof Currency) {
-            return appendTo.append(
-                    currencyFormat.format(
-                            new CurrencyAmount(n, (Currency) unit),
-                            new StringBuffer(),
-                            fieldPosition));
-
-        }
-        StringBuffer formattedNumber = new StringBuffer();
-        StandardPlural pluralForm = QuantityFormatter.selectPlural(
-                n, nf.nf, rules, formattedNumber, fieldPosition);
-        String formatter = getPluralFormatter(unit, formatWidth, pluralForm.ordinal());
-        return QuantityFormatter.format(formatter, formattedNumber, appendTo, fieldPosition);
-    }
-
-    /**
-     * Instances contain all MeasureFormat specific data for a particular locale.
-     * This data is cached. It is never copied, but is shared via shared pointers.
-     *
-     * Note: We might change the cache data to have
-     * an array[WIDTH_INDEX_COUNT] or EnumMap<FormatWidth, ...> of
-     * complete sets of unit & per patterns,
-     * to correspond to the resource data and its aliases.
-     */
-    private static final class MeasureFormatData {
-        static final int PER_UNIT_INDEX = StandardPlural.COUNT;
-        static final int PATTERN_COUNT = PER_UNIT_INDEX + 1;
-
-        boolean hasPerFormatter(FormatWidth width) {
-            return styleToPerPattern.containsKey(width);
-        }
-
-        /**
-         * Redirection data from root-bundle, top-level sideways aliases.
-         * - null: initial value, just fall back to root
-         * - FormatWidth.WIDE/SHORT/NARROW: sideways alias for missing data
-         */
-        final FormatWidth widthFallback[] = new FormatWidth[FormatWidth.INDEX_COUNT];
-        /** Measure unit -> format width -> array of patterns ("{0} meters") (plurals + PER_UNIT_INDEX) */
-        final Map<MeasureUnit, EnumMap<FormatWidth, String[]>> unitToStyleToPatterns =
-                new HashMap<MeasureUnit, EnumMap<FormatWidth, String[]>>();
-        final Map<MeasureUnit, EnumMap<FormatWidth, String>> unitToStyleToDnam =
-                new HashMap<MeasureUnit, EnumMap<FormatWidth, String>>();
-        final EnumMap<FormatWidth, String> styleToPerPattern =
-                new EnumMap<FormatWidth, String>(FormatWidth.class);;
-    }
-
-    // Wrapper around NumberFormat that provides immutability and thread-safety.
-    private static final class ImmutableNumberFormat {
-        private NumberFormat nf;
-
-        public ImmutableNumberFormat(NumberFormat nf) {
-            this.nf = (NumberFormat) nf.clone();
-        }
-
-        public synchronized NumberFormat get() {
-            return (NumberFormat) nf.clone();
-        }
-
-        public synchronized StringBuffer format(
-                Number n, StringBuffer buffer, FieldPosition pos) {
-            return nf.format(n, buffer, pos);
-        }
-
-        public synchronized StringBuffer format(
-                CurrencyAmount n, StringBuffer buffer, FieldPosition pos) {
-            return nf.format(n, buffer, pos);
-        }
-
-        @SuppressWarnings("unused")
-        public synchronized String format(Number number) {
-            return nf.format(number);
-        }
-
-        public String getPrefix(boolean positive) {
-            return positive ? ((DecimalFormat)nf).getPositivePrefix() : ((DecimalFormat)nf).getNegativePrefix();
-        }
-        public String getSuffix(boolean positive) {
-            return positive ? ((DecimalFormat)nf).getPositiveSuffix() : ((DecimalFormat)nf).getNegativeSuffix();
+            return getUnitFormatterFromCache(NUMBER_FORMATTER_CURRENCY, unit, null)
+                    .format(measure.getNumber());
+        } else {
+            return getUnitFormatterFromCache(NUMBER_FORMATTER_STANDARD, unit, null)
+                    .format(measure.getNumber());
         }
     }
 
-    static final class PatternData {
-        final String prefix;
-        final String suffix;
-        public PatternData(String pattern) {
-            int pos = pattern.indexOf("{0}");
-            if (pos < 0) {
-                prefix = pattern;
-                suffix = null;
-            } else {
-                prefix = pattern.substring(0,pos);
-                suffix = pattern.substring(pos+3);
-            }
-        }
-        @Override
-        public String toString() {
-            return prefix + "; " + suffix;
-        }
-
+    private FormattedNumber formatMeasureInteger(Measure measure) {
+        return getUnitFormatterFromCache(NUMBER_FORMATTER_INTEGER, measure.getUnit(), null)
+                .format(measure.getNumber());
     }
 
-    Object toTimeUnitProxy() {
-        return new MeasureProxy(getLocale(), formatWidth, numberFormat.get(), TIME_UNIT_FORMAT);
-    }
-
-    Object toCurrencyProxy() {
-        return new MeasureProxy(getLocale(), formatWidth, numberFormat.get(), CURRENCY_FORMAT);
-    }
-
-    private StringBuilder formatMeasuresSlowTrack(
+    private void formatMeasuresSlowTrack(
             ListFormatter listFormatter,
-            StringBuilder appendTo,
+            Appendable appendTo,
             FieldPosition fieldPosition,
             Measure... measures) {
         String[] results = new String[measures.length];
 
         // Zero out our field position so that we can tell when we find our field.
-        FieldPosition fpos = new FieldPosition(
-                fieldPosition.getFieldAttribute(), fieldPosition.getField());
+        FieldPosition fpos = new FieldPosition(fieldPosition.getFieldAttribute(),
+                fieldPosition.getField());
 
         int fieldPositionFoundIndex = -1;
         for (int i = 0; i < measures.length; ++i) {
-            ImmutableNumberFormat nf = (i == measures.length - 1 ? numberFormat : integerFormat);
+            FormattedNumber result;
+            if (i == measures.length - 1) {
+                result = formatMeasure(measures[i]);
+            } else {
+                result = formatMeasureInteger(measures[i]);
+            }
             if (fieldPositionFoundIndex == -1) {
-                results[i] = formatMeasure(measures[i], nf, new StringBuilder(), fpos).toString();
-                if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) {
+                result.populateFieldPosition(fpos);
+                if (fpos.getEndIndex() != 0) {
                     fieldPositionFoundIndex = i;
                 }
-            } else {
-                results[i] = formatMeasure(measures[i], nf);
             }
+            results[i] = result.toString();
         }
-        ListFormatter.FormattedListBuilder builder =
-                listFormatter.format(Arrays.asList(results), fieldPositionFoundIndex);
+        ListFormatter.FormattedListBuilder builder = listFormatter.format(Arrays.asList(results),
+                fieldPositionFoundIndex);
 
         // Fix up FieldPosition indexes if our field is found.
         if (builder.getOffset() != -1) {
-            fieldPosition.setBeginIndex(fpos.getBeginIndex() + builder.getOffset() + appendTo.length());
-            fieldPosition.setEndIndex(fpos.getEndIndex() + builder.getOffset() + appendTo.length());
+            fieldPosition.setBeginIndex(fpos.getBeginIndex() + builder.getOffset());
+            fieldPosition.setEndIndex(fpos.getEndIndex() + builder.getOffset());
         }
-        return appendTo.append(builder.toString());
+        builder.appendTo(appendTo);
     }
 
     // type is one of "hm", "ms" or "hms"
-    private static DateFormat loadNumericDurationFormat(
-            ICUResourceBundle r, String type) {
+    private static DateFormat loadNumericDurationFormat(ICUResourceBundle r, String type) {
         r = r.getWithFallback(String.format("durationUnits/%s", type));
         // We replace 'h' with 'H' because 'h' does not make sense in the context of durations.
         DateFormat result = new SimpleDateFormat(r.getString().replace("h", "H"));
@@ -1234,7 +820,7 @@
 
     // Formats numeric time duration as 5:00:47 or 3:54. In the process, it replaces any null
     // values in hms with 0.
-    private StringBuilder formatNumeric(Number[] hms, StringBuilder appendable) {
+    private void formatNumeric(Number[] hms, Appendable appendable) {
 
         // find the start and end of non-nil values in hms array. We have to know if we
         // have hour-minute; minute-second; or hour-minute-second.
@@ -1253,37 +839,32 @@
         }
         // convert hours, minutes, seconds into milliseconds.
         long millis = (long) (((Math.floor(hms[0].doubleValue()) * 60.0
-                + Math.floor(hms[1].doubleValue())) * 60.0
-                + Math.floor(hms[2].doubleValue())) * 1000.0);
+                + Math.floor(hms[1].doubleValue())) * 60.0 + Math.floor(hms[2].doubleValue())) * 1000.0);
         Date d = new Date(millis);
-        // if hour-minute-second
         if (startIndex == 0 && endIndex == 2) {
-            return formatNumeric(
-                    d,
+            // if hour-minute-second
+            formatNumeric(d,
                     numericFormatters.getHourMinuteSecond(),
                     DateFormat.Field.SECOND,
                     hms[endIndex],
                     appendable);
-        }
-        // if minute-second
-        if (startIndex == 1 && endIndex == 2) {
-            return formatNumeric(
-                    d,
+        } else if (startIndex == 1 && endIndex == 2) {
+            // if minute-second
+            formatNumeric(d,
                     numericFormatters.getMinuteSecond(),
                     DateFormat.Field.SECOND,
                     hms[endIndex],
                     appendable);
-        }
-        // if hour-minute
-        if (startIndex == 0 && endIndex == 1) {
-            return formatNumeric(
-                    d,
+        } else if (startIndex == 0 && endIndex == 1) {
+            // if hour-minute
+            formatNumeric(d,
                     numericFormatters.getHourMinute(),
                     DateFormat.Field.MINUTE,
                     hms[endIndex],
                     appendable);
+        } else {
+            throw new IllegalStateException();
         }
-        throw new IllegalStateException();
     }
 
     // Formats a duration as 5:00:37 or 23:59.
@@ -1295,12 +876,12 @@
     // smallestAmount is 37.3. This smallest field is formatted with this object's
     // NumberFormat instead of formatter.
     // appendTo is where the formatted string is appended.
-    private StringBuilder formatNumeric(
+    private void formatNumeric(
             Date duration,
             DateFormat formatter,
             DateFormat.Field smallestField,
             Number smallestAmount,
-            StringBuilder appendTo) {
+            Appendable appendTo) {
         // Format the smallest amount ahead of time.
         String smallestAmountFormatted;
 
@@ -1309,50 +890,62 @@
         // integer part with the corresponding value from formatting the date. Otherwise
         // when formatting 0 minutes 9 seconds, we may get "00:9" instead of "00:09"
         FieldPosition intFieldPosition = new FieldPosition(NumberFormat.INTEGER_FIELD);
-        smallestAmountFormatted = numberFormat.format(
-                smallestAmount, new StringBuffer(), intFieldPosition).toString();
+        FormattedNumber result = getNumberFormatter().format(smallestAmount);
+        result.populateFieldPosition(intFieldPosition);
+        smallestAmountFormatted = result.toString();
         // Give up if there is no integer field.
         if (intFieldPosition.getBeginIndex() == 0 && intFieldPosition.getEndIndex() == 0) {
             throw new IllegalStateException();
         }
+
         // Format our duration as a date, but keep track of where the smallest field is
         // so that we can use it to replace the integer portion of the smallest value.
+        // #13606: DateFormat is not thread-safe, but MeasureFormat advertises itself as thread-safe.
         FieldPosition smallestFieldPosition = new FieldPosition(smallestField);
-        String draft = formatter.format(
-                duration, new StringBuffer(), smallestFieldPosition).toString();
-
-        // If we find the smallest field
-        if (smallestFieldPosition.getBeginIndex() != 0
-                || smallestFieldPosition.getEndIndex() != 0) {
-            // add everything up to the start of the smallest field in duration.
-            appendTo.append(draft, 0, smallestFieldPosition.getBeginIndex());
-
-            // add everything in the smallest field up to the integer portion
-            appendTo.append(smallestAmountFormatted, 0, intFieldPosition.getBeginIndex());
-
-            // Add the smallest field in formatted duration in lieu of the integer portion
-            // of smallest field
-            appendTo.append(
-                    draft,
-                    smallestFieldPosition.getBeginIndex(),
-                    smallestFieldPosition.getEndIndex());
-
-            // Add the rest of the smallest field
-            appendTo.append(
-                    smallestAmountFormatted,
-                    intFieldPosition.getEndIndex(),
-                    smallestAmountFormatted.length());
-            appendTo.append(draft, smallestFieldPosition.getEndIndex(), draft.length());
-        } else {
-            // As fallback, just use the formatted duration.
-            appendTo.append(draft);
+        String draft;
+        synchronized (formatter) {
+            draft = formatter.format(duration, new StringBuffer(), smallestFieldPosition).toString();
         }
-        return appendTo;
+
+        try {
+            // If we find the smallest field
+            if (smallestFieldPosition.getBeginIndex() != 0 || smallestFieldPosition.getEndIndex() != 0) {
+                // add everything up to the start of the smallest field in duration.
+                appendTo.append(draft, 0, smallestFieldPosition.getBeginIndex());
+
+                // add everything in the smallest field up to the integer portion
+                appendTo.append(smallestAmountFormatted, 0, intFieldPosition.getBeginIndex());
+
+                // Add the smallest field in formatted duration in lieu of the integer portion
+                // of smallest field
+                appendTo.append(draft,
+                        smallestFieldPosition.getBeginIndex(),
+                        smallestFieldPosition.getEndIndex());
+
+                // Add the rest of the smallest field
+                appendTo.append(smallestAmountFormatted,
+                        intFieldPosition.getEndIndex(),
+                        smallestAmountFormatted.length());
+                appendTo.append(draft, smallestFieldPosition.getEndIndex(), draft.length());
+            } else {
+                // As fallback, just use the formatted duration.
+                appendTo.append(draft);
+            }
+        } catch (IOException e) {
+            throw new ICUUncheckedIOException(e);
+        }
+    }
+
+    Object toTimeUnitProxy() {
+        return new MeasureProxy(getLocale(), formatWidth, getNumberFormatInternal(), TIME_UNIT_FORMAT);
+    }
+
+    Object toCurrencyProxy() {
+        return new MeasureProxy(getLocale(), formatWidth, getNumberFormatInternal(), CURRENCY_FORMAT);
     }
 
     private Object writeReplace() throws ObjectStreamException {
-        return new MeasureProxy(
-                getLocale(), formatWidth, numberFormat.get(), MEASURE_FORMAT);
+        return new MeasureProxy(getLocale(), formatWidth, getNumberFormatInternal(), MEASURE_FORMAT);
     }
 
     static class MeasureProxy implements Externalizable {
@@ -1364,11 +957,7 @@
         private int subClass;
         private HashMap<Object, Object> keyValues;
 
-        public MeasureProxy(
-                ULocale locale,
-                FormatWidth width,
-                NumberFormat numberFormat,
-                int subClass) {
+        public MeasureProxy(ULocale locale, FormatWidth width, NumberFormat numberFormat, int subClass) {
             this.locale = locale;
             this.formatWidth = width;
             this.numberFormat = numberFormat;
@@ -1431,7 +1020,7 @@
             case TIME_UNIT_FORMAT:
                 return createTimeUnitFormat();
             case CURRENCY_FORMAT:
-                return new CurrencyFormat(locale);
+                return MeasureFormat.getCurrencyFormat(locale);
             default:
                 throw new InvalidObjectException("Unknown subclass: " + subClass);
             }
@@ -1446,13 +1035,15 @@
         return values[ordinal];
     }
 
-    private static final Map<ULocale, String> localeIdToRangeFormat =
-            new ConcurrentHashMap<ULocale, String>();
+    private static final Map<ULocale, String> localeIdToRangeFormat = new ConcurrentHashMap<ULocale, String>();
 
     /**
      * Return a formatter (compiled SimpleFormatter pattern) for a range, such as "{0}–{1}".
-     * @param forLocale locale to get the format for
-     * @param width the format width
+     *
+     * @param forLocale
+     *            locale to get the format for
+     * @param width
+     *            the format width
      * @return range formatter, such as "{0}–{1}"
      * @deprecated This API is ICU internal only.
      * @hide original deprecated declaration
@@ -1466,10 +1057,11 @@
         }
         String result = localeIdToRangeFormat.get(forLocale);
         if (result == null) {
-            ICUResourceBundle rb = (ICUResourceBundle)UResourceBundle.
-                    getBundleInstance(ICUData.ICU_BASE_NAME, forLocale);
+            ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle
+                    .getBundleInstance(ICUData.ICU_BASE_NAME, forLocale);
             ULocale realLocale = rb.getULocale();
-            if (!forLocale.equals(realLocale)) { // if the child would inherit, then add a cache entry for it.
+            if (!forLocale.equals(realLocale)) { // if the child would inherit, then add a cache entry
+                                                 // for it.
                 result = localeIdToRangeFormat.get(forLocale);
                 if (result != null) {
                     localeIdToRangeFormat.put(forLocale, result);
@@ -1482,12 +1074,13 @@
 
             String resultString = null;
             try {
-                resultString = rb.getStringWithFallback("NumberElements/" + ns.getName() + "/miscPatterns/range");
-            } catch ( MissingResourceException ex ) {
+                resultString = rb
+                        .getStringWithFallback("NumberElements/" + ns.getName() + "/miscPatterns/range");
+            } catch (MissingResourceException ex) {
                 resultString = rb.getStringWithFallback("NumberElements/latn/patterns/range");
             }
-            result = SimpleFormatterImpl.compileToStringMinMaxArguments(
-                    resultString, new StringBuilder(), 2, 2);
+            result = SimpleFormatterImpl
+                    .compileToStringMinMaxArguments(resultString, new StringBuilder(), 2, 2);
             localeIdToRangeFormat.put(forLocale, result);
             if (!forLocale.equals(realLocale)) {
                 localeIdToRangeFormat.put(realLocale, result);
diff --git a/android_icu4j/src/main/java/android/icu/text/NFRule.java b/android_icu4j/src/main/java/android/icu/text/NFRule.java
index 9160631..69e9f14 100644
--- a/android_icu4j/src/main/java/android/icu/text/NFRule.java
+++ b/android_icu4j/src/main/java/android/icu/text/NFRule.java
@@ -904,7 +904,7 @@
      * result is an integer and Double otherwise.  The result is never null.
      */
     public Number doParse(String text, ParsePosition parsePosition, boolean isFractionRule,
-                          double upperBound) {
+                          double upperBound, int nonNumericalExecutedRuleMask) {
 
         // internally we operate on a copy of the string being parsed
         // (because we're going to change it) and use our own ParsePosition
@@ -977,7 +977,7 @@
             pp.setIndex(0);
             double partialResult = matchToDelimiter(workText, start, tempBaseValue,
                                                     ruleText.substring(sub1Pos, sub2Pos), rulePatternFormat,
-                                                    pp, sub1, upperBound).doubleValue();
+                                                    pp, sub1, upperBound, nonNumericalExecutedRuleMask).doubleValue();
 
             // if we got a successful match (or were trying to match a
             // null substitution), pp is now pointing at the first unmatched
@@ -995,7 +995,7 @@
                 // a real result
                 partialResult = matchToDelimiter(workText2, 0, partialResult,
                                                  ruleText.substring(sub2Pos), rulePatternFormat, pp2, sub2,
-                                                 upperBound).doubleValue();
+                                                 upperBound, nonNumericalExecutedRuleMask).doubleValue();
 
                 // if we got a successful match on this second
                 // matchToDelimiter() call, update the high-water mark
@@ -1122,7 +1122,8 @@
      * Double.
      */
     private Number matchToDelimiter(String text, int startPos, double baseVal,
-                                    String delimiter, PluralFormat pluralFormatDelimiter, ParsePosition pp, NFSubstitution sub, double upperBound) {
+                                    String delimiter, PluralFormat pluralFormatDelimiter, ParsePosition pp, NFSubstitution sub,
+                                    double upperBound, int nonNumericalExecutedRuleMask) {
         // if "delimiter" contains real (i.e., non-ignorable) text, search
         // it for "delimiter" beginning at "start".  If that succeeds, then
         // use "sub"'s doParse() method to match the text before the
@@ -1145,7 +1146,7 @@
                 String subText = text.substring(0, dPos);
                 if (subText.length() > 0) {
                     tempResult = sub.doParse(subText, tempPP, baseVal, upperBound,
-                                             formatter.lenientParseEnabled());
+                                             formatter.lenientParseEnabled(), nonNumericalExecutedRuleMask);
 
                     // if the substitution could match all the text up to
                     // where we found "delimiter", then this function has
@@ -1193,7 +1194,7 @@
             Number result = ZERO;
             // try to match the whole string against the substitution
             Number tempResult = sub.doParse(text, tempPP, baseVal, upperBound,
-                    formatter.lenientParseEnabled());
+                    formatter.lenientParseEnabled(), nonNumericalExecutedRuleMask);
             if (tempPP.getIndex() != 0) {
                 // if there's a successful match (or it's a null
                 // substitution), update pp to point to the first
diff --git a/android_icu4j/src/main/java/android/icu/text/NFRuleSet.java b/android_icu4j/src/main/java/android/icu/text/NFRuleSet.java
index 422aad1..9b1c1a7 100644
--- a/android_icu4j/src/main/java/android/icu/text/NFRuleSet.java
+++ b/android_icu4j/src/main/java/android/icu/text/NFRuleSet.java
@@ -749,7 +749,7 @@
      * this function returns new Long(0), and the parse position is
      * left unchanged.
      */
-    public Number parse(String text, ParsePosition parsePosition, double upperBound) {
+    public Number parse(String text, ParsePosition parsePosition, double upperBound, int nonNumericalExecutedRuleMask) {
         // try matching each rule in the rule set against the text being
         // parsed.  Whichever one matches the most characters is the one
         // that determines the value we return.
@@ -764,9 +764,13 @@
         }
 
         // Try each of the negative rules, fraction rules, infinity rules and NaN rules
-        for (NFRule fractionRule : nonNumericalRules) {
-            if (fractionRule != null) {
-                tempResult = fractionRule.doParse(text, parsePosition, false, upperBound);
+        for (int nonNumericalRuleIdx = 0; nonNumericalRuleIdx < nonNumericalRules.length; nonNumericalRuleIdx++) {
+            NFRule nonNumericalRule = nonNumericalRules[nonNumericalRuleIdx];
+            if (nonNumericalRule != null && ((nonNumericalExecutedRuleMask >> nonNumericalRuleIdx) & 1) == 0) {
+                // Mark this rule as being executed so that we don't try to execute it again.
+                nonNumericalExecutedRuleMask |= 1 << nonNumericalRuleIdx;
+
+                tempResult = nonNumericalRule.doParse(text, parsePosition, false, upperBound, nonNumericalExecutedRuleMask);
                 if (parsePosition.getIndex() > highWaterMark.getIndex()) {
                     result = tempResult;
                     highWaterMark.setIndex(parsePosition.getIndex());
@@ -793,7 +797,7 @@
                 continue;
             }
 
-            tempResult = rules[i].doParse(text, parsePosition, isFractionRuleSet, upperBound);
+            tempResult = rules[i].doParse(text, parsePosition, isFractionRuleSet, upperBound, nonNumericalExecutedRuleMask);
             if (parsePosition.getIndex() > highWaterMark.getIndex()) {
                 result = tempResult;
                 highWaterMark.setIndex(parsePosition.getIndex());
diff --git a/android_icu4j/src/main/java/android/icu/text/NFSubstitution.java b/android_icu4j/src/main/java/android/icu/text/NFSubstitution.java
index 1dda8aa..2be22cc 100644
--- a/android_icu4j/src/main/java/android/icu/text/NFSubstitution.java
+++ b/android_icu4j/src/main/java/android/icu/text/NFSubstitution.java
@@ -426,7 +426,7 @@
      * is left unchanged.
      */
     public Number doParse(String text, ParsePosition parsePosition, double baseValue,
-                          double upperBound, boolean lenientParse) {
+                          double upperBound, boolean lenientParse, int nonNumericalExecutedRuleMask) {
         Number tempResult;
 
         // figure out the highest base value a rule can have and match
@@ -444,7 +444,7 @@
         // on), then also try parsing the text using a default-
         // constructed NumberFormat
         if (ruleSet != null) {
-            tempResult = ruleSet.parse(text, parsePosition, upperBound);
+            tempResult = ruleSet.parse(text, parsePosition, upperBound, nonNumericalExecutedRuleMask);
             if (lenientParse && !ruleSet.isFractionSet() && parsePosition.getIndex() == 0) {
                 tempResult = ruleSet.owner.getDecimalFormat().parse(text, parsePosition);
             }
@@ -996,17 +996,17 @@
      */
     @Override
   public Number doParse(String text, ParsePosition parsePosition, double baseValue,
-                        double upperBound, boolean lenientParse) {
+                        double upperBound, boolean lenientParse, int nonNumericalExecutedRuleMask) {
         // if this isn't a >>> substitution, we can just use the
         // inherited parse() routine to do the parsing
         if (ruleToUse == null) {
-            return super.doParse(text, parsePosition, baseValue, upperBound, lenientParse);
+            return super.doParse(text, parsePosition, baseValue, upperBound, lenientParse, nonNumericalExecutedRuleMask);
 
         } else {
             // but if it IS a >>> substitution, we have to do it here: we
             // use the specific rule's doParse() method, and then we have to
             // do some of the other work of NFRuleSet.parse()
-            Number tempResult = ruleToUse.doParse(text, parsePosition, false, upperBound);
+            Number tempResult = ruleToUse.doParse(text, parsePosition, false, upperBound, nonNumericalExecutedRuleMask);
 
             if (parsePosition.getIndex() != 0) {
                 double result = tempResult.doubleValue();
@@ -1301,11 +1301,11 @@
      */
     @Override
   public Number doParse(String text, ParsePosition parsePosition, double baseValue,
-                        double upperBound, boolean lenientParse) {
+                        double upperBound, boolean lenientParse, int nonNumericalExecutedRuleMask) {
         // if we're not in byDigits mode, we can just use the inherited
         // doParse()
         if (!byDigits) {
-            return super.doParse(text, parsePosition, baseValue, 0, lenientParse);
+            return super.doParse(text, parsePosition, baseValue, 0, lenientParse, nonNumericalExecutedRuleMask);
         }
         else {
             // if we ARE in byDigits mode, parse the text one digit at a time
@@ -1321,7 +1321,7 @@
             int leadingZeros = 0;
             while (workText.length() > 0 && workPos.getIndex() != 0) {
                 workPos.setIndex(0);
-                digit = ruleSet.parse(workText, workPos, 10).intValue();
+                digit = ruleSet.parse(workText, workPos, 10, nonNumericalExecutedRuleMask).intValue();
                 if (lenientParse && workPos.getIndex() == 0) {
                     Number n = ruleSet.owner.getDecimalFormat().parse(workText, workPos);
                     if (n != null) {
@@ -1627,7 +1627,7 @@
      */
     @Override
   public Number doParse(String text, ParsePosition parsePosition, double baseValue,
-                        double upperBound, boolean lenientParse) {
+                        double upperBound, boolean lenientParse, int nonNumericalExecutedRuleMask) {
         // we don't have to do anything special to do the parsing here,
         // but we have to turn lenient parsing off-- if we leave it on,
         // it SERIOUSLY messes up the algorithm
@@ -1642,7 +1642,7 @@
 
             while (workText.length() > 0 && workPos.getIndex() != 0) {
                 workPos.setIndex(0);
-                /*digit = */ruleSet.parse(workText, workPos, 1).intValue(); // parse zero or nothing at all
+                /*digit = */ruleSet.parse(workText, workPos, 1, nonNumericalExecutedRuleMask).intValue(); // parse zero or nothing at all
                 if (workPos.getIndex() == 0) {
                     // we failed, either there were no more zeros, or the number was formatted with digits
                     // either way, we're done
@@ -1663,7 +1663,7 @@
         }
 
         // we've parsed off the zeros, now let's parse the rest from our current position
-        Number result =  super.doParse(text, parsePosition, withZeros ? 1 : baseValue, upperBound, false);
+        Number result =  super.doParse(text, parsePosition, withZeros ? 1 : baseValue, upperBound, false, nonNumericalExecutedRuleMask);
 
         if (withZeros) {
             // any base value will do in this case.  is there a way to
diff --git a/android_icu4j/src/main/java/android/icu/text/NumberFormat.java b/android_icu4j/src/main/java/android/icu/text/NumberFormat.java
index 0863265..4f659fe 100644
--- a/android_icu4j/src/main/java/android/icu/text/NumberFormat.java
+++ b/android_icu4j/src/main/java/android/icu/text/NumberFormat.java
@@ -26,6 +26,7 @@
 
 import android.icu.impl.ICUData;
 import android.icu.impl.ICUResourceBundle;
+import android.icu.number.NumberFormatter;
 import android.icu.util.Currency;
 import android.icu.util.Currency.CurrencyUsage;
 import android.icu.util.CurrencyAmount;
@@ -36,6 +37,12 @@
 /**
  * <strong>[icu enhancement]</strong> ICU's replacement for {@link java.text.NumberFormat}.&nbsp;Methods, fields, and other functionality specific to ICU are labeled '<strong>[icu]</strong>'.
  *
+ * <p>
+ * <strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * {@link NumberFormatter} fits their use case.  Although not deprecated, this
+ * class, NumberFormat, is only provided for java.text.NumberFormat compatibility.
+ * <hr>
+ *
  * <code>NumberFormat</code> is the abstract base class for all number
  * formats. This class provides the interface for formatting and parsing
  * numbers. <code>NumberFormat</code> also provides methods for determining
@@ -542,6 +549,9 @@
     //============== Locale Stuff =====================
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns the default number format for the current default <code>FORMAT</code> locale.
      * The default format is one of the styles provided by the other
      * factory methods: getNumberInstance, getIntegerInstance,
@@ -555,6 +565,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns the default number format for the specified locale.
      * The default format is one of the styles provided by the other
      * factory methods: getNumberInstance, getCurrencyInstance or getPercentInstance.
@@ -565,6 +578,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * <strong>[icu]</strong> Returns the default number format for the specified locale.
      * The default format is one of the styles provided by the other
      * factory methods: getNumberInstance, getCurrencyInstance or getPercentInstance.
@@ -575,6 +591,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * <strong>[icu]</strong> Returns a specific style number format for default <code>FORMAT</code> locale.
      * @param style  number format style
      * @see Category#FORMAT
@@ -584,6 +603,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * <strong>[icu]</strong> Returns a specific style number format for a specific locale.
      * @param inLocale  the specific locale.
      * @param style     number format style
@@ -594,6 +616,9 @@
 
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a general-purpose number format for the current default <code>FORMAT</code> locale.
      * @see Category#FORMAT
      */
@@ -602,6 +627,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a general-purpose number format for the specified locale.
      */
     public static NumberFormat getNumberInstance(Locale inLocale) {
@@ -609,6 +637,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * <strong>[icu]</strong> Returns a general-purpose number format for the specified locale.
      */
     public static NumberFormat getNumberInstance(ULocale inLocale) {
@@ -616,6 +647,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns an integer number format for the current default <code>FORMAT</code> locale. The
      * returned number format is configured to round floating point numbers
      * to the nearest integer using IEEE half-even rounding (see {@link
@@ -632,6 +666,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns an integer number format for the specified locale. The
      * returned number format is configured to round floating point numbers
      * to the nearest integer using IEEE half-even rounding (see {@link
@@ -648,6 +685,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * <strong>[icu]</strong> Returns an integer number format for the specified locale. The
      * returned number format is configured to round floating point numbers
      * to the nearest integer using IEEE half-even rounding (see {@link
@@ -663,6 +703,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a currency format for the current default <code>FORMAT</code> locale.
      * @return a number format for currency
      * @see Category#FORMAT
@@ -672,6 +715,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a currency format for the specified locale.
      * @return a number format for currency
      */
@@ -680,6 +726,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * <strong>[icu]</strong> Returns a currency format for the specified locale.
      * @return a number format for currency
      */
@@ -688,6 +737,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a percentage format for the current default <code>FORMAT</code> locale.
      * @return a number format for percents
      * @see Category#FORMAT
@@ -697,6 +749,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a percentage format for the specified locale.
      * @return a number format for percents
      */
@@ -705,6 +760,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * <strong>[icu]</strong> Returns a percentage format for the specified locale.
      * @return a number format for percents
      */
@@ -713,6 +771,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * <strong>[icu]</strong> Returns a scientific format for the current default <code>FORMAT</code> locale.
      * @return a scientific number format
      * @see Category#FORMAT
@@ -722,6 +783,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * <strong>[icu]</strong> Returns a scientific format for the specified locale.
      * @return a scientific number format
      */
@@ -730,6 +794,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * <strong>[icu]</strong> Returns a scientific format for the specified locale.
      * @return a scientific number format
      */
@@ -1247,6 +1314,9 @@
 
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a specific style number format for a specific locale.
      * @param desiredLocale  the specific locale.
      * @param choice         number format style
diff --git a/android_icu4j/src/main/java/android/icu/text/RBBIDataWrapper.java b/android_icu4j/src/main/java/android/icu/text/RBBIDataWrapper.java
index dcdde54..a20e334 100644
--- a/android_icu4j/src/main/java/android/icu/text/RBBIDataWrapper.java
+++ b/android_icu4j/src/main/java/android/icu/text/RBBIDataWrapper.java
@@ -10,35 +10,192 @@
 
 package android.icu.text;
 
+import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
+import java.util.Arrays;
 
 import android.icu.impl.ICUBinary;
 import android.icu.impl.ICUBinary.Authenticate;
 import android.icu.impl.Trie2;
 
 /**
-* <p>Internal class used for Rule Based Break Iterators</p>
+* <p>Internal class used for Rule Based Break Iterators.</p>
 * <p>This class provides access to the compiled break rule data, as
-* it is stored in a .brk file.
+* it is stored in a .brk file. Refer to the file common/rbbidata.h from
+* ICU4C for further details.
+* Not intended for public use; declared public for testing purposes only.
+* @deprecated This API is ICU internal only.
+ * @hide Only a subset of ICU is exposed in Android
+ * @hide draft / provisional / internal are hidden on Android
 */
-final class RBBIDataWrapper {
+@Deprecated
+public final class RBBIDataWrapper {
+
+    /**
+     * A RBBI State Transition table, the form of the data used at run time in Java.
+     * These can be created from stored ICU data, or built from rules.
+     * The structure corresponds closely to struct RBBIStateTable in ICU4C.
+     * Not intended for public use; declared public for testing purposes only.
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    static public class RBBIStateTable {
+        /**
+         * Number of states (rows) in this table.
+         * @deprecated This API is ICU internal only.
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        @Deprecated
+        public int     fNumStates;
+        /**
+         * Length of a table row in bytes. Note mismatch with table data, which is short[].
+         * @deprecated This API is ICU internal only.
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        @Deprecated
+        public int     fRowLen;
+        /**
+         * Option Flags for this state table.
+         * @deprecated This API is ICU internal only.
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        @Deprecated
+        public int     fFlags;
+        /**
+         * Option Flags for this state table.
+         * @deprecated This API is ICU internal only.
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        @Deprecated
+        public int     fReserved;
+        /**
+         * Linear array of next state values, accessed as short[state, char_class]
+         * @deprecated This API is ICU internal only.
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        @Deprecated
+        public short[] fTable;
+
+        RBBIStateTable() {
+        }
+
+        static RBBIStateTable get(ByteBuffer bytes, int length) throws IOException {
+            if (length == 0) {
+                return null;
+            }
+            if (length < 16) {
+                throw new IOException("Invalid RBBI state table length.");
+            }
+            RBBIStateTable This = new RBBIStateTable();
+            This.fNumStates = bytes.getInt();
+            This.fRowLen    = bytes.getInt();
+            This.fFlags     = bytes.getInt();
+            This.fReserved  = bytes.getInt();
+            int lengthOfShorts = length - 16;   // length in bytes.
+            This.fTable     = ICUBinary.getShorts(bytes, lengthOfShorts / 2, lengthOfShorts & 1);
+            return This;
+        }
+
+        int put(DataOutputStream bytes) throws IOException {
+            bytes.writeInt(fNumStates);
+            bytes.writeInt(fRowLen);
+            bytes.writeInt(fFlags);
+            bytes.writeInt(fReserved);
+            int tableLen = fRowLen * fNumStates / 2;  // fRowLen is bytes.
+            for (int i = 0; i < tableLen; i++) {
+                bytes.writeShort(fTable[i]);
+            }
+            int bytesWritten = 16 + fRowLen * fNumStates;   // total bytes written,
+                                                            // including 16 for the header.
+            while (bytesWritten % 8 != 0) {
+                bytes.writeByte(0);
+                ++bytesWritten;
+            }
+            return bytesWritten;
+        }
+
+        /**
+         * {@inheritDoc}
+         * @deprecated This API is ICU internal only.
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        @Deprecated
+        @Override
+        public boolean equals (Object other) {
+            if (other == this) {
+                return true;
+            }
+            if (!(other instanceof RBBIStateTable)) {
+                return false;
+            }
+            RBBIStateTable otherST = (RBBIStateTable)other;
+            if (fNumStates != otherST.fNumStates) return false;
+            if (fRowLen    != otherST.fRowLen)    return false;
+            if (fFlags     != otherST.fFlags)     return false;
+            if (fReserved  != otherST.fReserved)  return false;
+            return Arrays.equals(fTable, otherST.fTable);
+        }
+    }
+
+    /**
+     * Equals helper for state tables, including null handling.
+     * Not intended for public use; declared public for testing purposes only.
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    static public boolean equals(RBBIStateTable left, RBBIStateTable right) {
+        if (left == right) {
+            return true;
+        }
+        if (left == null || right == null) {
+            return false;
+        }
+        return left.equals(right);
+    }
+
+
     //
     // These fields are the ready-to-use compiled rule data, as
     //   read from the file.
     //
-    RBBIDataHeader fHeader;
-    short          fFTable[];
-    short          fRTable[];
-    short          fSFTable[];
-    short          fSRTable[];
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public RBBIDataHeader fHeader;
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public RBBIStateTable   fFTable;
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public RBBIStateTable   fRTable;
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public RBBIStateTable   fSFTable;
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public RBBIStateTable   fSRTable;
+
     Trie2          fTrie;
     String         fRuleSource;
     int            fStatusTable[];
 
-    private boolean isBigEndian;
-
     static final int DATA_FORMAT = 0x42726b20;     // "Brk "
     static final int FORMAT_VERSION = 0x04000000;  // 4.0.0.0
 
@@ -79,20 +236,36 @@
     // Index offsets to the fields in a state table row.
     //    Corresponds to struct RBBIStateTableRow in the C version.
     //
-    final static int      ACCEPTING  = 0;
-    final static int      LOOKAHEAD  = 1;
-    final static int      TAGIDX     = 2;
-    final static int      RESERVED   = 3;
-    final static int      NEXTSTATES = 4;
-
-    // Index offsets to header fields of a state table
-    //     struct RBBIStateTable {...   in the C version.
-    //
-            static final int NUMSTATES  = 0;
-            static final int ROWLEN     = 2;
-            static final int FLAGS      = 4;
-    //ivate static final int RESERVED_2 = 6;
-    private static final int ROW_DATA   = 8;
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public final static int      ACCEPTING  = 0;
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public final static int      LOOKAHEAD  = 1;
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public final static int      TAGIDX     = 2;
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public final static int      RESERVED   = 3;
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public final static int      NEXTSTATES = 4;
 
     //  Bit selectors for the "FLAGS" field of the state table header
     //     enum RBBIStateTableFlags in the C version.
@@ -102,13 +275,22 @@
 
     /**
      * Data Header.  A struct-like class with the fields from the RBBI data file header.
+     * Not intended for public use, declared public for testing purposes only.
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
      */
-    final static class RBBIDataHeader {
+    @Deprecated
+    public final static class RBBIDataHeader {
         int         fMagic;         //  == 0xbla0
         byte[]      fFormatVersion; //  For ICU 3.4 and later.
         int         fLength;        //  Total length in bytes of this RBBI Data,
                                        //      including all sections, not just the header.
-        int         fCatCount;      //  Number of character categories.
+        /**
+         * @deprecated This API is ICU internal only.
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        @Deprecated
+        public int  fCatCount;      //  Number of character categories.
 
         //
         //  Offsets and sizes of each of the subsections within the RBBI data.
@@ -130,6 +312,11 @@
         int         fStatusTable;    // Offset to the table of rule status values
         int         fStatusTableLen;
 
+        /**
+         * @deprecated This API is ICU internal only.
+         * @hide draft / provisional / internal are hidden on Android
+         */
+        @Deprecated
         public RBBIDataHeader() {
             fMagic = 0;
             fFormatVersion = new byte[4];
@@ -140,10 +327,12 @@
     /**
      * RBBI State Table Indexing Function.  Given a state number, return the
      * array index of the start of the state table row for that state.
-     *
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
      */
-    int getRowIndex(int state){
-        return ROW_DATA + state * (fHeader.fCatCount + 4);
+    @Deprecated
+    public int getRowIndex(int state){
+        return state * (fHeader.fCatCount + 4);
     }
 
     RBBIDataWrapper() {
@@ -157,7 +346,6 @@
         RBBIDataWrapper This = new RBBIDataWrapper();
 
         ICUBinary.readHeader(bytes, DATA_FORMAT, IS_ACCEPTABLE);
-        This.isBigEndian = bytes.order() == ByteOrder.BIG_ENDIAN;
 
         // Read in the RBBI data header...
         This.fHeader = new  RBBIDataHeader();
@@ -205,8 +393,7 @@
         ICUBinary.skipBytes(bytes, This.fHeader.fFTable - pos);
         pos = This.fHeader.fFTable;
 
-        This.fFTable = ICUBinary.getShorts(
-                bytes, This.fHeader.fFTableLen / 2, This.fHeader.fFTableLen & 1);
+        This.fFTable = RBBIStateTable.get(bytes, This.fHeader.fFTableLen);
         pos += This.fHeader.fFTableLen;
 
         //
@@ -218,8 +405,7 @@
         pos = This.fHeader.fRTable;
 
         // Create & fill the table itself.
-        This.fRTable = ICUBinary.getShorts(
-                bytes, This.fHeader.fRTableLen / 2, This.fHeader.fRTableLen & 1);
+        This.fRTable = RBBIStateTable.get(bytes, This.fHeader.fRTableLen);
         pos += This.fHeader.fRTableLen;
 
         //
@@ -231,8 +417,7 @@
             pos = This.fHeader.fSFTable;
 
             // Create & fill the table itself.
-            This.fSFTable = ICUBinary.getShorts(
-                    bytes, This.fHeader.fSFTableLen / 2, This.fHeader.fSFTableLen & 1);
+            This.fSFTable = RBBIStateTable.get(bytes, This.fHeader.fSFTableLen);
             pos += This.fHeader.fSFTableLen;
         }
 
@@ -245,8 +430,7 @@
             pos = This.fHeader.fSRTable;
 
             // Create & fill the table itself.
-            This.fSRTable = ICUBinary.getShorts(
-                    bytes, This.fHeader.fSRTableLen / 2, This.fHeader.fSRTableLen & 1);
+            This.fSRTable = RBBIStateTable.get(bytes, This.fHeader.fSRTableLen);
             pos += This.fHeader.fSRTableLen;
         }
 
@@ -313,26 +497,14 @@
     }
 
     ///CLOVER:OFF
-    //  Getters for fields from the state table header
-    //
-    private int getStateTableNumStates(short table[]) {
-        if (isBigEndian) {
-            return (table[NUMSTATES] << 16) | (table[NUMSTATES+1] & 0xffff);
-        } else {
-            return (table[NUMSTATES+1] << 16) | (table[NUMSTATES] & 0xffff);
-        }
-    }
-    ///CLOVER:ON
-
-    int getStateTableFlags(short table[]) {
-        // This works for up to 15 flags bits.
-        return table[isBigEndian ? FLAGS + 1 : FLAGS];
-    }
-
-    ///CLOVER:OFF
     /* Debug function to display the break iterator data. */
-    void dump(java.io.PrintStream out) {
-        if (fFTable.length == 0) {
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
+    public void dump(java.io.PrintStream out) {
+        if (fFTable == null) {
             // There is no table. Fail early for testing purposes.
             throw new NullPointerException();
         }
@@ -355,6 +527,11 @@
 
     ///CLOVER:OFF
     /* Fixed width int-to-string conversion. */
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
     static public String intToString(int n, int width) {
         StringBuilder  dest = new StringBuilder(width);
         dest.append(n);
@@ -367,6 +544,11 @@
 
     ///CLOVER:OFF
     /* Fixed width int-to-string conversion. */
+    /**
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
+     */
+    @Deprecated
     static public String intToHexString(int n, int width) {
         StringBuilder  dest = new StringBuilder(width);
         dest.append(Integer.toHexString(n));
@@ -379,8 +561,8 @@
 
     ///CLOVER:OFF
     /** Dump a state table.  (A full set of RBBI rules has 4 state tables.)  */
-    private void dumpTable(java.io.PrintStream out, short table[]) {
-        if (table == null || table.length == 0)   {
+    private void dumpTable(java.io.PrintStream out, RBBIStateTable table) {
+        if (table == null || table.fTable.length == 0)   {
             out.println("  -- null -- ");
         } else {
             int n;
@@ -394,7 +576,7 @@
                 out.print("-");
             }
             out.println();
-            for (state=0; state< getStateTableNumStates(table); state++) {
+            for (state=0; state < table.fNumStates; state++) {
                 dumpRow(out, table, state);
             }
             out.println();
@@ -408,24 +590,24 @@
      * @param table
      * @param state
      */
-    private void dumpRow(java.io.PrintStream out, short table[], int   state) {
+    private void dumpRow(java.io.PrintStream out, RBBIStateTable table, int   state) {
         StringBuilder dest = new StringBuilder(fHeader.fCatCount*5 + 20);
         dest.append(intToString(state, 4));
         int row = getRowIndex(state);
-        if (table[row+ACCEPTING] != 0) {
-           dest.append(intToString(table[row+ACCEPTING], 5));
+        if (table.fTable[row+ACCEPTING] != 0) {
+           dest.append(intToString(table.fTable[row+ACCEPTING], 5));
         }else {
             dest.append("     ");
         }
-        if (table[row+LOOKAHEAD] != 0) {
-            dest.append(intToString(table[row+LOOKAHEAD], 5));
+        if (table.fTable[row+LOOKAHEAD] != 0) {
+            dest.append(intToString(table.fTable[row+LOOKAHEAD], 5));
         }else {
             dest.append("     ");
         }
-        dest.append(intToString(table[row+TAGIDX], 5));
+        dest.append(intToString(table.fTable[row+TAGIDX], 5));
 
         for (int col=0; col<fHeader.fCatCount; col++) {
-            dest.append(intToString(table[row+NEXTSTATES+col], 5));
+            dest.append(intToString(table.fTable[row+NEXTSTATES+col], 5));
         }
 
         out.println(dest);
diff --git a/android_icu4j/src/main/java/android/icu/text/RBBIRuleBuilder.java b/android_icu4j/src/main/java/android/icu/text/RBBIRuleBuilder.java
index ea89b47..69eab8f 100644
--- a/android_icu4j/src/main/java/android/icu/text/RBBIRuleBuilder.java
+++ b/android_icu4j/src/main/java/android/icu/text/RBBIRuleBuilder.java
@@ -29,6 +29,7 @@
 
     String fDebugEnv;              // controls debug trace output
     String fRules;                 // The rule string that we are compiling
+    StringBuilder fStrippedRules;  // The rule string, with comments stripped.
     RBBIRuleScanner fScanner;      // The scanner.
 
 
@@ -143,6 +144,7 @@
         fDebugEnv       = ICUDebug.enabled("rbbi") ?
                             ICUDebug.value("rbbi") : null;
         fRules          = rules;
+        fStrippedRules  = new StringBuilder(rules);
         fUSetNodes      = new ArrayList<RBBINode>();
         fRuleStatusVals = new ArrayList<Integer>();
         fScanner        = new RBBIRuleScanner(this);
@@ -166,8 +168,9 @@
         DataOutputStream dos = new DataOutputStream(os);
         int i;
 
-        //  Remove comments and whitespace from the rules to make it smaller.
-        String strippedRules = RBBIRuleScanner.stripRules(fRules);
+        //  Remove whitespace from the rules to make it smaller.
+        //  The rule parser has already removed comments.
+        String strippedRules = RBBIRuleScanner.stripRules(fStrippedRules.toString());
 
         // Calculate the size of each section in the data in bytes.
         //   Sizes here are padded up to a multiple of 8 for better memory alignment.
@@ -251,13 +254,9 @@
         }
 
         // Write out the actual state tables.
-        short[] tableData;
-        tableData = fForwardTables.exportTable();
-        Assert.assrt(outputPos == header[4]);
-        for (i = 0; i < tableData.length; i++) {
-            dos.writeShort(tableData[i]);
-            outputPos += 2;
-        }
+        RBBIDataWrapper.RBBIStateTable table = fForwardTables.exportTable();
+        assert(outputPos == header[4]);
+        outputPos += table.put(dos);
 
         /* do not write the reverse table
         tableData = fReverseTables.exportTable();
@@ -279,16 +278,13 @@
 
         // Write the safe reverse table.
         // If not present, write the plain reverse table (old style rule compatibility)
-        Assert.assrt(outputPos == header[10]);
+        assert(outputPos == header[10]);
         if (safeRevTableSize > 0) {
-            tableData = fSafeRevTables.exportTable();
+            table = fSafeRevTables.exportTable();
         } else {
-            tableData = fReverseTables.exportTable();
+            table = fReverseTables.exportTable();
         }
-        for (i = 0; i < tableData.length; i++) {
-            dos.writeShort(tableData[i]);
-            outputPos += 2;
-        }
+        outputPos += table.put(dos);
 
         // write out the Trie table
         Assert.assrt(outputPos == header[12]);
@@ -340,10 +336,10 @@
         //
         // UnicodeSet processing.
         //    Munge the Unicode Sets to create a set of character categories.
-        //    Generate the mapping tables (TRIE) from input 32-bit characters to
+        //    Generate the mapping tables (TRIE) from input code points to
         //    the character categories.
         //
-        builder.fSetBuilder.build();
+        builder.fSetBuilder.buildRanges();
 
         //
         //   Generate the DFA state transition table.
@@ -361,10 +357,38 @@
             builder.fForwardTables.printRuleStatusTable();
         }
 
+        builder.optimizeTables();
+        builder.fSetBuilder.buildTrie();
         //
         //   Package up the compiled data, writing it to an output stream
         //      in the serialization format.  This is the same as the ICU4C runtime format.
         //
         builder.flattenData(os);
     }
+
+    static class IntPair {
+        int first = 0;
+        int second = 0;
+        IntPair() {};
+        IntPair(int f, int s) {
+            first = f;
+            second = s;
+        }
+    }
+
+    void optimizeTables() {
+        IntPair duplPair = new IntPair(3, 0);
+        while (fForwardTables.findDuplCharClassFrom(duplPair)) {
+            fSetBuilder.mergeCategories(duplPair.first, duplPair.second);
+            fForwardTables.removeColumn(duplPair.second);
+            fReverseTables.removeColumn(duplPair.second);
+            fSafeFwdTables.removeColumn(duplPair.second);
+            fSafeRevTables.removeColumn(duplPair.second);
+        }
+
+        fForwardTables.removeDuplicateStates();
+        fReverseTables.removeDuplicateStates();
+        fSafeFwdTables.removeDuplicateStates();
+        fSafeRevTables.removeDuplicateStates();
+    }
 }
diff --git a/android_icu4j/src/main/java/android/icu/text/RBBIRuleScanner.java b/android_icu4j/src/main/java/android/icu/text/RBBIRuleScanner.java
index 6a69cf0..6285900 100644
--- a/android_icu4j/src/main/java/android/icu/text/RBBIRuleScanner.java
+++ b/android_icu4j/src/main/java/android/icu/text/RBBIRuleScanner.java
@@ -15,6 +15,7 @@
 import android.icu.impl.Assert;
 import android.icu.impl.Utility;
 import android.icu.lang.UCharacter;
+import android.icu.lang.UProperty;
 
 /**
   *  This class is part of the Rule Based Break Iterator rule compiler.
@@ -697,17 +698,16 @@
     static String stripRules(String rules) {
         StringBuilder strippedRules = new StringBuilder();
         int rulesLength = rules.length();
-        for (int idx = 0; idx < rulesLength;) {
-            char ch = rules.charAt(idx++);
-            if (ch == '#') {
-                while (idx < rulesLength
-                        && ch != '\r' && ch != '\n' && ch != chNEL) {
-                    ch = rules.charAt(idx++);
-                }
+        boolean skippingSpaces = false;
+
+        for (int idx = 0; idx < rulesLength; idx = rules.offsetByCodePoints(idx, 1)) {
+            int cp = rules.codePointAt(idx);
+            boolean whiteSpace = UCharacter.hasBinaryProperty(cp, UProperty.PATTERN_WHITE_SPACE);
+            if (skippingSpaces && whiteSpace) {
+                continue;
             }
-            if (!UCharacter.isISOControl(ch)) {
-                strippedRules.append(ch);
-            }
+            strippedRules.appendCodePoint(cp);
+            skippingSpaces = whiteSpace;
         }
         return strippedRules.toString();
     }
@@ -801,6 +801,7 @@
                 //  It will be treated as white-space, and serves to break up anything
                 //    that might otherwise incorrectly clump together with a comment in
                 //    the middle (a variable name, for example.)
+                int commentStart = fScanIndex;
                 for (;;) {
                     c.fChar = nextCharLL();
                     if (c.fChar == -1 || // EOF
@@ -812,6 +813,9 @@
                         break;
                     }
                 }
+                for (int i=commentStart; i<fNextIndex-1; ++i) {
+                    fRB.fStrippedRules.setCharAt(i, ' ');
+                }
             }
             if (c.fChar == -1) {
                 return;
diff --git a/android_icu4j/src/main/java/android/icu/text/RBBISetBuilder.java b/android_icu4j/src/main/java/android/icu/text/RBBISetBuilder.java
index bf56144..2bae1e4 100644
--- a/android_icu4j/src/main/java/android/icu/text/RBBISetBuilder.java
+++ b/android_icu4j/src/main/java/android/icu/text/RBBISetBuilder.java
@@ -113,7 +113,7 @@
                         }
                     }
                     if (setName.equals("dictionary")) {
-                        this.fNum |= 0x4000;
+                        this.fNum |= DICT_BIT;
                         break;
                     }
                 }
@@ -139,6 +139,8 @@
 
     boolean             fSawBOF;
 
+    static final int    DICT_BIT = 0x4000;
+
 
     //------------------------------------------------------------------------
     //
@@ -157,7 +159,7 @@
     //                          from the Unicode Sets.
     //
     //------------------------------------------------------------------------
-    void build() {
+    void buildRanges() {
         RangeDescriptor rlRange;
 
         if (fRB.fDebugEnv!=null  && fRB.fDebugEnv.indexOf("usets")>=0) {printSets();}
@@ -281,6 +283,15 @@
 
         if (fRB.fDebugEnv!=null  && fRB.fDebugEnv.indexOf("rgroup")>=0) {printRangeGroups();}
         if (fRB.fDebugEnv!=null  && fRB.fDebugEnv.indexOf("esets")>=0) {printSets();}
+    }
+
+
+    /**
+     * Build the Trie table for mapping UChar32 values to the corresponding
+     * range group number.
+     */
+    void buildTrie() {
+        RangeDescriptor rlRange;
 
         fTrie = new Trie2Writable(0,       //   Initial value for all code points.
                                   0);      //   Error value for out-of-range input.
@@ -295,6 +306,24 @@
         }
     }
 
+    /**
+     * Merge two character categories that have been identified as having equivalent behavior.
+     * The ranges belonging to the right category (table column) will be added to the left.
+     */
+    void mergeCategories(int left, int right) {
+        assert(left >= 1);
+        assert(right > left);
+        for (RangeDescriptor rd = fRangeList; rd != null; rd = rd.fNext) {
+            int rangeNum = rd.fNum & ~DICT_BIT;
+            int rangeDict = rd.fNum & DICT_BIT;
+            if (rangeNum == right) {
+                rd.fNum = left | rangeDict;
+            } else if (rangeNum > right) {
+                rd.fNum--;
+            }
+        }
+        --fGroupCount;
+    }
 
     //-----------------------------------------------------------------------------------
     //
@@ -458,7 +487,7 @@
                 if (groupNum<10) {System.out.print(" ");}
                 System.out.print(groupNum + " ");
 
-                if ((rlRange.fNum & 0x4000) != 0) { System.out.print(" <DICT> ");}
+                if ((rlRange.fNum & DICT_BIT) != 0) { System.out.print(" <DICT> ");}
 
                 for (i=0; i<rlRange.fIncludesSets.size(); i++) {
                     RBBINode       usetNode    = rlRange.fIncludesSets.get(i);
diff --git a/android_icu4j/src/main/java/android/icu/text/RBBITableBuilder.java b/android_icu4j/src/main/java/android/icu/text/RBBITableBuilder.java
index ca3d0da..8a46573 100644
--- a/android_icu4j/src/main/java/android/icu/text/RBBITableBuilder.java
+++ b/android_icu4j/src/main/java/android/icu/text/RBBITableBuilder.java
@@ -11,6 +11,7 @@
 package android.icu.text;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -21,6 +22,7 @@
 import android.icu.impl.Assert;
 import android.icu.lang.UCharacter;
 import android.icu.lang.UProperty;
+import android.icu.text.RBBIRuleBuilder.IntPair;
 
 //
 //  class RBBITableBuilder is part of the RBBI rule compiler.
@@ -656,7 +658,7 @@
                         // if sd.fAccepting already had a value other than 0 or -1, leave it be.
 
                        // If the end marker node is from a look-ahead rule, set
-                       //   the fLookAhead field or this state also.
+                       //   the fLookAhead field for this state also.
                        if (endMarker.fLookAheadEnd) {
                         // TODO:  don't change value if already set?
                         // TODO:  allow for more than one active look-ahead rule in engine.
@@ -833,115 +835,214 @@
 
 
 
+       /**
+        *  Find duplicate (redundant) character classes, beginning at the specified
+        *  pair, within this state table. This is an iterator-like function, used to
+        *  identify character classes (state table columns) that can be eliminated.
+        *  @param categories in/out parameter, specifies where to start looking for duplicates,
+        *                and returns the first pair of duplicates found, if any.
+        *  @return true if duplicate char classes were found, false otherwise.
+        *  @hide draft / provisional / internal are hidden on Android
+        */
+       boolean findDuplCharClassFrom(RBBIRuleBuilder.IntPair categories) {
+           int numStates = fDStates.size();
+           int numCols = fRB.fSetBuilder.getNumCharCategories();
 
-       //-----------------------------------------------------------------------------
-       //
-       //   getTableSize()    Calculate the size in bytes of the runtime form of this
-       //                     state transition table.
-       //
-       //          Note:  Refer to common/rbbidata.h from ICU4C for the declarations
-       //                 of the structures being matched by this calculation.
-       //
-       //-----------------------------------------------------------------------------
+           int table_base = 0;
+           int table_dupl = 0;
+           for (; categories.first < numCols-1; ++categories.first) {
+               for (categories.second=categories.first+1; categories.second < numCols; ++categories.second) {
+                   for (int state=0; state<numStates; state++) {
+                       RBBIStateDescriptor sd = fDStates.get(state);
+                       table_base = sd.fDtran[categories.first];
+                       table_dupl = sd.fDtran[categories.second];
+                       if (table_base != table_dupl) {
+                           break;
+                       }
+                   }
+                   if (table_base == table_dupl) {
+                       return true;
+                   }
+               }
+           }
+           return false;
+       }
+
+       /**
+        * Remove a column from the state table. Used when two character categories
+        * have been found equivalent, and merged together, to eliminate the unneeded table column.
+        */
+       void removeColumn(int column) {
+           int numStates = fDStates.size();
+           for (int state=0; state<numStates; state++) {
+               RBBIStateDescriptor sd = fDStates.get(state);
+               assert(column < sd.fDtran.length);
+               int[] newArray = Arrays.copyOf(sd.fDtran, sd.fDtran.length - 1);
+               System.arraycopy(sd.fDtran, column+1, newArray, column, newArray.length - column);
+               sd.fDtran = newArray;
+           }
+       }
+
+
+       /**
+        *  Find duplicate (redundant) states, beginning at the specified pair,
+        *  within this state table. This is an iterator-like function, used to
+        *  identify states (state table rows) that can be eliminated.
+        *  @param states in/out parameter, specifies where to start looking for duplicates,
+        *                and returns the first pair of duplicates found, if any.
+        *  @return true if duplicate states were found, false otherwise.
+        *  @hide draft / provisional / internal are hidden on Android
+        */
+       boolean findDuplicateState(RBBIRuleBuilder.IntPair states) {
+           int numStates = fDStates.size();
+           int numCols = fRB.fSetBuilder.getNumCharCategories();
+
+           for (; states.first<numStates-1; ++states.first) {
+               RBBIStateDescriptor firstSD = fDStates.get(states.first);
+               for (states.second=states.first+1; states.second<numStates; ++states.second) {
+                   RBBIStateDescriptor duplSD = fDStates.get(states.second);
+                   if (firstSD.fAccepting != duplSD.fAccepting ||
+                           firstSD.fLookAhead != duplSD.fLookAhead ||
+                           firstSD.fTagsIdx   != duplSD.fTagsIdx) {
+                       continue;
+                   }
+                   boolean rowsMatch = true;
+                   for (int col=0; col < numCols; ++col) {
+                       int firstVal = firstSD.fDtran[col];
+                       int duplVal = duplSD.fDtran[col];
+                       if (!((firstVal == duplVal) ||
+                               ((firstVal == states.first || firstVal == states.second) &&
+                                       (duplVal  == states.first || duplVal  == states.second)))) {
+                           rowsMatch = false;
+                           break;
+                       }
+                   }
+                   if (rowsMatch) {
+                       return true;
+                   }
+               }
+           }
+           return false;
+       }
+
+       /**
+        * Remove a duplicate state (row) from the state table. All references to the deleted state are
+        * redirected to "keepState", the first encountered of the duplicated pair of states.
+        * @param keepState The first of the duplicate pair of states, the one to be kept.
+        * @param duplState The second of the duplicate pair, the one to be removed.
+        * @hide draft / provisional / internal are hidden on Android
+        */
+       void removeState(int keepState, int duplState) {
+           assert(keepState < duplState);
+           assert(duplState < fDStates.size());
+
+           fDStates.remove(duplState);
+
+           int numStates = fDStates.size();
+           int numCols = fRB.fSetBuilder.getNumCharCategories();
+           for (int state=0; state<numStates; ++state) {
+               RBBIStateDescriptor sd = fDStates.get(state);
+               for (int col=0; col<numCols; col++) {
+                   int existingVal = sd.fDtran[col];
+                   int newVal = existingVal;
+                   if (existingVal == duplState) {
+                       newVal = keepState;
+                   } else if (existingVal > duplState) {
+                       newVal = existingVal - 1;
+                   }
+                   sd.fDtran[col] = newVal;
+               }
+               if (sd.fAccepting == duplState) {
+                   sd.fAccepting = keepState;
+               } else if (sd.fAccepting > duplState) {
+                   sd.fAccepting--;
+               }
+               if (sd.fLookAhead == duplState) {
+                   sd.fLookAhead = keepState;
+               } else if (sd.fLookAhead > duplState) {
+                   sd.fLookAhead--;
+               }
+           }
+       }
+
+
+       /**
+        *  Check for, and remove duplicate states (table rows).
+        *  @hide draft / provisional / internal are hidden on Android
+        */
+       void removeDuplicateStates() {
+           IntPair dupls = new IntPair(3, 0);
+           while (findDuplicateState(dupls)) {
+               // System.out.printf("Removing duplicate states (%d, %d)\n", dupls.first, dupls.second);
+               removeState(dupls.first, dupls.second);
+           }
+       }
+
+
+       /**
+        *  Calculate the size in bytes of the serialized form of this state transition table,
+        *  which is identical to the ICU4C runtime form.
+        *  Refer to common/rbbidata.h from ICU4C for the declarations of the structures
+        *  being matched by this calculation.
+        */
        int  getTableSize()  {
-           int    size = 0;
-           int    numRows;
-           int    numCols;
-           int    rowSize;
-
            if (fRB.fTreeRoots[fRootIx] == null) {
                return 0;
            }
-
-           size    = /*sizeof(RBBIStateTable) - 4 */ 16;    // The header, with no rows to the table.
-
-           numRows = fDStates.size();
-           numCols = fRB.fSetBuilder.getNumCharCategories();
-
-           //  Note  The declaration of RBBIStateTableRow is for a table of two columns.
-           //        Therefore we subtract two from numCols when determining
-           //        how much storage to add to a row for the total columns.
-           // rowSize = sizeof(RBBIStateTableRow) + sizeof(uint16_t)*(numCols-2);
-           rowSize = 8 + 2*numCols;
+           int size    = 16;    // The header of 4 ints, with no rows to the table.
+           int numRows = fDStates.size();
+           int numCols = fRB.fSetBuilder.getNumCharCategories();
+           int rowSize = 8 + 2*numCols;
            size   += numRows * rowSize;
-           while (size % 8 > 0) {    // Size must be multiple of 8 bytes in size.
-               size++;
-           }
-
+           size = (size + 7) & ~7;   // round up to a multiple of 8 bytes
            return size;
        }
 
 
 
-       //-----------------------------------------------------------------------------
-       //
-       //   exportTable()    export the state transition table in the ICU4C format.
-       //
-       //                    Most of the table is 16 bit shorts.  This function exports
-       //                    the whole thing as an array of shorts.
-       //
-       //                    The size of the array must be rounded up to a multiple of
-       //                    8 bytes.
-       //
-       //                    See struct RBBIStateTable in ICU4C, common/rbbidata.h
-       //
-       //-----------------------------------------------------------------------------
-
-       short [] exportTable() {
+       /**
+        * Create a RBBIDataWrapper.RBBIStateTable for a newly compiled table.
+        * RBBIDataWrapper.RBBIStateTable is similar to struct RBBIStateTable in ICU4C,
+        * in common/rbbidata.h
+        */
+       RBBIDataWrapper.RBBIStateTable exportTable() {
            int                state;
            int                col;
 
+           RBBIDataWrapper.RBBIStateTable table = new RBBIDataWrapper.RBBIStateTable();
            if (fRB.fTreeRoots[fRootIx] == null) {
-               return new short[0];
+               return table;
            }
 
            Assert.assrt(fRB.fSetBuilder.getNumCharCategories() < 0x7fff &&
                fDStates.size() < 0x7fff);
-
-           int numStates = fDStates.size();
+           table.fNumStates = fDStates.size();
 
            // Size of table size in shorts.
            //  the "4" is the size of struct RBBIStateTableRow, the row header part only.
-           int rowLen = 4 + fRB.fSetBuilder.getNumCharCategories();
-           int tableSize = getTableSize() / 2;
+           int rowLen = 4 + fRB.fSetBuilder.getNumCharCategories();   // Row Length in shorts.
+           int tableSize = (getTableSize() - 16) / 2;       // fTable length in shorts.
+           table.fTable = new short[tableSize];
+           table.fRowLen = rowLen * 2;                      // Row length in bytes.
 
-
-           short [] table = new short[tableSize];
-
-           //
-           // Fill in the header fields.
-           //      Annoying because they really want to be ints, not shorts.
-           //
-           // RBBIStateTable.fNumStates
-           table[RBBIDataWrapper.NUMSTATES]   = (short)(numStates >>> 16);
-           table[RBBIDataWrapper.NUMSTATES+1] = (short)(numStates & 0x0000ffff);
-
-           // RBBIStateTable.fRowLen
-           table[RBBIDataWrapper.ROWLEN]   = (short)(rowLen >>> 16);
-           table[RBBIDataWrapper.ROWLEN+1] = (short)(rowLen & 0x0000ffff);
-
-           // RBBIStateTable.fFlags
-           int flags = 0;
            if (fRB.fLookAheadHardBreak) {
-               flags  |= RBBIDataWrapper.RBBI_LOOKAHEAD_HARD_BREAK;
+               table.fFlags  |= RBBIDataWrapper.RBBI_LOOKAHEAD_HARD_BREAK;
            }
            if (fRB.fSetBuilder.sawBOF()) {
-               flags  |= RBBIDataWrapper.RBBI_BOF_REQUIRED;
+               table.fFlags  |= RBBIDataWrapper.RBBI_BOF_REQUIRED;
            }
-           table[RBBIDataWrapper.FLAGS]   = (short)(flags >>> 16);
-           table[RBBIDataWrapper.FLAGS+1] = (short)(flags & 0x0000ffff);
 
            int numCharCategories = fRB.fSetBuilder.getNumCharCategories();
-           for (state=0; state<numStates; state++) {
+           for (state=0; state<table.fNumStates; state++) {
                RBBIStateDescriptor sd = fDStates.get(state);
-               int                row = 8 + state*rowLen;
+               int row = state*rowLen;
                Assert.assrt (-32768 < sd.fAccepting && sd.fAccepting <= 32767);
                Assert.assrt (-32768 < sd.fLookAhead && sd.fLookAhead <= 32767);
-               table[row + RBBIDataWrapper.ACCEPTING] = (short)sd.fAccepting;
-               table[row + RBBIDataWrapper.LOOKAHEAD] = (short)sd.fLookAhead;
-               table[row + RBBIDataWrapper.TAGIDX]    = (short)sd.fTagsIdx;
+               table.fTable[row + RBBIDataWrapper.ACCEPTING] = (short)sd.fAccepting;
+               table.fTable[row + RBBIDataWrapper.LOOKAHEAD] = (short)sd.fLookAhead;
+               table.fTable[row + RBBIDataWrapper.TAGIDX]    = (short)sd.fTagsIdx;
                for (col=0; col<numCharCategories; col++) {
-                   table[row + RBBIDataWrapper.NEXTSTATES + col] = (short)sd.fDtran[col];
+                   table.fTable[row + RBBIDataWrapper.NEXTSTATES + col] = (short)sd.fDtran[col];
                }
            }
            return table;
diff --git a/android_icu4j/src/main/java/android/icu/text/RuleBasedBreakIterator.java b/android_icu4j/src/main/java/android/icu/text/RuleBasedBreakIterator.java
index 546125c..fdc6a24 100644
--- a/android_icu4j/src/main/java/android/icu/text/RuleBasedBreakIterator.java
+++ b/android_icu4j/src/main/java/android/icu/text/RuleBasedBreakIterator.java
@@ -211,15 +211,19 @@
     private static final int  RBBI_RUN    = 1;
     private static final int  RBBI_END    = 2;
 
-    /*
+    /**
      * The character iterator through which this BreakIterator accesses the text.
      */
     private CharacterIterator   fText = new java.text.StringCharacterIterator("");
 
     /**
-     * The rule data for this BreakIterator instance. Package private.
+     * The rule data for this BreakIterator instance.
+     * Not intended for public use. Declared public for testing purposes only.
+     * @deprecated This API is ICU internal only.
+     * @hide draft / provisional / internal are hidden on Android
      */
-    RBBIDataWrapper             fRData;
+    @Deprecated
+    public RBBIDataWrapper    fRData;
 
     /**
      *  The iteration state - current position, rule status for the current position,
@@ -259,7 +263,7 @@
 
     private DictionaryCache     fDictionaryCache = new DictionaryCache();
 
-    /*
+    /**
      * ICU debug argument name for RBBI
      */
     private static final String RBBI_DEBUG_ARG = "rbbi";
@@ -271,13 +275,6 @@
             && ICUDebug.value(RBBI_DEBUG_ARG).indexOf("trace") >= 0;
 
     /**
-     * What kind of break iterator this is.
-     * Defaulting BreakType to word gives reasonable dictionary behavior for
-     * Break Iterators that are built from rules.
-     */
-    private int fBreakType = KIND_WORD;
-
-    /**
      * The "default" break engine - just skips over ranges of dictionary words,
      * producing no breaks. Should only be used if characters need to be handled
      * by a dictionary but we have no dictionary implementation for them.
@@ -443,7 +440,7 @@
             return first();
         }
 
-        // Move requested offset to a code point start. It might be on a trail surrogate.
+        // Move requested offset to a code point start. It might be between a lead and trail surrogate.
         // Or it may be beyond the end of the text.
         startPos = CISetIndex32(fText, startPos);
         fBreakCache.following(startPos);
@@ -465,7 +462,7 @@
             return first();
         }
 
-        // Move requested offset to a code point start. It might be on a trail surrogate.
+        // Move requested offset to a code point start. It might be between a lead and trail surrogate.
         // int adjustedOffset = CISetIndex32(fText, offset);    // TODO: restore to match ICU4C behavior.
         int adjustedOffset = offset;
         fBreakCache.preceding(adjustedOffset);
@@ -517,7 +514,7 @@
     }
 
     /**
-     * Returns the current iteration position.  Note that UBRK_DONE is never
+     * Returns the current iteration position.  Note that DONE is never
      * returned from this function; if iteration has run to the end of a
      * string, current() will return the length of the string while
      * next() will return BreakIterator.DONE).
@@ -530,8 +527,8 @@
 
 
     /**
-     * Return the status tag from the break rule that determined the most recently
-     * returned break position.  The values appear in the rule source
+     * Return the status tag from the break rule that determined the boundary at
+     * the current iteration position.  The values appear in the rule source
      * within brackets, {123}, for example.  For rules that do not specify a
      * status, a default value of 0 is returned.  If more than one rule applies,
      * the numerically largest of the possible status values is returned.
@@ -545,8 +542,12 @@
      * position from <code>next()</code>, <code>previous()</code>, or
      * any other break iterator functions that returns a boundary position.
      * <p>
-     * @return the status from the break rule that determined the most recently
-     * returned break position.
+     * Note that <code>getRuleStatus()</code> returns the value corresponding to
+     * <code>current()</code> index even after <code>next()</code> has returned DONE.
+     * <p>
+
+     * @return the status from the break rule that determined the boundary
+     * at the current iteration position.
      */
 
     @Override
@@ -565,8 +566,8 @@
     }
 
     /**
-     * Get the status (tag) values from the break rule(s) that determined the most
-     * recently returned break position.  The values appear in the rule source
+     * Get the status (tag) values from the break rule(s) that determined the boundary
+     * at the current iteration position.  The values appear in the rule source
      * within brackets, {123}, for example.  The default status value for rules
      * that do not explicitly provide one is zero.
      * <p>
@@ -578,8 +579,8 @@
      *  will be thrown.
      *
      * @param fillInArray an array to be filled in with the status values.
-     * @return          The number of rule status values from rules that determined
-     *                  the most recent boundary returned by the break iterator.
+     * @return          The number of rule status values from the rules that determined
+     *                  the boundary at the current iteration position.
      *                  In the event that the array is too small, the return value
      *                  is the total number of status values that were available,
      *                  not the reduced number that were actually returned.
@@ -625,21 +626,7 @@
         this.first();
     }
 
-    /**
-     * package private
-     */
-    void setBreakType(int type) {
-        fBreakType = type;
-    }
-
-    /**
-     * package private
-     */
-    int getBreakType() {
-        return fBreakType;
-    }
-
-    /**
+     /**
      * Control debug, trace and dump options.
      * @hide draft / provisional / internal are hidden on Android
      */
@@ -652,7 +639,7 @@
         // We have a dictionary character.
         // Does an already instantiated break engine handle it?
         for (LanguageBreakEngine candidate : fBreakEngines) {
-            if (candidate.handles(c, fBreakType)) {
+            if (candidate.handles(c)) {
                 return candidate;
             }
         }
@@ -662,7 +649,7 @@
             // Check the global list, another break iterator may have instantiated the
             // desired engine.
             for (LanguageBreakEngine candidate : gAllBreakEngines) {
-                if (candidate.handles(c, fBreakType)) {
+                if (candidate.handles(c)) {
                     fBreakEngines.add(candidate);
                     return candidate;
                 }
@@ -692,24 +679,13 @@
                     eng = new KhmerBreakEngine();
                     break;
                 case UScript.HAN:
-                    if (getBreakType() == KIND_WORD) {
-                        eng = new CjkBreakEngine(false);
-                    }
-                    else {
-                        gUnhandledBreakEngine.handleChar(c, getBreakType());
-                        eng = gUnhandledBreakEngine;
-                    }
-                    break;
+                    eng = new CjkBreakEngine(false);
+                     break;
                 case UScript.HANGUL:
-                    if (getBreakType() == KIND_WORD) {
-                        eng = new CjkBreakEngine(true);
-                    } else {
-                        gUnhandledBreakEngine.handleChar(c, getBreakType());
-                        eng = gUnhandledBreakEngine;
-                    }
+                    eng = new CjkBreakEngine(true);
                     break;
                 default:
-                    gUnhandledBreakEngine.handleChar(c, getBreakType());
+                    gUnhandledBreakEngine.handleChar(c);
                     eng = gUnhandledBreakEngine;
                     break;
                 }
@@ -808,7 +784,7 @@
         CharacterIterator text = fText;
         Trie2 trie = fRData.fTrie;
 
-        short[] stateTable  = fRData.fFTable;
+        short[] stateTable  = fRData.fFTable.fTable;
         int initialPosition = fPosition;
         text.setIndex(initialPosition);
         int result          = initialPosition;
@@ -827,7 +803,7 @@
         int state           = START_STATE;
         int row             = fRData.getRowIndex(state);
         short category      = 3;
-        int flagsState      = fRData.getStateTableFlags(stateTable);
+        int flagsState      = fRData.fFTable.fFlags;
         int mode            = RBBI_RUN;
         if ((flagsState & RBBIDataWrapper.RBBI_BOF_REQUIRED) != 0) {
             category = 2;
@@ -987,7 +963,7 @@
         int            result             = 0;
         int            initialPosition    = fromPosition;
         fLookAheadMatches.reset();
-        short[] stateTable = fRData.fSRTable;
+        short[] stateTable = fRData.fSRTable.fTable;
         CISetIndex32(fText, fromPosition);
         if (fromPosition == fText.getBeginIndex()) {
             return BreakIterator.DONE;
@@ -1002,7 +978,7 @@
         row = fRData.getRowIndex(state);
         category = 3;   // TODO:  obsolete?  from the old start/run mode scheme?
         mode     = RBBI_RUN;
-        if ((fRData.getStateTableFlags(stateTable) & RBBIDataWrapper.RBBI_BOF_REQUIRED) != 0) {
+        if ((fRData.fSRTable.fFlags & RBBIDataWrapper.RBBI_BOF_REQUIRED) != 0) {
             category = 2;
             mode     = RBBI_START;
         }
@@ -1131,7 +1107,7 @@
         return ci.getIndex();
     }
 
-    /* DictionaryCache  stores the boundaries obtained from a run of dictionary characters.
+    /** DictionaryCache  stores the boundaries obtained from a run of dictionary characters.
      *                 Dictionary boundaries are moved first to this cache, then from here
      *                 to the main BreakCache, where they may inter-leave with non-dictionary
      *                 boundaries. The public BreakIterator API always fetches directly
@@ -1285,7 +1261,7 @@
                 // Ask the language object if there are any breaks. It will add them to the cache and
                 // leave the text pointer on the other side of its range, ready to search for the next one.
                 if (lbe != null) {
-                    foundBreakCount += lbe.findBreaks(fText, rangeStart, rangeEnd, fBreakType, fBreaks);
+                    foundBreakCount += lbe.findBreaks(fText, rangeStart, rangeEnd, fBreaks);
                 }
 
                 // Reload the loop variables for the next go-round
@@ -1456,7 +1432,7 @@
         return;
     };
 
-    /*
+    /**
      * Update the state of the public BreakIterator (fBI) to reflect the
      * current state of the break iterator cache (this).
      */
@@ -1714,7 +1690,7 @@
     static final boolean RetainCachePosition = false;
     static final boolean UpdateCachePosition = true;
 
-    /*
+    /**
      * Add the boundary following the current position.
      * The current position can be left as it was, or changed to the newly added boundary,
      * as specified by the update parameter.
@@ -1743,7 +1719,7 @@
     };
 
 
-    /*
+    /**
      * Add the boundary preceding the current position.
      * The current position can be left as it was, or changed to the newly added boundary,
      * as specified by the update parameter.
diff --git a/android_icu4j/src/main/java/android/icu/text/RuleBasedNumberFormat.java b/android_icu4j/src/main/java/android/icu/text/RuleBasedNumberFormat.java
index ce9acb0..ae5e58d 100644
--- a/android_icu4j/src/main/java/android/icu/text/RuleBasedNumberFormat.java
+++ b/android_icu4j/src/main/java/android/icu/text/RuleBasedNumberFormat.java
@@ -1294,7 +1294,7 @@
 
             // try parsing the string with the rule set.  If it gets past the
             // high-water mark, update the high-water mark and the result
-            tempResult = ruleSets[i].parse(workingText, workingPos, Double.MAX_VALUE);
+            tempResult = ruleSets[i].parse(workingText, workingPos, Double.MAX_VALUE, 0);
             if (workingPos.getIndex() > highWaterMark.getIndex()) {
                 result = tempResult;
                 highWaterMark.setIndex(workingPos.getIndex());
diff --git a/android_icu4j/src/main/java/android/icu/text/ScientificNumberFormatter.java b/android_icu4j/src/main/java/android/icu/text/ScientificNumberFormatter.java
index 12d506e..eb422e8 100644
--- a/android_icu4j/src/main/java/android/icu/text/ScientificNumberFormatter.java
+++ b/android_icu4j/src/main/java/android/icu/text/ScientificNumberFormatter.java
@@ -14,7 +14,7 @@
 import java.text.CharacterIterator;
 import java.util.Map;
 
-import android.icu.impl.number.Parse;
+import android.icu.impl.number.parse.UnicodeSetStaticCache;
 import android.icu.lang.UCharacter;
 import android.icu.util.ULocale;
 
@@ -219,14 +219,14 @@
                     int start = iterator.getRunStart(NumberFormat.Field.EXPONENT_SIGN);
                     int limit = iterator.getRunLimit(NumberFormat.Field.EXPONENT_SIGN);
                     int aChar = char32AtAndAdvance(iterator);
-                    if (Parse.UNISET_MINUS.contains(aChar)) {
+                    if (UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.MINUS_SIGN).contains(aChar)) {
                         append(
                                 iterator,
                                 copyFromOffset,
                                 start,
                                 result);
                         result.append(SUPERSCRIPT_MINUS_SIGN);
-                    } else if (Parse.UNISET_PLUS.contains(aChar)) {
+                    } else if (UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.PLUS_SIGN).contains(aChar)) {
                         append(
                                 iterator,
                                 copyFromOffset,
diff --git a/android_icu4j/src/main/java/android/icu/text/ThaiBreakEngine.java b/android_icu4j/src/main/java/android/icu/text/ThaiBreakEngine.java
index 40efdc3..721cdc6 100644
--- a/android_icu4j/src/main/java/android/icu/text/ThaiBreakEngine.java
+++ b/android_icu4j/src/main/java/android/icu/text/ThaiBreakEngine.java
@@ -17,7 +17,7 @@
 import android.icu.lang.UScript;
 
 class ThaiBreakEngine extends DictionaryBreakEngine {
-    
+
     // Constants for ThaiBreakIterator
     // How many words in a row are "good enough"?
     private static final byte THAI_LOOKAHEAD = 3;
@@ -34,14 +34,14 @@
     private static final byte THAI_MIN_WORD = 2;
     // Minimum number of characters for two words
     private static final byte THAI_MIN_WORD_SPAN = THAI_MIN_WORD * 2;
-    
+
     private DictionaryMatcher fDictionary;
     private static UnicodeSet fThaiWordSet;
     private static UnicodeSet fEndWordSet;
     private static UnicodeSet fBeginWordSet;
     private static UnicodeSet fSuffixSet;
     private static UnicodeSet fMarkSet;
-    
+
     static {
         // Initialize UnicodeSets
         fThaiWordSet = new UnicodeSet();
@@ -67,7 +67,7 @@
         fEndWordSet.compact();
         fBeginWordSet.compact();
         fSuffixSet.compact();
-        
+
         // Freeze the static UnicodeSet
         fThaiWordSet.freeze();
         fMarkSet.freeze();
@@ -75,32 +75,32 @@
         fBeginWordSet.freeze();
         fSuffixSet.freeze();
     }
-    
+
     public ThaiBreakEngine() throws IOException {
-        super(BreakIterator.KIND_WORD, BreakIterator.KIND_LINE);
         setCharacters(fThaiWordSet);
         // Initialize dictionary
         fDictionary = DictionaryData.loadDictionaryFor("Thai");
     }
-    
+
+    @Override
     public boolean equals(Object obj) {
         // Normally is a singleton, but it's possible to have duplicates
         //   during initialization. All are equivalent.
         return obj instanceof ThaiBreakEngine;
     }
 
+    @Override
     public int hashCode() {
         return getClass().hashCode();
     }
-    
-    public boolean handles(int c, int breakType) {
-        if (breakType == BreakIterator.KIND_WORD || breakType == BreakIterator.KIND_LINE) {
-            int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
-            return (script == UScript.THAI);
-        }
-        return false;
+
+    @Override
+    public boolean handles(int c) {
+        int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
+        return (script == UScript.THAI);
     }
 
+    @Override
     public int divideUpDictionaryRange(CharacterIterator fIter, int rangeStart, int rangeEnd,
             DequeI foundBreaks) {
 
@@ -113,7 +113,7 @@
         for (int i = 0; i < THAI_LOOKAHEAD; i++) {
             words[i] = new PossibleWord();
         }
-        
+
         int uc;
         fIter.setIndex(rangeStart);
         int current;
@@ -157,7 +157,7 @@
                                 }
                             } while (words[(wordsFound+1)%THAI_LOOKAHEAD].backUp(fIter));
                         }
-                    } 
+                    }
                     while (words[wordsFound%THAI_LOOKAHEAD].backUp(fIter));
                     // foundBest: end of loop
                 }
@@ -175,7 +175,7 @@
                 // no preceding word, or the non-word shares less than the minimum threshold
                 // of characters with a dictionary word, then scan to resynchronize
                 if (words[wordsFound%THAI_LOOKAHEAD].candidates(fIter, fDictionary, rangeEnd) <= 0 &&
-                        (wordLength == 0 || 
+                        (wordLength == 0 ||
                                 words[wordsFound%THAI_LOOKAHEAD].longestPrefix() < THAI_PREFIX_COMBINE_THRESHOLD)) {
                     // Look for a plausible word boundary
                     int remaining = rangeEnd - (current + wordLength);
@@ -225,7 +225,7 @@
 
             // Look ahead for possible suffixes if a dictionary word does not follow.
             // We do this in code rather than using a rule so that the heuristic
-            // resynch continues to function. For example, one of the suffix characters 
+            // resynch continues to function. For example, one of the suffix characters
             // could be a typo in the middle of a word.
             if (fIter.getIndex() < rangeEnd && wordLength > 0) {
                 if (words[wordsFound%THAI_LOOKAHEAD].candidates(fIter, fDictionary, rangeEnd) <= 0 &&
diff --git a/android_icu4j/src/main/java/android/icu/text/TimeUnitFormat.java b/android_icu4j/src/main/java/android/icu/text/TimeUnitFormat.java
index 2211fad..55c219a 100644
--- a/android_icu4j/src/main/java/android/icu/text/TimeUnitFormat.java
+++ b/android_icu4j/src/main/java/android/icu/text/TimeUnitFormat.java
@@ -10,7 +10,6 @@
 package android.icu.text;
 
 import java.io.ObjectStreamException;
-import java.text.FieldPosition;
 import java.text.ParseException;
 import java.text.ParsePosition;
 import java.util.HashMap;
@@ -24,7 +23,7 @@
 import android.icu.impl.ICUData;
 import android.icu.impl.ICUResourceBundle;
 import android.icu.impl.UResource;
-import android.icu.util.Measure;
+import android.icu.number.LocalizedNumberFormatter;
 import android.icu.util.TimeUnit;
 import android.icu.util.TimeUnitAmount;
 import android.icu.util.ULocale;
@@ -87,19 +86,12 @@
 
     private static final long serialVersionUID = -3707773153184971529L;
 
-    // These fields are supposed to be the same as the fields in mf. They
-    // are here for serialization backward compatibility and to support parsing.
+    // Unlike MeasureFormat, this class is mutable and allows a new NumberFormat to be set after
+    // initialization. Keep a second copy of NumberFormat and use it instead of the one from the parent.
     private NumberFormat format;
     private ULocale locale;
     private int style;
 
-    // We use this field in lieu of the super class because the super class
-    // is immutable while this class is mutable. The contents of the super class
-    // is an empty shell. Every public method of the super class is overridden to
-    // delegate to this field. Each time this object mutates, it replaces this field with
-    // a new immutable instance.
-    private transient MeasureFormat mf;
-
     private transient Map<TimeUnit, Map<String, Object[]>> timeUnitToCountToPatterns;
     private transient PluralRules pluralRules;
     private transient boolean isReady;
@@ -119,9 +111,7 @@
      */
     @Deprecated
     public TimeUnitFormat() {
-        mf = MeasureFormat.getInstance(ULocale.getDefault(), FormatWidth.WIDE);
-        isReady = false;
-        style = FULL_NAME;
+        this(ULocale.getDefault(), FULL_NAME);
     }
 
     /**
@@ -154,16 +144,12 @@
      */
     @Deprecated
     public TimeUnitFormat(ULocale locale, int style) {
+        super(locale, style == FULL_NAME ? FormatWidth.WIDE : FormatWidth.SHORT);
+        format = super.getNumberFormatInternal();
         if (style < FULL_NAME || style >= TOTAL_STYLES) {
             throw new IllegalArgumentException("style should be either FULL_NAME or ABBREVIATED_NAME style");
         }
-        mf = MeasureFormat.getInstance(
-                locale, style == FULL_NAME ? FormatWidth.WIDE : FormatWidth.SHORT);
         this.style = style;
-
-        // Needed for getLocale(ULocale.VALID_LOCALE)
-        setLocale(locale, locale);
-        this.locale = locale;
         isReady = false;
     }
 
@@ -191,14 +177,8 @@
      */
     @Deprecated
     public TimeUnitFormat setLocale(ULocale locale) {
-        if (locale != this.locale){
-            mf = mf.withLocale(locale);
-
-            // Needed for getLocale(ULocale.VALID_LOCALE)
-            setLocale(locale, locale);
-            this.locale = locale;
-            isReady = false;
-        }
+        setLocale(locale, locale);
+        clearCache();
         return this;
     }
 
@@ -228,28 +208,34 @@
         if (format == null) {
             if (locale == null) {
                 isReady = false;
-                mf = mf.withLocale(ULocale.getDefault());
             } else {
                 this.format = NumberFormat.getNumberInstance(locale);
-                mf = mf.withNumberFormat(this.format);
             }
         } else {
             this.format = format;
-            mf = mf.withNumberFormat(this.format);
         }
+        clearCache();
         return this;
     }
 
-
     /**
-     * Format a TimeUnitAmount.
-     * @see java.text.Format#format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition)
+     * {@inheritDoc}
      * @deprecated ICU 53 see {@link MeasureFormat}.
      */
+    @Override
     @Deprecated
-    public StringBuffer format(Object obj, StringBuffer toAppendTo,
-            FieldPosition pos) {
-        return mf.format(obj, toAppendTo, pos);
+    public NumberFormat getNumberFormat() {
+        return (NumberFormat) format.clone();
+    }
+
+    @Override
+    NumberFormat getNumberFormatInternal() {
+        return format;
+    }
+
+    @Override
+    LocalizedNumberFormatter getNumberFormatter() {
+        return ((DecimalFormat)format).toNumberFormatter();
     }
 
     /**
@@ -390,7 +376,7 @@
             } else {
                 beenHere = true;
             }
-            
+
             UResource.Table units = value.getTable();
             for (int i = 0; units.getKeyAndValue(i, key, value); ++i) {
                 String timeUnitName = key.toString();
@@ -571,38 +557,6 @@
     // boilerplate code to make TimeUnitFormat otherwise follow the contract of
     // MeasureFormat
 
-
-    /**
-     * @deprecated This API is ICU internal only.
-     * @hide draft / provisional / internal are hidden on Android
-     */
-    @Deprecated
-    @Override
-    public StringBuilder formatMeasures(
-            StringBuilder appendTo, FieldPosition fieldPosition, Measure... measures) {
-        return mf.formatMeasures(appendTo, fieldPosition, measures);
-    }
-
-    /**
-     * @deprecated This API is ICU internal only.
-     * @hide draft / provisional / internal are hidden on Android
-     */
-    @Deprecated
-    @Override
-    public MeasureFormat.FormatWidth getWidth() {
-        return mf.getWidth();
-    }
-
-    /**
-     * @deprecated This API is ICU internal only.
-     * @hide draft / provisional / internal are hidden on Android
-     */
-    @Deprecated
-    @Override
-    public NumberFormat getNumberFormat() {
-        return mf.getNumberFormat();
-    }
-
     /**
      * @deprecated This API is ICU internal only.
      * @hide draft / provisional / internal are hidden on Android
@@ -619,7 +573,7 @@
     // Serialization
 
     private Object writeReplace() throws ObjectStreamException {
-        return mf.toTimeUnitProxy();
+        return super.toTimeUnitProxy();
     }
 
     // Preserve backward serialize backward compatibility.
diff --git a/android_icu4j/src/main/java/android/icu/text/TimeZoneFormat.java b/android_icu4j/src/main/java/android/icu/text/TimeZoneFormat.java
index 62881de..a172ef8 100644
--- a/android_icu4j/src/main/java/android/icu/text/TimeZoneFormat.java
+++ b/android_icu4j/src/main/java/android/icu/text/TimeZoneFormat.java
@@ -2961,11 +2961,11 @@
             }
         }
 
-        int[] matchLen = new int[] {0};
-        Iterator<String> itr = ZONE_ID_TRIE.get(text, pos.getIndex(), matchLen);
+        TextTrieMap.Output trieOutput = new TextTrieMap.Output();
+        Iterator<String> itr = ZONE_ID_TRIE.get(text, pos.getIndex(), trieOutput);
         if (itr != null) {
             resolvedID = itr.next();
-            pos.setIndex(pos.getIndex() + matchLen[0]);
+            pos.setIndex(pos.getIndex() + trieOutput.matchLength);
         } else {
             // TODO
             // We many need to handle rule based custom zone ID (See ZoneMeta.parseCustomID),
@@ -3004,11 +3004,11 @@
             }
         }
 
-        int[] matchLen = new int[] {0};
-        Iterator<String> itr = SHORT_ZONE_ID_TRIE.get(text, pos.getIndex(), matchLen);
+        TextTrieMap.Output trieOutput = new TextTrieMap.Output();
+        Iterator<String> itr = SHORT_ZONE_ID_TRIE.get(text, pos.getIndex(), trieOutput);
         if (itr != null) {
             resolvedID = itr.next();
-            pos.setIndex(pos.getIndex() + matchLen[0]);
+            pos.setIndex(pos.getIndex() + trieOutput.matchLength);
         } else {
             pos.setErrorIndex(pos.getIndex());
         }
diff --git a/android_icu4j/src/main/java/android/icu/text/UnhandledBreakEngine.java b/android_icu4j/src/main/java/android/icu/text/UnhandledBreakEngine.java
index a914bb5..027f4bb 100644
--- a/android_icu4j/src/main/java/android/icu/text/UnhandledBreakEngine.java
+++ b/android_icu4j/src/main/java/android/icu/text/UnhandledBreakEngine.java
@@ -9,17 +9,14 @@
  */
 package android.icu.text;
 
-import static android.icu.impl.CharacterIteration.DONE32;
-
 import java.text.CharacterIterator;
-import java.util.concurrent.atomic.AtomicReferenceArray;
 
 import android.icu.impl.CharacterIteration;
 import android.icu.lang.UCharacter;
 import android.icu.lang.UProperty;
 
 final class UnhandledBreakEngine implements LanguageBreakEngine {
-    // TODO: Use two arrays of UnicodeSet, one with all frozen sets, one with unfrozen.
+    // TODO: Use two UnicodeSets, one with all frozen sets, one with unfrozen.
     // in handleChar(), update the unfrozen version, clone, freeze, replace the frozen one.
 
     // Note on concurrency: A single instance of UnhandledBreakEngine is shared across all
@@ -36,49 +33,42 @@
     // on which scripts have been previously seen by handleChar(). (This is not a
     // threading specific issue). Possibly stop on script boundaries?
 
-    final AtomicReferenceArray<UnicodeSet> fHandled = new AtomicReferenceArray<UnicodeSet>(BreakIterator.KIND_TITLE + 1);
+    volatile UnicodeSet fHandled = new UnicodeSet();
     public UnhandledBreakEngine() {
-        for (int i = 0; i < fHandled.length(); i++) {
-            fHandled.set(i, new UnicodeSet());
-        }
     }
 
     @Override
-    public boolean handles(int c, int breakType) {
-        return (breakType >= 0 && breakType < fHandled.length()) &&
-                (fHandled.get(breakType).contains(c));
+    public boolean handles(int c) {
+        return fHandled.contains(c);
     }
 
     @Override
     public int findBreaks(CharacterIterator text, int startPos, int endPos,
-            int breakType, DictionaryBreakEngine.DequeI foundBreaks) {
-        if (breakType >= 0 && breakType < fHandled.length()) {
-            UnicodeSet uniset = fHandled.get(breakType);
-            int c = CharacterIteration.current32(text);
-            while (text.getIndex() < endPos && uniset.contains(c)) {
-                CharacterIteration.next32(text);
-                c = CharacterIteration.current32(text);
-            }
+            DictionaryBreakEngine.DequeI foundBreaks) {
+
+        UnicodeSet uniset = fHandled;
+        int c = CharacterIteration.current32(text);
+        while (text.getIndex() < endPos && uniset.contains(c)) {
+            CharacterIteration.next32(text);
+            c = CharacterIteration.current32(text);
         }
         return 0;
     }
 
     /**
-     * Update the set of unhandled characters for the specified breakType to include
+     * Update the set of unhandled characters to include
      * all that have the same script as c.
      * May be called concurrently with handles() or findBreaks().
      * Must not be called concurrently with itself.
      */
-    public void handleChar(int c, int breakType) {
-        if (breakType >= 0 && breakType < fHandled.length() && c != DONE32) {
-            UnicodeSet originalSet = fHandled.get(breakType);
-            if (!originalSet.contains(c)) {
-                int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
-                UnicodeSet newSet = new UnicodeSet();
-                newSet.applyIntPropertyValue(UProperty.SCRIPT, script);
-                newSet.addAll(originalSet);
-                fHandled.set(breakType, newSet);
-            }
+    public void handleChar(int c) {
+        UnicodeSet originalSet = fHandled;
+        if (!originalSet.contains(c)) {
+            int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
+            UnicodeSet newSet = new UnicodeSet();
+            newSet.applyIntPropertyValue(UProperty.SCRIPT, script);
+            newSet.addAll(originalSet);
+            fHandled = newSet;
         }
     }
 }
diff --git a/android_icu4j/src/main/java/android/icu/text/UnicodeSet.java b/android_icu4j/src/main/java/android/icu/text/UnicodeSet.java
index 2ffb6c9..83fce1e 100644
--- a/android_icu4j/src/main/java/android/icu/text/UnicodeSet.java
+++ b/android_icu4j/src/main/java/android/icu/text/UnicodeSet.java
@@ -2352,7 +2352,7 @@
         StringBuilder rebuiltPat = new StringBuilder();
         RuleCharacterIterator chars =
                 new RuleCharacterIterator(pattern, symbols, pos);
-        applyPattern(chars, symbols, rebuiltPat, options);
+        applyPattern(chars, symbols, rebuiltPat, options, 0);
         if (chars.inVariable()) {
             syntaxError(chars, "Extra chars in variable value");
         }
@@ -2388,6 +2388,8 @@
             SETMODE2_PROPERTYPAT = 2,
             SETMODE3_PREPARSED = 3;
 
+    private static final int MAX_DEPTH = 100;
+
     /**
      * Parse the pattern from the given RuleCharacterIterator.  The
      * iterator is advanced over the parsed pattern.
@@ -2403,7 +2405,10 @@
      * IGNORE_SPACE, CASE.
      */
     private void applyPattern(RuleCharacterIterator chars, SymbolTable symbols,
-            Appendable rebuiltPat, int options) {
+            Appendable rebuiltPat, int options, int depth) {
+        if (depth > MAX_DEPTH) {
+            syntaxError(chars, "Pattern nested too deeply");
+        }
 
         // Syntax characters: [ ] ^ - & { }
 
@@ -2535,7 +2540,7 @@
                 }
                 switch (setMode) {
                 case SETMODE1_UNICODESET:
-                    nested.applyPattern(chars, symbols, patBuf, options);
+                    nested.applyPattern(chars, symbols, patBuf, options, depth + 1);
                     break;
                 case SETMODE2_PROPERTYPAT:
                     chars.skipIgnored(opts);
diff --git a/android_icu4j/src/main/java/android/icu/util/Calendar.java b/android_icu4j/src/main/java/android/icu/util/Calendar.java
index 7cfc8f3..49b18a2 100644
--- a/android_icu4j/src/main/java/android/icu/util/Calendar.java
+++ b/android_icu4j/src/main/java/android/icu/util/Calendar.java
@@ -5827,12 +5827,12 @@
 
         int year;
 
-        if (bestField == WEEK_OF_YEAR) {
+        if (bestField == WEEK_OF_YEAR && newerField(YEAR_WOY, YEAR) == YEAR_WOY) {
             // Nota Bene!  It is critical that YEAR_WOY be used as the year here, if it is
             // set.  Otherwise, when WOY is the best field, the year may be wrong at the
             // extreme limits of the year.  If YEAR_WOY is not set then it will fall back.
             // TODO: Should resolveField(YEAR_PRECEDENCE) be brought to bear?
-            year = internalGet(YEAR_WOY, handleGetExtendedYear());
+            year = internalGet(YEAR_WOY);
         } else {
             year = handleGetExtendedYear();
         }
diff --git a/android_icu4j/src/main/java/android/icu/util/Currency.java b/android_icu4j/src/main/java/android/icu/util/Currency.java
index 2dc4f9c..6396ded 100644
--- a/android_icu4j/src/main/java/android/icu/util/Currency.java
+++ b/android_icu4j/src/main/java/android/icu/util/Currency.java
@@ -25,7 +25,6 @@
 import java.util.Set;
 
 import android.icu.impl.CacheBase;
-import android.icu.impl.CurrencyData.CurrencyDisplayInfo;
 import android.icu.impl.ICUCache;
 import android.icu.impl.ICUData;
 import android.icu.impl.ICUDebug;
@@ -89,15 +88,10 @@
      * Selector for getName() indicating the narrow currency symbol.
      * The narrow currency symbol is similar to the regular currency
      * symbol, but it always takes the shortest form: for example,
-     * "$" instead of "US$".
+     * "$" instead of "US$" for USD in en-CA.
      *
-     * This method assumes that the currency data provider is the ICU4J
-     * built-in data provider. If it is not, an exception is thrown.
-     *
-     * @deprecated ICU 60: This API is ICU internal only.
      * @hide draft / provisional / internal are hidden on Android
      */
-    @Deprecated
     public static final int NARROW_SYMBOL_NAME = 3;
 
     private static final EquivalenceRelation<String> EQUIVALENT_CURRENCY_SYMBOLS =
@@ -525,7 +519,7 @@
      * @see #getName
      */
     public String getSymbol(ULocale uloc) {
-        return getName(uloc, SYMBOL_NAME, new boolean[1]);
+        return getName(uloc, SYMBOL_NAME, null);
     }
 
     /**
@@ -546,8 +540,8 @@
      * currency object in the en_US locale is "$".
      * @param locale locale in which to display currency
      * @param nameStyle selector for which kind of name to return.
-     *                  The nameStyle should be either SYMBOL_NAME or
-     *                  LONG_NAME. Otherwise, throw IllegalArgumentException.
+     *                  The nameStyle should be SYMBOL_NAME, NARROW_SYMBOL_NAME,
+     *                  or LONG_NAME. Otherwise, throw IllegalArgumentException.
      * @param isChoiceFormat fill-in; isChoiceFormat[0] is set to true
      * if the returned value is a ChoiceFormat pattern; otherwise it
      * is set to false
@@ -574,13 +568,7 @@
         case SYMBOL_NAME:
             return names.getSymbol(subType);
         case NARROW_SYMBOL_NAME:
-            // CurrencyDisplayNames is the public interface.
-            // CurrencyDisplayInfo is ICU's standard implementation.
-            if (!(names instanceof CurrencyDisplayInfo)) {
-                throw new UnsupportedOperationException(
-                        "Cannot get narrow symbol from custom currency display name provider");
-            }
-            return ((CurrencyDisplayInfo) names).getNarrowSymbol(subType);
+            return names.getNarrowSymbol(subType);
         case LONG_NAME:
             return names.getName(subType);
         default:
@@ -726,13 +714,12 @@
      * @hide draft / provisional / internal are hidden on Android
      */
     @Deprecated
-    public static TextTrieMap<CurrencyStringInfo>.ParseState openParseState(
-        ULocale locale, int startingCp, int type) {
+    public static TextTrieMap<CurrencyStringInfo> getParsingTrie(ULocale locale, int type) {
         List<TextTrieMap<CurrencyStringInfo>> currencyTrieVec = getCurrencyTrieVec(locale);
         if (type == Currency.LONG_NAME) {
-            return currencyTrieVec.get(0).openParseState(startingCp);
+            return currencyTrieVec.get(1);
         } else {
-            return currencyTrieVec.get(1).openParseState(startingCp);
+            return currencyTrieVec.get(0);
         }
     }
 
diff --git a/android_icu4j/src/main/java/android/icu/util/MeasureUnit.java b/android_icu4j/src/main/java/android/icu/util/MeasureUnit.java
index 1822b4e..1135249 100644
--- a/android_icu4j/src/main/java/android/icu/util/MeasureUnit.java
+++ b/android_icu4j/src/main/java/android/icu/util/MeasureUnit.java
@@ -159,7 +159,7 @@
     }
 
     /**
-     * Create a MeasureUnit instance (creates a singleton instance).
+     * Creates a MeasureUnit instance (creates a singleton instance) or returns one from the cache.
      * <p>
      * Normally this method should not be used, since there will be no formatting data
      * available for it, and it may not be returned by getAvailable().
@@ -760,7 +760,6 @@
     /**
      * Constant for unit of length: point
      * @hide unsupported on Android
-     * @hide draft / provisional / internal are hidden on Android
      */
     public static final MeasureUnit POINT = MeasureUnit.internalGetInstance("length", "point");
 
diff --git a/android_icu4j/src/main/java/android/icu/util/SimpleTimeZone.java b/android_icu4j/src/main/java/android/icu/util/SimpleTimeZone.java
index 509853b..ab2a577 100644
--- a/android_icu4j/src/main/java/android/icu/util/SimpleTimeZone.java
+++ b/android_icu4j/src/main/java/android/icu/util/SimpleTimeZone.java
@@ -523,14 +523,15 @@
      * Sets the amount of time in ms that the clock is advanced during DST.
      * @param millisSavedDuringDST the number of milliseconds the time is
      * advanced with respect to standard time when the daylight savings rules
-     * are in effect. A positive number, typically one hour (3600000).
+     * are in effect. Typically one hour (+3600000). The amount could be negative,
+     * but not 0.
      */
     public void setDSTSavings(int millisSavedDuringDST) {
         if (isFrozen()) {
             throw new UnsupportedOperationException("Attempt to modify a frozen SimpleTimeZone instance.");
         }
 
-        if (millisSavedDuringDST <= 0) {
+        if (millisSavedDuringDST == 0) {
             throw new IllegalArgumentException();
         }
         dst = millisSavedDuringDST;
@@ -542,7 +543,8 @@
      * Returns the amount of time in ms that the clock is advanced during DST.
      * @return the number of milliseconds the time is
      * advanced with respect to standard time when the daylight savings rules
-     * are in effect. A positive number, typically one hour (3600000).
+     * are in effect. Typically one hour (3600000). The amount could be negative,
+     * but not 0.
      */
     @Override
     public int getDSTSavings() {
@@ -991,7 +993,7 @@
 
         decodeRules();
 
-        if (_dst <= 0) {
+        if (_dst == 0) {
             throw new IllegalArgumentException();
         }
     }
diff --git a/android_icu4j/src/main/java/android/icu/util/VersionInfo.java b/android_icu4j/src/main/java/android/icu/util/VersionInfo.java
index ba89222..4791530 100644
--- a/android_icu4j/src/main/java/android/icu/util/VersionInfo.java
+++ b/android_icu4j/src/main/java/android/icu/util/VersionInfo.java
@@ -160,7 +160,7 @@
      * @hide draft / provisional / internal are hidden on Android
      */
     @Deprecated
-    public static final String ICU_DATA_VERSION_PATH = "60b";
+    public static final String ICU_DATA_VERSION_PATH = "61b";
 
     /**
      * Data version in ICU4J.
@@ -527,8 +527,8 @@
         UNICODE_9_0   = getInstance(9, 0, 0, 0);
         UNICODE_10_0   = getInstance(10, 0, 0, 0);
 
-        ICU_VERSION   = getInstance(60, 2, 0, 0);
-        ICU_DATA_VERSION = getInstance(60, 2, 0, 0);
+        ICU_VERSION   = getInstance(61, 1, 0, 0);
+        ICU_DATA_VERSION = ICU_VERSION;
         UNICODE_VERSION = UNICODE_10_0;
 
         UCOL_RUNTIME_VERSION = getInstance(9);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/numberformattestspecification.txt b/android_icu4j/src/main/tests/android/icu/dev/data/numberformattestspecification.txt
index 113473a..65dde7a 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/numberformattestspecification.txt
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/numberformattestspecification.txt
@@ -13,7 +13,7 @@
 // https://docs.google.com/document/d/1T2P0p953_Lh1pRwo-5CuPVrHlIBa_wcXElG-Hhg_WHM/edit?usp=sharing
 
 test plus sign
-set locale ar
+set locale ar-EG
 set pattern +0;-#
 begin
 format	output	breaks
@@ -441,11 +441,10 @@
 en_US	0	123,456	123
 en_US	1	123.456	123.456
 en_US	0	123.456	123.456
-fr_FR	1	123,456	123.456
-fr_FR	0	123,456	123.456
-// JDK returns 123 here; not sure why.
-fr_FR	1	123.456	123456	K
-fr_FR	0	123.456	123
+it_IT	1	123,456	123.456
+it_IT	0	123,456	123.456
+it_IT	1	123.456	123456
+it_IT	0	123.456	123
 
 test no grouping in pattern with parsing
 set pattern 0
@@ -466,9 +465,8 @@
 1,2345,6789	4
 1,23,45,6789	4	K	2
 1,23,45,6789	4	K	2	2
-// Q only supports minGrouping<=2
 123,456789	6		6	3
-123456789	6	JKQ	6	4
+123456789	6	JK	6	4
 
 test multiplier setters
 set locale en_US
@@ -745,7 +743,7 @@
 (34  25E-1)	-342.5	K
 (34,,25E-1)	-342.5
 // J doesn't allow trailing separators before E but C does
-(34,,25,E-1)	-342.5	J
+(34,,25,E-1)	-342.5	JP
 (34  25 E-1)	-342.5	JK
 (34,,25 E-1)	-342.5	CJK
 // Spaces are not allowed after exponent symbol
@@ -754,6 +752,7 @@
 +3.52EE4	3.52
 +1,234,567.8901	1234567.8901
 +1,23,4567.8901	1234567.8901
+// Fraction grouping is disabled by default
 +1,23,4567.89,01	1234567.89
 +1,23,456.78.9	123456.78
 +12.34,56	12.34
@@ -808,8 +807,8 @@
 // C parses until trailing separators, but sees -1234
 1,234,,,+	1234	JKC
 1,234-	-1234
-// J bails because of trailing separators
-1,234,-	-1234	J
+// J and P bail because of trailing separators
+1,234,-	-1234	JP
 // J bails here too
 1234  -	-1234	J
 
@@ -831,15 +830,14 @@
 // JDK does allow separators in the wrong place and parses as -5347.25
 (53,47.25)	fail	K
 // strict requires prefix or suffix, except in C
-65,347.25	fail	
+65,347.25	fail
 +3.52E4	35200
 (34.8E-3)	-0.0348
 (3425E-1)	-342.5
 // Strict doesn't allow separators in sci notation.
 (63,425)	-63425
-// JDK and S allow separators in sci notation and parses as -342.5
-// C passes
-(63,425E-1)	fail	CKS
+// J does not allow grouping separators in scientific notation.
+(63,425E-1)	-6342.5	J
 // Both prefix and suffix needed for strict.
 // JDK accepts this and parses as -342.5
 (3425E-1	fail	K
@@ -954,12 +952,12 @@
 begin
 parse	output	breaks
 // S is the only implementation that passes these cases.
-// C consumes the '9' as a digit and assumes number is negative
+// C and P consume the '9' as a digit and assumes number is negative
 // J and JDK bail
-6549K	654	CJK
-// C consumes the '9' as a digit and assumes number is negative
+6549K	654	CJKP
+// C and P consume the '9' as a digit and assumes number is negative
 // J and JDK bail
-6549N	-654	CJK
+6549N	-654	CJKP
 
 test really strange prefix
 set locale en
@@ -974,7 +972,7 @@
 set locale en
 set pattern '-'#y
 begin
-parse	output
+parse	output	breaks
 -45y	45
 
 test parse with locale symbols
@@ -1187,17 +1185,17 @@
 USD 53.45	53.45	USD	J
 53.45USD	53.45	USD	CJ
 USD53.45	53.45	USD
-// S fails these because '(' is an incomplete prefix.
-(7.92) USD	-7.92	USD	CJS
-(7.92) GBP	-7.92	GBP	CJS
-(7.926) USD	-7.926	USD	CJS
-(7.926 USD)	-7.926	USD	CJS
+// P fails these because '(' is an incomplete prefix.
+(7.92) USD	-7.92	USD	CJP
+(7.92) GBP	-7.92	GBP	CJP
+(7.926) USD	-7.926	USD	CJP
+(7.926 USD)	-7.926	USD	CJP
 (USD 7.926)	-7.926	USD	J
-USD (7.926)	-7.926	USD	CJS
-USD (7.92)	-7.92	USD	CJS
-(7.92)USD	-7.92	USD	CJS
-USD(7.92)	-7.92	USD	CJS
-(8) USD	-8	USD	CJS
+USD (7.926)	-7.926	USD	CJP
+USD (7.92)	-7.92	USD	CJP
+(7.92)USD	-7.92	USD	CJP
+USD(7.92)	-7.92	USD	CJP
+(8) USD	-8	USD	CJP
 -8 USD	-8	USD	C
 67 USD	67	USD	C
 53.45$	fail	USD
@@ -1223,37 +1221,38 @@
 set pattern \u00a4 0.00;\u00a4 -#
 set locale fa_IR
 begin
-parse	output	outputCurrency
+parse	output	outputCurrency	breaks
 \u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5	1235	IRR
 IRR \u06F1\u06F2\u06F3\u06F5	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR
+// P fails here because this currency name is in the Trie only, but it has the same prefix as the non-Trie currency
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR	P
 IRR 1235	1235	IRR
 \u0631\u06cc\u0627\u0644 1235	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR	P
 
 test parse foreign currency ISO
 set pattern \u00a4\u00a4 0.00;\u00a4\u00a4 -#
 set locale fa_IR
 begin
-parse	output	outputCurrency
+parse	output	outputCurrency	breaks
 \u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5	1235	IRR
 IRR \u06F1\u06F2\u06F3\u06F5	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR	P
 IRR 1235	1235	IRR
 \u0631\u06cc\u0627\u0644 1235	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR	P
 
 test parse foreign currency full
 set pattern \u00a4\u00a4\u00a4 0.00;\u00a4\u00a4\u00a4 -#
 set locale fa_IR
 begin
-parse	output	outputCurrency
+parse	output	outputCurrency	breaks
 \u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5	1235	IRR
 IRR \u06F1\u06F2\u06F3\u06F5	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR	P
 IRR 1235	1235	IRR
 \u0631\u06cc\u0627\u0644 1235	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR	P
 
 test parse currency with foreign symbols symbol english
 set pattern \u00a4 0.00;\u00a4 (#)
@@ -1288,16 +1287,17 @@
 test parse currency without currency mode
 // Should accept a symbol associated with the currency specified by the API,
 // but should not traverse the full currency data.
+// P always traverses full currency data.
 set locale en_US
 set pattern \u00a4#,##0.00
 begin
 parse	currency	output	breaks
 $52.41	USD	52.41
 USD52.41	USD	52.41	K
-\u20ac52.41	USD	fail
-EUR52.41	USD	fail
-$52.41	EUR	fail
-USD52.41	EUR	fail
+\u20ac52.41	USD	fail	P
+EUR52.41	USD	fail	P
+$52.41	EUR	fail	P
+USD52.41	EUR	fail	P
 \u20ac52.41	EUR	52.41	K
 EUR52.41	EUR	52.41
 
@@ -1307,11 +1307,11 @@
 set lenient 0
 begin
 parse	output	outputCurrency	breaks
-$53.45	53.45	USD
+$53.45	53.45	USD	P
 53.45 USD	53.45	USD
 USD 53.45	fail	USD
 53.45USD	fail	USD
-USD53.45	53.45	USD
+USD53.45	53.45	USD	P
 (7.92) USD	-7.92	USD
 (7.92) EUR	-7.92	EUR
 (7.926) USD	-7.926	USD
@@ -1329,9 +1329,9 @@
 53.45 US Dollars	53.45	USD
 US Dollar 53.45	fail	USD
 53.45 US Dollar	53.45	USD
-US Dollars53.45	53.45	USD
+US Dollars53.45	53.45	USD	P
 53.45US Dollars	fail	USD
-US Dollar53.45	53.45	USD
+US Dollar53.45	53.45	USD	P
 US Dollat53.45	fail	USD
 53.45US Dollar	fail	USD
 US Dollars (53.45)	fail	USD
@@ -1376,13 +1376,15 @@
 set locale en
 set pattern #
 begin
-parse	output	breaks
--123	-123
-- 123	-123	JK
- -123	-123	JK
- - 123	-123	JK
-123-	-123	CJKS
-123 -	-123	CJKS
+pattern	parse	output	breaks
+#	-123	-123
+#	- 123	-123	JK
+#	 -123	-123	JK
+#	 - 123	-123	JK
+#	123-	123
+#	123 -	123
+#;#-	123-	-123
+#;#-	123 -	-123	JK
 
 test parse case sensitive
 set locale en
@@ -1423,8 +1425,8 @@
 1E2147483646	1E2147483646
 1E-2147483649	0
 1E-2147483648	0
-// S returns zero here
-1E-2147483647	1E-2147483647	S
+// P returns zero here
+1E-2147483647	1E-2147483647	P
 1E-2147483646	1E-2147483646
 
 test format push limits
@@ -1439,7 +1441,7 @@
 100	9999999999999.9950000000001	9999999999999.9950000000001	C
 2	9999999999999.9950000000001	10000000000000.00	C
 2	9999999.99499999	9999999.99
-// K doesn't support halfDowm rounding mode?
+// K doesn't support halfDown rounding mode?
 2	9999999.995	9999999.99	K
 2	9999999.99500001	10000000.00
 100	56565656565656565656565656565656565656565656565656565656565656	56565656565656565656565656565656565656565656565656565656565656.00	C
@@ -1453,8 +1455,8 @@
 set pattern #,##0
 begin
 parse	output	breaks
-// K and J return null; S and C return 99
- 9 9	9	CJKS
+// K and J return null; S, C, and P return 99
+ 9 9	9	CJKP
 // K returns null
  9 999	9999	K
 
@@ -1497,7 +1499,7 @@
 56i j‎k 	-56	CJK
 56‎i jk 	-56	CJK
 // S and C get 56 (accepts ' ' gs grouping); J and K get null
-5 6	fail	CS
+5 6	fail	CP
 5‎6	5	JK
 
 test parse spaces in grouping
@@ -1507,9 +1509,9 @@
 set pattern #,##0
 begin
 parse	output	breaks
-// C, J and S get "12" here
-1 2	1	CJS
-1 23	1	CJS
+// C, J, S, and P get "12" here
+1 2	1	CJP
+1 23	1	CJP
 // K gets 1 here; doesn't pick up the grouping separator
 1 234	1234	K
 
@@ -1543,6 +1545,7 @@
 parse	output	breaks
 55%	0.55
 // J and K get null
+// C and P scale by 100 even if the percent sign is not present
 55	0.55	JK
 
 test trailing grouping separators in pattern
@@ -1573,6 +1576,34 @@
 parse	output	breaks
 9223372036854775807%	92233720368547758.07
 
+test sign always shown
+set locale en
+set pattern 0
+set signAlwaysShown 1
+begin
+format	output	breaks
+// C, J and K do not support this feature
+42	+42	CJK
+0	+0	CJK
+-42	-42
+
+test parse strict with plus sign
+set locale en
+set pattern 0
+set signAlwaysShown 1
+begin
+lenient	parse	output	breaks
+1	42	42
+1	-42	-42
+1	+42	42	CJK
+1	0	0
+1	+0	0	CJK
+0	42	fail	CJK
+0	-42	-42
+0	+42	42	CJK
+0	0	fail	CJK
+0	+0	0	CJK
+
 
 
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/ibm9027.cnv b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/ibm9027.cnv
index 9502a7e..b229b71 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/ibm9027.cnv
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/ibm9027.cnv
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/root.res b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/root.res
index e0fa7e7..8fc5b92 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/root.res
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/root.res
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/structLocale.res b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/structLocale.res
index a1cb784..c480dad 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/structLocale.res
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/structLocale.res
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test1.cnv b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test1.cnv
index 6575fbe..a0211f1 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test1.cnv
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test1.cnv
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test1bmp.cnv b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test1bmp.cnv
index c8e37a9..5b00905 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test1bmp.cnv
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test1bmp.cnv
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test2.cnv b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test2.cnv
index 34d9855..c587f12 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test2.cnv
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test2.cnv
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test3.cnv b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test3.cnv
index 81cdbb6..51df631a 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test3.cnv
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test3.cnv
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test4.cnv b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test4.cnv
index a8f37a9..0db3725 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test4.cnv
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test4.cnv
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test4x.cnv b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test4x.cnv
index d17a078..d004f3c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test4x.cnv
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test4x.cnv
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test5.cnv b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test5.cnv
index 25f9446..912f4b0 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test5.cnv
+++ b/android_icu4j/src/main/tests/android/icu/dev/data/testdata/test5.cnv
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_64BitBCD.java b/android_icu4j/src/main/tests/android/icu/dev/impl/number/DecimalQuantity_64BitBCD.java
similarity index 96%
copy from android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_64BitBCD.java
copy to android_icu4j/src/main/tests/android/icu/dev/impl/number/DecimalQuantity_64BitBCD.java
index 4a8ec7f..1c9fe86 100644
--- a/android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_64BitBCD.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/impl/number/DecimalQuantity_64BitBCD.java
@@ -1,10 +1,13 @@
 /* GENERATED SOURCE. DO NOT MODIFY. */
 // © 2017 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
-package android.icu.impl.number;
+package android.icu.dev.impl.number;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+
+import android.icu.impl.number.DecimalQuantity;
+import android.icu.impl.number.DecimalQuantity_AbstractBCD;
 import android.icu.testsharding.MainTestShard;
 
 @MainTestShard
diff --git a/android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_ByteArrayBCD.java b/android_icu4j/src/main/tests/android/icu/dev/impl/number/DecimalQuantity_ByteArrayBCD.java
similarity index 97%
rename from android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_ByteArrayBCD.java
rename to android_icu4j/src/main/tests/android/icu/dev/impl/number/DecimalQuantity_ByteArrayBCD.java
index c388906..5b321a7 100644
--- a/android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_ByteArrayBCD.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/impl/number/DecimalQuantity_ByteArrayBCD.java
@@ -1,10 +1,13 @@
 /* GENERATED SOURCE. DO NOT MODIFY. */
 // © 2017 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
-package android.icu.impl.number;
+package android.icu.dev.impl.number;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+
+import android.icu.impl.number.DecimalQuantity;
+import android.icu.impl.number.DecimalQuantity_AbstractBCD;
 import android.icu.testsharding.MainTestShard;
 
 @MainTestShard
diff --git a/android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_SimpleStorage.java b/android_icu4j/src/main/tests/android/icu/dev/impl/number/DecimalQuantity_SimpleStorage.java
similarity index 99%
rename from android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_SimpleStorage.java
rename to android_icu4j/src/main/tests/android/icu/dev/impl/number/DecimalQuantity_SimpleStorage.java
index a11ba80..002f30d 100644
--- a/android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_SimpleStorage.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/impl/number/DecimalQuantity_SimpleStorage.java
@@ -1,7 +1,7 @@
 /* GENERATED SOURCE. DO NOT MODIFY. */
 // © 2017 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
-package android.icu.impl.number;
+package android.icu.dev.impl.number;
 
 import java.math.BigDecimal;
 import java.math.MathContext;
@@ -9,6 +9,7 @@
 import java.text.FieldPosition;
 
 import android.icu.impl.StandardPlural;
+import android.icu.impl.number.DecimalQuantity;
 import android.icu.text.PluralRules;
 import android.icu.text.PluralRules.Operand;
 import android.icu.text.UFieldPosition;
@@ -505,6 +506,11 @@
     return (flags & NEGATIVE_FLAG) != 0;
   }
 
+  @Override
+  public int signum() {
+      return isNegative() ? -1 : isZero() ? 0 : 1;
+  }
+
   private void setNegative(boolean isNegative) {
     flags = (flags & (~NEGATIVE_FLAG)) | (isNegative ? NEGATIVE_FLAG : 0);
   }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCompatibility.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCompatibility.java
index 701fac8..d764424 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCompatibility.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCompatibility.java
@@ -12,7 +12,6 @@
 
 import java.awt.font.NumericShaper;
 import java.awt.font.TextAttribute;
-import java.text.AttributedCharacterIterator;
 import java.text.AttributedString;
 
 import org.junit.Test;
@@ -210,9 +209,8 @@
         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(1), 0, 26);
         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-1), 0, 6);
         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-1), 19, 26);
-        AttributedCharacterIterator aci = as.getIterator();
-        bidi = new Bidi(aci);
-        jbidi = new java.text.Bidi(aci);
+        bidi = new Bidi(as.getIterator());
+        jbidi = new java.text.Bidi(as.getIterator());
         compareBidi(bidi, jbidi);
         String out = bidi.writeReordered(0);
         logln("Output #1 of Bidi(AttributedCharacterIterator): " + out);
@@ -220,17 +218,15 @@
         as = new AttributedString("HEBREW 123 english MOREHEB");
         as.addAttribute(TextAttribute.RUN_DIRECTION, TextAttribute.RUN_DIRECTION_RTL);
         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(0), 0, 26);
-        aci = as.getIterator();
-        bidi = new Bidi(aci);
-        jbidi = new java.text.Bidi(aci);
+        bidi = new Bidi(as.getIterator());
+        jbidi = new java.text.Bidi(as.getIterator());
         compareBidi(bidi, jbidi);
         out = bidi.writeReordered(0);
         logln("Output #2 of Bidi(AttributedCharacterIterator): " + out);
 
         as = new AttributedString("HEBREW 123 english MOREHEB");
-        aci = as.getIterator();
-        bidi = new Bidi(aci);
-        jbidi = new java.text.Bidi(aci);
+        bidi = new Bidi(as.getIterator());
+        jbidi = new java.text.Bidi(as.getIterator());
         compareBidi(bidi, jbidi);
         out = bidi.writeReordered(0);
         logln("Output #3 of Bidi(AttributedCharacterIterator): " + out);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarRegressionTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarRegressionTest.java
index a4f8af4..dce7345 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarRegressionTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarRegressionTest.java
@@ -2528,5 +2528,39 @@
             }
         }
     }
- }
+
+    @Test
+    public void TestIslamicCalOverflow() {
+        String localeID = "ar@calendar=islamic-civil";
+        Calendar cal = Calendar.getInstance(new ULocale(localeID));
+        int maxMonth = cal.getMaximum(Calendar.MONTH);
+        int maxDayOfMonth = cal.getMaximum(Calendar.DATE);
+        int jd, year, month, dayOfMonth;
+        for (jd = 73530872; jd <= 73530876; jd++) { // year 202002, int32_t overflow if jd >= 73530874
+            cal.clear();
+            cal.set(Calendar.JULIAN_DAY, jd);
+            year = cal.get(Calendar.YEAR);
+            month = cal.get(Calendar.MONTH);
+            dayOfMonth = cal.get(Calendar.DATE);
+            if (month > maxMonth || dayOfMonth > maxDayOfMonth) {
+                errln("Error: localeID " + localeID + ", julianDay " + jd + "; got year " + year + "; maxMonth " + maxMonth +
+                        ", got month " + month + "; maxDayOfMonth " + maxDayOfMonth + ", got dayOfMonth " + dayOfMonth);
+            }
+        }
+    }
+
+    @Test
+    public void TestWeekOfYear13548() {
+        int year = 2000;
+
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.YEAR, year);
+        cal.set(Calendar.WEEK_OF_YEAR, 4);
+
+        int resultYear = cal.get(Calendar.YEAR);
+        if (year != resultYear) {
+            errln("Fail: Expected year=" + year + ", actual=" + resultYear);
+        }
+    }
+}
 //eof
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/AlphabeticIndexTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/AlphabeticIndexTest.java
index 8b4995c..9982039 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/AlphabeticIndexTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/AlphabeticIndexTest.java
@@ -1163,4 +1163,24 @@
         assertEquals("Wrong bucket label", "inflow", index.getInflowLabel());
         assertEquals("Bucket size not 1", 1, inflowBucket.size());
     }
+
+    @Test
+    public void testHasBuckets() {
+        checkHasBuckets(new Locale("am"), UScript.ETHIOPIC);
+        checkHasBuckets(new Locale("haw"), UScript.LATIN);
+        checkHasBuckets(new Locale("hy"), UScript.ARMENIAN);
+        checkHasBuckets(new Locale("vai"), UScript.VAI);
+    }
+
+    private void checkHasBuckets(Locale locale, int script) {
+        AlphabeticIndex.ImmutableIndex index =
+                new AlphabeticIndex<String>(locale).buildImmutableIndex();
+        String loc = locale.toString();
+        assertTrue(loc + " at least 3 buckets", index.getBucketCount() >= 3);
+        AlphabeticIndex.Bucket bucket = index.getBucket(1);
+        assertEquals(loc + " real bucket", AlphabeticIndex.Bucket.LabelType.NORMAL,
+                bucket.getLabelType());
+        assertEquals(loc + " expected script", script,
+                UScript.getScript(bucket.getLabel().codePointAt(0)));
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/CompactDecimalFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/CompactDecimalFormatTest.java
index 6f7fd72..71cf4e2 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/CompactDecimalFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/CompactDecimalFormatTest.java
@@ -191,9 +191,9 @@
             {new CurrencyAmount(1f, Currency.getInstance("EUR")), "1 €"},
             {new CurrencyAmount(12f, Currency.getInstance("EUR")), "12 €"},
             {new CurrencyAmount(123f, Currency.getInstance("EUR")), "120 €"},
-            {new CurrencyAmount(1234f, Currency.getInstance("EUR")), "1,2 Tsd. €"},
-            {new CurrencyAmount(12345f, Currency.getInstance("EUR")), "12 Tsd. €"},
-            {new CurrencyAmount(123456f, Currency.getInstance("EUR")), "120 Tsd. €"},
+            {new CurrencyAmount(1234f, Currency.getInstance("EUR")), "1200 €"},
+            {new CurrencyAmount(12345f, Currency.getInstance("EUR")), "12.000 €"},
+            {new CurrencyAmount(123456f, Currency.getInstance("EUR")), "120.000 €"},
             {new CurrencyAmount(1234567f, Currency.getInstance("EUR")), "1,2 Mio. €"},
             {new CurrencyAmount(12345678f, Currency.getInstance("EUR")), "12 Mio. €"},
             {new CurrencyAmount(123456789f, Currency.getInstance("EUR")), "120 Mio. €"},
@@ -396,7 +396,7 @@
     @Test
     public void TestArabicLongStyle() {
         NumberFormat cdf =
-                CompactDecimalFormat.getInstance(new Locale("ar"), CompactStyle.LONG);
+                CompactDecimalFormat.getInstance(new Locale("ar-EG"), CompactStyle.LONG);
         assertEquals("Arabic Long", "\u061C-\u0665\u066B\u0663 \u0623\u0644\u0641", cdf.format(-5300));
     }
 
@@ -693,17 +693,17 @@
         assertEquals("CDF should correctly format 43000 in 'ar'", "٤٣ ألف", result);
 
         // Bug #12449
-        cdf = CompactDecimalFormat.getInstance(new ULocale("ar"), CompactDecimalFormat.CompactStyle.SHORT);
+        cdf = CompactDecimalFormat.getInstance(new ULocale("ar-EG"), CompactDecimalFormat.CompactStyle.SHORT);
         cdf.setMaximumSignificantDigits(3);
         result = cdf.format(1234);
-        assertEquals("CDF should correctly format 1234 with 3 significant digits in 'ar'", "١٫٢٣ ألف", result);
+        assertEquals("CDF should correctly format 1234 with 3 significant digits in 'ar-EG'", "١٫٢٣ ألف", result);
 
         // Check currency formatting as well
-        cdf = CompactDecimalFormat.getInstance(new ULocale("ar"), CompactDecimalFormat.CompactStyle.SHORT);
+        cdf = CompactDecimalFormat.getInstance(new ULocale("ar-EG"), CompactDecimalFormat.CompactStyle.SHORT);
         result = cdf.format(new CurrencyAmount(43000f, Currency.getInstance("USD")));
-        assertEquals("CDF should correctly format 43000 with currency in 'ar'", "US$ ٤٣ ألف", result);
+        assertEquals("CDF should correctly format 43000 with currency in 'ar-EG'", "US$ ٤٣ ألف", result);
         result = cdf.format(new CurrencyAmount(-43000f, Currency.getInstance("USD")));
-        assertEquals("CDF should correctly format -43000 with currency in 'ar'", "؜-US$ ٤٣ ألف", result);
+        assertEquals("CDF should correctly format -43000 with currency in 'ar-EG'", "؜-US$ ٤٣ ألف", result);
 
         // Extra locale with different positive/negative formats
         cdf = CompactDecimalFormat.getInstance(new ULocale("fi"), CompactDecimalFormat.CompactStyle.SHORT);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestData.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestData.java
index 923bd6a..1f0ff7b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestData.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestData.java
@@ -111,6 +111,7 @@
     public String positiveSuffix = null;
     public String negativePrefix = null;
     public String negativeSuffix = null;
+    public Integer signAlwaysShown = null;
     public String localizedPattern = null;
     public String toPattern = null;
     public String toLocalizedPattern = null;
@@ -216,6 +217,7 @@
         "positiveSuffix",
         "negativePrefix",
         "negativeSuffix",
+        "signAlwaysShown",
         "localizedPattern",
         "toPattern",
         "toLocalizedPattern",
@@ -381,6 +383,10 @@
         negativeSuffix = value;
     }
 
+    public void setSignAlwaysShown(String value) {
+        signAlwaysShown = Integer.valueOf(value);
+    }
+
     public void setLocalizedPattern(String value) {
         localizedPattern = value;
     }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestUtility.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestUtility.java
index f2b5993..9ce04fc 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestUtility.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestUtility.java
@@ -276,7 +276,7 @@
             tuple.setField(name,  Utility.unescape(value));
             return true;
         } catch (Exception e) {
-            showError("No such field: " + name + ", or bad value: " + value);
+            showError("No such field: " + name + ", or bad value: " + value + ": " + e);
             return false;
         }
     }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatTest.java
index 3e67db9..19b9cd5 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatTest.java
@@ -2070,8 +2070,8 @@
         Date date = new Date(874266720000L);  // Sun Sep 14 21:52:00 CET 1997
         TimeZone tz = TimeZone.getTimeZone("CET");
 
-        DateFormat dfArab = DateFormat.getTimeInstance(DateFormat.SHORT, new ULocale("ar"));
-        DateFormat dfLatn = DateFormat.getTimeInstance(DateFormat.SHORT, new ULocale("ar-u-nu-latn"));
+        DateFormat dfArab = DateFormat.getTimeInstance(DateFormat.SHORT, new ULocale("ar-EG"));
+        DateFormat dfLatn = DateFormat.getTimeInstance(DateFormat.SHORT, new ULocale("ar-EG-u-nu-latn"));
 
         dfArab.setTimeZone(tz);
         dfLatn.setTimeZone(tz);
@@ -3915,7 +3915,8 @@
             df = DateFormat.getPatternInstance("", new Locale("en_US"));
             df = DateFormat.getPatternInstance(null, "", new Locale("en_US"));
         } catch(Exception e) {
-            errln("DateFormat.getPatternInstance is not suppose to return an exception.");
+            errln("DateFormat.getPatternInstance is not suppose to return an exception, got: " + e.toString());
+            //e.printStackTrace();
         }
     }
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateTimeGeneratorTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateTimeGeneratorTest.java
index 5b21a99..c7a6301 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateTimeGeneratorTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateTimeGeneratorTest.java
@@ -867,7 +867,8 @@
             DateTimePatternGenerator.getInstance();
         } catch(Exception e){
             errln("DateTimePatternGenerator.getInstance() was not suppose to " +
-                    "return an exception.");
+                    "return an exception, got: " + e.toString());
+            //e.printStackTrace();
         }
     }
 
@@ -1629,4 +1630,45 @@
         dtpg.setAppendItemFormat(DateTimePatternGenerator.ERA, "{0}, {1}");
         assertEquals(message, "d-MM-y, G", dtpg.getBestPattern(skeleton));
     }
+
+    private final class FieldDisplayNameData {
+        public String       locale;
+        public int          field;
+        public DateTimePatternGenerator.DisplayWidth width;
+        public String       expected;
+        // Simple constructor
+        public FieldDisplayNameData(String locale, int field, DateTimePatternGenerator.DisplayWidth width, String expected) {
+            this.locale   = locale;
+            this.field    = field;
+            this.width    = width;
+            this.expected = expected;
+        }
+    }
+    @Test
+    public void TestGetFieldDisplayNames() {
+        final FieldDisplayNameData[] testNamesData = {
+                new FieldDisplayNameData( "de",    DateTimePatternGenerator.QUARTER,              DateTimePatternGenerator.DisplayWidth.WIDE,        "Quartal" ),
+                new FieldDisplayNameData( "de",    DateTimePatternGenerator.QUARTER,              DateTimePatternGenerator.DisplayWidth.ABBREVIATED, "Quart." ),
+                new FieldDisplayNameData( "de",    DateTimePatternGenerator.QUARTER,              DateTimePatternGenerator.DisplayWidth.NARROW,      "Q" ),
+                new FieldDisplayNameData( "en",    DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.WIDE,        "weekday of the month" ),
+                new FieldDisplayNameData( "en",    DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.ABBREVIATED, "wkday. of mo." ),
+                new FieldDisplayNameData( "en",    DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.NARROW,      "wkday. of mo." ),
+                new FieldDisplayNameData( "en_GB", DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.WIDE,        "weekday of the month" ),
+                new FieldDisplayNameData( "en_GB", DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.ABBREVIATED, "wkday of mo" ),
+                new FieldDisplayNameData( "en_GB", DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.NARROW,      "wkday of mo" ),
+                new FieldDisplayNameData( "it",    DateTimePatternGenerator.SECOND,               DateTimePatternGenerator.DisplayWidth.WIDE,        "secondo" ),
+                new FieldDisplayNameData( "it",    DateTimePatternGenerator.SECOND,               DateTimePatternGenerator.DisplayWidth.ABBREVIATED, "s" ),
+                new FieldDisplayNameData( "it",    DateTimePatternGenerator.SECOND,               DateTimePatternGenerator.DisplayWidth.NARROW,      "s" ),
+        };
+
+        for (int i = 0; i < testNamesData.length; ++i) {
+            ULocale uloc = new ULocale(testNamesData[i].locale);
+            DateTimePatternGenerator dtpgen = DateTimePatternGenerator.getInstance(uloc);
+            String getName = dtpgen.getFieldDisplayName(testNamesData[i].field, testNamesData[i].width);
+            if (getName.compareTo(testNamesData[i].expected) != 0) {
+                errln("Locale " + testNamesData[i].locale + ", field " + testNamesData[i].field +
+                        ", width " + testNamesData[i].width + ", expected " + testNamesData[i].expected + ", got " + getName);
+            }
+        }
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbols.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbols.java
index b202edd..a71885c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbols.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbols.java
@@ -314,6 +314,36 @@
             errln("ERROR: Char digits should be Latin digits");
         }
 
+        // Check on copy
+        DecimalFormatSymbols copy = (DecimalFormatSymbols) symbols.clone();
+        if (!Arrays.equals(copy.getDigitStrings(), osmanyaDigitStrings)) {
+            errln("ERROR: Osmanya digits (supplementary) should be set");
+        }
+        if (Character.codePointAt(osmanyaDigitStrings[0], 0) != copy.getCodePointZero()) {
+            errln("ERROR: Code point zero be Osmanya code point zero");
+        }
+        if (defZero != copy.getZeroDigit()) {
+            errln("ERROR: Zero digit should be 0");
+        }
+        if (!Arrays.equals(copy.getDigits(), defDigits)) {
+            errln("ERROR: Char digits should be Latin digits");
+        }
+
+        // Check on resource bundle
+        DecimalFormatSymbols fromData = DecimalFormatSymbols.getInstance(new ULocale("en@numbers=osma"));
+        if (!Arrays.equals(fromData.getDigitStrings(), osmanyaDigitStrings)) {
+            errln("ERROR: Osmanya digits (supplementary) should be set");
+        }
+        if (Character.codePointAt(osmanyaDigitStrings[0], 0) != fromData.getCodePointZero()) {
+            errln("ERROR: Code point zero be Osmanya code point zero");
+        }
+        if (defZero != fromData.getZeroDigit()) {
+            errln("ERROR: Zero digit should be 0");
+        }
+        if (!Arrays.equals(fromData.getDigits(), defDigits)) {
+            errln("ERROR: Char digits should be Latin digits");
+        }
+
         symbols.setDigitStrings(differentDigitStrings);
         if (!Arrays.equals(symbols.getDigitStrings(), differentDigitStrings)) {
             errln("ERROR: Different digits should be set");
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitTest.java
index 8339e90..2ad12ca 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitTest.java
@@ -17,6 +17,7 @@
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.text.FieldPosition;
+import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -43,6 +44,7 @@
 import android.icu.text.MeasureFormat.FormatWidth;
 import android.icu.text.NumberFormat;
 import android.icu.util.Currency;
+import android.icu.util.CurrencyAmount;
 import android.icu.util.Measure;
 import android.icu.util.MeasureUnit;
 import android.icu.util.NoUnit;
@@ -1491,7 +1493,7 @@
                 {ULocale.ENGLISH, FormatWidth.SHORT, "2 mi, 1 ft, 2.3 in"},
                 {ULocale.ENGLISH, FormatWidth.NARROW, "2mi 1\u2032 2.3\u2033"},
                 {russia, FormatWidth.WIDE,   "2 \u043C\u0438\u043B\u0438 1 \u0444\u0443\u0442 2,3 \u0434\u044E\u0439\u043C\u0430"},
-                {russia, FormatWidth.SHORT,  "2 \u043C\u0438\u043B\u0438 1 \u0444\u0443\u0442 2,3 \u0434\u044E\u0439\u043C."},
+                {russia, FormatWidth.SHORT,  "2 \u043C\u0438\u043B\u0438 1 \u0444\u0442 2,3 \u0434\u044E\u0439\u043C."},
                 {russia, FormatWidth.NARROW, "2 \u043C\u0438\u043B\u044C 1 \u0444\u0442 2,3 \u0434\u044E\u0439\u043C\u0430"},
    };
         for (Object[] row : data) {
@@ -1679,9 +1681,11 @@
         assertEquals("numeric currency", "$2.00", mf.format(USD_2));
 
         mf = MeasureFormat.getInstance(ULocale.JAPAN, FormatWidth.WIDE);
-        assertEquals("Wide currency", "-1.00 \u7C73\u30C9\u30EB", mf.format(USD_NEG_1));
-        assertEquals("Wide currency", "1.00 \u7C73\u30C9\u30EB", mf.format(USD_1));
-        assertEquals("Wide currency", "2.00 \u7C73\u30C9\u30EB", mf.format(USD_2));
+        // Locale jp does NOT put a space between the number and the currency long name:
+        // https://unicode.org/cldr/trac/browser/tags/release-32-0-1/common/main/ja.xml?rev=13805#L7046
+        assertEquals("Wide currency", "-1.00\u7C73\u30C9\u30EB", mf.format(USD_NEG_1));
+        assertEquals("Wide currency", "1.00\u7C73\u30C9\u30EB", mf.format(USD_1));
+        assertEquals("Wide currency", "2.00\u7C73\u30C9\u30EB", mf.format(USD_2));
 
         Measure CAD_1 = new Measure(1.0, Currency.getInstance("CAD"));
         mf = MeasureFormat.getInstance(ULocale.CANADA, FormatWidth.SHORT);
@@ -1915,7 +1919,7 @@
                         new Measure(5.3, MeasureUnit.INCH)));
         assertEquals("getLocale", ULocale.ENGLISH, mf.getLocale());
         assertEquals("getNumberFormat", ULocale.ENGLISH, mf.getNumberFormat().getLocale(ULocale.VALID_LOCALE));
-        assertEquals("getWidth", MeasureFormat.FormatWidth.WIDE, mf.getWidth());
+        assertEquals("getWidth", MeasureFormat.FormatWidth.DEFAULT_CURRENCY, mf.getWidth());
     }
 
     @Test
@@ -1927,6 +1931,15 @@
     }
 
     @Test
+    public void testCurrencyFormatParseIsoCode() throws ParseException {
+        MeasureFormat mf = MeasureFormat.getCurrencyFormat(ULocale.ENGLISH);
+        CurrencyAmount result = (CurrencyAmount) mf.parseObject("GTQ 34.56");
+        assertEquals("Parse should succeed", result.getNumber().doubleValue(), 34.56, 0.0);
+        assertEquals("Should parse ISO code GTQ even though the currency is USD",
+                "GTQ", result.getCurrency().getCurrencyCode());
+    }
+
+    @Test
     public void testDoubleZero() {
         ULocale en = new ULocale("en");
         NumberFormat nf = NumberFormat.getInstance(en);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitThreadTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitThreadTest.java
index a842f63..b075142 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitThreadTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitThreadTest.java
@@ -9,7 +9,10 @@
 import org.junit.runners.JUnit4;
 
 import android.icu.dev.test.TestFmwk;
+import android.icu.impl.DontCareFieldPosition;
+import android.icu.text.MeasureFormat;
 import android.icu.util.Currency;
+import android.icu.util.Measure;
 import android.icu.util.MeasureUnit;
 import android.icu.util.ULocale;
 import android.icu.testsharding.MainTestShard;
@@ -33,5 +36,64 @@
         Currency.getInstance(ULocale.ENGLISH);
         try {thread.join();} catch(InterruptedException e) {};
     }
-}
 
+    static class NumericMeasureThread extends Thread {
+        final MeasureFormat mf;
+        final Measure[] arg;
+        final String expected;
+        volatile boolean running = true;
+        AssertionError error;
+
+        NumericMeasureThread(Measure[] arg, String expected) {
+            this.mf = MeasureFormat.getInstance(ULocale.ENGLISH, MeasureFormat.FormatWidth.NUMERIC);
+            this.arg = arg;
+            this.expected = expected;
+            this.error = null;
+        }
+
+        @Override
+        public void run() {
+            while (running) {
+                try {
+                    StringBuilder sb = new StringBuilder();
+                    mf.formatMeasures(sb, DontCareFieldPosition.INSTANCE, arg);
+                    org.junit.Assert.assertEquals(expected, sb.toString());
+                } catch (AssertionError e) {
+                    error = e;
+                    break;
+                }
+            }
+        }
+    }
+
+    // Race in formatMeasures with width NUMERIC:
+    // http://bugs.icu-project.org/trac/ticket/13606
+    @Test
+    public void NumericRaceTest() throws InterruptedException {
+        NumericMeasureThread t1 = new NumericMeasureThread(new Measure[] {
+          new Measure(3, MeasureUnit.MINUTE),
+          new Measure(4, MeasureUnit.SECOND)
+        }, "3:04");
+        NumericMeasureThread t2 = new NumericMeasureThread(new Measure[] {
+          new Measure(5, MeasureUnit.MINUTE),
+          new Measure(6, MeasureUnit.SECOND)
+        }, "5:06");
+        t1.start();
+        t2.start();
+        Thread.sleep(5);
+        t1.running = false;
+        t2.running = false;
+        t1.join();
+        t2.join();
+        if (t1.error != null) {
+            AssertionError error = new AssertionError("Failure in thread 1");
+            error.initCause(t1.error);
+            throw error;
+        }
+        if (t2.error != null) {
+            AssertionError error = new AssertionError("Failure in thread 2");
+            error.initCause(t2.error);
+            throw error;
+        }
+    }
+}
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatDataDrivenTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatDataDrivenTest.java
index 964941e..689d13e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatDataDrivenTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatDataDrivenTest.java
@@ -5,7 +5,6 @@
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.text.ParseException;
 import java.text.ParsePosition;
 
 import org.junit.Test;
@@ -13,10 +12,10 @@
 import android.icu.dev.test.TestUtil;
 import android.icu.impl.number.DecimalFormatProperties;
 import android.icu.impl.number.Padder.PadPosition;
-import android.icu.impl.number.Parse;
-import android.icu.impl.number.Parse.ParseMode;
 import android.icu.impl.number.PatternStringParser;
 import android.icu.impl.number.PatternStringUtils;
+import android.icu.impl.number.parse.NumberParserImpl;
+import android.icu.impl.number.parse.NumberParserImpl.ParseMode;
 import android.icu.number.LocalizedNumberFormatter;
 import android.icu.number.NumberFormatter;
 import android.icu.text.DecimalFormat;
@@ -235,6 +234,9 @@
           if (tuple.negativeSuffix != null) {
             fmt.setNegativeSuffix(tuple.negativeSuffix);
           }
+          if (tuple.signAlwaysShown != null) {
+            // Not supported.
+          }
           if (tuple.localizedPattern != null) {
             fmt.applyLocalizedPattern(tuple.localizedPattern);
           }
@@ -418,6 +420,9 @@
           if (tuple.negativeSuffix != null) {
             fmt.setNegativeSuffix(tuple.negativeSuffix);
           }
+          if (tuple.signAlwaysShown != null) {
+            // Not supported.
+          }
           if (tuple.localizedPattern != null) {
             fmt.applyLocalizedPattern(tuple.localizedPattern);
           }
@@ -522,6 +527,9 @@
     if (tuple.negativeSuffix != null) {
       properties.setNegativeSuffix(tuple.negativeSuffix);
     }
+    if (tuple.signAlwaysShown != null) {
+      properties.setSignAlwaysShown(tuple.signAlwaysShown != 0);
+    }
     if (tuple.localizedPattern != null) {
       DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(tuple.locale);
       String converted = PatternStringUtils.convertLocalized(tuple.localizedPattern, symbols, false);
@@ -584,10 +592,104 @@
         }
       };
 
+      /**
+       * Parsing, but no other features.
+       */
+      private DataDrivenNumberFormatTestUtility.CodeUnderTest ICU61_Parsing =
+          new DataDrivenNumberFormatTestUtility.CodeUnderTest() {
+
+            @Override
+            public Character Id() {
+              return 'P';
+            }
+
+            @Override
+            public String parse(DataDrivenNumberFormatTestData tuple) {
+                String pattern = (tuple.pattern == null) ? "0" : tuple.pattern;
+                DecimalFormatProperties properties;
+                ParsePosition ppos = new ParsePosition(0);
+                Number actual;
+                try {
+                    properties = PatternStringParser.parseToProperties(pattern,
+                            tuple.currency != null ? PatternStringParser.IGNORE_ROUNDING_ALWAYS
+                                    : PatternStringParser.IGNORE_ROUNDING_NEVER);
+                    propertiesFromTuple(tuple, properties);
+                    actual = NumberParserImpl.parseStatic(tuple.parse,
+                            ppos,
+                            properties,
+                            DecimalFormatSymbols.getInstance(tuple.locale));
+                } catch (IllegalArgumentException e) {
+                    return "parse exception: " + e.getMessage();
+                }
+                if (actual == null && ppos.getIndex() != 0) {
+                    throw new AssertionError("Error: value is null but parse position is not zero");
+                }
+                if (ppos.getIndex() == 0) {
+                    return "Parse failed; got " + actual + ", but expected " + tuple.output;
+                }
+                if (tuple.output.equals("NaN")) {
+                    if (!Double.isNaN(actual.doubleValue())) {
+                        return "Expected NaN, but got: " + actual;
+                    }
+                    return null;
+                } else if (tuple.output.equals("Inf")) {
+                    if (!Double.isInfinite(actual.doubleValue()) || Double.compare(actual.doubleValue(), 0.0) < 0) {
+                        return "Expected Inf, but got: " + actual;
+                    }
+                    return null;
+                } else if (tuple.output.equals("-Inf")) {
+                    if (!Double.isInfinite(actual.doubleValue()) || Double.compare(actual.doubleValue(), 0.0) > 0) {
+                        return "Expected -Inf, but got: " + actual;
+                    }
+                    return null;
+                } else if (tuple.output.equals("fail")) {
+                    return null;
+                } else if (new BigDecimal(tuple.output).compareTo(new BigDecimal(actual.toString())) != 0) {
+                    return "Expected: " + tuple.output + ", got: " + actual;
+                } else {
+                    return null;
+                }
+            }
+
+            @Override
+            public String parseCurrency(DataDrivenNumberFormatTestData tuple) {
+                String pattern = (tuple.pattern == null) ? "0" : tuple.pattern;
+                DecimalFormatProperties properties;
+                ParsePosition ppos = new ParsePosition(0);
+                CurrencyAmount actual;
+                try {
+                    properties = PatternStringParser.parseToProperties(
+                            pattern,
+                            tuple.currency != null ? PatternStringParser.IGNORE_ROUNDING_ALWAYS
+                                    : PatternStringParser.IGNORE_ROUNDING_NEVER);
+                    propertiesFromTuple(tuple, properties);
+                    actual = NumberParserImpl.parseStaticCurrency(tuple.parse,
+                            ppos,
+                            properties,
+                            DecimalFormatSymbols.getInstance(tuple.locale));
+                } catch (IllegalArgumentException e) {
+                    e.printStackTrace();
+                    return "parse exception: " + e.getMessage();
+                }
+                if (ppos.getIndex() == 0 || actual.getCurrency().getCurrencyCode().equals("XXX")) {
+                    return "Parse failed; got " + actual + ", but expected " + tuple.output;
+                }
+                BigDecimal expectedNumber = new BigDecimal(tuple.output);
+                if (expectedNumber.compareTo(new BigDecimal(actual.getNumber().toString())) != 0) {
+                    return "Wrong number: Expected: " + expectedNumber + ", got: " + actual;
+                }
+                String expectedCurrency = tuple.outputCurrency;
+                if (!expectedCurrency.equals(actual.getCurrency().toString())) {
+                    return "Wrong currency: Expected: " + expectedCurrency + ", got: " + actual;
+                }
+                return null;
+            }
+      };
+
     /**
      * All features except formatting.
      */
-    private DataDrivenNumberFormatTestUtility.CodeUnderTest ICU60_Other =
+    private DataDrivenNumberFormatTestUtility.CodeUnderTest ICU59_Other =
             new DataDrivenNumberFormatTestUtility.CodeUnderTest() {
 
         @Override
@@ -644,98 +746,6 @@
         }
 
         /**
-         * Runs a single parse test. On success, returns null. On failure, returns the error. This implementation just
-         * returns null. Subclasses should override.
-         *
-         * @param tuple
-         *            contains the parameters of the format test.
-         */
-        @Override
-        public String parse(DataDrivenNumberFormatTestData tuple) {
-            String pattern = (tuple.pattern == null) ? "0" : tuple.pattern;
-            DecimalFormatProperties properties;
-            ParsePosition ppos = new ParsePosition(0);
-            Number actual;
-            try {
-                properties = PatternStringParser.parseToProperties(
-                        pattern,
-                        tuple.currency != null ? PatternStringParser.IGNORE_ROUNDING_ALWAYS
-                                : PatternStringParser.IGNORE_ROUNDING_NEVER);
-                propertiesFromTuple(tuple, properties);
-                actual = Parse.parse(tuple.parse, ppos, properties, DecimalFormatSymbols.getInstance(tuple.locale));
-            } catch (IllegalArgumentException e) {
-                return "parse exception: " + e.getMessage();
-            }
-            if (actual == null && ppos.getIndex() != 0) {
-                throw new AssertionError("Error: value is null but parse position is not zero");
-            }
-            if (ppos.getIndex() == 0) {
-                return "Parse failed; got " + actual + ", but expected " + tuple.output;
-            }
-            if (tuple.output.equals("NaN")) {
-                if (!Double.isNaN(actual.doubleValue())) {
-                    return "Expected NaN, but got: " + actual;
-                }
-                return null;
-            } else if (tuple.output.equals("Inf")) {
-                if (!Double.isInfinite(actual.doubleValue()) || Double.compare(actual.doubleValue(), 0.0) < 0) {
-                    return "Expected Inf, but got: " + actual;
-                }
-                return null;
-            } else if (tuple.output.equals("-Inf")) {
-                if (!Double.isInfinite(actual.doubleValue()) || Double.compare(actual.doubleValue(), 0.0) > 0) {
-                    return "Expected -Inf, but got: " + actual;
-                }
-                return null;
-            } else if (tuple.output.equals("fail")) {
-                return null;
-            } else if (new BigDecimal(tuple.output).compareTo(new BigDecimal(actual.toString())) != 0) {
-                return "Expected: " + tuple.output + ", got: " + actual;
-            } else {
-                return null;
-            }
-        }
-
-        /**
-         * Runs a single parse currency test. On success, returns null. On failure, returns the error. This
-         * implementation just returns null. Subclasses should override.
-         *
-         * @param tuple
-         *            contains the parameters of the format test.
-         */
-        @Override
-        public String parseCurrency(DataDrivenNumberFormatTestData tuple) {
-            String pattern = (tuple.pattern == null) ? "0" : tuple.pattern;
-            DecimalFormatProperties properties;
-            ParsePosition ppos = new ParsePosition(0);
-            CurrencyAmount actual;
-            try {
-                properties = PatternStringParser.parseToProperties(
-                        pattern,
-                        tuple.currency != null ? PatternStringParser.IGNORE_ROUNDING_ALWAYS
-                                : PatternStringParser.IGNORE_ROUNDING_NEVER);
-                propertiesFromTuple(tuple, properties);
-                actual = Parse
-                        .parseCurrency(tuple.parse, ppos, properties, DecimalFormatSymbols.getInstance(tuple.locale));
-            } catch (ParseException e) {
-                e.printStackTrace();
-                return "parse exception: " + e.getMessage();
-            }
-            if (ppos.getIndex() == 0 || actual.getCurrency().getCurrencyCode().equals("XXX")) {
-                return "Parse failed; got " + actual + ", but expected " + tuple.output;
-            }
-            BigDecimal expectedNumber = new BigDecimal(tuple.output);
-            if (expectedNumber.compareTo(new BigDecimal(actual.getNumber().toString())) != 0) {
-                return "Wrong number: Expected: " + expectedNumber + ", got: " + actual;
-            }
-            String expectedCurrency = tuple.outputCurrency;
-            if (!expectedCurrency.equals(actual.getCurrency().toString())) {
-                return "Wrong currency: Expected: " + expectedCurrency + ", got: " + actual;
-            }
-            return null;
-        }
-
-        /**
          * Runs a single select test. On success, returns null. On failure, returns the error. This implementation just
          * returns null. Subclasses should override.
          *
@@ -782,8 +792,14 @@
   }
 
   @Test
+  public void TestDataDrivenICULatest_Parsing() {
+    DataDrivenNumberFormatTestUtility.runFormatSuiteIncludingKnownFailures(
+        "numberformattestspecification.txt", ICU61_Parsing);
+  }
+
+  @Test
   public void TestDataDrivenICULatest_Other() {
     DataDrivenNumberFormatTestUtility.runFormatSuiteIncludingKnownFailures(
-        "numberformattestspecification.txt", ICU60_Other);
+        "numberformattestspecification.txt", ICU59_Other);
   }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTest.java
index 33cde0b..c9012e7 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTest.java
@@ -36,6 +36,7 @@
 import java.util.Random;
 import java.util.Set;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -439,8 +440,8 @@
                 {"$ 124 ", "5", "-1"},
                 {"$\u00A0124 ", "5", "-1"},
                 {" $ 124 ", "6", "-1"},
-                {"124$", "3", "-1"},
-                {"124 $", "3", "-1"},
+                {"124$", "4", "-1"},
+                {"124 $", "5", "-1"},
                 {"$124\u200A", "4", "-1"},
                 {"$\u200A124", "5", "-1"},
         };
@@ -477,10 +478,11 @@
                 {"123, ", 3, -1},
                 {"123,,", 3, -1},
                 {"123,, ", 3, -1},
+                {"123,,456", 3, -1},
                 {"123 ,", 3, -1},
                 {"123, ", 3, -1},
                 {"123, 456", 3, -1},
-                {"123  456", 0, 8} // TODO: Does this behavior make sense?
+                {"123  456", 3, -1}
         };
         DecimalFormat df = new DecimalFormat("#,###");
         df.setParseStrict(true);
@@ -786,12 +788,12 @@
     public void TestMiscCurrencyParsing() {
         String[][] DATA = {
                 // each has: string to be parsed, parsed position, error position
-                {"1.00 ", "4", "-1", "0", "5"},
-                {"1.00 UAE dirha", "4", "-1", "0", "14"},
-                {"1.00 us dollar", "4", "-1", "14", "-1"},
-                {"1.00 US DOLLAR", "4", "-1", "14", "-1"},
-                {"1.00 usd", "4", "-1", "8", "-1"},
-                {"1.00 USD", "4", "-1", "8", "-1"},
+                {"1.00 ", "4", "-1", "0", "4"},
+                {"1.00 UAE dirha", "4", "-1", "0", "4"},
+                {"1.00 us dollar", "14", "-1", "14", "-1"},
+                {"1.00 US DOLLAR", "14", "-1", "14", "-1"},
+                {"1.00 usd", "8", "-1", "8", "-1"},
+                {"1.00 USD", "8", "-1", "8", "-1"},
         };
         ULocale locale = new ULocale("en_US");
         for (int i=0; i<DATA.length; ++i) {
@@ -832,18 +834,14 @@
             private final String localeString;
             private final String descrip;
             private final String currStr;
-            private final int    numExpectPos;
-            private final int    numExpectVal;
             private final int    curExpectPos;
             private final int    curExpectVal;
             private final String curExpectCurr;
 
-            ParseCurrencyItem(String locStr, String desc, String curr, int numExPos, int numExVal, int curExPos, int curExVal, String curExCurr) {
+            ParseCurrencyItem(String locStr, String desc, String curr, int curExPos, int curExVal, String curExCurr) {
                 localeString  = locStr;
                 descrip       = desc;
                 currStr       = curr;
-                numExpectPos  = numExPos;
-                numExpectVal  = numExVal;
                 curExpectPos  = curExPos;
                 curExpectVal  = curExVal;
                 curExpectCurr = curExCurr;
@@ -851,8 +849,6 @@
             public String getLocaleString()  { return localeString; }
             public String getDescrip()       { return descrip; }
             public String getCurrStr()       { return currStr; }
-            public int    getNumExpectPos()  { return numExpectPos; }
-            public int    getNumExpectVal()  { return numExpectVal; }
             public int    getCurExpectPos()  { return curExpectPos; }
             public int    getCurExpectVal()  { return curExpectVal; }
             public String getCurExpectCurr() { return curExpectCurr; }
@@ -860,27 +856,27 @@
         // Note: In cases where the number occurs before the currency sign, non-currency mode will parse the number
         // and stop when it reaches the currency symbol.
         final ParseCurrencyItem[] parseCurrencyItems = {
-                new ParseCurrencyItem( "en_US", "dollars2", "$2.00",            5,  2,  5,  2,  "USD" ),
-                new ParseCurrencyItem( "en_US", "dollars4", "$4",               2,  4,  2,  4,  "USD" ),
-                new ParseCurrencyItem( "en_US", "dollars9", "9\u00A0$",         1,  9,  3,  9,  "USD" ),
-                new ParseCurrencyItem( "en_US", "pounds3",  "\u00A33.00",       0,  0,  5,  3,  "GBP" ),
-                new ParseCurrencyItem( "en_US", "pounds5",  "\u00A35",          0,  0,  2,  5,  "GBP" ),
-                new ParseCurrencyItem( "en_US", "pounds7",  "7\u00A0\u00A3",    1,  7,  3,  7,  "GBP" ),
-                new ParseCurrencyItem( "en_US", "euros8",   "\u20AC8",          0,  0,  2,  8,  "EUR" ),
+                new ParseCurrencyItem( "en_US", "dollars2", "$2.00",            5,  2,  "USD" ),
+                new ParseCurrencyItem( "en_US", "dollars4", "$4",               2,  4,  "USD" ),
+                new ParseCurrencyItem( "en_US", "dollars9", "9\u00A0$",         3,  9,  "USD" ),
+                new ParseCurrencyItem( "en_US", "pounds3",  "\u00A33.00",       5,  3,  "GBP" ),
+                new ParseCurrencyItem( "en_US", "pounds5",  "\u00A35",          2,  5,  "GBP" ),
+                new ParseCurrencyItem( "en_US", "pounds7",  "7\u00A0\u00A3",    3,  7,  "GBP" ),
+                new ParseCurrencyItem( "en_US", "euros8",   "\u20AC8",          2,  8,  "EUR" ),
 
-                new ParseCurrencyItem( "en_GB", "pounds3",  "\u00A33.00",       5,  3,  5,  3,  "GBP" ),
-                new ParseCurrencyItem( "en_GB", "pounds5",  "\u00A35",          2,  5,  2,  5,  "GBP" ),
-                new ParseCurrencyItem( "en_GB", "pounds7",  "7\u00A0\u00A3",    1,  7,  3,  7,  "GBP" ),
-                new ParseCurrencyItem( "en_GB", "euros4",   "4,00\u00A0\u20AC", 4,400,  6,400,  "EUR" ),
-                new ParseCurrencyItem( "en_GB", "euros6",   "6\u00A0\u20AC",    1,  6,  3,  6,  "EUR" ),
-                new ParseCurrencyItem( "en_GB", "euros8",   "\u20AC8",          0,  0,  2,  8,  "EUR" ),
-                new ParseCurrencyItem( "en_GB", "dollars4", "US$4",             0,  0,  4,  4,  "USD" ),
+                new ParseCurrencyItem( "en_GB", "pounds3",  "\u00A33.00",       5,  3,  "GBP" ),
+                new ParseCurrencyItem( "en_GB", "pounds5",  "\u00A35",          2,  5,  "GBP" ),
+                new ParseCurrencyItem( "en_GB", "pounds7",  "7\u00A0\u00A3",    3,  7,  "GBP" ),
+                new ParseCurrencyItem( "en_GB", "euros4",   "4,00\u00A0\u20AC", 6,400,  "EUR" ),
+                new ParseCurrencyItem( "en_GB", "euros6",   "6\u00A0\u20AC",    3,  6,  "EUR" ),
+                new ParseCurrencyItem( "en_GB", "euros8",   "\u20AC8",          2,  8,  "EUR" ),
+                new ParseCurrencyItem( "en_GB", "dollars4", "US$4",             4,  4,  "USD" ),
 
-                new ParseCurrencyItem( "fr_FR", "euros4",   "4,00\u00A0\u20AC", 6,  4,  6,  4,  "EUR" ),
-                new ParseCurrencyItem( "fr_FR", "euros6",   "6\u00A0\u20AC",    3,  6,  3,  6,  "EUR" ),
-                new ParseCurrencyItem( "fr_FR", "euros8",   "\u20AC8",          0,  0,  2,  8,  "EUR" ),
-                new ParseCurrencyItem( "fr_FR", "dollars2", "$2.00",            0,  0,  0,  0,  ""    ),
-                new ParseCurrencyItem( "fr_FR", "dollars4", "$4",               0,  0,  0,  0,  ""    ),
+                new ParseCurrencyItem( "fr_FR", "euros4",   "4,00\u00A0\u20AC", 6,  4,  "EUR" ),
+                new ParseCurrencyItem( "fr_FR", "euros6",   "6\u00A0\u20AC",    3,  6,  "EUR" ),
+                new ParseCurrencyItem( "fr_FR", "euros8",   "\u20AC8",          2,  8,  "EUR" ),
+                new ParseCurrencyItem( "fr_FR", "dollars2", "$2.00",            0,  0,  ""    ),
+                new ParseCurrencyItem( "fr_FR", "dollars4", "$4",               0,  0,  ""    ),
         };
         for (ParseCurrencyItem item: parseCurrencyItems) {
             String localeString = item.getLocaleString();
@@ -896,14 +892,14 @@
             ParsePosition parsePos = new ParsePosition(0);
 
             Number numVal = fmt.parse(currStr, parsePos);
-            if ( parsePos.getIndex() != item.getNumExpectPos() || (numVal != null && numVal.intValue() != item.getNumExpectVal()) ) {
+            if ( parsePos.getIndex() != item.getCurExpectPos() || (numVal != null && numVal.intValue() != item.getCurExpectVal()) ) {
                 if (numVal != null) {
                     errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() +
-                            ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() +
+                            ", expect pos/val " + item.getCurExpectPos() + "/" + item.getCurExpectVal() +
                             ", get " + parsePos.getIndex() + "/" + numVal.intValue() );
                 } else {
                     errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() +
-                            ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() +
+                            ", expect pos/val " + item.getCurExpectPos() + "/" + item.getCurExpectVal() +
                             ", get " + parsePos.getIndex() + "/(NULL)" );
                 }
             }
@@ -931,7 +927,7 @@
         DecimalFormat df = new DecimalFormat("#,##0.00 ¤¤");
         ParsePosition ppos = new ParsePosition(0);
         df.parseCurrency("1.00 us denmark", ppos);
-        assertEquals("Expected to fail on 'us denmark' string", 9, ppos.getErrorIndex());
+        assertEquals("Expected to fail on 'us denmark' string", 4, ppos.getErrorIndex());
     }
 
     @Test
@@ -2809,6 +2805,7 @@
                 "0.0",         // single zero before decimal followed by digit is not leading
                 "0. ",         // same as above before period (or decimal) is not leading
                 "0.100,5",     // comma stops parse of decimal (no grouping)
+                "0.100,,5",    // two commas also stops parse
                 ".00",         // leading decimal is ok, even with zeros
                 "1234567",     // group separators are not required
                 "12345, ",     // comma not followed by digit is not a group separator, but end of number
@@ -2829,7 +2826,6 @@
                 ",1",        // leading group separator before digit
                 ",.02",      // leading group separator before decimal
                 "1,.02",     // group separator before decimal
-                "1,,200",    // multiple group separators
                 "1,45",      // wrong number of digits in primary group
                 "1,45 that", // wrong number of digits in primary group
                 "1,45.34",   // wrong number of digits in primary group
@@ -2964,9 +2960,8 @@
         for (int i = 0; i < defaultNonLong.length; i++) {
             try {
                 Number n = nf.parse(defaultNonLong[i]);
-                // For backwards compatibility with this test, BigDecimal is checked.
-                if ((n instanceof Long) || (n instanceof BigDecimal)) {
-                    errln("FAIL: parse returned a Long or a BigDecimal");
+                if (n instanceof Long) {
+                    errln("FAIL: parse returned a Long");
                 }
             } catch (ParseException e) {
                 errln("parse of '" + defaultNonLong[i] + "' threw exception: " + e);
@@ -4304,7 +4299,8 @@
                 result = parser.parse(value2ParseWithDecimal).doubleValue();
                 if(!hasDecimalPoint){
                     TestFmwk.errln("Parsing " + value2ParseWithDecimal + " should NOT have succeeded with " + testPattern[i] +
-                            " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired());
+                            " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired() +
+                            " (got: " + result + ")");
                 }
             } catch (ParseException e) {
                     // OK, should fail
@@ -4784,13 +4780,12 @@
         fmt.applyPattern("@@@E0");
         expect2(fmt, 1230000, "(1).(2)(3)E(6)");
 
-        // Grouping and decimal with multiple code points are not supported during parsing.
+        // Grouping and decimal with multiple code points (supported in parsing since ICU 61)
         symbols.setDecimalSeparatorString("~~");
         symbols.setGroupingSeparatorString("^^");
         fmt.setDecimalFormatSymbols(symbols);
         fmt.applyPattern("#,##0.0#");
-        assertEquals("Custom decimal and grouping separator string with multiple characters",
-                "(1)^^(2)(3)(4)^^(5)(6)(7)~~(8)(9)", fmt.format(1234567.89));
+        expect2(fmt, 1234567.89, "(1)^^(2)(3)(4)^^(5)(6)(7)~~(8)(9)");
 
         // Digits starting at U+1D7CE MATHEMATICAL BOLD DIGIT ZERO
         // These are all single code points, so parsing will work.
@@ -4887,7 +4882,9 @@
         df = new DecimalFormat("0%");
         assertEquals("Default division", 0.12001, df.parse("12.001%").doubleValue());
         df.setMathContext(fourDigits);
-        assertEquals("Division with fourDigits", 0.12, df.parse("12.001%").doubleValue());
+        // NOTE: Since ICU 61, division no longer occurs with percentage parsing.
+        // assertEquals("Division with fourDigits", 0.12, df.parse("12.001%").doubleValue());
+        assertEquals("Division with fourDigits", 0.12001, df.parse("12.001%").doubleValue());
         df.setMathContext(unlimitedCeiling);
         assertEquals("Division with unlimitedCeiling", 0.12001, df.parse("12.001%").doubleValue());
 
@@ -4897,11 +4894,13 @@
         String hugeNumberString = "9876543212345678987654321234567898765432123456789"; // 49 digits
         BigInteger huge34Digits = new BigInteger("9876543143209876985185182338271622000000");
         BigInteger huge4Digits = new BigInteger("9877000000000000000000000000000000000000");
-        assertEquals("Default extreme division", huge34Digits, df.parse(hugeNumberString));
+        BigInteger actual34Digits = ((BigDecimal) df.parse(hugeNumberString)).toBigIntegerExact();
+        assertEquals("Default extreme division", huge34Digits, actual34Digits);
         df.setMathContext(fourDigits);
-        assertEquals("Extreme division with fourDigits", huge4Digits, df.parse(hugeNumberString));
-        df.setMathContext(unlimitedCeiling);
+        BigInteger actual4Digits = ((BigDecimal) df.parse(hugeNumberString)).toBigIntegerExact();
+        assertEquals("Extreme division with fourDigits", huge4Digits, actual4Digits);
         try {
+            df.setMathContext(unlimitedCeiling);
             df.parse(hugeNumberString);
             fail("Extreme division with unlimitedCeiling should throw ArithmeticException");
         } catch (ArithmeticException e) {
@@ -5075,7 +5074,10 @@
     }
 
     @Test
+    @Ignore
     public void Test11686() {
+        // Only passes with slow mode.
+        // TODO: Re-enable this test with slow mode.
         DecimalFormat df = new DecimalFormat();
         df.setPositiveSuffix("0K");
         df.setNegativeSuffix("0N");
@@ -5332,6 +5334,50 @@
     }
 
     @Test
+    public void Test13453_AffixContent() {
+        DecimalFormat df = (DecimalFormat) DecimalFormat.getScientificInstance();
+        assertEquals("Scientific should NOT be included", "", df.getPositiveSuffix());
+
+        df = CompactDecimalFormat.getInstance(ULocale.ENGLISH, CompactDecimalFormat.CompactStyle.SHORT);
+        assertEquals("Compact should NOT be included", "", df.getPositiveSuffix());
+
+        df = (DecimalFormat) DecimalFormat.getInstance(NumberFormat.ISOCURRENCYSTYLE);
+        df.setCurrency(Currency.getInstance("GBP"));
+        assertEquals("ISO currency SHOULD be included", "GBP", df.getPositivePrefix());
+
+        df = (DecimalFormat) DecimalFormat.getInstance(NumberFormat.PLURALCURRENCYSTYLE);
+        df.setCurrency(Currency.getInstance("GBP"));
+        assertEquals("Plural name SHOULD be included", " British pounds", df.getPositiveSuffix());
+    }
+
+    @Test
+    public void Test11035_FormatCurrencyAmount() {
+        double amount = 12345.67;
+        String expected = "12,345$67 ​";
+        Currency cur = Currency.getInstance("PTE");
+
+        // Test three ways to set currency via API
+
+        ULocale loc1 = new ULocale("pt_PT");
+        NumberFormat fmt1 = NumberFormat.getCurrencyInstance(loc1);
+        fmt1.setCurrency(cur);
+        String actualSetCurrency = fmt1.format(amount);
+
+        ULocale loc2 = new ULocale("pt_PT@currency=PTE");
+        NumberFormat fmt2 = NumberFormat.getCurrencyInstance(loc2);
+        String actualLocaleString = fmt2.format(amount);
+
+        ULocale loc3 = new ULocale("pt_PT");
+        NumberFormat fmt3 = NumberFormat.getCurrencyInstance(loc3);
+        CurrencyAmount curAmt = new CurrencyAmount(amount, cur);
+        String actualCurrencyAmount = fmt3.format(curAmt);
+
+        assertEquals("Custom Currency Pattern, Set Currency", expected, actualSetCurrency);
+        assertEquals("Custom Currency Pattern, Locale String", expected, actualCurrencyAmount);
+        assertEquals("Custom Currency Pattern, CurrencyAmount", expected, actualLocaleString);
+    }
+
+    @Test
     public void testPercentZero() {
         DecimalFormat df = (DecimalFormat) NumberFormat.getPercentInstance();
         String actual = df.format(0);
@@ -5475,7 +5521,8 @@
         ParsePosition ppos = new ParsePosition(0);
         Number n1 = df.parse(str, ppos);
         Number n2 = df.parse(str, ppos);
-        assertEquals("Should parse 12 and -5", 7, n1.intValue() + n2.intValue());
+        assertEquals("Should parse 12 and -5", 12, n1.intValue());
+        assertEquals("Should parse 12 and -5", -5, n2.intValue());
     }
 
     @Test
@@ -5498,7 +5545,9 @@
         assertEquals("Quote should be escapable in padding syntax", "a''12b", result);
     }
 
+    // TODO: Investigate this test and re-enable if appropriate.
     @Test
+    @Ignore
     public void testParseAmbiguousAffixes() {
         BigDecimal positive = new BigDecimal("0.0567");
         BigDecimal negative = new BigDecimal("-0.0567");
@@ -5540,7 +5589,7 @@
         assertEquals("Should consume the trailing bidi since it is in the symbol", 5, ppos.getIndex());
         ppos.setIndex(0);
         result = df.parse("-42a\u200E ", ppos);
-        assertEquals("Should parse as percent", new BigDecimal("-0.42"), result);
+        assertEquals("Should parse as percent", -0.42, result.doubleValue());
         assertEquals("Should not consume the trailing bidi or whitespace", 4, ppos.getIndex());
 
         // A few more cases based on the docstring:
@@ -5647,88 +5696,6 @@
     }
 
     @Test
-    public void testParseGroupingMode() {
-        ULocale[] locales = {         // GROUPING   DECIMAL
-                new ULocale("en-US"), // comma      period
-                new ULocale("fr-FR"), // space      comma
-                new ULocale("de-CH"), // apostrophe period
-                new ULocale("es-PY")  // period     comma
-        };
-        String[] inputs = {
-                "12,345.67",
-                "12 345,67",
-                "12'345.67",
-                "12.345,67",
-                "12,345",
-                "12 345",
-                "12'345",
-                "12.345"
-        };
-        BigDecimal[] outputs = {
-                new BigDecimal("12345.67"),
-                new BigDecimal("12345.67"),
-                new BigDecimal("12345.67"),
-                new BigDecimal("12345.67"),
-                new BigDecimal("12345"),
-                new BigDecimal("12345"),
-                new BigDecimal("12345"),
-                new BigDecimal("12345")
-        };
-        int[][] expecteds = {
-                // 0 => works in neither default nor restricted
-                // 1 => works in default but not restricted
-                // 2 => works in restricted but not default (should not happen)
-                // 3 => works in both default and restricted
-                //
-                // C=comma, P=period, S=space, A=apostrophe
-                // C+P    S+C    A+P    P+C    C-only  S-only   A-only   P-only
-                {  3,     0,     1,     0,     3,      1,       1,       0  }, // => en-US
-                {  0,     3,     0,     1,     0,      3,       3,       1  }, // => fr-FR
-                {  1,     0,     3,     0,     1,      3,       3,       0  }, // => de-CH
-                {  0,     1,     0,     3,     0,      1,       1,       3  }  // => es-PY
-        };
-
-        for (int i=0; i<locales.length; i++) {
-            ULocale loc = locales[i];
-            DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(loc);
-            df.setParseBigDecimal(true);
-            for (int j=0; j<inputs.length; j++) {
-                String input = inputs[j];
-                BigDecimal output = outputs[j];
-                int expected = expecteds[i][j];
-
-                // TODO(sffc): Uncomment after ICU 60 API proposal
-                //df.setParseGroupingMode(null);
-                //assertEquals("Getter should return null", null, df.getParseGroupingMode());
-                ParsePosition ppos = new ParsePosition(0);
-                Number result = df.parse(input, ppos);
-                boolean actualNull = output.equals(result) && (ppos.getIndex() == input.length());
-                assertEquals("Locale " + loc + ", string \"" + input + "\", DEFAULT, "
-                        + "actual result: " + result + " (ppos: " + ppos.getIndex() + ")",
-                        (expected & 1) != 0, actualNull);
-
-                // TODO(sffc): Uncomment after ICU 60 API proposal
-                //df.setParseGroupingMode(GroupingMode.DEFAULT);
-                //assertEquals("Getter should return new value", GroupingMode.DEFAULT, df.getParseGroupingMode());
-                //ppos = new ParsePosition(0);
-                //result = df.parse(input, ppos);
-                //boolean actualDefault = output.equals(result) && (ppos.getIndex() == input.length());
-                //assertEquals("Result from null should be the same as DEFAULT", actualNull, actualDefault);
-
-                // TODO(sffc): Uncomment after ICU 60 API proposal
-                //df.setParseGroupingMode(GroupingMode.RESTRICTED);
-                //assertEquals("Getter should return new value", GroupingMode.RESTRICTED, df.getParseGroupingMode());
-                //ppos = new ParsePosition(0);
-                //result = df.parse(input, ppos);
-                //boolean actualRestricted = output.equals(result) && (ppos.getIndex() == input.length());
-                //assertEquals("Locale " + loc + ", string \"" + input + "\", RESTRICTED, "
-                //        + "actual result: " + result + " (ppos: " + ppos.getIndex() + ")",
-                //        (expected & 2) != 0, actualRestricted);
-            }
-        }
-    }
-
-    @Test
     public void testParseNoExponent() throws ParseException {
         DecimalFormat df = new DecimalFormat();
         assertEquals("Parse no exponent has wrong default", false, df.getParseNoExponent());
@@ -5936,4 +5903,76 @@
         // expect(currencyFormat, 0.08, "CA$0.1");  // ICU 58 and down
         expect(currencyFormat, 0.08, "CA$0.10");  // ICU 59 and up
     }
+
+    @Test
+    public void testParsePositionIncrease() {
+        String input = "123\n456\n$789";
+        ParsePosition ppos = new ParsePosition(0);
+        DecimalFormat df = new DecimalFormat();
+        df.parse(input, ppos);
+        assertEquals("Should stop after first entry", 3, ppos.getIndex());
+        ppos.setIndex(ppos.getIndex() + 1);
+        df.parse(input, ppos);
+        assertEquals("Should stop after second entry", 7, ppos.getIndex());
+        ppos.setIndex(ppos.getIndex() + 1);
+        df.parseCurrency(input, ppos); // test parseCurrency API as well
+        assertEquals("Should stop after third entry", 12, ppos.getIndex());
+    }
+
+    @Test
+    public void testTrailingMinusSign() {
+        String input = "52-";
+        DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(ULocale.ENGLISH);
+        ParsePosition ppos = new ParsePosition(0);
+        Number result = df.parse(input, ppos);
+        assertEquals("Trailing sign should NOT be accepted after the number in English by default",
+                52.0,
+                result.doubleValue(),
+                0.0);
+        df.applyPattern("#;#-");
+        ppos.setIndex(0);
+        result = df.parse(input, ppos);
+        assertEquals("Trailing sign SHOULD be accepted if there is one in the pattern",
+                -52.0,
+                result.doubleValue(),
+                0.0);
+    }
+
+    @Test
+    public void test13684_FrenchPercentParsing() {
+        NumberFormat numberFormat = NumberFormat.getPercentInstance(ULocale.FRENCH);
+        numberFormat.setParseStrict(true);
+        ParsePosition ppos = new ParsePosition(0);
+        Number percentage = numberFormat.parse("8\u00A0%", ppos);
+        assertEquals("Should parse successfully", 0.08, percentage.doubleValue());
+        assertEquals("Should consume whole string", 3, ppos.getIndex());
+    }
+
+    @Test
+    public void testParsePercentRegression() {
+        DecimalFormat df1 = (DecimalFormat) NumberFormat.getInstance(ULocale.ENGLISH);
+        DecimalFormat df2 = (DecimalFormat) NumberFormat.getPercentInstance(ULocale.ENGLISH);
+        df1.setParseStrict(false);
+        df2.setParseStrict(false);
+
+        {
+            ParsePosition ppos = new ParsePosition(0);
+            Number result = df1.parse("50%", ppos);
+            assertEquals("df1 should accept a number but not the percent sign", 2, ppos.getIndex());
+            assertEquals("df1 should return the number as 50", 50.0, result.doubleValue());
+        }
+        {
+            ParsePosition ppos = new ParsePosition(0);
+            Number result = df2.parse("50%", ppos);
+            assertEquals("df2 should accept the percent sign", 3, ppos.getIndex());
+            assertEquals("df2 should return the number as 0.5", 0.5, result.doubleValue());
+        }
+        {
+            ParsePosition ppos = new ParsePosition(0);
+            Number result = df2.parse("50", ppos);
+            assertEquals("df2 should return the number as 0.5 even though the percent sign is missing",
+                    0.5,
+                    result.doubleValue());
+        }
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTestCases.txt b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTestCases.txt
index 14b5219..18cb765 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTestCases.txt
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTestCases.txt
@@ -109,7 +109,7 @@
 p: -              "1,234,56" 1.234
 p: -              "1。234、56" 1234.56
 
-loc= "ar"
+loc= "ar-EG"
 p: -              "1234٫56" 1234.56
 p: -              "1234،56" 1234.56
 p: -              "1234،56" 1234.56
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRangesTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRangesTest.java
index 43158f5..e6c8a46 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRangesTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRangesTest.java
@@ -11,6 +11,7 @@
 
 import java.util.Arrays;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -75,6 +76,8 @@
         }
     }
 
+    // TODO: Re-enable this test when #12454 is fixed.
+    @Ignore("http://bugs.icu-project.org/trac/ticket/12454")
     @Test
     public void TestFormatting() {
         Object[][] tests = {
@@ -111,7 +114,9 @@
             MeasureFormat mf = MeasureFormat.getInstance(locale, width);
             Object actual;
             try {
-                actual = mf.formatMeasureRange(new Measure(low, unit), new Measure(high, unit));
+                // TODO: Fix this when range formatting is added again.
+                // To let the code compile, the following line does list formatting.
+                actual = mf.formatMeasures(new Measure(low, unit), new Measure(high, unit));
             } catch (Exception e) {
                 actual = e.getClass();
             }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRulesTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRulesTest.java
index 15ad86f..bab0e3c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRulesTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRulesTest.java
@@ -997,7 +997,7 @@
             "pt_PT; one: @integer 1; other: @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …",
             "da; one: @integer 1; other: @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …",
             "is; one: @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …; other: @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …",
-            "mk; one: @integer 1, 11, 21, 31, 41, 51, 61, 71, 101, 1001, …; other: @integer 0, 2~10, 12~17, 100, 1000, 10000, 100000, 1000000, …",
+            "mk; one: @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …; other: @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …",
             "fil,tl; one: @integer 0~3, 5, 7, 8, 10~13, 15, 17, 18, 20, 21, 100, 1000, 10000, 100000, 1000000, …; other: @integer 4, 6, 9, 14, 16, 19, 24, 26, 104, 1004, …",
 
             // [zero, one, other]
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/RBNFParseTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/RBNFParseTest.java
index d40d1ab..38c7f82 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/RBNFParseTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/RBNFParseTest.java
@@ -9,6 +9,7 @@
  */
 package android.icu.dev.test.format;
 
+import java.text.ParseException;
 import java.util.Locale;
 
 import org.junit.Test;
@@ -164,4 +165,22 @@
         logln("rbnf_fr:" + rbnf_en.getDefaultRuleSetName());
         parseList(rbnf_en, rbnf_fr, lists);
     }
+
+    @Test
+    public void TestBadParse() {
+        RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(Locale.JAPAN, RuleBasedNumberFormat.SPELLOUT);
+        String[] testData = {
+                "・・・・・・・・・・・・・・・・・・・・・・・・",
+        };
+
+        for (String testString : testData) {
+            try {
+                rbnf.parse(testString);
+                errln("Unexpected success: " + testString);
+            }
+            catch (ParseException e) {
+                // success!
+            }
+        }
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/impl/StringSegmentTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/impl/StringSegmentTest.java
new file mode 100644
index 0000000..96b6cde
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/impl/StringSegmentTest.java
@@ -0,0 +1,104 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.dev.test.impl;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import android.icu.impl.StringSegment;
+import android.icu.testsharding.MainTestShard;
+
+/**
+ * @author sffc
+ *
+ */
+@MainTestShard
+public class StringSegmentTest {
+    static final String SAMPLE_STRING = "📻 radio 📻";
+
+    @Test
+    public void testOffset() {
+        StringSegment segment = new StringSegment(SAMPLE_STRING, false);
+        assertEquals(0, segment.getOffset());
+        segment.adjustOffsetByCodePoint();
+        assertEquals(2, segment.getOffset());
+        segment.adjustOffset(1);
+        assertEquals(3, segment.getOffset());
+        segment.adjustOffset(2);
+        assertEquals(5, segment.getOffset());
+        segment.setOffset(4);
+        assertEquals(4, segment.getOffset());
+    }
+
+    @Test
+    public void testLength() {
+        StringSegment segment = new StringSegment(SAMPLE_STRING, false);
+        assertEquals(11, segment.length());
+        segment.adjustOffset(3);
+        assertEquals(8, segment.length());
+        segment.setLength(4);
+        assertEquals(4, segment.length());
+        segment.setOffset(5);
+        assertEquals(2, segment.length());
+        segment.resetLength();
+        assertEquals(6, segment.length());
+    }
+
+    @Test
+    public void testCharAt() {
+        StringSegment segment = new StringSegment(SAMPLE_STRING, false);
+        assertCharSequenceEquals(SAMPLE_STRING, segment);
+        segment.adjustOffset(3);
+        assertCharSequenceEquals("radio 📻", segment);
+        segment.setLength(5);
+        assertCharSequenceEquals("radio", segment);
+    }
+
+    @Test
+    public void testGetCodePoint() {
+        StringSegment segment = new StringSegment(SAMPLE_STRING, false);
+        assertEquals(0x1F4FB, segment.getCodePoint());
+        segment.setLength(1);
+        assertEquals(0xD83D, segment.getCodePoint());
+        segment.resetLength();
+        segment.adjustOffset(1);
+        assertEquals(0xDCFB, segment.getCodePoint());
+        segment.adjustOffset(1);
+        assertEquals(0x20, segment.getCodePoint());
+    }
+
+    @Test
+    public void testCommonPrefixLength() {
+        StringSegment segment = new StringSegment(SAMPLE_STRING, true);
+        assertEquals(11, segment.getCommonPrefixLength(SAMPLE_STRING));
+        assertEquals(4, segment.getCommonPrefixLength("📻 r"));
+        assertEquals(3, segment.getCommonPrefixLength("📻 x"));
+        assertEquals(0, segment.getCommonPrefixLength("x"));
+        assertEquals(0, segment.getCommonPrefixLength(""));
+        segment.adjustOffset(3);
+        assertEquals(5, segment.getCommonPrefixLength("raDio"));
+        assertEquals(5, segment.getCommonPrefixLength("radio"));
+        assertEquals(2, segment.getCommonPrefixLength("rafio"));
+        assertEquals(0, segment.getCommonPrefixLength("fadio"));
+        assertEquals(0, segment.getCommonPrefixLength(""));
+        assertEquals(5, segment.getCaseSensitivePrefixLength("radio"));
+        assertEquals(2, segment.getCaseSensitivePrefixLength("raDio"));
+        segment.setLength(3);
+        assertEquals(3, segment.getCommonPrefixLength("radio"));
+        assertEquals(2, segment.getCommonPrefixLength("rafio"));
+        assertEquals(0, segment.getCommonPrefixLength("fadio"));
+        assertEquals(0, segment.getCommonPrefixLength(""));
+        segment.resetLength();
+        segment.setOffset(11); // end of string
+        assertEquals(0, segment.getCommonPrefixLength("foo"));
+    }
+
+    private static void assertCharSequenceEquals(CharSequence a, CharSequence b) {
+        assertEquals(a.length(), b.length());
+        for (int i = 0; i < a.length(); i++) {
+            assertEquals(a.charAt(i), b.charAt(i));
+        }
+    }
+}
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCaseTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCaseTest.java
index b3686c5..8e6345f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCaseTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCaseTest.java
@@ -195,6 +195,28 @@
         }
     }
 
+    @Test
+    public void TestInvalidCodePointFolding() {
+        int[] invalidCodePoints = {
+                0xD800, // lead surrogate
+                0xDFFF, // trail surrogate
+                0xFDD0, // noncharacter
+                0xFFFF, // noncharacter
+                0x110000, // out of range
+                -1 // negative
+        };
+        for (int cp : invalidCodePoints) {
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, true));
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, false));
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, UCharacter.FOLD_CASE_DEFAULT));
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I));
+        }
+    }
+
     /**
      * Testing the strings case mapping methods
      */
@@ -461,19 +483,17 @@
                 }
             }
             else {
-                if (!SPECIAL_DATA_[j + 1].equals(
-                     UCharacter.toLowerCase(str))) {
+                String lower = UCharacter.toLowerCase(str);
+                if (!SPECIAL_DATA_[j + 1].equals(lower)) {
                     errln("error lowercasing special characters " +
                         hex(str) + " expected " + SPECIAL_DATA_[j + 1] +
-                        " but got " +
-                        hex(UCharacter.toLowerCase(locale, str)));
+                        " but got " + hex(lower));
                 }
-                if (!SPECIAL_DATA_[j + 2].equals(
-                     UCharacter.toUpperCase(locale, str))) {
+                String upper = UCharacter.toUpperCase(str);
+                if (!SPECIAL_DATA_[j + 2].equals(upper)) {
                     errln("error uppercasing special characters " +
                         hex(str) + " expected " + SPECIAL_DATA_[j + 2] +
-                        " but got " +
-                        hex(UCharacter.toUpperCase(locale, str)));
+                        " but got " + hex(upper));
                 }
             }
         }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetTest.java
index 81bc900..1e97fca 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetTest.java
@@ -2776,4 +2776,23 @@
         } catch (IllegalArgumentException expected) {
         }
     }
+
+    @Test
+    public void TestDeepPattern() {
+        // Nested ranges are parsed via recursion which can use a lot of stack space.
+        // After a reasonable limit, we should get an error.
+        final int DEPTH = 20000;
+        StringBuilder pattern = new StringBuilder();
+        StringBuilder suffix = new StringBuilder();
+        for (int i = 0; i < DEPTH; ++i) {
+            pattern.append("[a");
+            suffix.append(']');
+        }
+        pattern.append(suffix);
+        try {
+            new UnicodeSet(pattern.toString());
+            fail("[a[a[a...1000s...]]] did not throw an exception");
+        } catch(RuntimeException expected) {
+        }
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/number/AffixUtilsTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/number/AffixUtilsTest.java
index d0511db..d10c506 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/number/AffixUtilsTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/number/AffixUtilsTest.java
@@ -11,219 +11,237 @@
 import android.icu.impl.number.AffixUtils;
 import android.icu.impl.number.AffixUtils.SymbolProvider;
 import android.icu.impl.number.NumberStringBuilder;
+import android.icu.text.UnicodeSet;
 import android.icu.testsharding.MainTestShard;
 
 @MainTestShard
 public class AffixUtilsTest {
 
-    private static final SymbolProvider DEFAULT_SYMBOL_PROVIDER =
-        new SymbolProvider() {
-          @Override
-          public CharSequence getSymbol(int type) {
+    private static final SymbolProvider DEFAULT_SYMBOL_PROVIDER = new SymbolProvider() {
+        @Override
+        public CharSequence getSymbol(int type) {
             // Use interesting symbols where possible. The symbols are from ar_SA but are hard-coded
             // here to make the test independent of locale data changes.
             switch (type) {
-              case AffixUtils.TYPE_MINUS_SIGN:
+            case AffixUtils.TYPE_MINUS_SIGN:
                 return "−";
-              case AffixUtils.TYPE_PLUS_SIGN:
+            case AffixUtils.TYPE_PLUS_SIGN:
                 return "\u061C+";
-              case AffixUtils.TYPE_PERCENT:
+            case AffixUtils.TYPE_PERCENT:
                 return "٪\u061C";
-              case AffixUtils.TYPE_PERMILLE:
+            case AffixUtils.TYPE_PERMILLE:
                 return "؉";
-              case AffixUtils.TYPE_CURRENCY_SINGLE:
+            case AffixUtils.TYPE_CURRENCY_SINGLE:
                 return "$";
-              case AffixUtils.TYPE_CURRENCY_DOUBLE:
+            case AffixUtils.TYPE_CURRENCY_DOUBLE:
                 return "XXX";
-              case AffixUtils.TYPE_CURRENCY_TRIPLE:
+            case AffixUtils.TYPE_CURRENCY_TRIPLE:
                 return "long name";
-              case AffixUtils.TYPE_CURRENCY_QUAD:
+            case AffixUtils.TYPE_CURRENCY_QUAD:
                 return "\uFFFD";
-              case AffixUtils.TYPE_CURRENCY_QUINT:
+            case AffixUtils.TYPE_CURRENCY_QUINT:
                 return "@";
-              case AffixUtils.TYPE_CURRENCY_OVERFLOW:
+            case AffixUtils.TYPE_CURRENCY_OVERFLOW:
                 return "\uFFFD";
-              default:
+            default:
                 throw new AssertionError();
             }
-          }
+        }
+    };
+
+    @Test
+    public void testEscape() {
+        Object[][] cases = {
+                { "", "" },
+                { "abc", "abc" },
+                { "-", "'-'" },
+                { "-!", "'-'!" },
+                { "−", "−" },
+                { "---", "'---'" },
+                { "-%-", "'-%-'" },
+                { "'", "''" },
+                { "-'", "'-'''" },
+                { "-'-", "'-''-'" },
+                { "a-'-", "a'-''-'" } };
+
+        StringBuilder sb = new StringBuilder();
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            String expected = (String) cas[1];
+            sb.setLength(0);
+            AffixUtils.escape(input, sb);
+            assertEquals(expected, sb.toString());
+        }
+    }
+
+    @Test
+    public void testUnescape() {
+        Object[][] cases = {
+                { "", false, 0, "" },
+                { "abc", false, 3, "abc" },
+                { "📺", false, 1, "📺" },
+                { "-", false, 1, "−" },
+                { "-!", false, 2, "−!" },
+                { "+", false, 1, "\u061C+" },
+                { "+!", false, 2, "\u061C+!" },
+                { "‰", false, 1, "؉" },
+                { "‰!", false, 2, "؉!" },
+                { "-x", false, 2, "−x" },
+                { "'-'x", false, 2, "-x" },
+                { "'--''-'-x", false, 6, "--'-−x" },
+                { "''", false, 1, "'" },
+                { "''''", false, 2, "''" },
+                { "''''''", false, 3, "'''" },
+                { "''x''", false, 3, "'x'" },
+                { "¤", true, 1, "$" },
+                { "¤¤", true, 2, "XXX" },
+                { "¤¤¤", true, 3, "long name" },
+                { "¤¤¤¤", true, 4, "\uFFFD" },
+                { "¤¤¤¤¤", true, 5, "@" },
+                { "¤¤¤¤¤¤", true, 6, "\uFFFD" },
+                { "¤¤¤a¤¤¤¤", true, 8, "long namea\uFFFD" },
+                { "a¤¤¤¤b¤¤¤¤¤c", true, 12, "a\uFFFDb@c" },
+                { "¤!", true, 2, "$!" },
+                { "¤¤!", true, 3, "XXX!" },
+                { "¤¤¤!", true, 4, "long name!" },
+                { "-¤¤", true, 3, "−XXX" },
+                { "¤¤-", true, 3, "XXX−" },
+                { "'¤'", false, 1, "¤" },
+                { "%", false, 1, "٪\u061C" },
+                { "'%'", false, 1, "%" },
+                { "¤'-'%", true, 3, "$-٪\u061C" },
+                { "#0#@#*#;#", false, 9, "#0#@#*#;#" } };
+
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            boolean curr = (Boolean) cas[1];
+            int length = (Integer) cas[2];
+            String output = (String) cas[3];
+
+            assertEquals("Currency on <" + input + ">", curr, AffixUtils.hasCurrencySymbols(input));
+            assertEquals("Length on <" + input + ">", length, AffixUtils.estimateLength(input));
+
+            String actual = unescapeWithDefaults(input);
+            assertEquals("Output on <" + input + ">", output, actual);
+
+            int ulength = AffixUtils.unescapedCount(input, true, DEFAULT_SYMBOL_PROVIDER);
+            assertEquals("Unescaped length on <" + input + ">", output.length(), ulength);
+
+            int ucpcount = AffixUtils.unescapedCount(input, false, DEFAULT_SYMBOL_PROVIDER);
+            assertEquals("Unescaped length on <" + input + ">",
+                    output.codePointCount(0, output.length()),
+                    ucpcount);
+        }
+    }
+
+    @Test
+    public void testContainsReplaceType() {
+        Object[][] cases = {
+                { "", false, "" },
+                { "-", true, "+" },
+                { "-a", true, "+a" },
+                { "a-", true, "a+" },
+                { "a-b", true, "a+b" },
+                { "--", true, "++" },
+                { "x", false, "x" } };
+
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            boolean hasMinusSign = (Boolean) cas[1];
+            String output = (String) cas[2];
+
+            assertEquals("Contains on input " + input,
+                    hasMinusSign,
+                    AffixUtils.containsType(input, AffixUtils.TYPE_MINUS_SIGN));
+            assertEquals("Replace on input" + input,
+                    output,
+                    AffixUtils.replaceType(input, AffixUtils.TYPE_MINUS_SIGN, '+'));
+        }
+    }
+
+    @Test
+    public void testInvalid() {
+        String[] invalidExamples = { "'", "x'", "'x", "'x''", "''x'" };
+
+        for (String str : invalidExamples) {
+            try {
+                AffixUtils.hasCurrencySymbols(str);
+                fail("No exception was thrown on an invalid string");
+            } catch (IllegalArgumentException e) {
+                // OK
+            }
+            try {
+                AffixUtils.estimateLength(str);
+                fail("No exception was thrown on an invalid string");
+            } catch (IllegalArgumentException e) {
+                // OK
+            }
+            try {
+                unescapeWithDefaults(str);
+                fail("No exception was thrown on an invalid string");
+            } catch (IllegalArgumentException e) {
+                // OK
+            }
+        }
+    }
+
+    @Test
+    public void testUnescapeWithSymbolProvider() {
+        String[][] cases = {
+                { "", "" },
+                { "-", "1" },
+                { "'-'", "-" },
+                { "- + % ‰ ¤ ¤¤ ¤¤¤ ¤¤¤¤ ¤¤¤¤¤", "1 2 3 4 5 6 7 8 9" },
+                { "'¤¤¤¤¤¤'", "¤¤¤¤¤¤" },
+                { "¤¤¤¤¤¤", "\uFFFD" } };
+
+        SymbolProvider provider = new SymbolProvider() {
+            @Override
+            public CharSequence getSymbol(int type) {
+                return Integer.toString(Math.abs(type));
+            }
         };
 
-  @Test
-  public void testEscape() {
-    Object[][] cases = {
-      {"", ""},
-      {"abc", "abc"},
-      {"-", "'-'"},
-      {"-!", "'-'!"},
-      {"−", "−"},
-      {"---", "'---'"},
-      {"-%-", "'-%-'"},
-      {"'", "''"},
-      {"-'", "'-'''"},
-      {"-'-", "'-''-'"},
-      {"a-'-", "a'-''-'"}
-    };
+        NumberStringBuilder sb = new NumberStringBuilder();
+        for (String[] cas : cases) {
+            String input = cas[0];
+            String expected = cas[1];
+            sb.clear();
+            AffixUtils.unescape(input, sb, 0, provider);
+            assertEquals("With symbol provider on <" + input + ">", expected, sb.toString());
+        }
 
-    StringBuilder sb = new StringBuilder();
-    for (Object[] cas : cases) {
-      String input = (String) cas[0];
-      String expected = (String) cas[1];
-      sb.setLength(0);
-      AffixUtils.escape(input, sb);
-      assertEquals(expected, sb.toString());
-    }
-  }
-
-  @Test
-  public void testUnescape() {
-    Object[][] cases = {
-      {"", false, 0, ""},
-      {"abc", false, 3, "abc"},
-      {"-", false, 1, "−"},
-      {"-!", false, 2, "−!"},
-      {"+", false, 1, "\u061C+"},
-      {"+!", false, 2, "\u061C+!"},
-      {"‰", false, 1, "؉"},
-      {"‰!", false, 2, "؉!"},
-      {"-x", false, 2, "−x"},
-      {"'-'x", false, 2, "-x"},
-      {"'--''-'-x", false, 6, "--'-−x"},
-      {"''", false, 1, "'"},
-      {"''''", false, 2, "''"},
-      {"''''''", false, 3, "'''"},
-      {"''x''", false, 3, "'x'"},
-      {"¤", true, 1, "$"},
-      {"¤¤", true, 2, "XXX"},
-      {"¤¤¤", true, 3, "long name"},
-      {"¤¤¤¤", true, 4, "\uFFFD"},
-      {"¤¤¤¤¤", true, 5, "@"},
-      {"¤¤¤¤¤¤", true, 6, "\uFFFD"},
-      {"¤¤¤a¤¤¤¤", true, 8, "long namea\uFFFD"},
-      {"a¤¤¤¤b¤¤¤¤¤c", true, 12, "a\uFFFDb@c"},
-      {"¤!", true, 2, "$!"},
-      {"¤¤!", true, 3, "XXX!"},
-      {"¤¤¤!", true, 4, "long name!"},
-      {"-¤¤", true, 3, "−XXX"},
-      {"¤¤-", true, 3, "XXX−"},
-      {"'¤'", false, 1, "¤"},
-      {"%", false, 1, "٪\u061C"},
-      {"'%'", false, 1, "%"},
-      {"¤'-'%", true, 3, "$-٪\u061C"},
-      {"#0#@#*#;#", false, 9, "#0#@#*#;#"}
-    };
-
-    for (Object[] cas : cases) {
-      String input = (String) cas[0];
-      boolean curr = (Boolean) cas[1];
-      int length = (Integer) cas[2];
-      String output = (String) cas[3];
-
-      assertEquals(
-          "Currency on <" + input + ">", curr, AffixUtils.hasCurrencySymbols(input));
-      assertEquals("Length on <" + input + ">", length, AffixUtils.estimateLength(input));
-
-      String actual = unescapeWithDefaults(input);
-      assertEquals("Output on <" + input + ">", output, actual);
-
-      int ulength = AffixUtils.unescapedCodePointCount(input, DEFAULT_SYMBOL_PROVIDER);
-      assertEquals("Unescaped length on <" + input + ">", output.length(), ulength);
-    }
-  }
-
-  @Test
-  public void testContainsReplaceType() {
-    Object[][] cases = {
-      {"", false, ""},
-      {"-", true, "+"},
-      {"-a", true, "+a"},
-      {"a-", true, "a+"},
-      {"a-b", true, "a+b"},
-      {"--", true, "++"},
-      {"x", false, "x"}
-    };
-
-    for (Object[] cas : cases) {
-      String input = (String) cas[0];
-      boolean hasMinusSign = (Boolean) cas[1];
-      String output = (String) cas[2];
-
-      assertEquals(
-          "Contains on input " + input,
-          hasMinusSign,
-          AffixUtils.containsType(input, AffixUtils.TYPE_MINUS_SIGN));
-      assertEquals(
-          "Replace on input" + input,
-          output,
-          AffixUtils.replaceType(input, AffixUtils.TYPE_MINUS_SIGN, '+'));
-    }
-  }
-
-  @Test
-  public void testInvalid() {
-    String[] invalidExamples = {"'", "x'", "'x", "'x''", "''x'"};
-
-    for (String str : invalidExamples) {
-      try {
-        AffixUtils.hasCurrencySymbols(str);
-        fail("No exception was thrown on an invalid string");
-      } catch (IllegalArgumentException e) {
-        // OK
-      }
-      try {
-        AffixUtils.estimateLength(str);
-        fail("No exception was thrown on an invalid string");
-      } catch (IllegalArgumentException e) {
-        // OK
-      }
-      try {
-        unescapeWithDefaults(str);
-        fail("No exception was thrown on an invalid string");
-      } catch (IllegalArgumentException e) {
-        // OK
-      }
-    }
-  }
-
-  @Test
-  public void testUnescapeWithSymbolProvider() {
-    String[][] cases = {
-      {"", ""},
-      {"-", "1"},
-      {"'-'", "-"},
-      {"- + % ‰ ¤ ¤¤ ¤¤¤ ¤¤¤¤ ¤¤¤¤¤", "1 2 3 4 5 6 7 8 9"},
-      {"'¤¤¤¤¤¤'", "¤¤¤¤¤¤"},
-      {"¤¤¤¤¤¤", "\uFFFD"}
-    };
-
-    SymbolProvider provider =
-        new SymbolProvider() {
-          @Override
-          public CharSequence getSymbol(int type) {
-            return Integer.toString(Math.abs(type));
-          }
-        };
-
-    NumberStringBuilder sb = new NumberStringBuilder();
-    for (String[] cas : cases) {
-      String input = cas[0];
-      String expected = cas[1];
-      sb.clear();
-      AffixUtils.unescape(input, sb, 0, provider);
-      assertEquals("With symbol provider on <" + input + ">", expected, sb.toString());
+        // Test insertion position
+        sb.clear();
+        sb.append("abcdefg", null);
+        AffixUtils.unescape("-+%", sb, 4, provider);
+        assertEquals("Symbol provider into middle", "abcd123efg", sb.toString());
     }
 
-    // Test insertion position
-    sb.clear();
-    sb.append("abcdefg", null);
-    AffixUtils.unescape("-+%", sb, 4, provider);
-    assertEquals("Symbol provider into middle", "abcd123efg", sb.toString());
-  }
+    @Test
+    public void testWithoutSymbolsOrIgnorables() {
+        Object[][] cases = {
+                { "", true },
+                { "-", true },
+                { " ", true },
+                { "'-'", false },
+                { " a + b ", false },
+                { "-a+b%c‰d¤e¤¤f¤¤¤g¤¤¤¤h¤¤¤¤¤i", false }, };
 
-  private static String unescapeWithDefaults(String input) {
-    NumberStringBuilder nsb = new NumberStringBuilder();
-    int length = AffixUtils.unescape(input, nsb, 0, DEFAULT_SYMBOL_PROVIDER);
-    assertEquals("Return value of unescape", nsb.length(), length);
-    return nsb.toString();
-  }
+        UnicodeSet ignorables = new UnicodeSet("[:whitespace:]");
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            boolean expected = (Boolean) cas[1];
+            assertEquals("Contains only symbols and ignorables: " + input,
+                    expected,
+                    AffixUtils.containsOnlySymbolsAndIgnorables(input, ignorables));
+        }
+    }
+
+    private static String unescapeWithDefaults(String input) {
+        NumberStringBuilder nsb = new NumberStringBuilder();
+        int length = AffixUtils.unescape(input, nsb, 0, DEFAULT_SYMBOL_PROVIDER);
+        assertEquals("Return value of unescape", nsb.length(), length);
+        return nsb.toString();
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/number/DecimalQuantityTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/number/DecimalQuantityTest.java
index ab4255d..e58e59e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/number/DecimalQuantityTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/number/DecimalQuantityTest.java
@@ -4,6 +4,7 @@
 package android.icu.dev.test.number;
 
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.math.MathContext;
 import java.math.RoundingMode;
 import java.text.ParseException;
@@ -16,13 +17,13 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
+import android.icu.dev.impl.number.DecimalQuantity_64BitBCD;
+import android.icu.dev.impl.number.DecimalQuantity_ByteArrayBCD;
+import android.icu.dev.impl.number.DecimalQuantity_SimpleStorage;
 import android.icu.dev.test.TestFmwk;
 import android.icu.impl.number.DecimalFormatProperties;
 import android.icu.impl.number.DecimalQuantity;
-import android.icu.impl.number.DecimalQuantity_64BitBCD;
-import android.icu.impl.number.DecimalQuantity_ByteArrayBCD;
 import android.icu.impl.number.DecimalQuantity_DualStorageBCD;
-import android.icu.impl.number.DecimalQuantity_SimpleStorage;
 import android.icu.number.LocalizedNumberFormatter;
 import android.icu.number.NumberFormatter;
 import android.icu.text.CompactDecimalFormat.CompactStyle;
@@ -34,490 +35,556 @@
 @RunWith(JUnit4.class)
 public class DecimalQuantityTest extends TestFmwk {
 
-  @Ignore
-  @Test
-  public void testBehavior() throws ParseException {
+    @Ignore
+    @Test
+    public void testBehavior() throws ParseException {
 
-    // Make a list of several formatters to test the behavior of DecimalQuantity.
-    List<LocalizedNumberFormatter> formats = new ArrayList<LocalizedNumberFormatter>();
+        // Make a list of several formatters to test the behavior of DecimalQuantity.
+        List<LocalizedNumberFormatter> formats = new ArrayList<LocalizedNumberFormatter>();
 
-    DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
 
-    DecimalFormatProperties properties = new DecimalFormatProperties();
-    formats.add(NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
+        DecimalFormatProperties properties = new DecimalFormatProperties();
+        formats.add(
+                NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
 
-    properties =
-        new DecimalFormatProperties()
-            .setMinimumSignificantDigits(3)
-            .setMaximumSignificantDigits(3)
-            .setCompactStyle(CompactStyle.LONG);
-    formats.add(NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
+        properties = new DecimalFormatProperties().setMinimumSignificantDigits(3)
+                .setMaximumSignificantDigits(3).setCompactStyle(CompactStyle.LONG);
+        formats.add(
+                NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
 
-    properties =
-        new DecimalFormatProperties()
-            .setMinimumExponentDigits(1)
-            .setMaximumIntegerDigits(3)
-            .setMaximumFractionDigits(1);
-    formats.add(NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
+        properties = new DecimalFormatProperties().setMinimumExponentDigits(1).setMaximumIntegerDigits(3)
+                .setMaximumFractionDigits(1);
+        formats.add(
+                NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
 
-    properties = new DecimalFormatProperties().setRoundingIncrement(new BigDecimal("0.5"));
-    formats.add(NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
+        properties = new DecimalFormatProperties().setRoundingIncrement(new BigDecimal("0.5"));
+        formats.add(
+                NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
 
-    String[] cases = {
-      "1.0",
-      "2.01",
-      "1234.56",
-      "3000.0",
-      "0.00026418",
-      "0.01789261",
-      "468160.0",
-      "999000.0",
-      "999900.0",
-      "999990.0",
-      "0.0",
-      "12345678901.0",
-      "-5193.48",
-    };
+        String[] cases = {
+                "1.0",
+                "2.01",
+                "1234.56",
+                "3000.0",
+                "0.00026418",
+                "0.01789261",
+                "468160.0",
+                "999000.0",
+                "999900.0",
+                "999990.0",
+                "0.0",
+                "12345678901.0",
+                "-5193.48", };
 
-    String[] hardCases = {
-      "9999999999999900.0",
-      "789000000000000000000000.0",
-      "789123123567853156372158.0",
-      "987654321987654321987654321987654321987654311987654321.0",
-    };
+        String[] hardCases = {
+                "9999999999999900.0",
+                "789000000000000000000000.0",
+                "789123123567853156372158.0",
+                "987654321987654321987654321987654321987654311987654321.0", };
 
-    String[] doubleCases = {
-      "512.0000000000017",
-      "4095.9999999999977",
-      "4095.999999999998",
-      "4095.9999999999986",
-      "4095.999999999999",
-      "4095.9999999999995",
-      "4096.000000000001",
-      "4096.000000000002",
-      "4096.000000000003",
-      "4096.000000000004",
-      "4096.000000000005",
-      "4096.0000000000055",
-      "4096.000000000006",
-      "4096.000000000007",
-    };
+        String[] doubleCases = {
+                "512.0000000000017",
+                "4095.9999999999977",
+                "4095.999999999998",
+                "4095.9999999999986",
+                "4095.999999999999",
+                "4095.9999999999995",
+                "4096.000000000001",
+                "4096.000000000002",
+                "4096.000000000003",
+                "4096.000000000004",
+                "4096.000000000005",
+                "4096.0000000000055",
+                "4096.000000000006",
+                "4096.000000000007", };
 
-    int i = 0;
-    for (String str : cases) {
-      testDecimalQuantity(i++, str, formats, 0);
+        int i = 0;
+        for (String str : cases) {
+            testDecimalQuantity(i++, str, formats, 0);
+        }
+
+        i = 0;
+        for (String str : hardCases) {
+            testDecimalQuantity(i++, str, formats, 1);
+        }
+
+        i = 0;
+        for (String str : doubleCases) {
+            testDecimalQuantity(i++, str, formats, 2);
+        }
     }
 
-    i = 0;
-    for (String str : hardCases) {
-      testDecimalQuantity(i++, str, formats, 1);
+    static void testDecimalQuantity(
+            int t,
+            String str,
+            List<LocalizedNumberFormatter> formats,
+            int mode) {
+        if (mode == 2) {
+            assertEquals("Double is not valid", Double.toString(Double.parseDouble(str)), str);
+        }
+
+        List<DecimalQuantity> qs = new ArrayList<DecimalQuantity>();
+        BigDecimal d = new BigDecimal(str);
+        qs.add(new DecimalQuantity_SimpleStorage(d));
+        if (mode == 0)
+            qs.add(new DecimalQuantity_64BitBCD(d));
+        qs.add(new DecimalQuantity_ByteArrayBCD(d));
+        qs.add(new DecimalQuantity_DualStorageBCD(d));
+
+        if (new BigDecimal(Double.toString(d.doubleValue())).compareTo(d) == 0) {
+            double dv = d.doubleValue();
+            qs.add(new DecimalQuantity_SimpleStorage(dv));
+            if (mode == 0)
+                qs.add(new DecimalQuantity_64BitBCD(dv));
+            qs.add(new DecimalQuantity_ByteArrayBCD(dv));
+            qs.add(new DecimalQuantity_DualStorageBCD(dv));
+        }
+
+        if (new BigDecimal(Long.toString(d.longValue())).compareTo(d) == 0) {
+            double lv = d.longValue();
+            qs.add(new DecimalQuantity_SimpleStorage(lv));
+            if (mode == 0)
+                qs.add(new DecimalQuantity_64BitBCD(lv));
+            qs.add(new DecimalQuantity_ByteArrayBCD(lv));
+            qs.add(new DecimalQuantity_DualStorageBCD(lv));
+        }
+
+        testDecimalQuantityExpectedOutput(qs.get(0), str);
+
+        if (qs.size() == 1) {
+            return;
+        }
+
+        for (int i = 1; i < qs.size(); i++) {
+            DecimalQuantity q0 = qs.get(0);
+            DecimalQuantity q1 = qs.get(i);
+            testDecimalQuantityExpectedOutput(q1, str);
+            testDecimalQuantityRounding(q0, q1);
+            testDecimalQuantityRoundingInterval(q0, q1);
+            testDecimalQuantityMath(q0, q1);
+            testDecimalQuantityWithFormats(q0, q1, formats);
+        }
     }
 
-    i = 0;
-    for (String str : doubleCases) {
-      testDecimalQuantity(i++, str, formats, 2);
-    }
-  }
-
-  static void testDecimalQuantity(int t, String str, List<LocalizedNumberFormatter> formats, int mode) {
-    if (mode == 2) {
-      assertEquals("Double is not valid", Double.toString(Double.parseDouble(str)), str);
+    private static void testDecimalQuantityExpectedOutput(DecimalQuantity rq, String expected) {
+        DecimalQuantity q0 = rq.createCopy();
+        // Force an accurate double
+        q0.roundToInfinity();
+        q0.setIntegerLength(1, Integer.MAX_VALUE);
+        q0.setFractionLength(1, Integer.MAX_VALUE);
+        String actual = q0.toPlainString();
+        assertEquals("Unexpected output from simple string conversion (" + q0 + ")", expected, actual);
     }
 
-    List<DecimalQuantity> qs = new ArrayList<DecimalQuantity>();
-    BigDecimal d = new BigDecimal(str);
-    qs.add(new DecimalQuantity_SimpleStorage(d));
-    if (mode == 0) qs.add(new DecimalQuantity_64BitBCD(d));
-    qs.add(new DecimalQuantity_ByteArrayBCD(d));
-    qs.add(new DecimalQuantity_DualStorageBCD(d));
+    private static final MathContext MATH_CONTEXT_HALF_EVEN = new MathContext(0, RoundingMode.HALF_EVEN);
+    private static final MathContext MATH_CONTEXT_CEILING = new MathContext(0, RoundingMode.CEILING);
+    @SuppressWarnings("unused")
+    private static final MathContext MATH_CONTEXT_FLOOR = new MathContext(0, RoundingMode.FLOOR);
+    private static final MathContext MATH_CONTEXT_PRECISION = new MathContext(3, RoundingMode.HALF_UP);
 
-    if (new BigDecimal(Double.toString(d.doubleValue())).compareTo(d) == 0) {
-      double dv = d.doubleValue();
-      qs.add(new DecimalQuantity_SimpleStorage(dv));
-      if (mode == 0) qs.add(new DecimalQuantity_64BitBCD(dv));
-      qs.add(new DecimalQuantity_ByteArrayBCD(dv));
-      qs.add(new DecimalQuantity_DualStorageBCD(dv));
+    private static void testDecimalQuantityRounding(DecimalQuantity rq0, DecimalQuantity rq1) {
+        DecimalQuantity q0 = rq0.createCopy();
+        DecimalQuantity q1 = rq1.createCopy();
+        q0.roundToMagnitude(-1, MATH_CONTEXT_HALF_EVEN);
+        q1.roundToMagnitude(-1, MATH_CONTEXT_HALF_EVEN);
+        testDecimalQuantityBehavior(q0, q1);
+
+        q0 = rq0.createCopy();
+        q1 = rq1.createCopy();
+        q0.roundToMagnitude(-1, MATH_CONTEXT_CEILING);
+        q1.roundToMagnitude(-1, MATH_CONTEXT_CEILING);
+        testDecimalQuantityBehavior(q0, q1);
+
+        q0 = rq0.createCopy();
+        q1 = rq1.createCopy();
+        q0.roundToMagnitude(-1, MATH_CONTEXT_PRECISION);
+        q1.roundToMagnitude(-1, MATH_CONTEXT_PRECISION);
+        testDecimalQuantityBehavior(q0, q1);
     }
 
-    if (new BigDecimal(Long.toString(d.longValue())).compareTo(d) == 0) {
-      double lv = d.longValue();
-      qs.add(new DecimalQuantity_SimpleStorage(lv));
-      if (mode == 0) qs.add(new DecimalQuantity_64BitBCD(lv));
-      qs.add(new DecimalQuantity_ByteArrayBCD(lv));
-      qs.add(new DecimalQuantity_DualStorageBCD(lv));
+    private static void testDecimalQuantityRoundingInterval(DecimalQuantity rq0, DecimalQuantity rq1) {
+        DecimalQuantity q0 = rq0.createCopy();
+        DecimalQuantity q1 = rq1.createCopy();
+        q0.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_HALF_EVEN);
+        q1.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_HALF_EVEN);
+        testDecimalQuantityBehavior(q0, q1);
+
+        q0 = rq0.createCopy();
+        q1 = rq1.createCopy();
+        q0.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_CEILING);
+        q1.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_CEILING);
+        testDecimalQuantityBehavior(q0, q1);
     }
 
-    testDecimalQuantityExpectedOutput(qs.get(0), str);
+    private static void testDecimalQuantityMath(DecimalQuantity rq0, DecimalQuantity rq1) {
+        DecimalQuantity q0 = rq0.createCopy();
+        DecimalQuantity q1 = rq1.createCopy();
+        q0.adjustMagnitude(-3);
+        q1.adjustMagnitude(-3);
+        testDecimalQuantityBehavior(q0, q1);
 
-    if (qs.size() == 1) {
-      return;
+        q0 = rq0.createCopy();
+        q1 = rq1.createCopy();
+        q0.multiplyBy(new BigDecimal("3.14159"));
+        q1.multiplyBy(new BigDecimal("3.14159"));
+        testDecimalQuantityBehavior(q0, q1);
     }
 
-    for (int i = 1; i < qs.size(); i++) {
-      DecimalQuantity q0 = qs.get(0);
-      DecimalQuantity q1 = qs.get(i);
-      testDecimalQuantityExpectedOutput(q1, str);
-      testDecimalQuantityRounding(q0, q1);
-      testDecimalQuantityRoundingInterval(q0, q1);
-      testDecimalQuantityMath(q0, q1);
-      testDecimalQuantityWithFormats(q0, q1, formats);
-    }
-  }
-
-  private static void testDecimalQuantityExpectedOutput(DecimalQuantity rq, String expected) {
-    DecimalQuantity q0 = rq.createCopy();
-    // Force an accurate double
-    q0.roundToInfinity();
-    q0.setIntegerLength(1, Integer.MAX_VALUE);
-    q0.setFractionLength(1, Integer.MAX_VALUE);
-    String actual = q0.toPlainString();
-    assertEquals("Unexpected output from simple string conversion (" + q0 + ")", expected, actual);
-  }
-
-  private static final MathContext MATH_CONTEXT_HALF_EVEN =
-      new MathContext(0, RoundingMode.HALF_EVEN);
-  private static final MathContext MATH_CONTEXT_CEILING = new MathContext(0, RoundingMode.CEILING);
-  private static final MathContext MATH_CONTEXT_PRECISION =
-      new MathContext(3, RoundingMode.HALF_UP);
-
-  private static void testDecimalQuantityRounding(DecimalQuantity rq0, DecimalQuantity rq1) {
-    DecimalQuantity q0 = rq0.createCopy();
-    DecimalQuantity q1 = rq1.createCopy();
-    q0.roundToMagnitude(-1, MATH_CONTEXT_HALF_EVEN);
-    q1.roundToMagnitude(-1, MATH_CONTEXT_HALF_EVEN);
-    testDecimalQuantityBehavior(q0, q1);
-
-    q0 = rq0.createCopy();
-    q1 = rq1.createCopy();
-    q0.roundToMagnitude(-1, MATH_CONTEXT_CEILING);
-    q1.roundToMagnitude(-1, MATH_CONTEXT_CEILING);
-    testDecimalQuantityBehavior(q0, q1);
-
-    q0 = rq0.createCopy();
-    q1 = rq1.createCopy();
-    q0.roundToMagnitude(-1, MATH_CONTEXT_PRECISION);
-    q1.roundToMagnitude(-1, MATH_CONTEXT_PRECISION);
-    testDecimalQuantityBehavior(q0, q1);
-  }
-
-  private static void testDecimalQuantityRoundingInterval(DecimalQuantity rq0, DecimalQuantity rq1) {
-    DecimalQuantity q0 = rq0.createCopy();
-    DecimalQuantity q1 = rq1.createCopy();
-    q0.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_HALF_EVEN);
-    q1.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_HALF_EVEN);
-    testDecimalQuantityBehavior(q0, q1);
-
-    q0 = rq0.createCopy();
-    q1 = rq1.createCopy();
-    q0.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_CEILING);
-    q1.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_CEILING);
-    testDecimalQuantityBehavior(q0, q1);
-  }
-
-  private static void testDecimalQuantityMath(DecimalQuantity rq0, DecimalQuantity rq1) {
-    DecimalQuantity q0 = rq0.createCopy();
-    DecimalQuantity q1 = rq1.createCopy();
-    q0.adjustMagnitude(-3);
-    q1.adjustMagnitude(-3);
-    testDecimalQuantityBehavior(q0, q1);
-
-    q0 = rq0.createCopy();
-    q1 = rq1.createCopy();
-    q0.multiplyBy(new BigDecimal("3.14159"));
-    q1.multiplyBy(new BigDecimal("3.14159"));
-    testDecimalQuantityBehavior(q0, q1);
-  }
-
-  private static void testDecimalQuantityWithFormats(
-      DecimalQuantity rq0, DecimalQuantity rq1, List<LocalizedNumberFormatter> formats) {
-    for (LocalizedNumberFormatter format : formats) {
-      DecimalQuantity q0 = rq0.createCopy();
-      DecimalQuantity q1 = rq1.createCopy();
-      String s1 = format.format(q0).toString();
-      String s2 = format.format(q1).toString();
-      assertEquals("Different output from formatter (" + q0 + ", " + q1 + ")", s1, s2);
-    }
-  }
-
-  private static void testDecimalQuantityBehavior(DecimalQuantity rq0, DecimalQuantity rq1) {
-    DecimalQuantity q0 = rq0.createCopy();
-    DecimalQuantity q1 = rq1.createCopy();
-
-    assertEquals("Different sign (" + q0 + ", " + q1 + ")", q0.isNegative(), q1.isNegative());
-
-    assertEquals(
-        "Different fingerprint (" + q0 + ", " + q1 + ")",
-        q0.getPositionFingerprint(),
-        q1.getPositionFingerprint());
-
-    assertDoubleEquals(
-        "Different double values (" + q0 + ", " + q1 + ")", q0.toDouble(), q1.toDouble());
-
-    assertBigDecimalEquals(
-        "Different BigDecimal values (" + q0 + ", " + q1 + ")",
-        q0.toBigDecimal(),
-        q1.toBigDecimal());
-
-    q0.roundToInfinity();
-    q1.roundToInfinity();
-
-    assertEquals(
-        "Different lower display magnitude",
-        q0.getLowerDisplayMagnitude(),
-        q1.getLowerDisplayMagnitude());
-    assertEquals(
-        "Different upper display magnitude",
-        q0.getUpperDisplayMagnitude(),
-        q1.getUpperDisplayMagnitude());
-
-    for (int m = q0.getUpperDisplayMagnitude(); m >= q0.getLowerDisplayMagnitude(); m--) {
-      assertEquals(
-          "Different digit at magnitude " + m + " (" + q0 + ", " + q1 + ")",
-          q0.getDigit(m),
-          q1.getDigit(m));
+    private static void testDecimalQuantityWithFormats(
+            DecimalQuantity rq0,
+            DecimalQuantity rq1,
+            List<LocalizedNumberFormatter> formats) {
+        for (LocalizedNumberFormatter format : formats) {
+            DecimalQuantity q0 = rq0.createCopy();
+            DecimalQuantity q1 = rq1.createCopy();
+            String s1 = format.format(q0).toString();
+            String s2 = format.format(q1).toString();
+            assertEquals("Different output from formatter (" + q0 + ", " + q1 + ")", s1, s2);
+        }
     }
 
-    if (rq0 instanceof DecimalQuantity_DualStorageBCD) {
-      String message = ((DecimalQuantity_DualStorageBCD) rq0).checkHealth();
-      if (message != null) errln(message);
-    }
-    if (rq1 instanceof DecimalQuantity_DualStorageBCD) {
-      String message = ((DecimalQuantity_DualStorageBCD) rq1).checkHealth();
-      if (message != null) errln(message);
-    }
-  }
+    private static void testDecimalQuantityBehavior(DecimalQuantity rq0, DecimalQuantity rq1) {
+        DecimalQuantity q0 = rq0.createCopy();
+        DecimalQuantity q1 = rq1.createCopy();
 
-  @Test
-  public void testSwitchStorage() {
-    DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
+        assertEquals("Different sign (" + q0 + ", " + q1 + ")", q0.isNegative(), q1.isNegative());
 
-    fq.setToLong(1234123412341234L);
-    assertFalse("Should not be using byte array", fq.isUsingBytes());
-    assertEquals("Failed on initialize", "1234123412341234E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    // Long -> Bytes
-    fq.appendDigit((byte) 5, 0, true);
-    assertTrue("Should be using byte array", fq.isUsingBytes());
-    assertEquals("Failed on multiply", "12341234123412345E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    // Bytes -> Long
-    fq.roundToMagnitude(5, MATH_CONTEXT_HALF_EVEN);
-    assertFalse("Should not be using byte array", fq.isUsingBytes());
-    assertEquals("Failed on round", "123412341234E5", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-  }
+        assertEquals("Different fingerprint (" + q0 + ", " + q1 + ")",
+                q0.getPositionFingerprint(),
+                q1.getPositionFingerprint());
 
-  @Test
-  public void testAppend() {
-    DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
-    fq.appendDigit((byte) 1, 0, true);
-    assertEquals("Failed on append", "1E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 2, 0, true);
-    assertEquals("Failed on append", "12E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 3, 1, true);
-    assertEquals("Failed on append", "1203E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 0, 1, true);
-    assertEquals("Failed on append", "1203E2", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 4, 0, true);
-    assertEquals("Failed on append", "1203004E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 0, 0, true);
-    assertEquals("Failed on append", "1203004E1", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 5, 0, false);
-    assertEquals("Failed on append", "120300405E-1", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 6, 0, false);
-    assertEquals("Failed on append", "1203004056E-2", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 7, 3, false);
-    assertEquals("Failed on append", "12030040560007E-6", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    StringBuilder baseExpected = new StringBuilder("12030040560007");
-    for (int i = 0; i < 10; i++) {
-      fq.appendDigit((byte) 8, 0, false);
-      baseExpected.append('8');
-      StringBuilder expected = new StringBuilder(baseExpected);
-      expected.append("E");
-      expected.append(-7 - i);
-      assertEquals("Failed on append", expected.toString(), fq.toNumberString());
-      assertNull("Failed health check", fq.checkHealth());
-    }
-    fq.appendDigit((byte) 9, 2, false);
-    baseExpected.append("009");
-    StringBuilder expected = new StringBuilder(baseExpected);
-    expected.append('E');
-    expected.append("-19");
-    assertEquals("Failed on append", expected.toString(), fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-  }
+        assertDoubleEquals("Different double values (" + q0 + ", " + q1 + ")",
+                q0.toDouble(),
+                q1.toDouble());
 
-  @Ignore
-  @Test
-  public void testConvertToAccurateDouble() {
-    // based on https://github.com/google/double-conversion/issues/28
-    double[] hardDoubles = {
-      1651087494906221570.0,
-      -5074790912492772E-327,
-      83602530019752571E-327,
-      2.207817077636718750000000000000,
-      1.818351745605468750000000000000,
-      3.941719055175781250000000000000,
-      3.738609313964843750000000000000,
-      3.967735290527343750000000000000,
-      1.328025817871093750000000000000,
-      3.920967102050781250000000000000,
-      1.015235900878906250000000000000,
-      1.335227966308593750000000000000,
-      1.344520568847656250000000000000,
-      2.879127502441406250000000000000,
-      3.695838928222656250000000000000,
-      1.845344543457031250000000000000,
-      3.793952941894531250000000000000,
-      3.211402893066406250000000000000,
-      2.565971374511718750000000000000,
-      0.965156555175781250000000000000,
-      2.700004577636718750000000000000,
-      0.767097473144531250000000000000,
-      1.780448913574218750000000000000,
-      2.624839782714843750000000000000,
-      1.305290222167968750000000000000,
-      3.834922790527343750000000000000,
-    };
+        assertBigDecimalEquals("Different BigDecimal values (" + q0 + ", " + q1 + ")",
+                q0.toBigDecimal(),
+                q1.toBigDecimal());
 
-    double[] integerDoubles = {
-      51423,
-      51423e10,
-      4.503599627370496E15,
-      6.789512076111555E15,
-      9.007199254740991E15,
-      9.007199254740992E15
-    };
+        q0.roundToInfinity();
+        q1.roundToInfinity();
 
-    for (double d : hardDoubles) {
-      checkDoubleBehavior(d, true, "");
+        assertEquals("Different lower display magnitude",
+                q0.getLowerDisplayMagnitude(),
+                q1.getLowerDisplayMagnitude());
+        assertEquals("Different upper display magnitude",
+                q0.getUpperDisplayMagnitude(),
+                q1.getUpperDisplayMagnitude());
+
+        for (int m = q0.getUpperDisplayMagnitude(); m >= q0.getLowerDisplayMagnitude(); m--) {
+            assertEquals("Different digit at magnitude " + m + " (" + q0 + ", " + q1 + ")",
+                    q0.getDigit(m),
+                    q1.getDigit(m));
+        }
+
+        if (rq0 instanceof DecimalQuantity_DualStorageBCD) {
+            String message = ((DecimalQuantity_DualStorageBCD) rq0).checkHealth();
+            if (message != null)
+                errln(message);
+        }
+        if (rq1 instanceof DecimalQuantity_DualStorageBCD) {
+            String message = ((DecimalQuantity_DualStorageBCD) rq1).checkHealth();
+            if (message != null)
+                errln(message);
+        }
     }
 
-    for (double d : integerDoubles) {
-      checkDoubleBehavior(d, false, "");
+    @Test
+    public void testSwitchStorage() {
+        DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
+
+        fq.setToLong(1234123412341234L);
+        assertFalse("Should not be using byte array", fq.isUsingBytes());
+        assertEquals("Failed on initialize", "1234123412341234E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        // Long -> Bytes
+        fq.appendDigit((byte) 5, 0, true);
+        assertTrue("Should be using byte array", fq.isUsingBytes());
+        assertEquals("Failed on multiply", "12341234123412345E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        // Bytes -> Long
+        fq.roundToMagnitude(5, MATH_CONTEXT_HALF_EVEN);
+        assertFalse("Should not be using byte array", fq.isUsingBytes());
+        assertEquals("Failed on round", "123412341234E5", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
     }
 
-    assertEquals("NaN check failed", Double.NaN, new DecimalQuantity_DualStorageBCD(Double.NaN).toDouble());
-    assertEquals(
-        "Inf check failed",
-        Double.POSITIVE_INFINITY,
-        new DecimalQuantity_DualStorageBCD(Double.POSITIVE_INFINITY).toDouble());
-    assertEquals(
-        "-Inf check failed",
-        Double.NEGATIVE_INFINITY,
-        new DecimalQuantity_DualStorageBCD(Double.NEGATIVE_INFINITY).toDouble());
-
-    // Generate random doubles
-    String alert = "UNEXPECTED FAILURE: PLEASE REPORT THIS MESSAGE TO THE ICU TEAM: ";
-    Random rnd = new Random();
-    for (int i = 0; i < 10000; i++) {
-      double d = Double.longBitsToDouble(rnd.nextLong());
-      if (Double.isNaN(d) || Double.isInfinite(d)) continue;
-      checkDoubleBehavior(d, false, alert);
+    @Test
+    public void testAppend() {
+        DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
+        fq.appendDigit((byte) 1, 0, true);
+        assertEquals("Failed on append", "1E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 2, 0, true);
+        assertEquals("Failed on append", "12E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 3, 1, true);
+        assertEquals("Failed on append", "1203E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 0, 1, true);
+        assertEquals("Failed on append", "1203E2", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 4, 0, true);
+        assertEquals("Failed on append", "1203004E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 0, 0, true);
+        assertEquals("Failed on append", "1203004E1", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 5, 0, false);
+        assertEquals("Failed on append", "120300405E-1", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 6, 0, false);
+        assertEquals("Failed on append", "1203004056E-2", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 7, 3, false);
+        assertEquals("Failed on append", "12030040560007E-6", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        StringBuilder baseExpected = new StringBuilder("12030040560007");
+        for (int i = 0; i < 10; i++) {
+            fq.appendDigit((byte) 8, 0, false);
+            baseExpected.append('8');
+            StringBuilder expected = new StringBuilder(baseExpected);
+            expected.append("E");
+            expected.append(-7 - i);
+            assertEquals("Failed on append", expected.toString(), fq.toNumberString());
+            assertNull("Failed health check", fq.checkHealth());
+        }
+        fq.appendDigit((byte) 9, 2, false);
+        baseExpected.append("009");
+        StringBuilder expected = new StringBuilder(baseExpected);
+        expected.append('E');
+        expected.append("-19");
+        assertEquals("Failed on append", expected.toString(), fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
     }
-  }
 
-  private static void checkDoubleBehavior(double d, boolean explicitRequired, String alert) {
-    DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD(d);
-    if (explicitRequired) {
-      assertTrue(alert + "Should be using approximate double", !fq.explicitExactDouble);
+    @Ignore
+    @Test
+    public void testConvertToAccurateDouble() {
+        // based on https://github.com/google/double-conversion/issues/28
+        double[] hardDoubles = {
+                1651087494906221570.0,
+                -5074790912492772E-327,
+                83602530019752571E-327,
+                2.207817077636718750000000000000,
+                1.818351745605468750000000000000,
+                3.941719055175781250000000000000,
+                3.738609313964843750000000000000,
+                3.967735290527343750000000000000,
+                1.328025817871093750000000000000,
+                3.920967102050781250000000000000,
+                1.015235900878906250000000000000,
+                1.335227966308593750000000000000,
+                1.344520568847656250000000000000,
+                2.879127502441406250000000000000,
+                3.695838928222656250000000000000,
+                1.845344543457031250000000000000,
+                3.793952941894531250000000000000,
+                3.211402893066406250000000000000,
+                2.565971374511718750000000000000,
+                0.965156555175781250000000000000,
+                2.700004577636718750000000000000,
+                0.767097473144531250000000000000,
+                1.780448913574218750000000000000,
+                2.624839782714843750000000000000,
+                1.305290222167968750000000000000,
+                3.834922790527343750000000000000, };
+
+        double[] integerDoubles = {
+                51423,
+                51423e10,
+                4.503599627370496E15,
+                6.789512076111555E15,
+                9.007199254740991E15,
+                9.007199254740992E15 };
+
+        for (double d : hardDoubles) {
+            checkDoubleBehavior(d, true, "");
+        }
+
+        for (double d : integerDoubles) {
+            checkDoubleBehavior(d, false, "");
+        }
+
+        assertEquals("NaN check failed",
+                Double.NaN,
+                new DecimalQuantity_DualStorageBCD(Double.NaN).toDouble());
+        assertEquals("Inf check failed",
+                Double.POSITIVE_INFINITY,
+                new DecimalQuantity_DualStorageBCD(Double.POSITIVE_INFINITY).toDouble());
+        assertEquals("-Inf check failed",
+                Double.NEGATIVE_INFINITY,
+                new DecimalQuantity_DualStorageBCD(Double.NEGATIVE_INFINITY).toDouble());
+
+        // Generate random doubles
+        String alert = "UNEXPECTED FAILURE: PLEASE REPORT THIS MESSAGE TO THE ICU TEAM: ";
+        Random rnd = new Random();
+        for (int i = 0; i < 10000; i++) {
+            double d = Double.longBitsToDouble(rnd.nextLong());
+            if (Double.isNaN(d) || Double.isInfinite(d))
+                continue;
+            checkDoubleBehavior(d, false, alert);
+        }
     }
-    assertEquals(alert + "Initial construction from hard double", d, fq.toDouble());
-    fq.roundToInfinity();
-    if (explicitRequired) {
-      assertTrue(alert + "Should not be using approximate double", fq.explicitExactDouble);
+
+    private static void checkDoubleBehavior(double d, boolean explicitRequired, String alert) {
+        DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD(d);
+        if (explicitRequired) {
+            assertTrue(alert + "Should be using approximate double", !fq.explicitExactDouble);
+        }
+        assertEquals(alert + "Initial construction from hard double", d, fq.toDouble());
+        fq.roundToInfinity();
+        if (explicitRequired) {
+            assertTrue(alert + "Should not be using approximate double", fq.explicitExactDouble);
+        }
+        assertDoubleEquals(alert + "After conversion to exact BCD (double)", d, fq.toDouble());
+        assertBigDecimalEquals(alert + "After conversion to exact BCD (BigDecimal)",
+                new BigDecimal(Double.toString(d)),
+                fq.toBigDecimal());
     }
-    assertDoubleEquals(alert + "After conversion to exact BCD (double)", d, fq.toDouble());
-    assertBigDecimalEquals(
-        alert + "After conversion to exact BCD (BigDecimal)",
-        new BigDecimal(Double.toString(d)),
-        fq.toBigDecimal());
-  }
 
-  @Test
-  public void testUseApproximateDoubleWhenAble() {
-    Object[][] cases = {
-      {1.2345678, 1, MATH_CONTEXT_HALF_EVEN, false},
-      {1.2345678, 7, MATH_CONTEXT_HALF_EVEN, false},
-      {1.2345678, 12, MATH_CONTEXT_HALF_EVEN, false},
-      {1.2345678, 13, MATH_CONTEXT_HALF_EVEN, true},
-      {1.235, 1, MATH_CONTEXT_HALF_EVEN, false},
-      {1.235, 2, MATH_CONTEXT_HALF_EVEN, true},
-      {1.235, 3, MATH_CONTEXT_HALF_EVEN, false},
-      {1.000000000000001, 0, MATH_CONTEXT_HALF_EVEN, false},
-      {1.000000000000001, 0, MATH_CONTEXT_CEILING, true},
-      {1.235, 1, MATH_CONTEXT_CEILING, false},
-      {1.235, 2, MATH_CONTEXT_CEILING, false},
-      {1.235, 3, MATH_CONTEXT_CEILING, true}
-    };
+    @Test
+    public void testUseApproximateDoubleWhenAble() {
+        Object[][] cases = {
+                { 1.2345678, 1, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.2345678, 7, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.2345678, 12, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.2345678, 13, MATH_CONTEXT_HALF_EVEN, true },
+                { 1.235, 1, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.235, 2, MATH_CONTEXT_HALF_EVEN, true },
+                { 1.235, 3, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.000000000000001, 0, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.000000000000001, 0, MATH_CONTEXT_CEILING, true },
+                { 1.235, 1, MATH_CONTEXT_CEILING, false },
+                { 1.235, 2, MATH_CONTEXT_CEILING, false },
+                { 1.235, 3, MATH_CONTEXT_CEILING, true } };
 
-    for (Object[] cas : cases) {
-      double d = (Double) cas[0];
-      int maxFrac = (Integer) cas[1];
-      MathContext mc = (MathContext) cas[2];
-      boolean usesExact = (Boolean) cas[3];
+        for (Object[] cas : cases) {
+            double d = (Double) cas[0];
+            int maxFrac = (Integer) cas[1];
+            MathContext mc = (MathContext) cas[2];
+            boolean usesExact = (Boolean) cas[3];
 
-      DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD(d);
-      assertTrue("Should be using approximate double", !fq.explicitExactDouble);
-      fq.roundToMagnitude(-maxFrac, mc);
-      assertEquals(
-          "Using approximate double after rounding: " + d + " maxFrac=" + maxFrac + " " + mc,
-          usesExact,
-          fq.explicitExactDouble);
+            DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD(d);
+            assertTrue("Should be using approximate double", !fq.explicitExactDouble);
+            fq.roundToMagnitude(-maxFrac, mc);
+            assertEquals(
+                    "Using approximate double after rounding: " + d + " maxFrac=" + maxFrac + " " + mc,
+                    usesExact,
+                    fq.explicitExactDouble);
+        }
     }
-  }
 
-  @Test
-  public void testDecimalQuantityBehaviorStandalone() {
-      DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
-      assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 0E0>");
-      fq.setToInt(51423);
-      assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 51423E0>");
-      fq.adjustMagnitude(-3);
-      assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 51423E-3>");
-      fq.setToLong(999999999999000L);
-      assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 999999999999E3>");
-      fq.setIntegerLength(2, 5);
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:0:-999 long 999999999999E3>");
-      fq.setFractionLength(3, 6);
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 999999999999E3>");
-      fq.setToDouble(987.654321);
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987654321E-6>");
-      fq.roundToInfinity();
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987654321E-6>");
-      fq.roundToIncrement(new BigDecimal("0.005"), MATH_CONTEXT_HALF_EVEN);
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987655E-3>");
-      fq.roundToMagnitude(-2, MATH_CONTEXT_HALF_EVEN);
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 98766E-2>");
-  }
+    @Test
+    public void testDecimalQuantityBehaviorStandalone() {
+        DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
+        assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 0E0>");
+        fq.setToInt(51423);
+        assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 51423E0>");
+        fq.adjustMagnitude(-3);
+        assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 51423E-3>");
+        fq.setToLong(999999999999000L);
+        assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 999999999999E3>");
+        fq.setIntegerLength(2, 5);
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:0:-999 long 999999999999E3>");
+        fq.setFractionLength(3, 6);
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 999999999999E3>");
+        fq.setToDouble(987.654321);
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987654321E-6>");
+        fq.roundToInfinity();
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987654321E-6>");
+        fq.roundToIncrement(new BigDecimal("0.005"), MATH_CONTEXT_HALF_EVEN);
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987655E-3>");
+        fq.roundToMagnitude(-2, MATH_CONTEXT_HALF_EVEN);
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 98766E-2>");
+    }
 
-  static void assertDoubleEquals(String message, double d1, double d2) {
-    boolean equal = (Math.abs(d1 - d2) < 1e-6) || (Math.abs((d1 - d2) / d1) < 1e-6);
-    handleAssert(equal, message, d1, d2, null, false);
-  }
+    @Test
+    public void testFitsInLong() {
+        DecimalQuantity_DualStorageBCD quantity = new DecimalQuantity_DualStorageBCD();
+        quantity.setToInt(0);
+        assertTrue("Zero should fit", quantity.fitsInLong());
+        quantity.setToInt(42);
+        assertTrue("Small int should fit", quantity.fitsInLong());
+        quantity.setToDouble(0.1);
+        assertFalse("Fraction should not fit", quantity.fitsInLong());
+        quantity.setToDouble(42.1);
+        assertFalse("Fraction should not fit", quantity.fitsInLong());
+        quantity.setToLong(1000000);
+        assertTrue("Large low-precision int should fit", quantity.fitsInLong());
+        quantity.setToLong(1000000000000000000L);
+        assertTrue("10^19 should fit", quantity.fitsInLong());
+        quantity.setToLong(1234567890123456789L);
+        assertTrue("A number between 10^19 and max long should fit", quantity.fitsInLong());
+        quantity.setToLong(1234567890000000000L);
+        assertTrue("A number with trailing zeros less than max long should fit", quantity.fitsInLong());
+        quantity.setToLong(9223372026854775808L);
+        assertTrue("A number less than max long but with similar digits should fit",
+                quantity.fitsInLong());
+        quantity.setToLong(9223372036854775806L);
+        assertTrue("One less than max long should fit", quantity.fitsInLong());
+        quantity.setToLong(9223372036854775807L);
+        assertTrue("Max long should fit", quantity.fitsInLong());
+        quantity.setToBigInteger(new BigInteger("9223372036854775808"));
+        assertFalse("One greater than max long long should not fit", quantity.fitsInLong());
+        quantity.setToBigInteger(new BigInteger("9223372046854775806"));
+        assertFalse("A number between max long and 10^20 should not fit", quantity.fitsInLong());
+        quantity.setToBigInteger(new BigInteger("9223372046800000000"));
+        assertFalse("A large 10^19 number with trailing zeros should not fit", quantity.fitsInLong());
+        quantity.setToBigInteger(new BigInteger("10000000000000000000"));
+        assertFalse("10^20 should not fit", quantity.fitsInLong());
+    }
 
-  static void assertBigDecimalEquals(String message, String d1, BigDecimal d2) {
-    assertBigDecimalEquals(message, new BigDecimal(d1), d2);
-  }
+    @Test
+    public void testHardDoubleConversion() {
+        // This test is somewhat duplicated from previous tests, but it is needed
+        // for ICU4C compatibility.
+        Object[][] cases = {
+                { 512.0000000000017, "512.0000000000017" },
+                { 4095.9999999999977, "4095.9999999999977" },
+                { 4095.999999999998, "4095.999999999998" },
+                { 4095.9999999999986, "4095.9999999999986" },
+                { 4095.999999999999, "4095.999999999999" },
+                { 4095.9999999999995, "4095.9999999999995" },
+                { 4096.000000000001, "4096.000000000001" },
+                { 4096.000000000002, "4096.000000000002" },
+                { 4096.000000000003, "4096.000000000003" },
+                { 4096.000000000004, "4096.000000000004" },
+                { 4096.000000000005, "4096.000000000005" },
+                { 4096.0000000000055, "4096.0000000000055" },
+                { 4096.000000000006, "4096.000000000006" },
+                { 4096.000000000007, "4096.000000000007" } };
 
-  static void assertBigDecimalEquals(String message, BigDecimal d1, BigDecimal d2) {
-    boolean equal = d1.compareTo(d2) == 0;
-    handleAssert(equal, message, d1, d2, null, false);
-  }
+        for (Object[] cas : cases) {
+            double input = (Double) cas[0];
+            String expectedOutput = (String) cas[1];
 
-  static void assertToStringAndHealth(DecimalQuantity_DualStorageBCD fq, String expected) {
-      String actual = fq.toString();
-      assertEquals("DecimalQuantity toString", expected, actual);
-      String health = fq.checkHealth();
-      assertNull("DecimalQuantity health", health);
-  }
+            DecimalQuantity q = new DecimalQuantity_DualStorageBCD(input);
+            q.roundToInfinity();
+            String actualOutput = q.toPlainString();
+            assertEquals("", expectedOutput, actualOutput);
+        }
+    }
+
+    static void assertDoubleEquals(String message, double d1, double d2) {
+        boolean equal = (Math.abs(d1 - d2) < 1e-6) || (Math.abs((d1 - d2) / d1) < 1e-6);
+        handleAssert(equal, message, d1, d2, null, false);
+    }
+
+    static void assertBigDecimalEquals(String message, String d1, BigDecimal d2) {
+        assertBigDecimalEquals(message, new BigDecimal(d1), d2);
+    }
+
+    static void assertBigDecimalEquals(String message, BigDecimal d1, BigDecimal d2) {
+        boolean equal = d1.compareTo(d2) == 0;
+        handleAssert(equal, message, d1, d2, null, false);
+    }
+
+    static void assertToStringAndHealth(DecimalQuantity_DualStorageBCD fq, String expected) {
+        String actual = fq.toString();
+        assertEquals("DecimalQuantity toString", expected, actual);
+        String health = fq.checkHealth();
+        assertNull("DecimalQuantity health", health);
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/number/ModifierTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/number/ModifierTest.java
index 388fb10..1c4d7d5 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/number/ModifierTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/number/ModifierTest.java
@@ -34,12 +34,12 @@
     public void testConstantMultiFieldModifier() {
         NumberStringBuilder prefix = new NumberStringBuilder();
         NumberStringBuilder suffix = new NumberStringBuilder();
-        Modifier mod1 = new ConstantMultiFieldModifier(prefix, suffix, true);
+        Modifier mod1 = new ConstantMultiFieldModifier(prefix, suffix, false, true);
         assertModifierEquals(mod1, 0, true, "|", "n");
 
         prefix.append("a📻", NumberFormat.Field.PERCENT);
         suffix.append("b", NumberFormat.Field.CURRENCY);
-        Modifier mod2 = new ConstantMultiFieldModifier(prefix, suffix, true);
+        Modifier mod2 = new ConstantMultiFieldModifier(prefix, suffix, false, true);
         assertModifierEquals(mod2, 3, true, "a📻|b", "%%%n$");
 
         // Make sure the first modifier is still the same (that it stayed constant)
@@ -49,11 +49,20 @@
     @Test
     public void testSimpleModifier() {
         String[] patterns = { "{0}", "X{0}Y", "XX{0}YYY", "{0}YY", "XX📺XX{0}" };
-        Object[][] outputs = { { "", 0, 0 }, { "a📻bcde", 0, 0 }, { "a📻bcde", 4, 4 }, { "a📻bcde", 3, 5 } };
+        Object[][] outputs = {
+                { "", 0, 0 },
+                { "a📻bcde", 0, 0 },
+                { "a📻bcde", 4, 4 },
+                { "a📻bcde", 3, 5 } };
         int[] prefixLens = { 0, 1, 2, 0, 6 };
-        String[][] expectedCharFields = { { "|", "n" }, { "X|Y", "%n%" }, { "XX|YYY", "%%n%%%" }, { "|YY", "n%%" },
+        String[][] expectedCharFields = {
+                { "|", "n" },
+                { "X|Y", "%n%" },
+                { "XX|YYY", "%%n%%%" },
+                { "|YY", "n%%" },
                 { "XX📺XX|", "%%%%%%n" } };
-        String[][] expecteds = { { "", "XY", "XXYYY", "YY", "XX📺XX" },
+        String[][] expecteds = {
+                { "", "XY", "XXYYY", "YY", "XX📺XX" },
                 { "a📻bcde", "XYa📻bcde", "XXYYYa📻bcde", "YYa📻bcde", "XX📺XXa📻bcde" },
                 { "a📻bcde", "a📻bXYcde", "a📻bXXYYYcde", "a📻bYYcde", "a📻bXX📺XXcde" },
                 { "a📻bcde", "a📻XbcYde", "a📻XXbcYYYde", "a📻bcYYde", "a📻XX📺XXbcde" } };
@@ -62,7 +71,11 @@
             String compiledPattern = SimpleFormatterImpl
                     .compileToStringMinMaxArguments(pattern, new StringBuilder(), 1, 1);
             Modifier mod = new SimpleModifier(compiledPattern, NumberFormat.Field.PERCENT, false);
-            assertModifierEquals(mod, prefixLens[i], false, expectedCharFields[i][0], expectedCharFields[i][1]);
+            assertModifierEquals(mod,
+                    prefixLens[i],
+                    false,
+                    expectedCharFields[i][0],
+                    expectedCharFields[i][1]);
 
             // Test strange insertion positions
             for (int j = 0; j < outputs.length; j++) {
@@ -81,11 +94,11 @@
         DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
         NumberStringBuilder prefix = new NumberStringBuilder();
         NumberStringBuilder suffix = new NumberStringBuilder();
-        Modifier mod1 = new CurrencySpacingEnabledModifier(prefix, suffix, true, symbols);
+        Modifier mod1 = new CurrencySpacingEnabledModifier(prefix, suffix, false, true, symbols);
         assertModifierEquals(mod1, 0, true, "|", "n");
 
         prefix.append("USD", NumberFormat.Field.CURRENCY);
-        Modifier mod2 = new CurrencySpacingEnabledModifier(prefix, suffix, true, symbols);
+        Modifier mod2 = new CurrencySpacingEnabledModifier(prefix, suffix, false, true, symbols);
         assertModifierEquals(mod2, 3, true, "USD|", "$$$n");
 
         // Test the default currency spacing rules
@@ -102,9 +115,11 @@
 
         // Test custom patterns
         // The following line means that the last char of the number should be a | (rather than a digit)
-        symbols.setPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH, true, "[|]");
+        symbols.setPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH,
+                true,
+                "[|]");
         suffix.append("XYZ", NumberFormat.Field.CURRENCY);
-        Modifier mod3 = new CurrencySpacingEnabledModifier(prefix, suffix, true, symbols);
+        Modifier mod3 = new CurrencySpacingEnabledModifier(prefix, suffix, false, true, symbols);
         assertModifierEquals(mod3, 3, true, "USD|\u00A0XYZ", "$$$nn$$$");
     }
 
@@ -115,18 +130,18 @@
         // If this test starts failing, please update the method #getUnicodeSet() in
         // BOTH CurrencySpacingEnabledModifier.java AND in C++.
         DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(new ULocale("en-US"));
-        assertEquals(
-                "[:^S:]",
-                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH, true));
-        assertEquals(
-                "[:^S:]",
-                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH, false));
-        assertEquals(
-                "[:digit:]",
-                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH, true));
-        assertEquals(
-                "[:digit:]",
-                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH, false));
+        assertEquals("[:^S:]",
+                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH,
+                        true));
+        assertEquals("[:^S:]",
+                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH,
+                        false));
+        assertEquals("[:digit:]",
+                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH,
+                        true));
+        assertEquals("[:digit:]",
+                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH,
+                        false));
     }
 
     private void assertModifierEquals(
@@ -137,7 +152,12 @@
             String expectedFields) {
         NumberStringBuilder sb = new NumberStringBuilder();
         sb.appendCodePoint('|', null);
-        assertModifierEquals(mod, sb, expectedPrefixLength, expectedStrong, expectedChars, expectedFields);
+        assertModifierEquals(mod,
+                sb,
+                expectedPrefixLength,
+                expectedStrong,
+                expectedChars,
+                expectedFields);
     }
 
     private void assertModifierEquals(
@@ -153,8 +173,10 @@
         assertEquals("Strong on " + sb, expectedStrong, mod.isStrong());
         if (!(mod instanceof CurrencySpacingEnabledModifier)) {
             assertEquals("Code point count equals actual code point count",
-                    sb.codePointCount() - oldCount, mod.getCodePointCount());
+                    sb.codePointCount() - oldCount,
+                    mod.getCodePointCount());
         }
-        assertEquals("<NumberStringBuilder [" + expectedChars + "] [" + expectedFields + "]>", sb.toDebugString());
+        assertEquals("<NumberStringBuilder [" + expectedChars + "] [" + expectedFields + "]>",
+                sb.toDebugString());
     }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/number/MutablePatternModifierTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/number/MutablePatternModifierTest.java
index 77f402f..be13297 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/number/MutablePatternModifierTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/number/MutablePatternModifierTest.java
@@ -30,19 +30,24 @@
         MutablePatternModifier mod = new MutablePatternModifier(false);
         mod.setPatternInfo(PatternStringParser.parseToPatternInfo("a0b"));
         mod.setPatternAttributes(SignDisplay.AUTO, false);
-        mod.setSymbols(
-                DecimalFormatSymbols.getInstance(ULocale.ENGLISH),
+        mod.setSymbols(DecimalFormatSymbols.getInstance(ULocale.ENGLISH),
                 Currency.getInstance("USD"),
                 UnitWidth.SHORT,
                 null);
 
-        mod.setNumberProperties(false, null);
+        mod.setNumberProperties(1, null);
         assertEquals("a", getPrefix(mod));
         assertEquals("b", getSuffix(mod));
         mod.setPatternAttributes(SignDisplay.ALWAYS, false);
         assertEquals("+a", getPrefix(mod));
         assertEquals("b", getSuffix(mod));
-        mod.setNumberProperties(true, null);
+        mod.setNumberProperties(0, null);
+        assertEquals("+a", getPrefix(mod));
+        assertEquals("b", getSuffix(mod));
+        mod.setPatternAttributes(SignDisplay.EXCEPT_ZERO, false);
+        assertEquals("a", getPrefix(mod));
+        assertEquals("b", getSuffix(mod));
+        mod.setNumberProperties(-1, null);
         assertEquals("-a", getPrefix(mod));
         assertEquals("b", getSuffix(mod));
         mod.setPatternAttributes(SignDisplay.NEVER, false);
@@ -51,13 +56,19 @@
 
         mod.setPatternInfo(PatternStringParser.parseToPatternInfo("a0b;c-0d"));
         mod.setPatternAttributes(SignDisplay.AUTO, false);
-        mod.setNumberProperties(false, null);
+        mod.setNumberProperties(1, null);
         assertEquals("a", getPrefix(mod));
         assertEquals("b", getSuffix(mod));
         mod.setPatternAttributes(SignDisplay.ALWAYS, false);
         assertEquals("c+", getPrefix(mod));
         assertEquals("d", getSuffix(mod));
-        mod.setNumberProperties(true, null);
+        mod.setNumberProperties(0, null);
+        assertEquals("c+", getPrefix(mod));
+        assertEquals("d", getSuffix(mod));
+        mod.setPatternAttributes(SignDisplay.EXCEPT_ZERO, false);
+        assertEquals("a", getPrefix(mod));
+        assertEquals("b", getSuffix(mod));
+        mod.setNumberProperties(-1, null);
         assertEquals("c-", getPrefix(mod));
         assertEquals("d", getSuffix(mod));
         mod.setPatternAttributes(SignDisplay.NEVER, false);
@@ -95,6 +106,32 @@
         assertFalse(nsb1 + " vs. " + nsb3, nsb1.contentEquals(nsb3));
     }
 
+    @Test
+    public void patternWithNoPlaceholder() {
+        MutablePatternModifier mod = new MutablePatternModifier(false);
+        mod.setPatternInfo(PatternStringParser.parseToPatternInfo("abc"));
+        mod.setPatternAttributes(SignDisplay.AUTO, false);
+        mod.setSymbols(DecimalFormatSymbols.getInstance(ULocale.ENGLISH),
+                Currency.getInstance("USD"),
+                UnitWidth.SHORT,
+                null);
+        mod.setNumberProperties(1, null);
+
+        // Unsafe Code Path
+        NumberStringBuilder nsb = new NumberStringBuilder();
+        nsb.append("x123y", null);
+        mod.apply(nsb, 1, 4);
+        assertEquals("Unsafe Path", "xabcy", nsb.toString());
+
+        // Safe Code Path
+        nsb.clear();
+        nsb.append("x123y", null);
+        MicroProps micros = new MicroProps(false);
+        mod.createImmutable().applyToMicros(micros, new DecimalQuantity_DualStorageBCD());
+        micros.modMiddle.apply(nsb, 1, 4);
+        assertEquals("Safe Path", "xabcy", nsb.toString());
+    }
+
     private static String getPrefix(MutablePatternModifier mod) {
         NumberStringBuilder nsb = new NumberStringBuilder();
         mod.apply(nsb, 0, 0);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberFormatterApiTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberFormatterApiTest.java
index 3735543..57db088 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberFormatterApiTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberFormatterApiTest.java
@@ -5,27 +5,38 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
 
 import org.junit.Ignore;
 import org.junit.Test;
 
+import android.icu.impl.number.Grouper;
+import android.icu.impl.number.MacroProps;
 import android.icu.impl.number.Padder;
 import android.icu.impl.number.Padder.PadPosition;
 import android.icu.impl.number.PatternStringParser;
-import android.icu.number.FormattedNumber;
-import android.icu.number.Grouper;
+import android.icu.number.CompactNotation;
+import android.icu.number.FractionRounder;
 import android.icu.number.IntegerWidth;
 import android.icu.number.LocalizedNumberFormatter;
 import android.icu.number.Notation;
 import android.icu.number.NumberFormatter;
 import android.icu.number.NumberFormatter.DecimalSeparatorDisplay;
+import android.icu.number.NumberFormatter.GroupingStrategy;
 import android.icu.number.NumberFormatter.SignDisplay;
 import android.icu.number.NumberFormatter.UnitWidth;
 import android.icu.number.Rounder;
+import android.icu.number.ScientificNotation;
 import android.icu.number.UnlocalizedNumberFormatter;
 import android.icu.text.DecimalFormatSymbols;
 import android.icu.text.NumberingSystem;
@@ -45,6 +56,8 @@
     private static final Currency GBP = Currency.getInstance("GBP");
     private static final Currency CZK = Currency.getInstance("CZK");
     private static final Currency CAD = Currency.getInstance("CAD");
+    private static final Currency ESP = Currency.getInstance("ESP");
+    private static final Currency PTE = Currency.getInstance("PTE");
 
     @Test
     public void notationSimple() {
@@ -348,6 +361,19 @@
                 ULocale.ENGLISH,
                 9990000,
                 "10M");
+
+        Map<String, Map<String, String>> compactCustomData = new HashMap<String, Map<String, String>>();
+        Map<String, String> entry = new HashMap<String, String>();
+        entry.put("one", "Kun");
+        entry.put("other", "0KK");
+        compactCustomData.put("1000", entry);
+        assertFormatSingle(
+                "Compact Somali No Figure",
+                "",
+                NumberFormatter.with().notation(CompactNotation.forCustomData(compactCustomData)),
+                ULocale.ENGLISH,
+                1000,
+                "Kun");
     }
 
     @Test
@@ -467,6 +493,73 @@
                 ULocale.forLanguageTag("es-US"),
                 5.43,
                 "5.43 °F");
+
+        assertFormatSingle(
+                "MeasureUnit form without {0} in CLDR pattern",
+                "",
+                NumberFormatter.with().unit(MeasureUnit.KELVIN).unitWidth(UnitWidth.FULL_NAME),
+                ULocale.forLanguageTag("es-MX"),
+                1,
+                "kelvin");
+
+        assertFormatSingle(
+                "MeasureUnit form without {0} in CLDR pattern and wide base form",
+                "",
+                NumberFormatter.with()
+                    .rounding(Rounder.fixedFraction(20))
+                    .unit(MeasureUnit.KELVIN)
+                    .unitWidth(UnitWidth.FULL_NAME),
+                ULocale.forLanguageTag("es-MX"),
+                1,
+                "kelvin");
+    }
+
+    @Test
+    public void unitCompoundMeasure() {
+        assertFormatDescending(
+                "Meters Per Second Short (unit that simplifies)",
+                "",
+                NumberFormatter.with().unit(MeasureUnit.METER).perUnit(MeasureUnit.SECOND),
+                ULocale.ENGLISH,
+                "87,650 m/s",
+                "8,765 m/s",
+                "876.5 m/s",
+                "87.65 m/s",
+                "8.765 m/s",
+                "0.8765 m/s",
+                "0.08765 m/s",
+                "0.008765 m/s",
+                "0 m/s");
+
+        assertFormatDescending(
+                "Pounds Per Square Mile Short (secondary unit has per-format)",
+                "",
+                NumberFormatter.with().unit(MeasureUnit.POUND).perUnit(MeasureUnit.SQUARE_MILE),
+                ULocale.ENGLISH,
+                "87,650 lb/mi²",
+                "8,765 lb/mi²",
+                "876.5 lb/mi²",
+                "87.65 lb/mi²",
+                "8.765 lb/mi²",
+                "0.8765 lb/mi²",
+                "0.08765 lb/mi²",
+                "0.008765 lb/mi²",
+                "0 lb/mi²");
+
+        assertFormatDescending(
+                "Joules Per Furlong Short (unit with no simplifications or special patterns)",
+                "",
+                NumberFormatter.with().unit(MeasureUnit.JOULE).perUnit(MeasureUnit.FURLONG),
+                ULocale.ENGLISH,
+                "87,650 J/fur",
+                "8,765 J/fur",
+                "876.5 J/fur",
+                "87.65 J/fur",
+                "8.765 J/fur",
+                "0.8765 J/fur",
+                "0.08765 J/fur",
+                "0.008765 J/fur",
+                "0 J/fur");
     }
 
     @Test
@@ -572,9 +665,59 @@
                 "Currency Difference between Narrow and Short (Short Version)",
                 "",
                 NumberFormatter.with().unit(USD).unitWidth(UnitWidth.SHORT),
-                ULocale.forLanguageTag("en_CA"),
+                ULocale.forLanguageTag("en-CA"),
                 5.43,
-                "US$ 5.43");
+                "US$5.43");
+
+        assertFormatSingle(
+                "Currency-dependent format (Control)",
+                "",
+                NumberFormatter.with().unit(USD).unitWidth(UnitWidth.SHORT),
+                ULocale.forLanguageTag("ca"),
+                444444.55,
+                "444.444,55 USD");
+
+        assertFormatSingle(
+                "Currency-dependent format (Test)",
+                "",
+                NumberFormatter.with().unit(ESP).unitWidth(UnitWidth.SHORT),
+                ULocale.forLanguageTag("ca"),
+                444444.55,
+                "₧ 444.445");
+
+        assertFormatSingle(
+                "Currency-dependent symbols (Control)",
+                "",
+                NumberFormatter.with().unit(USD).unitWidth(UnitWidth.SHORT),
+                ULocale.forLanguageTag("pt-PT"),
+                444444.55,
+                "444 444,55 US$");
+
+        // NOTE: This is a bit of a hack on CLDR's part. They set the currency symbol to U+200B (zero-
+        // width space), and they set the decimal separator to the $ symbol.
+        assertFormatSingle(
+                "Currency-dependent symbols (Test)",
+                "",
+                NumberFormatter.with().unit(PTE).unitWidth(UnitWidth.SHORT),
+                ULocale.forLanguageTag("pt-PT"),
+                444444.55,
+                "444,444$55 \u200B");
+
+        assertFormatSingle(
+                "Currency-dependent symbols (Test)",
+                "",
+                NumberFormatter.with().unit(PTE).unitWidth(UnitWidth.NARROW),
+                ULocale.forLanguageTag("pt-PT"),
+                444444.55,
+                "444,444$55 PTE");
+
+        assertFormatSingle(
+                "Currency-dependent symbols (Test)",
+                "",
+                NumberFormatter.with().unit(PTE).unitWidth(UnitWidth.ISO_CODE),
+                ULocale.forLanguageTag("pt-PT"),
+                444444.55,
+                "444,444$55 PTE");
     }
 
     @Test
@@ -816,6 +959,22 @@
                 "0.09",
                 "0.01",
                 "0.00");
+
+        assertFormatSingle(
+                "FracSig with trailing zeros A",
+                "",
+                NumberFormatter.with().rounding(Rounder.fixedFraction(2).withMinDigits(3)),
+                ULocale.ENGLISH,
+                0.1,
+                "0.10");
+
+        assertFormatSingle(
+                "FracSig with trailing zeros B",
+                "",
+                NumberFormatter.with().rounding(Rounder.fixedFraction(2).withMinDigits(3)),
+                ULocale.ENGLISH,
+                0.0999999,
+                "0.10");
     }
 
     @Test
@@ -947,7 +1106,7 @@
         assertFormatDescendingBig(
                 "Western Grouping",
                 "grouping=defaults",
-                NumberFormatter.with().grouping(Grouper.defaults()),
+                NumberFormatter.with().grouping(GroupingStrategy.AUTO),
                 ULocale.ENGLISH,
                 "87,650,000",
                 "8,765,000",
@@ -962,7 +1121,7 @@
         assertFormatDescendingBig(
                 "Indic Grouping",
                 "grouping=defaults",
-                NumberFormatter.with().grouping(Grouper.defaults()),
+                NumberFormatter.with().grouping(GroupingStrategy.AUTO),
                 new ULocale("en-IN"),
                 "8,76,50,000",
                 "87,65,000",
@@ -977,7 +1136,7 @@
         assertFormatDescendingBig(
                 "Western Grouping, Min 2",
                 "grouping=min2",
-                NumberFormatter.with().grouping(Grouper.minTwoDigits()),
+                NumberFormatter.with().grouping(GroupingStrategy.MIN2),
                 ULocale.ENGLISH,
                 "87,650,000",
                 "8,765,000",
@@ -992,7 +1151,7 @@
         assertFormatDescendingBig(
                 "Indic Grouping, Min 2",
                 "grouping=min2",
-                NumberFormatter.with().grouping(Grouper.minTwoDigits()),
+                NumberFormatter.with().grouping(GroupingStrategy.MIN2),
                 new ULocale("en-IN"),
                 "8,76,50,000",
                 "87,65,000",
@@ -1007,7 +1166,7 @@
         assertFormatDescendingBig(
                 "No Grouping",
                 "grouping=none",
-                NumberFormatter.with().grouping(Grouper.none()),
+                NumberFormatter.with().grouping(GroupingStrategy.OFF),
                 new ULocale("en-IN"),
                 "87650000",
                 "8765000",
@@ -1018,6 +1177,117 @@
                 "87.65",
                 "8.765",
                 "0");
+
+        assertFormatDescendingBig(
+                "Indic locale with THOUSANDS grouping",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.THOUSANDS),
+                new ULocale("en-IN"),
+                "87,650,000",
+                "8,765,000",
+                "876,500",
+                "87,650",
+                "8,765",
+                "876.5",
+                "87.65",
+                "8.765",
+                "0");
+
+        // NOTE: Hungarian is interesting because it has minimumGroupingDigits=4 in locale data
+        // If this test breaks due to data changes, find another locale that has minimumGroupingDigits.
+        assertFormatDescendingBig(
+                "Hungarian Grouping",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.AUTO),
+                new ULocale("hu"),
+                "87 650 000",
+                "8 765 000",
+                "876500",
+                "87650",
+                "8765",
+                "876,5",
+                "87,65",
+                "8,765",
+                "0");
+
+        assertFormatDescendingBig(
+                "Hungarian Grouping, Min 2",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.MIN2),
+                new ULocale("hu"),
+                "87 650 000",
+                "8 765 000",
+                "876500",
+                "87650",
+                "8765",
+                "876,5",
+                "87,65",
+                "8,765",
+                "0");
+
+        assertFormatDescendingBig(
+                "Hungarian Grouping, Always",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.ON_ALIGNED),
+                new ULocale("hu"),
+                "87 650 000",
+                "8 765 000",
+                "876 500",
+                "87 650",
+                "8 765",
+                "876,5",
+                "87,65",
+                "8,765",
+                "0");
+
+        // NOTE: Bulgarian is interesting because it has no grouping in the default currency format.
+        // If this test breaks due to data changes, find another locale that has no default grouping.
+        assertFormatDescendingBig(
+                "Bulgarian Currency Grouping",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.AUTO).unit(USD),
+                new ULocale("bg"),
+                "87650000,00 щ.д.",
+                "8765000,00 щ.д.",
+                "876500,00 щ.д.",
+                "87650,00 щ.д.",
+                "8765,00 щ.д.",
+                "876,50 щ.д.",
+                "87,65 щ.д.",
+                "8,76 щ.д.",
+                "0,00 щ.д.");
+
+        assertFormatDescendingBig(
+                "Bulgarian Currency Grouping, Always",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.ON_ALIGNED).unit(USD),
+                new ULocale("bg"),
+                "87 650 000,00 щ.д.",
+                "8 765 000,00 щ.д.",
+                "876 500,00 щ.д.",
+                "87 650,00 щ.д.",
+                "8 765,00 щ.д.",
+                "876,50 щ.д.",
+                "87,65 щ.д.",
+                "8,76 щ.д.",
+                "0,00 щ.д.");
+
+        MacroProps macros = new MacroProps();
+        macros.grouping = Grouper.getInstance((short) 4, (short) 1, (short) 3);
+        assertFormatDescendingBig(
+                "Custom Grouping via Internal API",
+                "",
+                NumberFormatter.with().macros(macros),
+                ULocale.ENGLISH,
+                "8,7,6,5,0000",
+                "8,7,6,5000",
+                "876500",
+                "87650",
+                "8765",
+                "876.5",
+                "87.65",
+                "8.765",
+                "0");
     }
 
     @Test
@@ -1312,10 +1582,10 @@
                 "US$ 12,345.67");
 
         assertFormatSingle(
-                "Currency symbol should follow number in ar with NS arab",
+                "Currency symbol should follow number in ar-EG with NS arab",
                 "",
                 NumberFormatter.with().unit(USD),
-                new ULocale("ar"),
+                new ULocale("ar-EG"),
                 12345.67,
                 "١٢٬٣٤٥٫٦٧ US$");
 
@@ -1327,6 +1597,22 @@
                 12345.67,
                 "١٢٬٣٤٥٫٦٧ US$");
 
+        assertFormatSingle(
+                "NumberingSystem in API should win over @numbers keyword",
+                "",
+                NumberFormatter.with().symbols(NumberingSystem.LATIN).unit(USD),
+                new ULocale("ar@numbers=arab"),
+                12345.67,
+                "US$ 12,345.67");
+
+        assertEquals("NumberingSystem in API should win over @numbers keyword in reverse order",
+                "US$ 12,345.67",
+                NumberFormatter.withLocale(new ULocale("ar@numbers=arab"))
+                    .symbols(NumberingSystem.LATIN)
+                    .unit(USD)
+                    .format(12345.67)
+                    .toString());
+
         DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(new ULocale("de-CH"));
         UnlocalizedNumberFormatter f = NumberFormatter.with().symbols(symbols);
         symbols.setGroupingSeparatorString("!");
@@ -1389,6 +1675,14 @@
                 "-444,444");
 
         assertFormatSingle(
+                "Sign Auto Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.AUTO),
+                ULocale.ENGLISH,
+                0,
+                "0");
+
+        assertFormatSingle(
                 "Sign Always Positive",
                 "sign=ALWAYS",
                 NumberFormatter.with().sign(SignDisplay.ALWAYS),
@@ -1405,6 +1699,14 @@
                 "-444,444");
 
         assertFormatSingle(
+                "Sign Always Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.ALWAYS),
+                ULocale.ENGLISH,
+                0,
+                "+0");
+
+        assertFormatSingle(
                 "Sign Never Positive",
                 "sign=NEVER",
                 NumberFormatter.with().sign(SignDisplay.NEVER),
@@ -1421,6 +1723,14 @@
                 "444,444");
 
         assertFormatSingle(
+                "Sign Never Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.NEVER),
+                ULocale.ENGLISH,
+                0,
+                "0");
+
+        assertFormatSingle(
                 "Sign Accounting Positive",
                 "$USD sign=ACCOUNTING",
                 NumberFormatter.with().sign(SignDisplay.ACCOUNTING).unit(USD),
@@ -1437,6 +1747,14 @@
                 "($444,444.00)");
 
         assertFormatSingle(
+                "Sign Accounting Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.ACCOUNTING).unit(USD),
+                ULocale.ENGLISH,
+                0,
+                "$0.00");
+
+        assertFormatSingle(
                 "Sign Accounting-Always Positive",
                 "$USD sign=ACCOUNTING_ALWAYS",
                 NumberFormatter.with().sign(SignDisplay.ACCOUNTING_ALWAYS).unit(USD),
@@ -1453,6 +1771,62 @@
                 "($444,444.00)");
 
         assertFormatSingle(
+                "Sign Accounting-Always Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.ACCOUNTING_ALWAYS).unit(USD),
+                ULocale.ENGLISH,
+                0,
+                "+$0.00");
+
+        assertFormatSingle(
+                "Sign Except-Zero Positive",
+                "",
+                NumberFormatter.with().sign(SignDisplay.EXCEPT_ZERO),
+                ULocale.ENGLISH,
+                444444,
+                "+444,444");
+
+        assertFormatSingle(
+                "Sign Except-Zero Negative",
+                "",
+                NumberFormatter.with().sign(SignDisplay.EXCEPT_ZERO),
+                ULocale.ENGLISH,
+                -444444,
+                "-444,444");
+
+        assertFormatSingle(
+                "Sign Except-Zero Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.EXCEPT_ZERO),
+                ULocale.ENGLISH,
+                0,
+                "0");
+
+        assertFormatSingle(
+                "Sign Accounting-Except-Zero Positive",
+                "$USD sign=ACCOUNTING_ALWAYS",
+                NumberFormatter.with().sign(SignDisplay.ACCOUNTING_EXCEPT_ZERO).unit(USD),
+                ULocale.ENGLISH,
+                444444,
+                "+$444,444.00");
+
+        assertFormatSingle(
+                "Sign Accounting-Except-Zero Negative",
+                "$USD sign=ACCOUNTING_ALWAYS",
+                NumberFormatter.with().sign(SignDisplay.ACCOUNTING_EXCEPT_ZERO).unit(USD),
+                ULocale.ENGLISH,
+                -444444,
+                "($444,444.00)");
+
+        assertFormatSingle(
+                "Sign Accounting-Except-Zero Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.ACCOUNTING_EXCEPT_ZERO).unit(USD),
+                ULocale.ENGLISH,
+                0,
+                "$0.00");
+
+        assertFormatSingle(
                 "Sign Accounting Negative Hidden",
                 "$USD unit-width=HIDDEN sign=ACCOUNTING",
                 NumberFormatter.with().sign(SignDisplay.ACCOUNTING).unit(USD).unitWidth(UnitWidth.HIDDEN),
@@ -1504,29 +1878,6 @@
     }
 
     @Test
-    public void getPrefixSuffix() {
-        Object[][] cases = {
-                { NumberFormatter.withLocale(ULocale.ENGLISH).unit(GBP).unitWidth(UnitWidth.ISO_CODE), "GBP", "",
-                        "-GBP", "" },
-                { NumberFormatter.withLocale(ULocale.ENGLISH).unit(GBP).unitWidth(UnitWidth.FULL_NAME), "",
-                        " British pounds", "-", " British pounds" } };
-
-        for (Object[] cas : cases) {
-            LocalizedNumberFormatter f = (LocalizedNumberFormatter) cas[0];
-            String posPrefix = (String) cas[1];
-            String posSuffix = (String) cas[2];
-            String negPrefix = (String) cas[3];
-            String negSuffix = (String) cas[4];
-            FormattedNumber positive = f.format(1);
-            FormattedNumber negative = f.format(-1);
-            assertEquals(posPrefix, positive.getPrefix());
-            assertEquals(posSuffix, positive.getSuffix());
-            assertEquals(negPrefix, negative.getPrefix());
-            assertEquals(negSuffix, negative.getSuffix());
-        }
-    }
-
-    @Test
     public void plurals() {
         // TODO: Expand this test.
 
@@ -1547,6 +1898,119 @@
                 "1.00 US dollars");
     }
 
+    @Test
+    public void validRanges() throws NoSuchMethodException, IllegalAccessException {
+        Method[] methodsWithOneArgument = new Method[] { Rounder.class.getDeclaredMethod("fixedFraction", Integer.TYPE),
+                Rounder.class.getDeclaredMethod("minFraction", Integer.TYPE),
+                Rounder.class.getDeclaredMethod("maxFraction", Integer.TYPE),
+                Rounder.class.getDeclaredMethod("fixedDigits", Integer.TYPE),
+                Rounder.class.getDeclaredMethod("minDigits", Integer.TYPE),
+                Rounder.class.getDeclaredMethod("maxDigits", Integer.TYPE),
+                FractionRounder.class.getDeclaredMethod("withMinDigits", Integer.TYPE),
+                FractionRounder.class.getDeclaredMethod("withMaxDigits", Integer.TYPE),
+                ScientificNotation.class.getDeclaredMethod("withMinExponentDigits", Integer.TYPE),
+                IntegerWidth.class.getDeclaredMethod("zeroFillTo", Integer.TYPE),
+                IntegerWidth.class.getDeclaredMethod("truncateAt", Integer.TYPE), };
+        Method[] methodsWithTwoArguments = new Method[] {
+                Rounder.class.getDeclaredMethod("minMaxFraction", Integer.TYPE, Integer.TYPE),
+                Rounder.class.getDeclaredMethod("minMaxDigits", Integer.TYPE, Integer.TYPE), };
+
+        final int EXPECTED_MAX_INT_FRAC_SIG = 999;
+        final String expectedSubstring0 = "between 0 and 999 (inclusive)";
+        final String expectedSubstring1 = "between 1 and 999 (inclusive)";
+        final String expectedSubstringN1 = "between -1 and 999 (inclusive)";
+
+        // We require that the upper bounds all be 999 inclusive.
+        // The lower bound may be either -1, 0, or 1.
+        Set<String> methodsWithLowerBound1 = new HashSet();
+        methodsWithLowerBound1.add("fixedDigits");
+        methodsWithLowerBound1.add("minDigits");
+        methodsWithLowerBound1.add("maxDigits");
+        methodsWithLowerBound1.add("minMaxDigits");
+        methodsWithLowerBound1.add("withMinDigits");
+        methodsWithLowerBound1.add("withMaxDigits");
+        methodsWithLowerBound1.add("withMinExponentDigits");
+        // Methods with lower bound 0:
+        // fixedFraction
+        // minFraction
+        // maxFraction
+        // minMaxFraction
+        // zeroFillTo
+        Set<String> methodsWithLowerBoundN1 = new HashSet();
+        methodsWithLowerBoundN1.add("truncateAt");
+
+        // Some of the methods require an object to be called upon.
+        Map<String, Object> targets = new HashMap<String, Object>();
+        targets.put("withMinDigits", Rounder.integer());
+        targets.put("withMaxDigits", Rounder.integer());
+        targets.put("withMinExponentDigits", Notation.scientific());
+        targets.put("truncateAt", IntegerWidth.zeroFillTo(0));
+
+        for (int argument = -2; argument <= EXPECTED_MAX_INT_FRAC_SIG + 2; argument++) {
+            for (Method method : methodsWithOneArgument) {
+                String message = "i = " + argument + "; method = " + method.getName();
+                int lowerBound = methodsWithLowerBound1.contains(method.getName()) ? 1
+                        : methodsWithLowerBoundN1.contains(method.getName()) ? -1 : 0;
+                String expectedSubstring = lowerBound == 0 ? expectedSubstring0
+                        : lowerBound == 1 ? expectedSubstring1 : expectedSubstringN1;
+                Object target = targets.get(method.getName());
+                try {
+                    method.invoke(target, argument);
+                    assertTrue(message, argument >= lowerBound && argument <= EXPECTED_MAX_INT_FRAC_SIG);
+                } catch (InvocationTargetException e) {
+                    assertTrue(message, argument < lowerBound || argument > EXPECTED_MAX_INT_FRAC_SIG);
+                    // Ensure the exception message contains the expected substring
+                    String actualMessage = e.getCause().getMessage();
+                    assertNotEquals(message + ": " + actualMessage, -1, actualMessage.indexOf(expectedSubstring));
+                }
+            }
+            for (Method method : methodsWithTwoArguments) {
+                String message = "i = " + argument + "; method = " + method.getName();
+                int lowerBound = methodsWithLowerBound1.contains(method.getName()) ? 1
+                        : methodsWithLowerBoundN1.contains(method.getName()) ? -1 : 0;
+                String expectedSubstring = lowerBound == 0 ? expectedSubstring0 : expectedSubstring1;
+                Object target = targets.get(method.getName());
+                // Check range on the first argument
+                try {
+                    // Pass EXPECTED_MAX_INT_FRAC_SIG as the second argument so arg1 <= arg2 in expected cases
+                    method.invoke(target, argument, EXPECTED_MAX_INT_FRAC_SIG);
+                    assertTrue(message, argument >= lowerBound && argument <= EXPECTED_MAX_INT_FRAC_SIG);
+                } catch (InvocationTargetException e) {
+                    assertTrue(message, argument < lowerBound || argument > EXPECTED_MAX_INT_FRAC_SIG);
+                    // Ensure the exception message contains the expected substring
+                    String actualMessage = e.getCause().getMessage();
+                    assertNotEquals(message + ": " + actualMessage, -1, actualMessage.indexOf(expectedSubstring));
+                }
+                // Check range on the second argument
+                try {
+                    // Pass lowerBound as the first argument so arg1 <= arg2 in expected cases
+                    method.invoke(target, lowerBound, argument);
+                    assertTrue(message, argument >= lowerBound && argument <= EXPECTED_MAX_INT_FRAC_SIG);
+                } catch (InvocationTargetException e) {
+                    assertTrue(message, argument < lowerBound || argument > EXPECTED_MAX_INT_FRAC_SIG);
+                    // Ensure the exception message contains the expected substring
+                    String actualMessage = e.getCause().getMessage();
+                    assertNotEquals(message + ": " + actualMessage, -1, actualMessage.indexOf(expectedSubstring));
+                }
+                // Check that first argument must be less than or equal to second argument
+                try {
+                    method.invoke(target, argument, argument - 1);
+                    org.junit.Assert.fail();
+                } catch (InvocationTargetException e) {
+                    // Pass
+                }
+            }
+        }
+
+        // Check first argument less than or equal to second argument on IntegerWidth
+        try {
+            IntegerWidth.zeroFillTo(4).truncateAt(2);
+            org.junit.Assert.fail();
+        } catch (IllegalArgumentException e) {
+            // Pass
+        }
+    }
+
     private static void assertFormatDescending(
             String message,
             String skeleton,
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberParserTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberParserTest.java
new file mode 100644
index 0000000..df84699
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberParserTest.java
@@ -0,0 +1,257 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.dev.test.number;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import android.icu.impl.StringSegment;
+import android.icu.impl.number.DecimalFormatProperties;
+import android.icu.impl.number.parse.IgnorablesMatcher;
+import android.icu.impl.number.parse.MinusSignMatcher;
+import android.icu.impl.number.parse.NumberParserImpl;
+import android.icu.impl.number.parse.ParsedNumber;
+import android.icu.impl.number.parse.ParsingUtils;
+import android.icu.impl.number.parse.PercentMatcher;
+import android.icu.impl.number.parse.PlusSignMatcher;
+import android.icu.impl.number.parse.SeriesMatcher;
+import android.icu.impl.number.parse.UnicodeSetStaticCache;
+import android.icu.impl.number.parse.UnicodeSetStaticCache.Key;
+import android.icu.text.DecimalFormatSymbols;
+import android.icu.util.ULocale;
+import android.icu.testsharding.MainTestShard;
+
+/**
+ * @author sffc
+ *
+ */
+@MainTestShard
+public class NumberParserTest {
+    @Test
+    public void testBasic() {
+        Object[][] cases = new Object[][] {
+                // Fields:
+                // a) Flags:
+                // --- Bit 0x01 => Test greedy implementation
+                // --- Bit 0x02 => Test slow implementation
+                // --- Bit 0x04 => Test strict grouping separators
+                // b) Input string
+                // c) Pattern
+                // d) Expected chars consumed
+                // e) Expected double result
+                { 3, "51423", "0", 5, 51423. },
+                { 3, "51423x", "0", 5, 51423. },
+                { 3, " 51423", "0", 6, 51423. },
+                { 3, "51423 ", "0", 5, 51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯", "0", 10, 51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯x", "0", 10, 51423. },
+                { 3, " 𝟱𝟭𝟰𝟮𝟯", "0", 11, 51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯 ", "0", 10, 51423. },
+                { 7, "𝟱𝟭,𝟰𝟮𝟯", "#,##,##0", 11, 51423. },
+                { 7, "𝟳,𝟴𝟵,𝟱𝟭,𝟰𝟮𝟯", "#,##,##0", 19, 78951423. },
+                { 7, "𝟳𝟴,𝟵𝟱𝟭.𝟰𝟮𝟯", "#,##,##0", 18, 78951.423 },
+                { 7, "𝟳𝟴,𝟬𝟬𝟬", "#,##,##0", 11, 78000. },
+                { 7, "𝟳𝟴,𝟬𝟬𝟬.𝟬𝟬𝟬", "#,##,##0", 18, 78000. },
+                { 7, "𝟳𝟴,𝟬𝟬𝟬.𝟬𝟮𝟯", "#,##,##0", 18, 78000.023 },
+                { 7, "𝟳𝟴.𝟬𝟬𝟬.𝟬𝟮𝟯", "#,##,##0", 11, 78. },
+                { 3, "-𝟱𝟭𝟰𝟮𝟯", "0", 11, -51423. },
+                { 3, "-𝟱𝟭𝟰𝟮𝟯-", "0", 11, -51423. },
+                { 3, "a51423US dollars", "a0¤¤¤", 16, 51423. },
+                { 3, "a 51423 US dollars", "a0¤¤¤", 18, 51423. },
+                { 3, "514.23 USD", "0", 10, 514.23 },
+                { 3, "514.23 GBP", "0", 10, 514.23 },
+                { 3, "a 𝟱𝟭𝟰𝟮𝟯 b", "a0b", 14, 51423. },
+                { 3, "-a 𝟱𝟭𝟰𝟮𝟯 b", "a0b", 15, -51423. },
+                { 3, "a -𝟱𝟭𝟰𝟮𝟯 b", "a0b", 15, -51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯", "[0];(0)", 10, 51423. },
+                { 3, "[𝟱𝟭𝟰𝟮𝟯", "[0];(0)", 11, 51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯]", "[0];(0)", 11, 51423. },
+                { 3, "[𝟱𝟭𝟰𝟮𝟯]", "[0];(0)", 12, 51423. },
+                { 3, "(𝟱𝟭𝟰𝟮𝟯", "[0];(0)", 11, -51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯)", "[0];(0)", 11, -51423. },
+                { 3, "(𝟱𝟭𝟰𝟮𝟯)", "[0];(0)", 12, -51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯", "{0};{0}", 10, 51423. },
+                { 3, "{𝟱𝟭𝟰𝟮𝟯", "{0};{0}", 11, 51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯}", "{0};{0}", 11, 51423. },
+                { 3, "{𝟱𝟭𝟰𝟮𝟯}", "{0};{0}", 12, 51423. },
+                { 1, "a40b", "a0'0b'", 3, 40. }, // greedy code path thinks "40" is the number
+                { 2, "a40b", "a0'0b'", 4, 4. }, // slow code path finds the suffix "0b"
+                { 3, "𝟱.𝟭𝟰𝟮E𝟯", "0", 12, 5142. },
+                { 3, "𝟱.𝟭𝟰𝟮E-𝟯", "0", 13, 0.005142 },
+                { 3, "𝟱.𝟭𝟰𝟮e-𝟯", "0", 13, 0.005142 },
+                { 7, "5,142.50 Canadian dollars", "#,##,##0", 25, 5142.5 },
+                { 3, "a$ b5", "a ¤ b0", 5, 5.0 },
+                { 3, "📺1.23", "📺0;📻0", 6, 1.23 },
+                { 3, "📻1.23", "📺0;📻0", 6, -1.23 },
+                { 3, ".00", "0", 3, 0.0 },
+                { 3, "                              0", "a0", 31, 0.0 }, // should not hang
+                { 3, "0", "0", 1, 0.0 } };
+
+        for (Object[] cas : cases) {
+            int flags = (Integer) cas[0];
+            String input = (String) cas[1];
+            String pattern = (String) cas[2];
+            int expectedCharsConsumed = (Integer) cas[3];
+            double resultDouble = (Double) cas[4];
+            NumberParserImpl parser = NumberParserImpl
+                    .createParserFromPattern(ULocale.ENGLISH, pattern, false);
+            String message = "Input <" + input + "> Parser " + parser;
+
+            if (0 != (flags & 0x01)) {
+                // Test greedy code path
+                ParsedNumber resultObject = new ParsedNumber();
+                parser.parse(input, true, resultObject);
+                assertNotNull("Greedy Parse failed: " + message, resultObject.quantity);
+                assertEquals("Greedy Parse failed: " + message,
+                        expectedCharsConsumed,
+                        resultObject.charEnd);
+                assertEquals("Greedy Parse failed: " + message,
+                        resultDouble,
+                        resultObject.getNumber().doubleValue(),
+                        0.0);
+            }
+
+            if (0 != (flags & 0x02)) {
+                // Test slow code path
+                ParsedNumber resultObject = new ParsedNumber();
+                parser.parse(input, false, resultObject);
+                assertNotNull("Non-Greedy Parse failed: " + message, resultObject.quantity);
+                assertEquals("Non-Greedy Parse failed: " + message,
+                        expectedCharsConsumed,
+                        resultObject.charEnd);
+                assertEquals("Non-Greedy Parse failed: " + message,
+                        resultDouble,
+                        resultObject.getNumber().doubleValue(),
+                        0.0);
+            }
+
+            if (0 != (flags & 0x04)) {
+                // Test with strict separators
+                parser = NumberParserImpl.createParserFromPattern(ULocale.ENGLISH, pattern, true);
+                ParsedNumber resultObject = new ParsedNumber();
+                parser.parse(input, true, resultObject);
+                assertNotNull("Strict Parse failed: " + message, resultObject.quantity);
+                assertEquals("Strict Parse failed: " + message,
+                        expectedCharsConsumed,
+                        resultObject.charEnd);
+                assertEquals("Strict Parse failed: " + message,
+                        resultDouble,
+                        resultObject.getNumber().doubleValue(),
+                        0.0);
+            }
+        }
+    }
+
+    @Test
+    public void testLocaleFi() {
+        // This case is interesting because locale fi has NaN starting with 'e', the same as scientific
+        NumberParserImpl parser = NumberParserImpl
+                .createParserFromPattern(new ULocale("fi"), "0", false);
+
+        ParsedNumber resultObject = new ParsedNumber();
+        parser.parse("epäluku", false, resultObject);
+        assertTrue(resultObject.success());
+        assertEquals(Double.NaN, resultObject.getNumber().doubleValue(), 0.0);
+
+        resultObject = new ParsedNumber();
+        parser.parse("1,2e3", false, resultObject);
+        assertTrue(resultObject.success());
+        assertEquals(1200.0, resultObject.getNumber().doubleValue(), 0.0);
+    }
+
+    @Test
+    public void testSeriesMatcher() {
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
+        SeriesMatcher series = new SeriesMatcher();
+        series.addMatcher(PlusSignMatcher.getInstance(symbols, false));
+        series.addMatcher(MinusSignMatcher.getInstance(symbols, false));
+        series.addMatcher(IgnorablesMatcher.DEFAULT);
+        series.addMatcher(PercentMatcher.getInstance(symbols));
+        series.addMatcher(IgnorablesMatcher.DEFAULT);
+        series.freeze();
+
+        assertEquals(UnicodeSetStaticCache.get(Key.PLUS_SIGN), series.getLeadCodePoints());
+
+        Object[][] cases = new Object[][] {
+                { "", 0, true },
+                { " ", 0, false },
+                { "$", 0, false },
+                { "+", 0, true },
+                { " +", 0, false },
+                { "+-", 0, true },
+                { "+ -", 0, false },
+                { "+-  ", 0, true },
+                { "+-  $", 0, false },
+                { "+-%", 3, true },
+                { "  +-  %  ", 0, false },
+                { "+-  %  ", 7, true },
+                { "+-%$", 3, false } };
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            int expectedOffset = (Integer) cas[1];
+            boolean expectedMaybeMore = (Boolean) cas[2];
+
+            StringSegment segment = new StringSegment(input, false);
+            ParsedNumber result = new ParsedNumber();
+            boolean actualMaybeMore = series.match(segment, result);
+            int actualOffset = segment.getOffset();
+
+            assertEquals("'" + input + "'", expectedOffset, actualOffset);
+            assertEquals("'" + input + "'", expectedMaybeMore, actualMaybeMore);
+        }
+    }
+
+    @Test
+    public void testGroupingDisabled() {
+        DecimalFormatProperties properties = new DecimalFormatProperties();
+        properties.setGroupingSize(0);
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
+        NumberParserImpl parser = NumberParserImpl
+                .createParserFromProperties(properties, symbols, false, true);
+        ParsedNumber result = new ParsedNumber();
+        parser.parse("12,345.678", true, result);
+        assertEquals("Should not parse with grouping separator",
+                12.0,
+                result.getNumber().doubleValue(),
+                0.0);
+    }
+
+    @Test
+    public void testCaseFolding() {
+        Object[][] cases = new Object[][] {
+                // pattern, input string, case sensitive chars, case insensitive chars
+                { "0", "JP¥3456", 7, 7 },
+                { "0", "jp¥3456", 0, 0 }, // not to be accepted, even in case insensitive mode
+                { "A0", "A5", 2, 2 },
+                { "A0", "a5", 0, 2 },
+                { "0", "NaN", 3, 3 },
+                { "0", "nan", 0, 3 } };
+        for (Object[] cas : cases) {
+            String patternString = (String) cas[0];
+            String inputString = (String) cas[1];
+            int expectedCaseSensitiveChars = (Integer) cas[2];
+            int expectedCaseFoldingChars = (Integer) cas[3];
+
+            NumberParserImpl caseSensitiveParser = NumberParserImpl
+                    .removeMeWhenMerged(ULocale.ENGLISH, patternString, ParsingUtils.PARSE_FLAG_OPTIMIZE);
+            ParsedNumber result = new ParsedNumber();
+            caseSensitiveParser.parse(inputString, true, result);
+            assertEquals("Case-Sensitive: " + inputString + " on " + patternString,
+                    expectedCaseSensitiveChars,
+                    result.charEnd);
+
+            NumberParserImpl caseFoldingParser = NumberParserImpl.removeMeWhenMerged(ULocale.ENGLISH,
+                    patternString,
+                    ParsingUtils.PARSE_FLAG_IGNORE_CASE | ParsingUtils.PARSE_FLAG_OPTIMIZE);
+            result = new ParsedNumber();
+            caseFoldingParser.parse(inputString, true, result);
+            assertEquals("Folded: " + inputString + " on " + patternString,
+                    expectedCaseFoldingChars,
+                    result.charEnd);
+        }
+    }
+}
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberStringBuilderTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberStringBuilderTest.java
index 778f30a..9d7a28a 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberStringBuilderTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/number/NumberStringBuilderTest.java
@@ -20,208 +20,251 @@
 /** @author sffc */
 @MainTestShard
 public class NumberStringBuilderTest {
-  private static final String[] EXAMPLE_STRINGS = {
-    "",
-    "xyz",
-    "The quick brown fox jumps over the lazy dog",
-    "😁",
-    "mixed 😇 and ASCII",
-    "with combining characters like 🇦🇧🇨🇩",
-    "A very very very very very very very very very very long string to force heap"
-  };
+    private static final String[] EXAMPLE_STRINGS = {
+            "",
+            "xyz",
+            "The quick brown fox jumps over the lazy dog",
+            "😁",
+            "mixed 😇 and ASCII",
+            "with combining characters like 🇦🇧🇨🇩",
+            "A very very very very very very very very very very long string to force heap" };
 
-  @Test
-  public void testInsertAppendCharSequence() {
+    @Test
+    public void testInsertAppendCharSequence() {
 
-    StringBuilder sb1 = new StringBuilder();
-    NumberStringBuilder sb2 = new NumberStringBuilder();
-    for (String str : EXAMPLE_STRINGS) {
-      NumberStringBuilder sb3 = new NumberStringBuilder();
-      sb1.append(str);
-      sb2.append(str, null);
-      sb3.append(str, null);
-      assertCharSequenceEquals(sb1, sb2);
-      assertCharSequenceEquals(sb3, str);
+        StringBuilder sb1 = new StringBuilder();
+        NumberStringBuilder sb2 = new NumberStringBuilder();
+        for (String str : EXAMPLE_STRINGS) {
+            NumberStringBuilder sb3 = new NumberStringBuilder();
+            sb1.append(str);
+            sb2.append(str, null);
+            sb3.append(str, null);
+            assertCharSequenceEquals(sb1, sb2);
+            assertCharSequenceEquals(sb3, str);
 
-      StringBuilder sb4 = new StringBuilder();
-      NumberStringBuilder sb5 = new NumberStringBuilder();
-      sb4.append("😇");
-      sb4.append(str);
-      sb4.append("xx");
-      sb5.append("😇xx", null);
-      sb5.insert(2, str, null);
-      assertCharSequenceEquals(sb4, sb5);
+            StringBuilder sb4 = new StringBuilder();
+            NumberStringBuilder sb5 = new NumberStringBuilder();
+            sb4.append("😇");
+            sb4.append(str);
+            sb4.append("xx");
+            sb5.append("😇xx", null);
+            sb5.insert(2, str, null);
+            assertCharSequenceEquals(sb4, sb5);
 
-      int start = Math.min(1, str.length());
-      int end = Math.min(10, str.length());
-      sb4.insert(3, str, start, end);
-      sb5.insert(3, str, start, end, null);
-      assertCharSequenceEquals(sb4, sb5);
+            int start = Math.min(1, str.length());
+            int end = Math.min(10, str.length());
+            sb4.insert(3, str, start, end);
+            sb5.insert(3, str, start, end, null);
+            assertCharSequenceEquals(sb4, sb5);
 
-      sb4.append(str.toCharArray());
-      sb5.append(str.toCharArray(), null);
-      assertCharSequenceEquals(sb4, sb5);
+            sb4.append(str.toCharArray());
+            sb5.append(str.toCharArray(), null);
+            assertCharSequenceEquals(sb4, sb5);
 
-      sb4.insert(4, str.toCharArray());
-      sb5.insert(4, str.toCharArray(), null);
-      assertCharSequenceEquals(sb4, sb5);
+            sb4.insert(4, str.toCharArray());
+            sb5.insert(4, str.toCharArray(), null);
+            assertCharSequenceEquals(sb4, sb5);
 
-      sb4.append(sb4.toString());
-      sb5.append(new NumberStringBuilder(sb5));
-      assertCharSequenceEquals(sb4, sb5);
-    }
-  }
-
-  @Test
-  public void testInsertAppendCodePoint() {
-    int[] cases = {0, 1, 60, 127, 128, 0x7fff, 0x8000, 0xffff, 0x10000, 0x1f000, 0x10ffff};
-
-    StringBuilder sb1 = new StringBuilder();
-    NumberStringBuilder sb2 = new NumberStringBuilder();
-    for (int cas : cases) {
-      NumberStringBuilder sb3 = new NumberStringBuilder();
-      sb1.appendCodePoint(cas);
-      sb2.appendCodePoint(cas, null);
-      sb3.appendCodePoint(cas, null);
-      assertCharSequenceEquals(sb1, sb2);
-      assertEquals(Character.codePointAt(sb3, 0), cas);
-
-      StringBuilder sb4 = new StringBuilder();
-      NumberStringBuilder sb5 = new NumberStringBuilder();
-      sb4.append("😇");
-      sb4.appendCodePoint(cas); // Java StringBuilder has no insertCodePoint()
-      sb4.append("xx");
-      sb5.append("😇xx", null);
-      sb5.insertCodePoint(2, cas, null);
-      assertCharSequenceEquals(sb4, sb5);
-    }
-  }
-
-  @Test
-  public void testCopy() {
-    for (String str : EXAMPLE_STRINGS) {
-      NumberStringBuilder sb1 = new NumberStringBuilder();
-      sb1.append(str, null);
-      NumberStringBuilder sb2 = new NumberStringBuilder(sb1);
-      assertCharSequenceEquals(sb1, sb2);
-      assertTrue(sb1.contentEquals(sb2));
-
-      sb1.append("12345", null);
-      assertNotEquals(sb1.length(), sb2.length());
-      assertFalse(sb1.contentEquals(sb2));
-    }
-  }
-
-  @Test
-  public void testFields() {
-    for (String str : EXAMPLE_STRINGS) {
-      NumberStringBuilder sb = new NumberStringBuilder();
-      sb.append(str, null);
-      sb.append(str, NumberFormat.Field.CURRENCY);
-      Field[] fields = sb.toFieldArray();
-      assertEquals(str.length() * 2, fields.length);
-      for (int i = 0; i < str.length(); i++) {
-        assertEquals(null, fields[i]);
-        assertEquals(null, sb.fieldAt(i));
-        assertEquals(NumberFormat.Field.CURRENCY, fields[i + str.length()]);
-        assertEquals(NumberFormat.Field.CURRENCY, sb.fieldAt(i + str.length()));
-      }
-
-      // Very basic FieldPosition test. More robust tests happen in NumberFormatTest.
-      // Let NumberFormatTest also take care of AttributedCharacterIterator material.
-      FieldPosition fp = new FieldPosition(NumberFormat.Field.CURRENCY);
-      sb.populateFieldPosition(fp, 0);
-      assertEquals(str.length(), fp.getBeginIndex());
-      assertEquals(str.length() * 2, fp.getEndIndex());
-
-      if (str.length() > 0) {
-        sb.insertCodePoint(2, 100, NumberFormat.Field.INTEGER);
-        fields = sb.toFieldArray();
-        assertEquals(str.length() * 2 + 1, fields.length);
-        assertEquals(fields[2], NumberFormat.Field.INTEGER);
-      }
-
-      sb.append(new NumberStringBuilder(sb));
-      sb.append(sb.toCharArray(), sb.toFieldArray());
-      int numNull = 0;
-      int numCurr = 0;
-      int numInt = 0;
-      Field[] oldFields = fields;
-      fields = sb.toFieldArray();
-      for (int i = 0; i < sb.length(); i++) {
-        assertEquals(oldFields[i % oldFields.length], fields[i]);
-        if (fields[i] == null) {
-          numNull++;
-        } else if (fields[i] == NumberFormat.Field.CURRENCY) {
-          numCurr++;
-        } else if (fields[i] == NumberFormat.Field.INTEGER) {
-          numInt++;
-        } else {
-          throw new AssertionError("Encountered unknown field in " + str);
+            sb4.append(sb4.toString());
+            sb5.append(new NumberStringBuilder(sb5));
+            assertCharSequenceEquals(sb4, sb5);
         }
-      }
-      assertEquals(str.length() * 4, numNull);
-      assertEquals(numNull, numCurr);
-      assertEquals(str.length() > 0 ? 4 : 0, numInt);
-
-      NumberStringBuilder sb2 = new NumberStringBuilder();
-      sb2.append(sb);
-      assertTrue(sb.contentEquals(sb2));
-      assertTrue(sb.contentEquals(sb2.toCharArray(), sb2.toFieldArray()));
-
-      sb2.insertCodePoint(0, 50, NumberFormat.Field.FRACTION);
-      assertTrue(!sb.contentEquals(sb2));
-      assertTrue(!sb.contentEquals(sb2.toCharArray(), sb2.toFieldArray()));
-    }
-  }
-
-  @Test
-  public void testUnlimitedCapacity() {
-    NumberStringBuilder builder = new NumberStringBuilder();
-    // The builder should never fail upon repeated appends.
-    for (int i = 0; i < 1000; i++) {
-      assertEquals(builder.length(), i);
-      builder.appendCodePoint('x', null);
-      assertEquals(builder.length(), i + 1);
-    }
-  }
-
-  @Test
-  public void testCodePoints() {
-      NumberStringBuilder nsb = new NumberStringBuilder();
-      assertEquals("First is -1 on empty string", -1, nsb.getFirstCodePoint());
-      assertEquals("Last is -1 on empty string", -1, nsb.getLastCodePoint());
-      assertEquals("Length is 0 on empty string", 0, nsb.codePointCount());
-
-      nsb.append("q", null);
-      assertEquals("First is q", 'q', nsb.getFirstCodePoint());
-      assertEquals("Last is q", 'q', nsb.getLastCodePoint());
-      assertEquals("0th is q", 'q', nsb.codePointAt(0));
-      assertEquals("Before 1st is q", 'q', nsb.codePointBefore(1));
-      assertEquals("Code point count is 1", 1, nsb.codePointCount());
-
-      // 🚀 is two char16s
-      nsb.append("🚀", null);
-      assertEquals("First is still q", 'q', nsb.getFirstCodePoint());
-      assertEquals("Last is space ship", 128640, nsb.getLastCodePoint());
-      assertEquals("1st is space ship", 128640, nsb.codePointAt(1));
-      assertEquals("Before 1st is q", 'q', nsb.codePointBefore(1));
-      assertEquals("Before 3rd is space ship", 128640, nsb.codePointBefore(3));
-      assertEquals("Code point count is 2", 2, nsb.codePointCount());
-  }
-
-  private static void assertCharSequenceEquals(CharSequence a, CharSequence b) {
-    assertEquals(a.toString(), b.toString());
-
-    assertEquals(a.length(), b.length());
-    for (int i = 0; i < a.length(); i++) {
-      assertEquals(a.charAt(i), b.charAt(i));
     }
 
-    int start = Math.min(2, a.length());
-    int end = Math.min(12, a.length());
-    if (start != end) {
-      assertCharSequenceEquals(a.subSequence(start, end), b.subSequence(start, end));
+    @Test
+    public void testSplice() {
+        Object[][] cases = {
+                { "", 0, 0 },
+                { "abc", 0, 0 },
+                { "abc", 1, 1 },
+                { "abc", 1, 2 },
+                { "abc", 0, 2 },
+                { "abc", 0, 3 },
+                { "lorem ipsum dolor sit amet", 8, 8 },
+                { "lorem ipsum dolor sit amet", 8, 11 }, // 3 chars, equal to replacement "xyz"
+                { "lorem ipsum dolor sit amet", 8, 18 } }; // 10 chars, larger than several replacements
+
+        StringBuilder sb1 = new StringBuilder();
+        NumberStringBuilder sb2 = new NumberStringBuilder();
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            int startThis = (Integer) cas[1];
+            int endThis = (Integer) cas[2];
+            for (String replacement : EXAMPLE_STRINGS) {
+                // Test replacement with full string
+                sb1.setLength(0);
+                sb1.append(input);
+                sb1.replace(startThis, endThis, replacement);
+                sb2.clear();
+                sb2.append(input, null);
+                sb2.splice(startThis, endThis, replacement, 0, replacement.length(), null);
+                assertCharSequenceEquals(sb1, sb2);
+
+                // Test replacement with partial string
+                if (replacement.length() <= 2) {
+                    continue;
+                }
+                sb1.setLength(0);
+                sb1.append(input);
+                sb1.replace(startThis, endThis, replacement.substring(1, 3));
+                sb2.clear();
+                sb2.append(input, null);
+                sb2.splice(startThis, endThis, replacement, 1, 3, null);
+                assertCharSequenceEquals(sb1, sb2);
+            }
+        }
     }
-  }
+
+    @Test
+    public void testInsertAppendCodePoint() {
+        int[] cases = { 0, 1, 60, 127, 128, 0x7fff, 0x8000, 0xffff, 0x10000, 0x1f000, 0x10ffff };
+
+        StringBuilder sb1 = new StringBuilder();
+        NumberStringBuilder sb2 = new NumberStringBuilder();
+        for (int cas : cases) {
+            NumberStringBuilder sb3 = new NumberStringBuilder();
+            sb1.appendCodePoint(cas);
+            sb2.appendCodePoint(cas, null);
+            sb3.appendCodePoint(cas, null);
+            assertCharSequenceEquals(sb1, sb2);
+            assertEquals(Character.codePointAt(sb3, 0), cas);
+
+            StringBuilder sb4 = new StringBuilder();
+            NumberStringBuilder sb5 = new NumberStringBuilder();
+            sb4.append("😇");
+            sb4.appendCodePoint(cas); // Java StringBuilder has no insertCodePoint()
+            sb4.append("xx");
+            sb5.append("😇xx", null);
+            sb5.insertCodePoint(2, cas, null);
+            assertCharSequenceEquals(sb4, sb5);
+        }
+    }
+
+    @Test
+    public void testCopy() {
+        for (String str : EXAMPLE_STRINGS) {
+            NumberStringBuilder sb1 = new NumberStringBuilder();
+            sb1.append(str, null);
+            NumberStringBuilder sb2 = new NumberStringBuilder(sb1);
+            assertCharSequenceEquals(sb1, sb2);
+            assertTrue(sb1.contentEquals(sb2));
+
+            sb1.append("12345", null);
+            assertNotEquals(sb1.length(), sb2.length());
+            assertFalse(sb1.contentEquals(sb2));
+        }
+    }
+
+    @Test
+    public void testFields() {
+        for (String str : EXAMPLE_STRINGS) {
+            NumberStringBuilder sb = new NumberStringBuilder();
+            sb.append(str, null);
+            sb.append(str, NumberFormat.Field.CURRENCY);
+            Field[] fields = sb.toFieldArray();
+            assertEquals(str.length() * 2, fields.length);
+            for (int i = 0; i < str.length(); i++) {
+                assertEquals(null, fields[i]);
+                assertEquals(null, sb.fieldAt(i));
+                assertEquals(NumberFormat.Field.CURRENCY, fields[i + str.length()]);
+                assertEquals(NumberFormat.Field.CURRENCY, sb.fieldAt(i + str.length()));
+            }
+
+            // Very basic FieldPosition test. More robust tests happen in NumberFormatTest.
+            // Let NumberFormatTest also take care of AttributedCharacterIterator material.
+            FieldPosition fp = new FieldPosition(NumberFormat.Field.CURRENCY);
+            sb.populateFieldPosition(fp, 0);
+            assertEquals(str.length(), fp.getBeginIndex());
+            assertEquals(str.length() * 2, fp.getEndIndex());
+
+            if (str.length() > 0) {
+                sb.insertCodePoint(2, 100, NumberFormat.Field.INTEGER);
+                fields = sb.toFieldArray();
+                assertEquals(str.length() * 2 + 1, fields.length);
+                assertEquals(fields[2], NumberFormat.Field.INTEGER);
+            }
+
+            sb.append(new NumberStringBuilder(sb));
+            sb.append(sb.toCharArray(), sb.toFieldArray());
+            int numNull = 0;
+            int numCurr = 0;
+            int numInt = 0;
+            Field[] oldFields = fields;
+            fields = sb.toFieldArray();
+            for (int i = 0; i < sb.length(); i++) {
+                assertEquals(oldFields[i % oldFields.length], fields[i]);
+                if (fields[i] == null) {
+                    numNull++;
+                } else if (fields[i] == NumberFormat.Field.CURRENCY) {
+                    numCurr++;
+                } else if (fields[i] == NumberFormat.Field.INTEGER) {
+                    numInt++;
+                } else {
+                    throw new AssertionError("Encountered unknown field in " + str);
+                }
+            }
+            assertEquals(str.length() * 4, numNull);
+            assertEquals(numNull, numCurr);
+            assertEquals(str.length() > 0 ? 4 : 0, numInt);
+
+            NumberStringBuilder sb2 = new NumberStringBuilder();
+            sb2.append(sb);
+            assertTrue(sb.contentEquals(sb2));
+            assertTrue(sb.contentEquals(sb2.toCharArray(), sb2.toFieldArray()));
+
+            sb2.insertCodePoint(0, 50, NumberFormat.Field.FRACTION);
+            assertTrue(!sb.contentEquals(sb2));
+            assertTrue(!sb.contentEquals(sb2.toCharArray(), sb2.toFieldArray()));
+        }
+    }
+
+    @Test
+    public void testUnlimitedCapacity() {
+        NumberStringBuilder builder = new NumberStringBuilder();
+        // The builder should never fail upon repeated appends.
+        for (int i = 0; i < 1000; i++) {
+            assertEquals(builder.length(), i);
+            builder.appendCodePoint('x', null);
+            assertEquals(builder.length(), i + 1);
+        }
+    }
+
+    @Test
+    public void testCodePoints() {
+        NumberStringBuilder nsb = new NumberStringBuilder();
+        assertEquals("First is -1 on empty string", -1, nsb.getFirstCodePoint());
+        assertEquals("Last is -1 on empty string", -1, nsb.getLastCodePoint());
+        assertEquals("Length is 0 on empty string", 0, nsb.codePointCount());
+
+        nsb.append("q", null);
+        assertEquals("First is q", 'q', nsb.getFirstCodePoint());
+        assertEquals("Last is q", 'q', nsb.getLastCodePoint());
+        assertEquals("0th is q", 'q', nsb.codePointAt(0));
+        assertEquals("Before 1st is q", 'q', nsb.codePointBefore(1));
+        assertEquals("Code point count is 1", 1, nsb.codePointCount());
+
+        // 🚀 is two char16s
+        nsb.append("🚀", null);
+        assertEquals("First is still q", 'q', nsb.getFirstCodePoint());
+        assertEquals("Last is space ship", 128640, nsb.getLastCodePoint());
+        assertEquals("1st is space ship", 128640, nsb.codePointAt(1));
+        assertEquals("Before 1st is q", 'q', nsb.codePointBefore(1));
+        assertEquals("Before 3rd is space ship", 128640, nsb.codePointBefore(3));
+        assertEquals("Code point count is 2", 2, nsb.codePointCount());
+    }
+
+    private static void assertCharSequenceEquals(CharSequence a, CharSequence b) {
+        assertEquals(a.toString(), b.toString());
+
+        assertEquals(a.length(), b.length());
+        for (int i = 0; i < a.length(); i++) {
+            assertEquals(a.charAt(i), b.charAt(i));
+        }
+
+        int start = Math.min(2, a.length());
+        int end = Math.min(12, a.length());
+        if (start != end) {
+            assertCharSequenceEquals(a.subSequence(start, end), b.subSequence(start, end));
+        }
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/number/PatternStringTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/number/PatternStringTest.java
index 760dc7e..0ea4b95 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/number/PatternStringTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/number/PatternStringTest.java
@@ -19,104 +19,113 @@
 @MainTestShard
 public class PatternStringTest {
 
-  @Test
-  public void testLocalized() {
-    DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
-    symbols.setDecimalSeparatorString("a");
-    symbols.setPercentString("b");
-    symbols.setMinusSignString(".");
-    symbols.setPlusSignString("'");
+    @Test
+    public void testLocalized() {
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
+        symbols.setDecimalSeparatorString("a");
+        symbols.setPercentString("b");
+        symbols.setMinusSignString(".");
+        symbols.setPlusSignString("'");
 
-    String standard = "+-abcb''a''#,##0.0%'a%'";
-    String localized = "’.'ab'c'b''a'''#,##0a0b'a%'";
-    String toStandard = "+-'ab'c'b''a'''#,##0.0%'a%'";
+        String standard = "+-abcb''a''#,##0.0%'a%'";
+        String localized = "’.'ab'c'b''a'''#,##0a0b'a%'";
+        String toStandard = "+-'ab'c'b''a'''#,##0.0%'a%'";
 
-    assertEquals(localized, PatternStringUtils.convertLocalized(standard, symbols, true));
-    assertEquals(toStandard, PatternStringUtils.convertLocalized(localized, symbols, false));
-  }
-
-  @Test
-  public void testToPatternSimple() {
-    String[][] cases = {
-      {"#", "0"},
-      {"0", "0"},
-      {"#0", "0"},
-      {"###", "0"},
-      {"0.##", "0.##"},
-      {"0.00", "0.00"},
-      {"0.00#", "0.00#"},
-      {"#E0", "#E0"},
-      {"0E0", "0E0"},
-      {"#00E00", "#00E00"},
-      {"#,##0", "#,##0"},
-      {"#;#", "0;0"},
-      {"#;-#", "0"}, // ignore a negative prefix pattern of '-' since that is the default
-      {"**##0", "**##0"},
-      {"*'x'##0", "*x##0"},
-      {"a''b0", "a''b0"},
-      {"*''##0", "*''##0"},
-      {"*📺##0", "*'📺'##0"},
-      {"*'நி'##0", "*'நி'##0"},
-    };
-
-    for (String[] cas : cases) {
-      String input = cas[0];
-      String output = cas[1];
-
-      DecimalFormatProperties properties = PatternStringParser.parseToProperties(input);
-      String actual = PatternStringUtils.propertiesToPatternString(properties);
-      assertEquals(
-          "Failed on input pattern '" + input + "', properties " + properties, output, actual);
+        assertEquals(localized, PatternStringUtils.convertLocalized(standard, symbols, true));
+        assertEquals(toStandard, PatternStringUtils.convertLocalized(localized, symbols, false));
     }
-  }
 
-  @Test
-  public void testToPatternWithProperties() {
-    Object[][] cases = {
-      {new DecimalFormatProperties().setPositivePrefix("abc"), "abc#"},
-      {new DecimalFormatProperties().setPositiveSuffix("abc"), "#abc"},
-      {new DecimalFormatProperties().setPositivePrefixPattern("abc"), "abc#"},
-      {new DecimalFormatProperties().setPositiveSuffixPattern("abc"), "#abc"},
-      {new DecimalFormatProperties().setNegativePrefix("abc"), "#;abc#"},
-      {new DecimalFormatProperties().setNegativeSuffix("abc"), "#;#abc"},
-      {new DecimalFormatProperties().setNegativePrefixPattern("abc"), "#;abc#"},
-      {new DecimalFormatProperties().setNegativeSuffixPattern("abc"), "#;#abc"},
-      {new DecimalFormatProperties().setPositivePrefix("+"), "'+'#"},
-      {new DecimalFormatProperties().setPositivePrefixPattern("+"), "+#"},
-      {new DecimalFormatProperties().setPositivePrefix("+'"), "'+'''#"},
-      {new DecimalFormatProperties().setPositivePrefix("'+"), "'''+'#"},
-      {new DecimalFormatProperties().setPositivePrefix("'"), "''#"},
-      {new DecimalFormatProperties().setPositivePrefixPattern("+''"), "+''#"},
-    };
+    @Test
+    public void testToPatternSimple() {
+        String[][] cases = {
+                { "#", "0" },
+                { "0", "0" },
+                { "#0", "0" },
+                { "###", "0" },
+                { "0.##", "0.##" },
+                { "0.00", "0.00" },
+                { "0.00#", "0.00#" },
+                { "#E0", "#E0" },
+                { "0E0", "0E0" },
+                { "#00E00", "#00E00" },
+                { "#,##0", "#,##0" },
+                { "#;#", "0;0" },
+                { "#;-#", "0" }, // ignore a negative prefix pattern of '-' since that is the default
+                { "**##0", "**##0" },
+                { "*'x'##0", "*x##0" },
+                { "a''b0", "a''b0" },
+                { "*''##0", "*''##0" },
+                { "*📺##0", "*'📺'##0" },
+                { "*'நி'##0", "*'நி'##0" }, };
 
-    for (Object[] cas : cases) {
-      DecimalFormatProperties input = (DecimalFormatProperties) cas[0];
-      String output = (String) cas[1];
+        for (String[] cas : cases) {
+            String input = cas[0];
+            String output = cas[1];
 
-      String actual = PatternStringUtils.propertiesToPatternString(input);
-      assertEquals("Failed on input properties " + input, output, actual);
+            DecimalFormatProperties properties = PatternStringParser.parseToProperties(input);
+            String actual = PatternStringUtils.propertiesToPatternString(properties);
+            assertEquals("Failed on input pattern '" + input + "', properties " + properties,
+                    output,
+                    actual);
+        }
     }
-  }
 
-  @Test
-  public void testExceptionOnInvalid() {
-    String[] invalidPatterns = {
-      "#.#.#", "0#", "0#.", ".#0", "0#.#0", "@0", "0@", "0,", "0,,", "0,,0", "0,,0,", "#,##0E0"
-    };
+    @Test
+    public void testToPatternWithProperties() {
+        Object[][] cases = {
+                { new DecimalFormatProperties().setPositivePrefix("abc"), "abc#" },
+                { new DecimalFormatProperties().setPositiveSuffix("abc"), "#abc" },
+                { new DecimalFormatProperties().setPositivePrefixPattern("abc"), "abc#" },
+                { new DecimalFormatProperties().setPositiveSuffixPattern("abc"), "#abc" },
+                { new DecimalFormatProperties().setNegativePrefix("abc"), "#;abc#" },
+                { new DecimalFormatProperties().setNegativeSuffix("abc"), "#;#abc" },
+                { new DecimalFormatProperties().setNegativePrefixPattern("abc"), "#;abc#" },
+                { new DecimalFormatProperties().setNegativeSuffixPattern("abc"), "#;#abc" },
+                { new DecimalFormatProperties().setPositivePrefix("+"), "'+'#" },
+                { new DecimalFormatProperties().setPositivePrefixPattern("+"), "+#" },
+                { new DecimalFormatProperties().setPositivePrefix("+'"), "'+'''#" },
+                { new DecimalFormatProperties().setPositivePrefix("'+"), "'''+'#" },
+                { new DecimalFormatProperties().setPositivePrefix("'"), "''#" },
+                { new DecimalFormatProperties().setPositivePrefixPattern("+''"), "+''#" }, };
 
-    for (String pattern : invalidPatterns) {
-      try {
-        PatternStringParser.parseToProperties(pattern);
-        fail("Didn't throw IllegalArgumentException when parsing pattern: " + pattern);
-      } catch (IllegalArgumentException e) {
-      }
+        for (Object[] cas : cases) {
+            DecimalFormatProperties input = (DecimalFormatProperties) cas[0];
+            String output = (String) cas[1];
+
+            String actual = PatternStringUtils.propertiesToPatternString(input);
+            assertEquals("Failed on input properties " + input, output, actual);
+        }
     }
-  }
 
-  @Test
-  public void testBug13117() {
-    DecimalFormatProperties expected = PatternStringParser.parseToProperties("0");
-    DecimalFormatProperties actual = PatternStringParser.parseToProperties("0;");
-    assertEquals("Should not consume negative subpattern", expected, actual);
-  }
+    @Test
+    public void testExceptionOnInvalid() {
+        String[] invalidPatterns = {
+                "#.#.#",
+                "0#",
+                "0#.",
+                ".#0",
+                "0#.#0",
+                "@0",
+                "0@",
+                "0,",
+                "0,,",
+                "0,,0",
+                "0,,0,",
+                "#,##0E0" };
+
+        for (String pattern : invalidPatterns) {
+            try {
+                PatternStringParser.parseToProperties(pattern);
+                fail("Didn't throw IllegalArgumentException when parsing pattern: " + pattern);
+            } catch (IllegalArgumentException e) {
+            }
+        }
+    }
+
+    @Test
+    public void testBug13117() {
+        DecimalFormatProperties expected = PatternStringParser.parseToProperties("0");
+        DecimalFormatProperties actual = PatternStringParser.parseToProperties("0;");
+        assertEquals("Should not consume negative subpattern", expected, actual);
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/number/PropertiesTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/number/PropertiesTest.java
index 784bb4b..38d05a8 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/number/PropertiesTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/number/PropertiesTest.java
@@ -32,9 +32,8 @@
 import android.icu.dev.test.serializable.SerializableTestUtility;
 import android.icu.impl.number.DecimalFormatProperties;
 import android.icu.impl.number.Padder.PadPosition;
-import android.icu.impl.number.Parse.GroupingMode;
-import android.icu.impl.number.Parse.ParseMode;
 import android.icu.impl.number.PatternStringParser;
+import android.icu.impl.number.parse.NumberParserImpl.ParseMode;
 import android.icu.text.CompactDecimalFormat.CompactStyle;
 import android.icu.text.CurrencyPluralInfo;
 import android.icu.text.MeasureFormat.FormatWidth;
@@ -48,322 +47,335 @@
 @MainTestShard
 public class PropertiesTest {
 
-  @Test
-  public void testBasicEquals() {
-    DecimalFormatProperties p1 = new DecimalFormatProperties();
-    DecimalFormatProperties p2 = new DecimalFormatProperties();
-    assertEquals(p1, p2);
+    @Test
+    public void testBasicEquals() {
+        DecimalFormatProperties p1 = new DecimalFormatProperties();
+        DecimalFormatProperties p2 = new DecimalFormatProperties();
+        assertEquals(p1, p2);
 
-    p1.setPositivePrefix("abc");
-    assertNotEquals(p1, p2);
-    p2.setPositivePrefix("xyz");
-    assertNotEquals(p1, p2);
-    p1.setPositivePrefix("xyz");
-    assertEquals(p1, p2);
-  }
+        p1.setPositivePrefix("abc");
+        assertNotEquals(p1, p2);
+        p2.setPositivePrefix("xyz");
+        assertNotEquals(p1, p2);
+        p1.setPositivePrefix("xyz");
+        assertEquals(p1, p2);
+    }
 
-  @Test
-  public void testFieldCoverage() {
-    DecimalFormatProperties p0 = new DecimalFormatProperties();
-    DecimalFormatProperties p1 = new DecimalFormatProperties();
-    DecimalFormatProperties p2 = new DecimalFormatProperties();
-    DecimalFormatProperties p3 = new DecimalFormatProperties();
-    DecimalFormatProperties p4 = new DecimalFormatProperties();
+    @Test
+    public void testFieldCoverage() {
+        DecimalFormatProperties p0 = new DecimalFormatProperties();
+        DecimalFormatProperties p1 = new DecimalFormatProperties();
+        DecimalFormatProperties p2 = new DecimalFormatProperties();
+        DecimalFormatProperties p3 = new DecimalFormatProperties();
+        DecimalFormatProperties p4 = new DecimalFormatProperties();
 
-    Set<Integer> hashCodes = new HashSet<Integer>();
-    Field[] fields = DecimalFormatProperties.class.getDeclaredFields();
-    for (Field field : fields) {
-      if (Modifier.isStatic(field.getModifiers())) {
-        continue;
-      }
+        Set<Integer> hashCodes = new HashSet<Integer>();
+        Field[] fields = DecimalFormatProperties.class.getDeclaredFields();
+        for (Field field : fields) {
+            if (Modifier.isStatic(field.getModifiers())) {
+                continue;
+            }
 
-      // Check for getters and setters
-      String fieldNamePascalCase =
-          Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
-      String getterName = "get" + fieldNamePascalCase;
-      String setterName = "set" + fieldNamePascalCase;
-      Method getter, setter;
-      try {
-        getter = DecimalFormatProperties.class.getMethod(getterName);
-        assertEquals(
-            "Getter does not return correct type", field.getType(), getter.getReturnType());
-      } catch (NoSuchMethodException e) {
-        fail("Could not find method " + getterName + " for field " + field);
-        continue;
-      } catch (SecurityException e) {
-        fail("Could not access method " + getterName + " for field " + field);
-        continue;
-      }
-      try {
-        setter = DecimalFormatProperties.class.getMethod(setterName, field.getType());
-        assertEquals(
-            "Method " + setterName + " does not return correct type",
-            DecimalFormatProperties.class,
-            setter.getReturnType());
-      } catch (NoSuchMethodException e) {
-        fail("Could not find method " + setterName + " for field " + field);
-        continue;
-      } catch (SecurityException e) {
-        fail("Could not access method " + setterName + " for field " + field);
-        continue;
-      }
+            // Check for getters and setters
+            String fieldNamePascalCase = Character.toUpperCase(field.getName().charAt(0))
+                    + field.getName().substring(1);
+            String getterName = "get" + fieldNamePascalCase;
+            String setterName = "set" + fieldNamePascalCase;
+            Method getter, setter;
+            try {
+                getter = DecimalFormatProperties.class.getMethod(getterName);
+                assertEquals("Getter does not return correct type",
+                        field.getType(),
+                        getter.getReturnType());
+            } catch (NoSuchMethodException e) {
+                fail("Could not find method " + getterName + " for field " + field);
+                continue;
+            } catch (SecurityException e) {
+                fail("Could not access method " + getterName + " for field " + field);
+                continue;
+            }
+            try {
+                setter = DecimalFormatProperties.class.getMethod(setterName, field.getType());
+                assertEquals("Method " + setterName + " does not return correct type",
+                        DecimalFormatProperties.class,
+                        setter.getReturnType());
+            } catch (NoSuchMethodException e) {
+                fail("Could not find method " + setterName + " for field " + field);
+                continue;
+            } catch (SecurityException e) {
+                fail("Could not access method " + setterName + " for field " + field);
+                continue;
+            }
 
-      // Check for parameter name equality.
-      // The parameter name is not always available, depending on compiler settings.
-      // TODO: Enable in Java 8
-      /*
-      Parameter param = setter.getParameters()[0];
-      if (!param.getName().subSequence(0, 3).equals("arg")) {
-        assertEquals("Parameter name should equal field name", field.getName(), param.getName());
-      }
-      */
+            // Check for parameter name equality.
+            // The parameter name is not always available, depending on compiler settings.
+            // TODO: Enable in Java 8
+            /*
+             * Parameter param = setter.getParameters()[0]; if (!param.getName().subSequence(0,
+             * 3).equals("arg")) { assertEquals("Parameter name should equal field name",
+             * field.getName(), param.getName()); }
+             */
 
-      try {
-        // Check for default value (should be null for objects)
-        if (field.getType() != Integer.TYPE && field.getType() != Boolean.TYPE) {
-          Object default0 = getter.invoke(p0);
-          assertEquals("Field " + field + " has non-null default value:", null, default0);
+            try {
+                // Check for default value (should be null for objects)
+                if (field.getType() != Integer.TYPE && field.getType() != Boolean.TYPE) {
+                    Object default0 = getter.invoke(p0);
+                    assertEquals("Field " + field + " has non-null default value:", null, default0);
+                }
+
+                // Check for getter, equals, and hash code behavior
+                Object val0 = getSampleValueForType(field.getType(), 0);
+                Object val1 = getSampleValueForType(field.getType(), 1);
+                Object val2 = getSampleValueForType(field.getType(), 2);
+                assertNotEquals(val0, val1);
+                setter.invoke(p1, val0);
+                setter.invoke(p2, val0);
+                assertEquals(p1, p2);
+                assertEquals(p1.hashCode(), p2.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(p2));
+                assertEquals(getter.invoke(p1), val0);
+                assertNotEquals(getter.invoke(p1), val1);
+                hashCodes.add(p1.hashCode());
+                setter.invoke(p1, val1);
+                assertNotEquals("Field " + field + " is missing from equals()", p1, p2);
+                assertNotEquals(getter.invoke(p1), getter.invoke(p2));
+                assertNotEquals(getter.invoke(p1), val0);
+                assertEquals(getter.invoke(p1), val1);
+                setter.invoke(p1, val0);
+                assertEquals("Field " + field + " setter might have side effects", p1, p2);
+                assertEquals(p1.hashCode(), p2.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(p2));
+                setter.invoke(p1, val1);
+                setter.invoke(p2, val1);
+                assertEquals(p1, p2);
+                assertEquals(p1.hashCode(), p2.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(p2));
+                setter.invoke(p1, val2);
+                setter.invoke(p1, val1);
+                assertEquals("Field " + field + " setter might have side effects", p1, p2);
+                assertEquals(p1.hashCode(), p2.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(p2));
+                hashCodes.add(p1.hashCode());
+
+                // Check for clone behavior
+                DecimalFormatProperties copy = p1.clone();
+                assertEquals("Field " + field + " did not get copied in clone", p1, copy);
+                assertEquals(p1.hashCode(), copy.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(copy));
+
+                // Check for copyFrom behavior
+                setter.invoke(p1, val0);
+                assertNotEquals(p1, p2);
+                assertNotEquals(getter.invoke(p1), getter.invoke(p2));
+                p2.copyFrom(p1);
+                assertEquals("Field " + field + " is missing from copyFrom()", p1, p2);
+                assertEquals(p1.hashCode(), p2.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(p2));
+
+                // Load values into p3 and p4 for clear() behavior test
+                setter.invoke(p3, getSampleValueForType(field.getType(), 3));
+                hashCodes.add(p3.hashCode());
+                setter.invoke(p4, getSampleValueForType(field.getType(), 4));
+                hashCodes.add(p4.hashCode());
+            } catch (IllegalAccessException e) {
+                fail("Could not access method for field " + field);
+            } catch (IllegalArgumentException e) {
+                fail("Could call method for field " + field);
+            } catch (InvocationTargetException e) {
+                fail("Could invoke method on target for field " + field);
+            }
         }
 
-        // Check for getter, equals, and hash code behavior
-        Object val0 = getSampleValueForType(field.getType(), 0);
-        Object val1 = getSampleValueForType(field.getType(), 1);
-        Object val2 = getSampleValueForType(field.getType(), 2);
-        assertNotEquals(val0, val1);
-        setter.invoke(p1, val0);
-        setter.invoke(p2, val0);
-        assertEquals(p1, p2);
-        assertEquals(p1.hashCode(), p2.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(p2));
-        assertEquals(getter.invoke(p1), val0);
-        assertNotEquals(getter.invoke(p1), val1);
-        hashCodes.add(p1.hashCode());
-        setter.invoke(p1, val1);
-        assertNotEquals("Field " + field + " is missing from equals()", p1, p2);
-        assertNotEquals(getter.invoke(p1), getter.invoke(p2));
-        assertNotEquals(getter.invoke(p1), val0);
-        assertEquals(getter.invoke(p1), val1);
-        setter.invoke(p1, val0);
-        assertEquals("Field " + field + " setter might have side effects", p1, p2);
-        assertEquals(p1.hashCode(), p2.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(p2));
-        setter.invoke(p1, val1);
-        setter.invoke(p2, val1);
-        assertEquals(p1, p2);
-        assertEquals(p1.hashCode(), p2.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(p2));
-        setter.invoke(p1, val2);
-        setter.invoke(p1, val1);
-        assertEquals("Field " + field + " setter might have side effects", p1, p2);
-        assertEquals(p1.hashCode(), p2.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(p2));
-        hashCodes.add(p1.hashCode());
+        // Check for clear() behavior
+        assertNotEquals(p3, p4);
+        p3.clear();
+        p4.clear();
+        assertEquals("A field is missing from the clear() function", p3, p4);
 
-        // Check for clone behavior
-        DecimalFormatProperties copy = p1.clone();
-        assertEquals("Field " + field + " did not get copied in clone", p1, copy);
-        assertEquals(p1.hashCode(), copy.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(copy));
-
-        // Check for copyFrom behavior
-        setter.invoke(p1, val0);
-        assertNotEquals(p1, p2);
-        assertNotEquals(getter.invoke(p1), getter.invoke(p2));
-        p2.copyFrom(p1);
-        assertEquals("Field " + field + " is missing from copyFrom()", p1, p2);
-        assertEquals(p1.hashCode(), p2.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(p2));
-
-        // Load values into p3 and p4 for clear() behavior test
-        setter.invoke(p3, getSampleValueForType(field.getType(), 3));
-        hashCodes.add(p3.hashCode());
-        setter.invoke(p4, getSampleValueForType(field.getType(), 4));
-        hashCodes.add(p4.hashCode());
-      } catch (IllegalAccessException e) {
-        fail("Could not access method for field " + field);
-      } catch (IllegalArgumentException e) {
-        fail("Could call method for field " + field);
-      } catch (InvocationTargetException e) {
-        fail("Could invoke method on target for field " + field);
-      }
+        // A good hashCode() implementation should produce very few collisions. We added at most
+        // 4*fields.length codes to the set. We'll say the implementation is good if we had at least
+        // fields.length unique values.
+        // TODO: Should the requirement be stronger than this?
+        assertTrue(
+                "Too many hash code collisions: " + hashCodes.size() + " out of " + (fields.length * 4),
+                hashCodes.size() >= fields.length);
     }
 
-    // Check for clear() behavior
-    assertNotEquals(p3, p4);
-    p3.clear();
-    p4.clear();
-    assertEquals("A field is missing from the clear() function", p3, p4);
+    /**
+     * Creates a valid sample instance of the given type. Used to simulate getters and setters.
+     *
+     * @param type
+     *            The type to generate.
+     * @param seed
+     *            An integer seed, guaranteed to be positive. The same seed should generate two instances
+     *            that are equal. A different seed should in general generate two instances that are not
+     *            equal; this might not always be possible, such as with booleans or enums where there
+     *            are limited possible values.
+     * @return An instance of the specified type.
+     */
+    Object getSampleValueForType(Class<?> type, int seed) {
+        if (type == Integer.TYPE) {
+            return seed * 1000001;
 
-    // A good hashCode() implementation should produce very few collisions.  We added at most
-    // 4*fields.length codes to the set.  We'll say the implementation is good if we had at least
-    // fields.length unique values.
-    // TODO: Should the requirement be stronger than this?
-    assertTrue(
-        "Too many hash code collisions: " + hashCodes.size() + " out of " + (fields.length * 4),
-        hashCodes.size() >= fields.length);
-  }
+        } else if (type == Boolean.TYPE) {
+            return (seed % 2) == 0;
 
-  /**
-   * Creates a valid sample instance of the given type. Used to simulate getters and setters.
-   *
-   * @param type The type to generate.
-   * @param seed An integer seed, guaranteed to be positive. The same seed should generate two
-   *     instances that are equal. A different seed should in general generate two instances that
-   *     are not equal; this might not always be possible, such as with booleans or enums where
-   *     there are limited possible values.
-   * @return An instance of the specified type.
-   */
-  Object getSampleValueForType(Class<?> type, int seed) {
-    if (type == Integer.TYPE) {
-      return seed * 1000001;
+        } else if (type == BigDecimal.class) {
+            if (seed == 0)
+                return null;
+            return new BigDecimal(seed * 1000002);
 
-    } else if (type == Boolean.TYPE) {
-      return (seed % 2) == 0;
+        } else if (type == String.class) {
+            if (seed == 0)
+                return null;
+            return BigInteger.valueOf(seed * 1000003).toString(32);
 
-    } else if (type == BigDecimal.class) {
-      if (seed == 0) return null;
-      return new BigDecimal(seed * 1000002);
+        } else if (type == CompactStyle.class) {
+            if (seed == 0)
+                return null;
+            CompactStyle[] values = CompactStyle.values();
+            return values[seed % values.length];
 
-    } else if (type == String.class) {
-      if (seed == 0) return null;
-      return BigInteger.valueOf(seed * 1000003).toString(32);
+        } else if (type == Currency.class) {
+            if (seed == 0)
+                return null;
+            Object[] currencies = Currency.getAvailableCurrencies().toArray();
+            return currencies[seed % currencies.length];
 
-    } else if (type == CompactStyle.class) {
-      if (seed == 0) return null;
-      CompactStyle[] values = CompactStyle.values();
-      return values[seed % values.length];
+        } else if (type == CurrencyPluralInfo.class) {
+            if (seed == 0)
+                return null;
+            ULocale[] locales = ULocale.getAvailableLocales();
+            return CurrencyPluralInfo.getInstance(locales[seed % locales.length]);
 
-    } else if (type == Currency.class) {
-      if (seed == 0) return null;
-      Object[] currencies = Currency.getAvailableCurrencies().toArray();
-      return currencies[seed % currencies.length];
+        } else if (type == CurrencyUsage.class) {
+            if (seed == 0)
+                return null;
+            CurrencyUsage[] values = CurrencyUsage.values();
+            return values[seed % values.length];
 
-    } else if (type == CurrencyPluralInfo.class) {
-      if (seed == 0) return null;
-      ULocale[] locales = ULocale.getAvailableLocales();
-      return CurrencyPluralInfo.getInstance(locales[seed % locales.length]);
+        } else if (type == FormatWidth.class) {
+            if (seed == 0)
+                return null;
+            FormatWidth[] values = FormatWidth.values();
+            return values[seed % values.length];
 
-    } else if (type == CurrencyUsage.class) {
-      if (seed == 0) return null;
-      CurrencyUsage[] values = CurrencyUsage.values();
-      return values[seed % values.length];
+        } else if (type == Map.class) {
+            // Map<String,Map<String,String>> for compactCustomData property
+            if (seed == 0)
+                return null;
+            Map<String, Map<String, String>> outer = new HashMap<String, Map<String, String>>();
+            Map<String, String> inner = new HashMap<String, String>();
+            inner.put("one", "0 thousand");
+            StringBuilder magnitudeKey = new StringBuilder();
+            magnitudeKey.append("1000");
+            for (int i = 0; i < seed % 9; i++) {
+                magnitudeKey.append("0");
+            }
+            outer.put(magnitudeKey.toString(), inner);
+            return outer;
 
-    } else if (type == GroupingMode.class) {
-      if (seed == 0) return null;
-      GroupingMode[] values = GroupingMode.values();
-      return values[seed % values.length];
+        } else if (type == MathContext.class) {
+            if (seed == 0)
+                return null;
+            RoundingMode[] modes = RoundingMode.values();
+            return new MathContext(seed, modes[seed % modes.length]);
 
-    } else if (type == FormatWidth.class) {
-      if (seed == 0) return null;
-      FormatWidth[] values = FormatWidth.values();
-      return values[seed % values.length];
+        } else if (type == MeasureUnit.class) {
+            if (seed == 0)
+                return null;
+            Object[] units = MeasureUnit.getAvailable().toArray();
+            return units[seed % units.length];
 
-    } else if (type == Map.class) {
-      // Map<String,Map<String,String>> for compactCustomData property
-      if (seed == 0) return null;
-      Map<String, Map<String, String>> outer = new HashMap<String, Map<String, String>>();
-      Map<String, String> inner = new HashMap<String, String>();
-      inner.put("one", "0 thousand");
-      StringBuilder magnitudeKey = new StringBuilder();
-      magnitudeKey.append("1000");
-      for (int i = 0; i < seed % 9; i++) {
-        magnitudeKey.append("0");
-      }
-      outer.put(magnitudeKey.toString(), inner);
-      return outer;
+        } else if (type == PadPosition.class) {
+            if (seed == 0)
+                return null;
+            PadPosition[] values = PadPosition.values();
+            return values[seed % values.length];
 
-    } else if (type == MathContext.class) {
-      if (seed == 0) return null;
-      RoundingMode[] modes = RoundingMode.values();
-      return new MathContext(seed, modes[seed % modes.length]);
+        } else if (type == ParseMode.class) {
+            if (seed == 0)
+                return null;
+            ParseMode[] values = ParseMode.values();
+            return values[seed % values.length];
 
-    } else if (type == MeasureUnit.class) {
-      if (seed == 0) return null;
-      Object[] units = MeasureUnit.getAvailable().toArray();
-      return units[seed % units.length];
+        } else if (type == PluralRules.class) {
+            if (seed == 0)
+                return null;
+            ULocale[] locales = PluralRules.getAvailableULocales();
+            return PluralRules.forLocale(locales[seed % locales.length]);
 
-    } else if (type == PadPosition.class) {
-      if (seed == 0) return null;
-      PadPosition[] values = PadPosition.values();
-      return values[seed % values.length];
+        } else if (type == RoundingMode.class) {
+            if (seed == 0)
+                return null;
+            RoundingMode[] values = RoundingMode.values();
+            return values[seed % values.length];
 
-    } else if (type == ParseMode.class) {
-      if (seed == 0) return null;
-      ParseMode[] values = ParseMode.values();
-      return values[seed % values.length];
-
-    } else if (type == PluralRules.class) {
-      if (seed == 0) return null;
-      ULocale[] locales = PluralRules.getAvailableULocales();
-      return PluralRules.forLocale(locales[seed % locales.length]);
-
-    } else if (type == RoundingMode.class) {
-      if (seed == 0) return null;
-      RoundingMode[] values = RoundingMode.values();
-      return values[seed % values.length];
-
-    } else {
-      fail("Don't know how to handle type " + type + ". Please add it to getSampleValueForType().");
-      return null;
-    }
-  }
-
-  @Test
-  public void TestBasicSerializationRoundTrip() throws IOException, ClassNotFoundException {
-    DecimalFormatProperties props0 = new DecimalFormatProperties();
-
-    // Write values to some of the fields
-    PatternStringParser.parseToExistingProperties("A-**####,#00.00#b¤", props0);
-
-    // Write to byte stream
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    ObjectOutputStream oos = new ObjectOutputStream(baos);
-    oos.writeObject(props0);
-    oos.flush();
-    baos.close();
-    byte[] bytes = baos.toByteArray();
-
-    // Read from byte stream
-    ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
-    Object obj = ois.readObject();
-    ois.close();
-    DecimalFormatProperties props1 = (DecimalFormatProperties) obj;
-
-    // Test equality
-    assertEquals("Did not round-trip through serialization", props0, props1);
-  }
-
-  /** Handler for serialization compatibility test suite. */
-  public static class PropertiesHandler implements SerializableTestUtility.Handler {
-
-    @Override
-    public Object[] getTestObjects() {
-      return new Object[] {
-        new DecimalFormatProperties(),
-        PatternStringParser.parseToProperties("x#,##0.00%"),
-        new DecimalFormatProperties().setCompactStyle(CompactStyle.LONG).setMinimumExponentDigits(2)
-      };
+        } else {
+            fail("Don't know how to handle type "
+                    + type
+                    + ". Please add it to getSampleValueForType().");
+            return null;
+        }
     }
 
-    @Override
-    public boolean hasSameBehavior(Object a, Object b) {
-      return a.equals(b);
-    }
-  }
+    @Test
+    public void TestBasicSerializationRoundTrip() throws IOException, ClassNotFoundException {
+        DecimalFormatProperties props0 = new DecimalFormatProperties();
 
-  /** Handler for the ICU 59 class named "Properties" before it was renamed to "DecimalFormatProperties". */
-  public static class ICU59PropertiesHandler implements SerializableTestUtility.Handler {
+        // Write values to some of the fields
+        PatternStringParser.parseToExistingProperties("A-**####,#00.00#b¤", props0);
 
-    @Override
-    public Object[] getTestObjects() {
-      return new Object[] {
-        new android.icu.impl.number.Properties()
-      };
+        // Write to byte stream
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(props0);
+        oos.flush();
+        baos.close();
+        byte[] bytes = baos.toByteArray();
+
+        // Read from byte stream
+        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
+        Object obj = ois.readObject();
+        ois.close();
+        DecimalFormatProperties props1 = (DecimalFormatProperties) obj;
+
+        // Test equality
+        assertEquals("Did not round-trip through serialization", props0, props1);
     }
 
-    @Override
-    public boolean hasSameBehavior(Object a, Object b) {
-      return true;
+    /** Handler for serialization compatibility test suite. */
+    public static class PropertiesHandler implements SerializableTestUtility.Handler {
+
+        @Override
+        public Object[] getTestObjects() {
+            return new Object[] {
+                    new DecimalFormatProperties(),
+                    PatternStringParser.parseToProperties("x#,##0.00%"),
+                    new DecimalFormatProperties().setCompactStyle(CompactStyle.LONG)
+                            .setMinimumExponentDigits(2) };
+        }
+
+        @Override
+        public boolean hasSameBehavior(Object a, Object b) {
+            return a.equals(b);
+        }
     }
-  }
+
+    /**
+     * Handler for the ICU 59 class named "Properties" before it was renamed to
+     * "DecimalFormatProperties".
+     */
+    public static class ICU59PropertiesHandler implements SerializableTestUtility.Handler {
+
+        @Override
+        public Object[] getTestObjects() {
+            return new Object[] { new android.icu.impl.number.Properties() };
+        }
+
+        @Override
+        public boolean hasSameBehavior(Object a, Object b) {
+            return true;
+        }
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/number/UnicodeSetStaticCacheTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/number/UnicodeSetStaticCacheTest.java
new file mode 100644
index 0000000..54e5559
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/number/UnicodeSetStaticCacheTest.java
@@ -0,0 +1,92 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package android.icu.dev.test.number;
+
+import static android.icu.impl.number.parse.UnicodeSetStaticCache.get;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import android.icu.impl.number.parse.UnicodeSetStaticCache.Key;
+import android.icu.lang.UCharacter;
+import android.icu.text.DecimalFormatSymbols;
+import android.icu.text.UnicodeSet;
+import android.icu.util.ULocale;
+import android.icu.testsharding.MainTestShard;
+
+/**
+ * @author sffc
+ *
+ */
+@MainTestShard
+public class UnicodeSetStaticCacheTest {
+
+    @Test
+    public void testSetCoverage() {
+        // Lenient comma/period should be supersets of strict comma/period;
+        // it also makes the coverage logic cheaper.
+        assertTrue("COMMA should be superset of STRICT_COMMA",
+                get(Key.COMMA).containsAll(get(Key.STRICT_COMMA)));
+        assertTrue("PERIOD should be superset of STRICT_PERIOD",
+                get(Key.PERIOD).containsAll(get(Key.STRICT_PERIOD)));
+
+        UnicodeSet decimals = get(Key.STRICT_COMMA).cloneAsThawed().addAll(get(Key.STRICT_PERIOD))
+                .freeze();
+        UnicodeSet grouping = decimals.cloneAsThawed().addAll(get(Key.OTHER_GROUPING_SEPARATORS))
+                .freeze();
+        UnicodeSet plusSign = get(Key.PLUS_SIGN);
+        UnicodeSet minusSign = get(Key.MINUS_SIGN);
+        UnicodeSet percent = get(Key.PERCENT_SIGN);
+        UnicodeSet permille = get(Key.PERMILLE_SIGN);
+        UnicodeSet infinity = get(Key.INFINITY);
+        UnicodeSet nanLead = get(Key.NAN_LEAD);
+        UnicodeSet scientificLead = get(Key.SCIENTIFIC_LEAD);
+
+        for (ULocale locale : ULocale.getAvailableLocales()) {
+            DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(locale);
+
+            assertInSet(locale, decimals, dfs.getDecimalSeparatorString());
+            assertInSet(locale, grouping, dfs.getGroupingSeparatorString());
+            assertInSet(locale, plusSign, dfs.getPlusSignString());
+            assertInSet(locale, minusSign, dfs.getMinusSignString());
+            assertInSet(locale, percent, dfs.getPercentString());
+            assertInSet(locale, permille, dfs.getPerMillString());
+            assertInSet(locale, infinity, dfs.getInfinity());
+            assertInSet(locale, nanLead, dfs.getNaN().codePointAt(0));
+            assertInSet(locale, nanLead, UCharacter.foldCase(dfs.getNaN(), true).codePointAt(0));
+            assertInSet(locale,
+                    scientificLead,
+                    UCharacter.foldCase(dfs.getExponentSeparator(), true).codePointAt(0));
+        }
+    }
+
+    @Test
+    public void testFrozen() {
+        for (Key key : Key.values()) {
+            assertTrue(get(key).isFrozen());
+        }
+    }
+
+    static void assertInSet(ULocale locale, UnicodeSet set, String str) {
+        if (str.codePointCount(0, str.length()) != 1) {
+            // Ignore locale strings with more than one code point (usually a bidi mark)
+            return;
+        }
+        assertInSet(locale, set, str.codePointAt(0));
+    }
+
+    static void assertInSet(ULocale locale, UnicodeSet set, int cp) {
+        // If this test case fails, add the specified code point to the corresponding set in
+        // UnicodeSetStaticCache.java
+        assertTrue(
+                locale
+                        + " U+"
+                        + Integer.toHexString(cp)
+                        + " ("
+                        + UCharacter.toString(cp)
+                        + ") should be in "
+                        + set,
+                set.contains(cp));
+    }
+}
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorTest.java
index b7824a3..54fbf39 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorTest.java
@@ -10,11 +10,8 @@
 package android.icu.dev.test.rbbi;
 
 import java.text.StringCharacterIterator;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Locale;
 
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -26,190 +23,19 @@
 import android.icu.testsharding.MainTestShard;
 
 @MainTestShard
-@SuppressWarnings("unused")
 @RunWith(JUnit4.class)
 public class BreakIteratorTest extends TestFmwk
 {
-    private BreakIterator characterBreak;
-    private BreakIterator wordBreak;
-    private BreakIterator lineBreak;
-    private BreakIterator sentenceBreak;
-    private BreakIterator titleBreak;
-
     public BreakIteratorTest()
     {
 
     }
 
-    @Before
-    public void init(){
-        characterBreak = BreakIterator.getCharacterInstance();
-        wordBreak = BreakIterator.getWordInstance();
-        lineBreak = BreakIterator.getLineInstance();
-        //logln("Creating sentence iterator...");
-        sentenceBreak = BreakIterator.getSentenceInstance();
-        //logln("Finished creating sentence iterator...");
-        titleBreak = BreakIterator.getTitleInstance();
-    }
+
     //=========================================================================
     // general test subroutines
     //=========================================================================
 
-    private List<String> _testFirstAndNext(BreakIterator bi, String text) {
-        int p = bi.first();
-        int lastP = p;
-        List<String> result = new ArrayList<String>();
-
-        if (p != 0)
-            errln("first() returned " + p + " instead of 0");
-        while (p != BreakIterator.DONE) {
-            p = bi.next();
-            if (p != BreakIterator.DONE) {
-                if (p <= lastP)
-                    errln("next() failed to move forward: next() on position "
-                                    + lastP + " yielded " + p);
-
-                result.add(text.substring(lastP, p));
-            }
-            else {
-                if (lastP != text.length())
-                    errln("next() returned DONE prematurely: offset was "
-                                    + lastP + " instead of " + text.length());
-            }
-            lastP = p;
-        }
-        return result;
-    }
-
-    private List<String> _testLastAndPrevious(BreakIterator bi, String text) {
-        int p = bi.last();
-        int lastP = p;
-        List<String> result = new ArrayList<String>();
-
-        if (p != text.length())
-            errln("last() returned " + p + " instead of " + text.length());
-        while (p != BreakIterator.DONE) {
-            p = bi.previous();
-            if (p != BreakIterator.DONE) {
-                if (p >= lastP)
-                    errln("previous() failed to move backward: previous() on position "
-                                    + lastP + " yielded " + p);
-
-                result.add(0, text.substring(p, lastP));
-            }
-            else {
-                if (lastP != 0)
-                    errln("previous() returned DONE prematurely: offset was "
-                                    + lastP + " instead of 0");
-            }
-            lastP = p;
-        }
-        return result;
-    }
-
-    private void compareFragmentLists(String f1Name, String f2Name, List<String> f1, List<String> f2) {
-        int p1 = 0;
-        int p2 = 0;
-        String s1;
-        String s2;
-        int t1 = 0;
-        int t2 = 0;
-
-        while (p1 < f1.size() && p2 < f2.size()) {
-            s1 = f1.get(p1);
-            s2 = f2.get(p2);
-            t1 += s1.length();
-            t2 += s2.length();
-
-            if (s1.equals(s2)) {
-                debugLogln("   >" + s1 + "<");
-                ++p1;
-                ++p2;
-            }
-            else {
-                int tempT1 = t1;
-                int tempT2 = t2;
-                int tempP1 = p1;
-                int tempP2 = p2;
-
-                while (tempT1 != tempT2 && tempP1 < f1.size() && tempP2 < f2.size()) {
-                    while (tempT1 < tempT2 && tempP1 < f1.size()) {
-                        tempT1 += (f1.get(tempP1)).length();
-                        ++tempP1;
-                    }
-                    while (tempT2 < tempT1 && tempP2 < f2.size()) {
-                        tempT2 += (f2.get(tempP2)).length();
-                        ++tempP2;
-                    }
-                }
-                logln("*** " + f1Name + " has:");
-                while (p1 <= tempP1 && p1 < f1.size()) {
-                    s1 = f1.get(p1);
-                    t1 += s1.length();
-                    debugLogln(" *** >" + s1 + "<");
-                    ++p1;
-                }
-                logln("***** " + f2Name + " has:");
-                while (p2 <= tempP2 && p2 < f2.size()) {
-                    s2 = f2.get(p2);
-                    t2 += s2.length();
-                    debugLogln(" ***** >" + s2 + "<");
-                    ++p2;
-                }
-                errln("Discrepancy between " + f1Name + " and " + f2Name);
-            }
-        }
-    }
-
-    private void _testFollowing(BreakIterator bi, String text, int[] boundaries) {
-        logln("testFollowing():");
-        int p = 2;
-        for (int i = 0; i <= text.length(); i++) {
-            if (i == boundaries[p])
-                ++p;
-
-            int b = bi.following(i);
-            logln("bi.following(" + i + ") -> " + b);
-            if (b != boundaries[p])
-                errln("Wrong result from following() for " + i + ": expected " + boundaries[p]
-                                + ", got " + b);
-        }
-    }
-
-    private void _testPreceding(BreakIterator bi, String text, int[] boundaries) {
-        logln("testPreceding():");
-        int p = 0;
-        for (int i = 0; i <= text.length(); i++) {
-            int b = bi.preceding(i);
-            logln("bi.preceding(" + i + ") -> " + b);
-            if (b != boundaries[p])
-                errln("Wrong result from preceding() for " + i + ": expected " + boundaries[p]
-                                + ", got " + b);
-
-            if (i == boundaries[p + 1])
-                ++p;
-        }
-    }
-
-    private void _testIsBoundary(BreakIterator bi, String text, int[] boundaries) {
-        logln("testIsBoundary():");
-        int p = 1;
-        boolean isB;
-        for (int i = 0; i <= text.length(); i++) {
-            isB = bi.isBoundary(i);
-            logln("bi.isBoundary(" + i + ") -> " + isB);
-
-            if (i == boundaries[p]) {
-                if (!isB)
-                    errln("Wrong result from isBoundary() for " + i + ": expected true, got false");
-                ++p;
-            }
-            else {
-                if (isB)
-                    errln("Wrong result from isBoundary() for " + i + ": expected false, got true");
-            }
-        }
-    }
 
     private void doOtherInvariantTest(BreakIterator tb, String testChars)
     {
@@ -365,43 +191,7 @@
             errln("Didn't get break at end of string.");
     }
 
-    // The Following two tests are ported from ICU4C 1.8.1 [Richard/GCL]
-    /**
-     * Port From:   ICU4C v1.8.1 : textbounds : IntlTestTextBoundary
-     * Source File: $ICU4CRoot/source/test/intltest/ittxtbd.cpp
-     **/
-    /**
-     * test methods preceding, following and isBoundary
-     **/
-    @Test
-    public void TestPreceding() {
-        String words3 = "aaa bbb ccc";
-        BreakIterator e = BreakIterator.getWordInstance(Locale.getDefault());
-        e.setText( words3 );
-        e.first();
-        int p1 = e.next();
-        int p2 = e.next();
-        int p3 = e.next();
-        int p4 = e.next();
-
-        int f = e.following(p2+1);
-        int p = e.preceding(p2+1);
-        if (f!=p3)
-            errln("IntlTestTextBoundary::TestPreceding: f!=p3");
-        if (p!=p2)
-            errln("IntlTestTextBoundary::TestPreceding: p!=p2");
-
-        if (p1+1!=p2)
-            errln("IntlTestTextBoundary::TestPreceding: p1+1!=p2");
-
-        if (p3+1!=p4)
-            errln("IntlTestTextBoundary::TestPreceding: p3+1!=p4");
-
-        if (!e.isBoundary(p2) || e.isBoundary(p2+1) || !e.isBoundary(p3))
-        {
-            errln("IntlTestTextBoundary::TestPreceding: isBoundary err");
-        }
-    }
+    // The Following test is ported from ICU4C 1.8.1 [Richard/GCL]
 
     /**
      * Ticket#5615
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBIMonkeyTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBIMonkeyTest.java
index 5e8cc56..6799f59 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBIMonkeyTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBIMonkeyTest.java
@@ -27,7 +27,7 @@
 import android.icu.text.RuleBasedBreakIterator;
 import android.icu.text.UnicodeSet;
 import android.icu.util.ULocale;
-import android.icu.testsharding.MainTestShard;
+import android.icu.testsharding.HiMemTestShard;
 
 /**
  * RBBI Monkey Test. Ported from ICU4C test/intltest/rbbimonkeytest.cpp.
@@ -35,7 +35,7 @@
  * older class RBBITestMonkey.
  */
 
-@MainTestShard
+@HiMemTestShard
 @RunWith(JUnit4.class)
 public class RBBIMonkeyTest extends TestFmwk {
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITest.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITest.java
index bf5ee8d..f768884 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITest.java
@@ -20,6 +20,7 @@
 import java.text.CharacterIterator;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -27,6 +28,7 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.BreakIterator;
+import android.icu.text.RBBIDataWrapper;
 import android.icu.text.RuleBasedBreakIterator;
 import android.icu.util.ULocale;
 import android.icu.testsharding.MainTestShard;
@@ -551,4 +553,111 @@
         assertEquals("", t1.fExpectedBoundaries, t1.fBoundaries);
         assertEquals("", t2.fExpectedBoundaries, t2.fBoundaries);
     }
+
+    @Test
+    public void TestBug12677() {
+        // Check that stripping of comments from rules for getRules() is not confused by
+        // the presence of '#' characters in the rules that do not introduce comments.
+        String rules = "!!forward; \n"
+                     + "$x = [ab#];  # a set with a # literal. \n"
+                     + " # .;        # a comment that looks sort of like a rule.   \n"
+                     + " '#' '?';    # a rule with a quoted #   \n";
+
+        RuleBasedBreakIterator bi  = new RuleBasedBreakIterator(rules);
+        String rtRules = bi.toString();        // getRules() in C++
+        assertEquals("Break Iterator rule stripping test", "!!forward; $x = [ab#]; '#' '?'; ",  rtRules);
+    }
+
+    @Test
+    public void TestTableRedundancies() {
+        RuleBasedBreakIterator bi = (RuleBasedBreakIterator)BreakIterator.getLineInstance(Locale.ENGLISH);
+        String rules = bi.toString();
+        bi = new RuleBasedBreakIterator(rules);
+        // Build a break iterator from source rules.
+        // Want to check the rule builder in Java, not the pre-built rules that are imported from ICU4C.
+        RBBIDataWrapper dw = bi.fRData;
+        RBBIDataWrapper.RBBIStateTable fwtbl = dw.fFTable;
+        int numCharClasses = dw.fHeader.fCatCount;
+
+        // Check for duplicate columns (character categories)
+        List<String> columns = new ArrayList<String>();
+        for (int column=0; column<numCharClasses; column++) {
+            StringBuilder s = new StringBuilder();
+            for (int r = 1; r < fwtbl.fNumStates; r++) {
+                int row = dw.getRowIndex(r);
+                short tableVal = fwtbl.fTable[row + RBBIDataWrapper.NEXTSTATES + column];
+                s.append((char)tableVal);
+            }
+            columns.add(s.toString());
+        }
+        // Ignore column (char class) 0 while checking; it's special, and may have duplicates.
+        for (int c1=1; c1<numCharClasses; c1++) {
+            for (int c2 = c1+1; c2 < numCharClasses; c2++) {
+                assertFalse(String.format("Duplicate columns (%d, %d)", c1, c2), columns.get(c1).equals(columns.get(c2)));
+                // if (columns.get(c1).equals(columns.get(c2))) {
+                //    System.out.printf("Duplicate columns (%d, %d)\n", c1, c2);
+                // }
+            }
+        }
+
+        // Check for duplicate states.
+        List<String> rows = new ArrayList<String>();
+        for (int r=0; r<fwtbl.fNumStates; r++) {
+            StringBuilder s = new StringBuilder();
+            int row = dw.getRowIndex(r);
+            assertTrue("Accepting < -1", fwtbl.fTable[row + RBBIDataWrapper.ACCEPTING] >= -1);
+            s.append(fwtbl.fTable[row + RBBIDataWrapper.ACCEPTING]);
+            s.append(fwtbl.fTable[row + RBBIDataWrapper.LOOKAHEAD]);
+            s.append(fwtbl.fTable[row + RBBIDataWrapper.TAGIDX]);
+            for (int column=0; column<numCharClasses; column++) {
+                short tableVal = fwtbl.fTable[row + RBBIDataWrapper.NEXTSTATES + column];
+                s.append((char)tableVal);
+            }
+            rows.add(s.toString());
+        }
+
+        for (int r1=0; r1 < fwtbl.fNumStates; r1++) {
+            for (int r2= r1+1; r2 < fwtbl.fNumStates; r2++) {
+                assertFalse(String.format("Duplicate states (%d, %d)", r1, r2), rows.get(r1).equals(rows.get(r2)));
+                // if (rows.get(r1).equals(rows.get(r2))) {
+                //     System.out.printf("Duplicate states (%d, %d)\n", r1, r2);
+                // }
+            }
+        }
+    }
+
+    @Test
+    public void TestBug13447() {
+        // Bug 13447: verify that getRuleStatus() returns the value corresponding to current(),
+        //  even after next() has returned DONE.
+       RuleBasedBreakIterator bi =
+                (RuleBasedBreakIterator)BreakIterator.getWordInstance(Locale.ENGLISH);
+        bi.setText("1234");
+        assertEquals("", BreakIterator.WORD_NONE, bi.getRuleStatus());
+        assertEquals("", 4, bi.next());
+        assertEquals("", BreakIterator.WORD_NUMBER, bi.getRuleStatus());
+        assertEquals("", BreakIterator.DONE, bi.next());
+        assertEquals("", 4, bi.current());
+        assertEquals("", BreakIterator.WORD_NUMBER, bi.getRuleStatus());
+    }
+
+    @Test
+    public void TestTableRebuild() {
+        // Test to verify that rebuilding the state tables from rule source for the standard
+        // break iterator types yields the same tables as are imported from ICU4C as part of the default data.
+        List<RuleBasedBreakIterator> breakIterators = new ArrayList<RuleBasedBreakIterator>();
+        breakIterators.add((RuleBasedBreakIterator)BreakIterator.getCharacterInstance(Locale.ENGLISH));
+        breakIterators.add((RuleBasedBreakIterator)BreakIterator.getWordInstance(Locale.ENGLISH));
+        breakIterators.add((RuleBasedBreakIterator)BreakIterator.getSentenceInstance(Locale.ENGLISH));
+        breakIterators.add((RuleBasedBreakIterator)BreakIterator.getLineInstance(Locale.ENGLISH));
+
+        for (RuleBasedBreakIterator bi: breakIterators) {
+            String rules = bi.toString();
+            RuleBasedBreakIterator bi2 = new RuleBasedBreakIterator(rules);
+            assertTrue("Forward Table",      RBBIDataWrapper.equals(bi.fRData.fFTable, bi2.fRData.fFTable));
+            assertTrue("Reverse Table",      RBBIDataWrapper.equals(bi.fRData.fRTable, bi2.fRData.fRTable));
+            assertTrue("Safe Forward Table", RBBIDataWrapper.equals(bi.fRData.fSFTable, bi2.fRData.fSFTable));
+            assertTrue("SafeForward Table",  RBBIDataWrapper.equals(bi.fRData.fSRTable, bi2.fRData.fSRTable));
+        }
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/rbbitst.txt b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/rbbitst.txt
index 1450a98..761b3e0 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/rbbitst.txt
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/rbbitst.txt
@@ -38,19 +38,8 @@
 
 
 #   Temp debugging tests
-<locale en>
-<word>
-<data><0>コンピューター<400>は<400>、<0>本質<400>的<400>に<400>は<400>数字<400>しか<400>扱う<400>こと<400>が<400>でき<400>ま<400>せん<400>。<0>\
-コンピューター<400>は<400>、<0>文字<400>や<400>記号<400>など<400>の<400>それぞれに<400>番号<400>を<400>割り振る<400>こと<400>によって<400>扱える<400>\
-よう<400>にし<400>ます<400>。<0>ユニ<400>コード<400>が<400>出来る<400>まで<400>は<400>、<0>これらの<400>番号<400>を<400>割り振る<400>仕組み<400>が<400>\
-何<400>百<400>種類<400>も<400>存在<400>しま<400>した<400>。<0>どの<400>一つ<400>を<400>とっても<400>、<0>十分<400>な<400>文字<400>を<400>含<400>\
-んで<400>は<400>いま<400>せん<400>で<400>した<400>。<0>例えば<400>、<0>欧州<400>連合<400>一つ<400>を<400>見<400>て<400>も<400>、<0>その<400>\
-すべて<400>の<400>言語<400>を<400>カバー<400>する<400>ため<400>に<400>は<400>、<0>いくつか<400>の<400>異なる<400>符号<400>化<400>の<400>仕組み<400>\
-が<400>必要<400>で<400>した<400>。<0>英語<400>の<400>よう<400>な<400>一つ<400>の<400>言語<400>に<400>限<400>って<400>も<400>、<0>一つ<400>だけ<400>\
-の<400>符号<400>化<400>の<400>仕組み<400>では<400>、<0>一般<400>的<400>に<400>使<400>われる<400>すべて<400>の<400>文字<400>、<0>句読点<400>、<0>\
-。<0></data>
+#
 
-#<data><0>コンピューター<400>は<400>、<0>本質<400>的<400>に<400>は<400>数字<400>しか<400>扱う<400>こと<400>が<400>でき<400>ま<400>せん<400>。<0>\
 
 ## FILTERED BREAK TESTS
 
@@ -330,6 +319,15 @@
 <data>•\U00011700<200>ロ<400>から<400>売却<400>完了<400>時<400>の<400>時価<400>が<400>提示<400>さ<400>れ<400>て<400>いる<400></data>
 
 #
+# Ticket #13549
+#   CjiBreakEngine::divideUpDictionaryRange: assertion failure.
+#
+<locale en>
+<word>
+<data>•\U00020029<400>\u3300<400>\U0002C400<400></data>
+<data>•\uFAD7<400>\u331B<400>\u87DF<400>\u006D<200>\uFFFD•</data>
+
+#
 # What Is Unicode in Japanese
 # From http://unicode.org/standard/translations/japanese.html
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.IllegalIcuArgumentException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.IllegalIcuArgumentException.dat
deleted file mode 100644
index 9f92268..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.IllegalIcuArgumentException.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.InvalidFormatException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.InvalidFormatException.dat
deleted file mode 100644
index c8d1cbe..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.InvalidFormatException.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.RelativeDateFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.RelativeDateFormat.dat
deleted file mode 100644
index eb1a5ac..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.RelativeDateFormat.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.locale.LocaleSyntaxException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.locale.LocaleSyntaxException.dat
deleted file mode 100644
index 4ea0dd1..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.locale.LocaleSyntaxException.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ArabicShapingException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ArabicShapingException.dat
deleted file mode 100644
index 6a1f856..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ArabicShapingException.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ChineseDateFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ChineseDateFormat.dat
deleted file mode 100644
index b00cfa4..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ChineseDateFormat.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ChineseDateFormatSymbols.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ChineseDateFormatSymbols.dat
deleted file mode 100644
index bb08616..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ChineseDateFormatSymbols.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.CurrencyPluralInfo.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.CurrencyPluralInfo.dat
deleted file mode 100644
index 56cc8f2..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.CurrencyPluralInfo.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateFormat.dat
deleted file mode 100644
index ae89494..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateFormat.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateFormatSymbols.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateFormatSymbols.dat
deleted file mode 100644
index c37aeed..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateFormatSymbols.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateIntervalFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateIntervalFormat.dat
deleted file mode 100644
index 56b683c..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateIntervalFormat.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DecimalFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DecimalFormat.dat
deleted file mode 100644
index 64ba0b7..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DecimalFormat.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DecimalFormatSymbols.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DecimalFormatSymbols.dat
deleted file mode 100644
index 717bb22..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DecimalFormatSymbols.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.MeasureFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.MeasureFormat.dat
deleted file mode 100644
index 4f5a9ed..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.MeasureFormat.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.NumberFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.NumberFormat.dat
deleted file mode 100644
index 4a31dc9..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.NumberFormat.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.PluralFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.PluralFormat.dat
deleted file mode 100644
index 5313c81..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.PluralFormat.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.SimpleDateFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.SimpleDateFormat.dat
deleted file mode 100644
index 80cd3fa..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.SimpleDateFormat.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.StringPrepParseException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.StringPrepParseException.dat
deleted file mode 100644
index 9344bc5..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.StringPrepParseException.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.TimeUnitFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.TimeUnitFormat.dat
deleted file mode 100644
index 269bb8b..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.TimeUnitFormat.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.BuddhistCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.BuddhistCalendar.dat
deleted file mode 100644
index 445d218..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.BuddhistCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.Calendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.Calendar.dat
deleted file mode 100644
index 51dd37d..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.Calendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ChineseCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ChineseCalendar.dat
deleted file mode 100644
index 9b52b9c..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ChineseCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.CopticCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.CopticCalendar.dat
deleted file mode 100644
index 6699f07..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.CopticCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.DangiCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.DangiCalendar.dat
deleted file mode 100644
index 7132ff8..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.DangiCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.EthiopicCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.EthiopicCalendar.dat
deleted file mode 100644
index c3d2f86..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.EthiopicCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.GregorianCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.GregorianCalendar.dat
deleted file mode 100644
index 26b979d..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.GregorianCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ICUCloneNotSupportedException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ICUCloneNotSupportedException.dat
deleted file mode 100644
index 920e9c6..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ICUCloneNotSupportedException.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ICUException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ICUException.dat
deleted file mode 100644
index 4b2157f..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ICUException.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ICUUncheckedIOException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ICUUncheckedIOException.dat
deleted file mode 100644
index d5541f5..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ICUUncheckedIOException.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.IllformedLocaleException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.IllformedLocaleException.dat
deleted file mode 100644
index 338a1e9..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.IllformedLocaleException.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.IndianCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.IndianCalendar.dat
deleted file mode 100644
index 1046c12..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.IndianCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.JapaneseCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.JapaneseCalendar.dat
deleted file mode 100644
index 73367a9..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.JapaneseCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.PersianCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.PersianCalendar.dat
deleted file mode 100644
index 61b2c37..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.PersianCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TaiwanCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TaiwanCalendar.dat
deleted file mode 100644
index 32f448e..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TaiwanCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.UResourceTypeMismatchException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.UResourceTypeMismatchException.dat
deleted file mode 100644
index a99e099..0000000
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.UResourceTypeMismatchException.dat
+++ /dev/null
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.DateNumberFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.DateNumberFormat.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.DateNumberFormat.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.DateNumberFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.IllegalIcuArgumentException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.IllegalIcuArgumentException.dat
new file mode 100644
index 0000000..2905888
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.IllegalIcuArgumentException.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.InvalidFormatException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.InvalidFormatException.dat
new file mode 100644
index 0000000..05c1399
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.InvalidFormatException.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.OlsonTimeZone.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.OlsonTimeZone.dat
similarity index 92%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.OlsonTimeZone.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.OlsonTimeZone.dat
index 1644d97..2294744 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.OlsonTimeZone.dat
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.OlsonTimeZone.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.RelativeDateFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.RelativeDateFormat.dat
new file mode 100644
index 0000000..b538469
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.RelativeDateFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.TZDBTimeZoneNames.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.TZDBTimeZoneNames.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.TZDBTimeZoneNames.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.TZDBTimeZoneNames.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.TimeZoneAdapter.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.TimeZoneAdapter.dat
similarity index 92%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.TimeZoneAdapter.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.TimeZoneAdapter.dat
index 561c870..f284bee 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.TimeZoneAdapter.dat
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.TimeZoneAdapter.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.TimeZoneGenericNames.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.TimeZoneGenericNames.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.TimeZoneGenericNames.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.TimeZoneGenericNames.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.TimeZoneNamesImpl.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.TimeZoneNamesImpl.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.TimeZoneNamesImpl.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.TimeZoneNamesImpl.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.duration.BasicDurationFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.duration.BasicDurationFormat.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.impl.duration.BasicDurationFormat.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.duration.BasicDurationFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.locale.LocaleSyntaxException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.locale.LocaleSyntaxException.dat
new file mode 100644
index 0000000..866a634
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.locale.LocaleSyntaxException.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.Currency.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.number.CustomSymbolCurrency.dat
similarity index 100%
copy from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.Currency.dat
copy to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.number.CustomSymbolCurrency.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.number.DecimalFormatProperties.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.number.DecimalFormatProperties.dat
new file mode 100644
index 0000000..1c6023b
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.number.DecimalFormatProperties.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.number.Properties.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.number.Properties.dat
new file mode 100644
index 0000000..3e0c8db
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.impl.number.Properties.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.math.BigDecimal.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.math.BigDecimal.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.math.BigDecimal.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.math.BigDecimal.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.math.MathContext.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.math.MathContext.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.math.MathContext.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.math.MathContext.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ArabicShapingException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ArabicShapingException.dat
new file mode 100644
index 0000000..eb743a5
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ArabicShapingException.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ChineseDateFormat$Field.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ChineseDateFormat$Field.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.ChineseDateFormat$Field.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ChineseDateFormat$Field.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ChineseDateFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ChineseDateFormat.dat
new file mode 100644
index 0000000..3e60dc1
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ChineseDateFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ChineseDateFormatSymbols.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ChineseDateFormatSymbols.dat
new file mode 100644
index 0000000..afb6ff3
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.ChineseDateFormatSymbols.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.CompactDecimalFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.CompactDecimalFormat.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.CompactDecimalFormat.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.CompactDecimalFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.CurrencyPluralInfo.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.CurrencyPluralInfo.dat
new file mode 100644
index 0000000..ea54e21
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.CurrencyPluralInfo.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateFormat$Field.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateFormat$Field.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateFormat$Field.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateFormat$Field.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateFormat.dat
new file mode 100644
index 0000000..d32c97c
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateFormatSymbols.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateFormatSymbols.dat
new file mode 100644
index 0000000..42317ee
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateFormatSymbols.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateIntervalFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateIntervalFormat.dat
new file mode 100644
index 0000000..c88e37a
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateIntervalFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateIntervalInfo$PatternInfo.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateIntervalInfo$PatternInfo.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateIntervalInfo$PatternInfo.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateIntervalInfo$PatternInfo.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateIntervalInfo.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateIntervalInfo.dat
similarity index 71%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateIntervalInfo.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateIntervalInfo.dat
index 59c719a..546ebbb 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.DateIntervalInfo.dat
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DateIntervalInfo.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DecimalFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DecimalFormat.dat
new file mode 100644
index 0000000..736759d
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DecimalFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DecimalFormatSymbols.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DecimalFormatSymbols.dat
new file mode 100644
index 0000000..6b9df07
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.DecimalFormatSymbols.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.MeasureFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.MeasureFormat.dat
new file mode 100644
index 0000000..f557ff5
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.MeasureFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.MessageFormat$Field.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.MessageFormat$Field.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.MessageFormat$Field.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.MessageFormat$Field.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.MessageFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.MessageFormat.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.MessageFormat.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.MessageFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.NumberFormat$Field.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.NumberFormat$Field.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.NumberFormat$Field.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.NumberFormat$Field.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.NumberFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.NumberFormat.dat
new file mode 100644
index 0000000..2028f7a
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.NumberFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.PluralFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.PluralFormat.dat
new file mode 100644
index 0000000..b60447e
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.PluralFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.PluralRules.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.PluralRules.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.PluralRules.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.PluralRules.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.RuleBasedNumberFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.RuleBasedNumberFormat.dat
similarity index 96%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.RuleBasedNumberFormat.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.RuleBasedNumberFormat.dat
index 7fd77d2..d0b7ea9 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.RuleBasedNumberFormat.dat
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.RuleBasedNumberFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.SelectFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.SelectFormat.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.SelectFormat.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.SelectFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.SimpleDateFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.SimpleDateFormat.dat
new file mode 100644
index 0000000..28a6f0a
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.SimpleDateFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.StringPrepParseException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.StringPrepParseException.dat
new file mode 100644
index 0000000..b754141
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.StringPrepParseException.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.TimeUnitFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.TimeUnitFormat.dat
new file mode 100644
index 0000000..7cd75ff
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.TimeUnitFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.TimeZoneFormat.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.TimeZoneFormat.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.text.TimeZoneFormat.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.text.TimeZoneFormat.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.AnnualTimeZoneRule.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.AnnualTimeZoneRule.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.AnnualTimeZoneRule.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.AnnualTimeZoneRule.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.BuddhistCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.BuddhistCalendar.dat
new file mode 100644
index 0000000..73d4b2f
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.BuddhistCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.Calendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.Calendar.dat
new file mode 100644
index 0000000..ac152f8
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.Calendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ChineseCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ChineseCalendar.dat
new file mode 100644
index 0000000..729e09e
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ChineseCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.CopticCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.CopticCalendar.dat
new file mode 100644
index 0000000..82caae8
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.CopticCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.Currency.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.Currency.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.Currency.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.Currency.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.DangiCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.DangiCalendar.dat
new file mode 100644
index 0000000..69c946a
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.DangiCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.DateInterval.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.DateInterval.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.DateInterval.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.DateInterval.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.DateTimeRule.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.DateTimeRule.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.DateTimeRule.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.DateTimeRule.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.EthiopicCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.EthiopicCalendar.dat
new file mode 100644
index 0000000..94f7f83
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.EthiopicCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.GregorianCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.GregorianCalendar.dat
new file mode 100644
index 0000000..e9bdf6a
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.GregorianCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.HebrewCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.HebrewCalendar.dat
similarity index 61%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.HebrewCalendar.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.HebrewCalendar.dat
index 461c09d..780d3b0 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.HebrewCalendar.dat
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.HebrewCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ICUCloneNotSupportedException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ICUCloneNotSupportedException.dat
new file mode 100644
index 0000000..cba3177
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ICUCloneNotSupportedException.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ICUException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ICUException.dat
new file mode 100644
index 0000000..3426da4
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ICUException.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ICUUncheckedIOException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ICUUncheckedIOException.dat
new file mode 100644
index 0000000..621d245
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ICUUncheckedIOException.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.IllformedLocaleException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.IllformedLocaleException.dat
new file mode 100644
index 0000000..4569e26
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.IllformedLocaleException.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.IndianCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.IndianCalendar.dat
new file mode 100644
index 0000000..6c6ce29
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.IndianCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.InitialTimeZoneRule.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.InitialTimeZoneRule.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.InitialTimeZoneRule.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.InitialTimeZoneRule.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.IslamicCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.IslamicCalendar.dat
similarity index 63%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.IslamicCalendar.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.IslamicCalendar.dat
index 3074ebd..570cf85 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.IslamicCalendar.dat
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.IslamicCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.JapaneseCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.JapaneseCalendar.dat
new file mode 100644
index 0000000..4f228f9
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.JapaneseCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.MeasureUnit.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.MeasureUnit.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.MeasureUnit.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.MeasureUnit.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TimeUnit.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.NoUnit.dat
similarity index 100%
copy from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TimeUnit.dat
copy to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.NoUnit.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.PersianCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.PersianCalendar.dat
new file mode 100644
index 0000000..89e0d8f
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.PersianCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.RuleBasedTimeZone.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.RuleBasedTimeZone.dat
similarity index 69%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.RuleBasedTimeZone.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.RuleBasedTimeZone.dat
index 9271a99..d69978e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.RuleBasedTimeZone.dat
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.RuleBasedTimeZone.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.SimpleTimeZone.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.SimpleTimeZone.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.SimpleTimeZone.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.SimpleTimeZone.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.TaiwanCalendar.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.TaiwanCalendar.dat
new file mode 100644
index 0000000..e5a6a06
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.TaiwanCalendar.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TimeArrayTimeZoneRule.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.TimeArrayTimeZoneRule.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TimeArrayTimeZoneRule.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.TimeArrayTimeZoneRule.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TimeUnit.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.TimeUnit.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TimeUnit.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.TimeUnit.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TimeZone.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.TimeZone.dat
similarity index 87%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TimeZone.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.TimeZone.dat
index 04eff58..56e8cd2 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.TimeZone.dat
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.TimeZone.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ULocale.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ULocale.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.ULocale.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.ULocale.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.UResourceTypeMismatchException.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.UResourceTypeMismatchException.dat
new file mode 100644
index 0000000..be84482
--- /dev/null
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.UResourceTypeMismatchException.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.VTimeZone.dat b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.VTimeZone.dat
similarity index 100%
rename from android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_56.1/android.icu.util.VTimeZone.dat
rename to android_icu4j/src/main/tests/android/icu/dev/test/serializable/data/ICU_61.1/android.icu.util.VTimeZone.dat
Binary files differ
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRegressionTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRegressionTest.java
index f450db5..ffbcc90 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRegressionTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRegressionTest.java
@@ -397,10 +397,10 @@
         int[] DATA = {
             1, GOOD,
             0, BAD,
-            -1, BAD,
+            -1, GOOD,   // #13566 updates SimpleTimeZone to support negative DST saving amount
             60*60*1000, GOOD,
-            Integer.MIN_VALUE, BAD,
-            // Integer.MAX_VALUE, ?, // no upper limit on DST savings at this time
+            Integer.MAX_VALUE, GOOD,    // no upper limit on DST savings at this time
+            Integer.MIN_VALUE, GOOD,    // no lower limit as well
         };
         for (int i=0; i<DATA.length; i+=2) {
             int savings = DATA[i];
@@ -1227,6 +1227,48 @@
             }
         }
     }
+
+    @Test
+    public void TestNegativeDaylightSaving() {
+        int stdOff = 1 * 60*60*1000;    // Standard offset UTC+1
+        int save = -1 * 60*60*1000;     // DST saving amount -1 hour
+        SimpleTimeZone stzDublin = new SimpleTimeZone(
+                1*60*60*1000, "Dublin-2018a",
+                Calendar.OCTOBER, -1, -Calendar.SUNDAY, 2*60*60*1000,
+                Calendar.MARCH, -1, -Calendar.SUNDAY, 1*60*60*1000,
+                save);
+        if (save != stzDublin.getDSTSavings()) {
+            errln("FAIL: DST saving is not " + save);
+        }
+
+        GregorianCalendar cal = new GregorianCalendar(TimeZone.GMT_ZONE);
+        Date testDate;
+        int[] offsets = new int[2];
+
+        cal.set(2018, Calendar.JANUARY, 15, 0, 0, 0);
+        testDate = cal.getTime();
+        if (!stzDublin.inDaylightTime(testDate)) {
+            errln("FAIL: The test date (Jan 15) must be in DST.");
+        }
+        stzDublin.getOffset(testDate.getTime(), false, offsets);
+        if (offsets[0] != stdOff || offsets[1] != save) {
+            errln("FAIL: Expected [stdoff=" + stdOff + ",save=" + save
+                    + "] on the test date (Jan 15), actual[stdoff=" + offsets[0]
+                    + ",save=" + offsets[1] + "]");
+        }
+
+        cal.set(2018, Calendar.JULY, 15, 0, 0, 0);
+        testDate = cal.getTime();
+        if (stzDublin.inDaylightTime(testDate)) {
+            errln("FAIL: The test date (Jul 15) must not be in DST.");
+        }
+        stzDublin.getOffset(testDate.getTime(), false, offsets);
+        if (offsets[0] != stdOff || offsets[1] != 0) {
+            errln("FAIL: Expected [stdoff=" + stdOff + ",save=" + 0
+                    + "] on the test date (Jul 15), actual[stdoff=" + offsets[0]
+                    + ",save=" + offsets[1] + "]");
+        }
+    }
 }
 
 //eof
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneTest.java
index 63999a7..dc46da3 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneTest.java
@@ -29,6 +29,7 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.impl.ICUData;
+import android.icu.impl.TimeZoneAdapter;
 import android.icu.text.SimpleDateFormat;
 import android.icu.util.BasicTimeZone;
 import android.icu.util.Calendar;
@@ -2319,6 +2320,19 @@
                     data[2], id);
         }
     }
+
+    @Test
+    public void TestTimeZoneAdapterEquals() {
+        String idChicago = "America/Chicago";
+        TimeZone icuChicago = TimeZone.getTimeZone(idChicago);
+        TimeZone icuChicago2 = TimeZone.getTimeZone(idChicago);
+        java.util.TimeZone icuChicagoWrapped = TimeZoneAdapter.wrap(icuChicago);
+        java.util.TimeZone icuChicagoWrapped2 = TimeZoneAdapter.wrap(icuChicago2);
+
+        assertFalse("Compare TimeZone and TimeZoneAdapter", icuChicago.equals(icuChicagoWrapped));
+        assertFalse("Compare TimeZoneAdapter with TimeZone", icuChicagoWrapped.equals(icuChicago));
+        assertTrue("Compare two TimeZoneAdapters", icuChicagoWrapped.equals(icuChicagoWrapped2));
+    }
 }
 
 //eof
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/CurrencyTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/CurrencyTest.java
index 033940f..1441f38 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/CurrencyTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/CurrencyTest.java
@@ -193,17 +193,54 @@
         // Do a basic check of getName()
         // USD { "US$", "US Dollar"            } // 04/04/1792-
         ULocale en = ULocale.ENGLISH;
+        ULocale en_CA = ULocale.forLanguageTag("en-CA");
+        ULocale en_US = ULocale.forLanguageTag("en-US");
+        ULocale en_NZ = ULocale.forLanguageTag("en-NZ");
         boolean[] isChoiceFormat = new boolean[1];
-        Currency usd = Currency.getInstance("USD");
+        Currency USD = Currency.getInstance("USD");
+        Currency CAD = Currency.getInstance("CAD");
+        Currency USX = Currency.getInstance("USX");
         // Warning: HARD-CODED LOCALE DATA in this test.  If it fails, CHECK
         // THE LOCALE DATA before diving into the code.
-        assertEquals("USD.getName(SYMBOL_NAME)",
+        assertEquals("USD.getName(SYMBOL_NAME, en)",
                 "$",
-                usd.getName(en, Currency.SYMBOL_NAME, isChoiceFormat));
-        assertEquals("USD.getName(LONG_NAME)",
+                USD.getName(en, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USD.getName(NARROW_SYMBOL_NAME, en)",
+                "$",
+                USD.getName(en, Currency.NARROW_SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USD.getName(LONG_NAME, en)",
                 "US Dollar",
-                usd.getName(en, Currency.LONG_NAME, isChoiceFormat));
-        // TODO add more tests later
+                USD.getName(en, Currency.LONG_NAME, isChoiceFormat));
+        assertEquals("CAD.getName(SYMBOL_NAME, en)",
+                "CA$",
+                CAD.getName(en, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("CAD.getName(NARROW_SYMBOL_NAME, en)",
+                "$",
+                CAD.getName(en, Currency.NARROW_SYMBOL_NAME, isChoiceFormat));
+        assertEquals("CAD.getName(SYMBOL_NAME, en_CA)",
+                "$",
+                CAD.getName(en_CA, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USD.getName(SYMBOL_NAME, en_CA)",
+                "US$",
+                USD.getName(en_CA, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USD.getName(NARROW_SYMBOL_NAME, en_CA)",
+                "$",
+                USD.getName(en_CA, Currency.NARROW_SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USD.getName(SYMBOL_NAME) in en_NZ",
+                "US$",
+                USD.getName(en_NZ, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("CAD.getName(SYMBOL_NAME)",
+                "CA$",
+                CAD.getName(en_NZ, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USX.getName(SYMBOL_NAME)",
+                "USX",
+                USX.getName(en_US, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USX.getName(NARROW_SYMBOL_NAME)",
+                "USX",
+                USX.getName(en_US, Currency.NARROW_SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USX.getName(LONG_NAME)",
+                "USX",
+                USX.getName(en_US, Currency.LONG_NAME, isChoiceFormat));
     }
 
     @Test
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/DebugUtilitiesData.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/DebugUtilitiesData.java
index 0354ddb..32427f2 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/DebugUtilitiesData.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/DebugUtilitiesData.java
@@ -14,7 +14,7 @@
 
 @MainTestShard
 public class DebugUtilitiesData extends Object {
-    public static final String ICU4C_VERSION="60.2";
+    public static final String ICU4C_VERSION="61.1";
     public static final int UDebugEnumType = 0;
     public static final int UCalendarDateFields = 1;
     public static final int UCalendarMonths = 2;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/RegionTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/RegionTest.java
index d1daad9..39de7cc 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/RegionTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/RegionTest.java
@@ -102,12 +102,12 @@
             { "BS" , "044", "029", "TERRITORY", "019" },
             { "BT" , "064", "034", "TERRITORY", "142" },
             { "BU" , "104", "035", "TERRITORY", "142" },
-            { "BV" , "074", "QO" , "TERRITORY", "009" },
+            { "BV" , "074", "005", "TERRITORY", "019" },
             { "BW" , "072", "018", "TERRITORY", "002" },
             { "BY" , "112", "151", "TERRITORY", "150" },
             { "BZ" , "084", "013", "TERRITORY", "019" },
             { "CA" , "124", "021", "TERRITORY", "019" },
-            { "CC" , "166", "QO" , "TERRITORY", "009" },
+            { "CC" , "166", "053", "TERRITORY", "009" },
             { "CD" , "180", "017", "TERRITORY", "002" },
             { "CF" , "140", "017", "TERRITORY", "002" },
             { "CG" , "178", "017", "TERRITORY", "002" },
@@ -123,7 +123,7 @@
             { "CU" , "192", "029", "TERRITORY", "019" },
             { "CV" , "132", "011", "TERRITORY", "002" },
             { "CW" , "531", "029", "TERRITORY", "019" },
-            { "CX" , "162", "QO" , "TERRITORY", "009" },
+            { "CX" , "162", "053", "TERRITORY", "009" },
             { "CY" , "196", "145", "TERRITORY", "142" },
             { "CZ" , "203", "151", "TERRITORY", "150" },
             { "DD" , "276", "155", "TERRITORY", "150" },
@@ -164,13 +164,13 @@
             { "GP" , "312", "029", "TERRITORY", "019" },
             { "GQ" , "226", "017", "TERRITORY", "002" },
             { "GR" , "300", "039", "TERRITORY", "150" },
-            { "GS" , "239", "QO" , "TERRITORY", "009" },
+            { "GS" , "239", "005", "TERRITORY", "019" },
             { "GT" , "320", "013", "TERRITORY", "019" },
             { "GU" , "316", "057", "TERRITORY", "009" },
             { "GW" , "624", "011", "TERRITORY", "002" },
             { "GY" , "328", "005", "TERRITORY", "019" },
             { "HK" , "344", "030", "TERRITORY", "142" },
-            { "HM" , "334", "QO" , "TERRITORY", "009" },
+            { "HM" , "334", "053", "TERRITORY", "009" },
             { "HN" , "340", "013", "TERRITORY", "019" },
             { "HR" , "191", "039", "TERRITORY", "150" },
             { "HT" , "332", "029", "TERRITORY", "019" },
@@ -181,7 +181,7 @@
             { "IL" , "376", "145", "TERRITORY", "142" },
             { "IM" , "833", "154", "TERRITORY", "150" },
             { "IN" , "356", "034", "TERRITORY", "142" },
-            { "IO" , "086", "QO" , "TERRITORY", "009" },
+            { "IO" , "086", "014", "TERRITORY", "002" },
             { "IQ" , "368", "145", "TERRITORY", "142" },
             { "IR" , "364", "034", "TERRITORY", "142" },
             { "IS" , "352", "154", "TERRITORY", "150" },
@@ -296,7 +296,7 @@
             { "TA" , "-1" , "QO", "TERRITORY", "009" },
             { "TC" , "796", "029", "TERRITORY", "019" },
             { "TD" , "148", "017", "TERRITORY", "002" },
-            { "TF" , "260", "QO" , "TERRITORY", "009" },
+            { "TF" , "260", "145", "TERRITORY", "142" },
             { "TG" , "768", "011", "TERRITORY", "002" },
             { "TH" , "764", "035", "TERRITORY", "142" },
             { "TJ" , "762", "143", "TERRITORY", "142" },
@@ -313,7 +313,7 @@
             { "TZ" , "834", "014", "TERRITORY", "002" },
             { "UA" , "804", "151", "TERRITORY", "150" },
             { "UG" , "800", "014", "TERRITORY", "002" },
-            { "UM" , "581", "QO" , "TERRITORY", "009" },
+            { "UM" , "581", "057", "TERRITORY", "009" },
             { "US" , "840", "021", "TERRITORY", "019" },
             { "UY" , "858", "005", "TERRITORY", "019" },
             { "UZ" , "860", "143", "TERRITORY", "142" },
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/TextTrieMapTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/TextTrieMapTest.java
index 945bfe8..9ef805c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/TextTrieMapTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/TextTrieMapTest.java
@@ -18,6 +18,7 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.impl.TextTrieMap;
+import android.icu.text.UnicodeSet;
 import android.icu.testsharding.MainTestShard;
 
 @MainTestShard
@@ -36,6 +37,7 @@
     private static final Integer SUP2 = new Integer(9);
     private static final Integer SUP3 = new Integer(10);
     private static final Integer SUP4 = new Integer(11);
+    private static final Integer SUP5 = new Integer(12);
 
     private static final Integer FOO = new Integer(-1);
     private static final Integer BAR = new Integer(-2);
@@ -66,6 +68,9 @@
         {"L📺1", SUP2}, // L, 0xD83D, 0xDCFA, 1
         {"L📻", SUP3}, // L, 0xD83D, 0xDCFB
         {"L🃏", SUP4}, // L, 0xD83C, 0xDCCF
+        {"📺", SUP5}, // 0xD83D, 0xDCFA
+        {"📻", SUP5}, // 0xD83D, 0xDCFB
+        {"🃏", SUP5}, // 0xD83C, 0xDCCF
     };
 
     private static final Object[][] TESTCASES = {
@@ -83,67 +88,6 @@
         {"l📺", null, SUP1},
     };
 
-    private static final Object[][] TESTCASES_PARSE = {
-            {
-                "Sunday",
-                new Object[]{
-                        new Object[]{SAT,SUN}, new Object[]{SAT,SUN}, // matches on "S"
-                        null, null, // matches on "Su"
-                        SUN, SUN, // matches on "Sun"
-                        null, null, // matches on "Sund"
-                        null, null, // matches on "Sunda"
-                        SUN, SUN, // matches on "Sunday"
-                }
-            },
-            {
-                "sunday",
-                new Object[]{
-                        null, new Object[]{SAT,SUN}, // matches on "s"
-                        null, null, // matches on "su"
-                        null, SUN, // matches on "sun"
-                        null, null, // matches on "sund"
-                        null, null, // matches on "sunda"
-                        null, SUN, // matches on "sunday"
-                }
-            },
-            {
-                "MMM",
-                new Object[]{
-                        MON, MON, // matches on "M"
-                        // no more matches in data
-                }
-            },
-            {
-                "BBB",
-                new Object[]{
-                        // no matches in data
-                }
-            },
-            {
-                "l📺12",
-                new Object[]{
-                        null, null, // matches on "L"
-                        null, SUP1, // matches on "L📺"
-                        null, SUP2, // matches on "L📺1"
-                        // no more matches in data
-                }
-            },
-            {
-                "L📻",
-                new Object[] {
-                        null, null, // matches on "L"
-                        SUP3, SUP3, // matches on "L📻"
-                }
-            },
-            {
-                "L🃏",
-                new Object[] {
-                        null, null, // matches on "L"
-                        SUP4, SUP4, // matches on "L🃏"
-                }
-            }
-    };
-
     @Test
     public void TestCaseSensitive() {
         Iterator itr = null;
@@ -170,12 +114,29 @@
             checkResult("get(String, int) case " + i, itr, TESTCASES[i][1]);
         }
 
-        logln("Test for ParseState");
-        for (int i = 0; i < TESTCASES_PARSE.length; i++) {
-            String test = (String) TESTCASES_PARSE[i][0];
-            Object[] expecteds = (Object[]) TESTCASES_PARSE[i][1];
-            checkParse(map, test, expecteds, true);
+        logln("Test for partial match");
+        for (Object[] cas : TESTDATA) {
+            String str = (String) cas[0];
+            for (int i = 0; i < str.length() - 1; i++) {
+                TextTrieMap.Output output = new TextTrieMap.Output();
+                map.get(str.substring(0, i), 0, output);
+                assertTrue("Partial string means partial match", output.partialMatch);
+            }
+            String bad = str + "x";
+            TextTrieMap.Output output = new TextTrieMap.Output();
+            map.get(bad, 0, output);
+            assertFalse("No partial match on bad string", output.partialMatch);
         }
+        TextTrieMap.Output output = new TextTrieMap.Output();
+        map.get("Sunday", 0, output);
+        assertFalse("No partial match on string with no continuation", output.partialMatch);
+
+        logln("Test for LeadCodePoints");
+        // Note: The 📺 and 📻 have the same lead surrogate
+        UnicodeSet expectedLeadCodePoints = new UnicodeSet("[SMTWFL📺📻🃏]");
+        UnicodeSet actualLeadCodePoints = new UnicodeSet();
+        map.putLeadCodePoints(actualLeadCodePoints);
+        assertEquals("leadCodePoints", expectedLeadCodePoints, actualLeadCodePoints);
 
         // Add duplicated entry
         map.put("Sunday", FOO);
@@ -213,12 +174,28 @@
             checkResult("get(String, int) case " + i, itr, TESTCASES[i][2]);
         }
 
-        logln("Test for ParseState");
-        for (int i = 0; i < TESTCASES_PARSE.length; i++) {
-            String test = (String) TESTCASES_PARSE[i][0];
-            Object[] expecteds = (Object[]) TESTCASES_PARSE[i][1];
-            checkParse(map, test, expecteds, false);
+        logln("Test for partial match");
+        for (Object[] cas : TESTDATA) {
+            String str = (String) cas[0];
+            for (int i = 0; i < str.length() - 1; i++) {
+                TextTrieMap.Output output = new TextTrieMap.Output();
+                map.get(str.substring(0, i), 0, output);
+                assertTrue("Partial string means partial match", output.partialMatch);
+            }
+            String bad = str + "x";
+            TextTrieMap.Output output = new TextTrieMap.Output();
+            map.get(bad, 0, output);
+            assertFalse("No partial match on bad string", output.partialMatch);
         }
+        TextTrieMap.Output output = new TextTrieMap.Output();
+        map.get("Sunday", 0, output);
+        assertFalse("No partial match on string with no continuation", output.partialMatch);
+
+        logln("Test for LeadCodePoints");
+        UnicodeSet expectedLeadCodePoints = new UnicodeSet("[smtwfl📺📻🃏]");
+        UnicodeSet actualLeadCodePoints = new UnicodeSet();
+        map.putLeadCodePoints(actualLeadCodePoints);
+        assertEquals("leadCodePoints", expectedLeadCodePoints, actualLeadCodePoints);
 
         // Add duplicated entry
         map.put("Sunday", FOO);
@@ -230,54 +207,6 @@
         checkResult("Get Sunday", itr, new Object[]{SUN, FOO, BAR});
     }
 
-    private void checkParse(TextTrieMap map, String text, Object[] rawExpecteds, boolean caseSensitive) {
-        // rawExpecteds has even-valued indices for case sensitive and odd-valued indicies for case insensitive
-        // Get out only the values that we want.
-        Object[] expecteds = null;
-        for (int i=rawExpecteds.length/2-1; i>=0; i--) {
-            int j = i*2+(caseSensitive?0:1);
-            if (rawExpecteds[j] != null) {
-                if (expecteds == null) {
-                    expecteds = new Object[i+1];
-                }
-                expecteds[i] = rawExpecteds[j];
-            }
-        }
-        if (expecteds == null) {
-            expecteds = new Object[0];
-        }
-
-        TextTrieMap.ParseState state = null;
-        for (int charOffset=0, cpOffset=0; charOffset < text.length(); cpOffset++) {
-            int cp = Character.codePointAt(text, charOffset);
-            if (state == null) {
-                state = map.openParseState(cp);
-            }
-            if (state == null) {
-                assertEquals("Expected matches, but no matches are available", 0, expecteds.length);
-                break;
-            }
-            state.accept(cp);
-            if (cpOffset < expecteds.length - 1) {
-                assertFalse(
-                        "In middle of parse sequence, but atEnd() is true: '" + text + "' offset " + charOffset,
-                        state.atEnd());
-            } else if (cpOffset == expecteds.length) {
-                // Note: it possible for atEnd() to be either true or false at expecteds.length - 1;
-                // if true, we are at the end of the input string; if false, there is still input string
-                // left to be consumed, but we don't know if there are remaining matches.
-                assertTrue(
-                        "At end of parse sequence, but atEnd() is false: '" + text + "' offset " + charOffset,
-                        state.atEnd());
-                break;
-            }
-            Object expected = expecteds[cpOffset];
-            Iterator actual = state.getCurrentMatches();
-            checkResult("ParseState '" + text + "' offset " + charOffset, actual, expected);
-            charOffset += Character.charCount(cp);
-        }
-    }
-
     private boolean eql(Object o1, Object o2) {
         if (o1 == null || o2 == null) {
             if (o1 == null && o2 == null) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/UtilityTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/UtilityTest.java
index c4632e4..b10db96 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/UtilityTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/UtilityTest.java
@@ -16,6 +16,7 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Random;
 import java.util.Set;
 
 import org.junit.Test;
@@ -252,4 +253,45 @@
     public String CheckSourceLocale() {
         return TestFmwk.sourceLocation();
     }
+
+    static final String RANDOM_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+    static final Random RANDOM = new Random(2018);
+
+    @Test
+    public void TestCharSequenceEqualsAndHashCode() {
+        for (int t=0; t<1000; t++) {
+            int length = RANDOM.nextInt(5);
+            CharSequence a = randomCharSequence(length);
+            CharSequence b = randomCharSequence(length);
+            CharSequence c = randomCharSequence(length + 3);
+            String message = "a=" + a + "; b=" + b + "; c=" + c;
+
+            assertTrue(message, Utility.charSequenceEquals(a, a));
+            assertFalse(message, Utility.charSequenceEquals(a, c));
+            assertTrue(message, Utility.charSequenceEquals(b, b));
+            assertFalse(message, Utility.charSequenceEquals(b, c));
+            assertFalse(message, Utility.charSequenceEquals(c, a));
+            assertFalse(message, Utility.charSequenceEquals(c, b));
+            assertTrue(message, Utility.charSequenceEquals(c, c));
+            if (length == 0 || a.toString().equals(b.toString())) {
+                assertTrue(message, Utility.charSequenceEquals(a, b));
+                assertTrue(message, Utility.charSequenceEquals(b, a));
+            } else {
+                assertFalse(message, Utility.charSequenceEquals(a, b));
+                assertFalse(message, Utility.charSequenceEquals(b, a));
+            }
+
+            assertEquals(message, Utility.charSequenceHashCode(a), a.toString().hashCode());
+            assertEquals(message, Utility.charSequenceHashCode(b), b.toString().hashCode());
+            assertEquals(message, Utility.charSequenceHashCode(c), c.toString().hashCode());
+        }
+    }
+
+    private CharSequence randomCharSequence(int length) {
+        StringBuilder sb = new StringBuilder();
+        for (int i=0; i<length; i++) {
+            sb.append(RANDOM_CHARS.charAt(RANDOM.nextInt(RANDOM_CHARS.length())));
+        }
+        return sb;
+    }
 }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/XLocaleDistanceTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/XLocaleDistanceTest.java
index 9c287c6..70598a8 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/XLocaleDistanceTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/XLocaleDistanceTest.java
@@ -57,6 +57,7 @@
         }
     }
 
+    @SuppressWarnings("unused")
     @Ignore("Disabled because of Linux; need to investigate.")
     @Test
     public void testTiming() {
diff --git a/icu4c/APIChangeReport.html b/icu4c/APIChangeReport.html
index 64f4390..d17133d 100644
--- a/icu4c/APIChangeReport.html
+++ b/icu4c/APIChangeReport.html
@@ -5,31 +5,31 @@
 	-->
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>ICU4C API Comparison: ICU 59 with ICU 60</title>
+<title>ICU4C API Comparison: ICU 60 (update #1: 60.2) with ICU 61</title>
 <link type="text/css" href="icu4c.css" rel="stylesheet">
 </head>
 <body>
 <a name="#_top"></a>
-<h1>ICU4C API Comparison: ICU 59 with ICU 60</h1>
+<h1>ICU4C API Comparison: ICU 60 (update #1: 60.2) with ICU 61</h1>
 <div id="toc">
 <ul>
 <li>
-<a href="#removed">Removed from ICU 59</a>
+<a href="#removed">Removed from ICU 60</a>
 </li>
 <li>
-<a href="#deprecated">Deprecated or Obsoleted in ICU 60</a>
+<a href="#deprecated">Deprecated or Obsoleted in ICU 61</a>
 </li>
 <li>
-<a href="#changed">Changed in  ICU 60</a>
+<a href="#changed">Changed in  ICU 61</a>
 </li>
 <li>
-<a href="#promoted">Promoted to stable in ICU 60</a>
+<a href="#promoted">Promoted to stable in ICU 61</a>
 </li>
 <li>
-<a href="#added">Added in ICU 60</a>
+<a href="#added">Added in ICU 61</a>
 </li>
 <li>
-<a href="#other">Other existing drafts in ICU 60</a>
+<a href="#other">Other existing drafts in ICU 61</a>
 </li>
 <li>
 <a href="#purevirtual">Signature Simplifications</a><sup style="background-color: yellow; font-size: smallest;">(new)</sup>
@@ -38,1235 +38,572 @@
 <hr>
 </div>
 <a name="removed"></a>
-<h2>Removed from ICU 59</h2>
+<h2>Removed from ICU 60</h2>
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 59</th><th>ICU 60</th>
+<th>File</th><th>API</th><th>ICU 60</th><th>ICU 61</th>
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">decimfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::DecimalFormat::ERoundingMode {}</td><td class="stabchange">Stable<br>ICU 2.4</td><td>(moved to numfmt.h)<br></td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::resolveUnitPerUnit(const MeasureUnit&amp;, const MeasureUnit&amp;)</td><td class="">Internal</td><td>(missing)<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">decimfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::DecimalFormat::ERoundingMode::kRoundCeiling</td><td class="stabchange">Stable<br>ICU 2.4</td><td>(moved to numfmt.h)<br></td>
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::adoptSymbols(const NumberingSystem*)</td><td class="">Draft<br>ICU 60</td><td>(missing)<br>actually, just<br>removed “const”<br>from one param<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">decimfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::DecimalFormat::ERoundingMode::kRoundDown</td><td class="stabchange">Stable<br>ICU 2.4</td><td>(moved to numfmt.h)<br></td>
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::adoptUnit(const icu::MeasureUnit*)</td><td class="">Draft<br>ICU 60</td><td>(missing)<br>actually, just<br>removed “const”<br>from one param<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">decimfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::DecimalFormat::ERoundingMode::kRoundFloor</td><td class="stabchange">Stable<br>ICU 2.4</td><td>(moved to numfmt.h)<br></td>
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::grouping(const Grouper&amp;)</td><td class="">Internal</td><td>(missing)<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">decimfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::DecimalFormat::ERoundingMode::kRoundHalfDown</td><td class="stabchange">Stable<br>ICU 2.4</td><td>(moved to numfmt.h)<br></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Grouper icu::number::Grouper::defaults()</td><td class="">Internal</td><td>(missing)<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">decimfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::DecimalFormat::ERoundingMode::kRoundHalfEven</td><td class="stabchange">Stable<br>ICU 2.4</td><td>(moved to numfmt.h)<br></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Grouper icu::number::Grouper::minTwoDigits()</td><td class="">Internal</td><td>(missing)<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">decimfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::DecimalFormat::ERoundingMode::kRoundHalfUp</td><td class="stabchange">Stable<br>ICU 2.4</td><td>(moved to numfmt.h)<br></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Grouper icu::number::Grouper::none()</td><td class="">Internal</td><td>(missing)<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">decimfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::DecimalFormat::ERoundingMode::kRoundUnnecessary</td><td class="stabchange">Stable<br>ICU 4.8</td><td>(moved to numfmt.h)<br></td>
+<td class="file">utrans.h</td><td class="proto">void utrans_trans(const UTransliterator*, UReplaceable*, UReplaceableCallbacks*, int32_t, int32_t*, UErrorCode*)</td><td class="stabchange">Stable<br>ICU 2.0</td><td>(missing)<br>actually, just<br>added “const”<br>to one param<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">decimfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::DecimalFormat::ERoundingMode::kRoundUp</td><td class="stabchange">Stable<br>ICU 2.4</td><td>(moved to numfmt.h)<br></td>
-</tr>
-<tr class="row0">
-<td class="file">platform.h</td><td class="proto"><tt>#define</tt> U_IOSTREAM_SOURCE</td><td class="">Internal</td><td>(missing)<br></td>
-</tr>
-<tr class="row1">
-<td class="file">plurrule.h</td><td class="proto">UnicodeString icu::PluralRules::select(const FixedDecimal&amp;)</td><td class="">Internal</td><td>(missing)<br></td>
-</tr>
-<tr class="row0">
-<td class="file">ucasemap.h</td><td class="proto"><tt>#define</tt> U_TITLECASE_NO_BREAK_ADJUSTMENT</td><td class="stabchange">Stable<br>ICU 3.8</td><td>(moved to new stringoptions.h)<br></td>
-</tr>
-<tr class="row1">
-<td class="file">ucasemap.h</td><td class="proto"><tt>#define</tt> U_TITLECASE_NO_LOWERCASE</td><td class="stabchange">Stable<br>ICU 3.8</td><td>(moved to new stringoptions.h)<br></td>
-</tr>
-<tr class="row0">
-<td class="file">ucasemap.h</td><td class="proto"><tt>#define</tt> UCASEMAP_OMIT_UNCHANGED_TEXT</td><td class="">Draft<br>ICU 59</td><td>(missing)<br></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>#define</tt> U_FOLD_CASE_DEFAULT</td><td class="stabchange">Stable<br>ICU 2.0</td><td>(moved to new stringoptions.h)<br></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>#define</tt> U_FOLD_CASE_EXCLUDE_SPECIAL_I</td><td class="stabchange">Stable<br>ICU 2.0</td><td>(moved to new stringoptions.h)<br></td>
-</tr>
-<tr class="row1">
-<td class="file">unorm2.h</td><td class="proto"><tt>#define</tt> U_COMPARE_CODE_POINT_ORDER</td><td class="stabchange">Stable<br>ICU 2.2</td><td>(moved to new stringoptions.h)<br></td>
-</tr>
-<tr class="row0">
-<td class="file">unorm2.h</td><td class="proto"><tt>#define</tt> U_COMPARE_IGNORE_CASE</td><td class="stabchange">Stable<br>ICU 2.2</td><td>(moved to new stringoptions.h)<br></td>
-</tr>
-<tr class="row1">
-<td class="file">unorm2.h</td><td class="proto"><tt>#define</tt> UNORM_INPUT_IS_FCD</td><td class="stabchange">Stable<br>ICU 2.2</td><td>(moved to new stringoptions.h)<br></td>
-</tr>
-<tr class="row0">
-<td class="file">ustring.h</td><td class="proto"><tt>#define</tt> U_COMPARE_CODE_POINT_ORDER</td><td class="stabchange">Stable<br>ICU 2.2</td><td>(moved to new stringoptions.h)<br></td>
+<td class="file">utrans.h</td><td class="proto">void utrans_transIncremental(const UTransliterator*, UReplaceable*, UReplaceableCallbacks*, UTransPosition*, UErrorCode*)</td><td class="stabchange">Stable<br>ICU 2.0</td><td>(missing)<br>actually, just<br>added “const”<br>to one param<br>
+<span class=""><span></span></span></td>
 </tr>
 </table>
 <P></P>
 <a href="#_top">(jump back to top)</a>
 <hr>
 <a name="deprecated"></a>
-<h2>Deprecated or Obsoleted in ICU 60</h2>
+<h2>Deprecated or Obsoleted in ICU 61</h2>
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 59</th><th>ICU 60</th>
+<th>File</th><th>API</th><th>ICU 60</th><th>ICU 61</th>
 </tr>
 </THEAD>
-<tr class="row1">
-<td class="file">filteredbrk.h</td><td class="proto">BreakIterator* icu::FilteredBreakIteratorBuilder::build(BreakIterator*, UErrorCode&amp;)</td><td class="stabchange">Stable<br>ICU 56</td><td>Deprecated<br>
-<span class="verchange"><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">filteredbrk.h</td><td class="proto"><tt>static</tt> FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createInstance(UErrorCode&amp;)</td><td class="stabchange">Stable<br>ICU 56</td><td>Deprecated<br>
-<span class="verchange"><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">utf_old.h</td><td class="proto"><tt>#define</tt> U_HIDE_OBSOLETE_UTF_OLD_H</td><td class="">(missing)</td><td>Deprecated<br>
-<span class=""><span>ICU 2.4</span></span></td>
+<tr>
+<td></td><td></td><td></td><td></td>
 </tr>
 </table>
 <P></P>
 <a href="#_top">(jump back to top)</a>
 <hr>
 <a name="changed"></a>
-<h2>Changed in  ICU 60 (old, new)</h2>
+<h2>Changed in  ICU 61 (old, new)</h2>
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 59</th><th>ICU 60</th>
+<th>File</th><th>API</th><th>ICU 60</th><th>ICU 61</th>
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">filteredbrk.h</td><td class="proto">BreakIterator* icu::FilteredBreakIteratorBuilder::build(BreakIterator*, UErrorCode&amp;)</td><td class="stabchange">Stable<br>ICU 56</td><td>Deprecated<br>
-<span class="verchange"><span>ICU 60</span></span></td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::fold(uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">filteredbrk.h</td><td class="proto"><tt>static</tt> FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createInstance(UErrorCode&amp;)</td><td class="stabchange">Stable<br>ICU 56</td><td>Deprecated<br>
-<span class="verchange"><span>ICU 60</span></span></td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::toLower(const char*, uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">measfmt.h</td><td class="proto">UnicodeString icu::MeasureFormat::getUnitDisplayName(const MeasureUnit&amp;, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::toTitle(const char*, uint32_t, BreakIterator*, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">ubiditransform.h</td><td class="proto">UBiDiTransform* ubiditransform_open(UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::toUpper(const char*, uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">ubiditransform.h</td><td class="proto"><tt>enum</tt> UBiDiMirroring::UBIDI_MIRRORING_OFF</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8Fold(uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">ubiditransform.h</td><td class="proto"><tt>enum</tt> UBiDiMirroring::UBIDI_MIRRORING_ON</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8ToLower(const char*, uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">ubiditransform.h</td><td class="proto"><tt>enum</tt> UBiDiOrder::UBIDI_LOGICAL</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8ToTitle(const char*, uint32_t, BreakIterator*, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">ubiditransform.h</td><td class="proto"><tt>enum</tt> UBiDiOrder::UBIDI_VISUAL</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8ToUpper(const char*, uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">ubiditransform.h</td><td class="proto">uint32_t ubiditransform_transform(UBiDiTransform*, const UChar*, int32_t, UChar*, int32_t, UBiDiLevel, UBiDiOrder, UBiDiLevel, UBiDiOrder, UBiDiMirroring, uint32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">char16_t* icu::Char16Ptr::get()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">ubiditransform.h</td><td class="proto">void ubiditransform_close(UBiDiTransform*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">const char16_t* icu::ConstChar16Ptr::get()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">udisplaycontext.h</td><td class="proto"><tt>enum</tt> UDisplayContext::UDISPCTX_NO_SUBSTITUTE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(char16_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">udisplaycontext.h</td><td class="proto"><tt>enum</tt> UDisplayContext::UDISPCTX_SUBSTITUTE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(std::nullptr_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">udisplaycontext.h</td><td class="proto"><tt>enum</tt> UDisplayContextType::UDISPCTX_TYPE_SUBSTITUTE_HANDLING</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(uint16_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uspoof.h</td><td class="proto">URestrictionLevel uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(wchar_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uspoof.h</td><td class="proto">USpoofCheckResult* uspoof_openCheckResult(UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::operator char16_t* ()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uspoof.h</td><td class="proto">U_NAMESPACE_END int32_t uspoof_getCheckResultChecks(const USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::~Char16Ptr()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uspoof.h</td><td class="proto">const USet* uspoof_getCheckResultNumerics(const USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const char16_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uspoof.h</td><td class="proto"><tt>enum</tt> USpoofChecks::USPOOF_CONFUSABLE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uspoof.h</td><td class="proto">int32_t uspoof_check2(const USpoofChecker*, const UChar*, int32_t, USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const uint16_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uspoof.h</td><td class="proto">int32_t uspoof_check2UTF8(const USpoofChecker*, const char*, int32_t, USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const wchar_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uspoof.h</td><td class="proto">int32_t uspoof_check2UnicodeString(const USpoofChecker*, const icu::UnicodeString&amp;, USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::operator const char16_t* ()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uspoof.h</td><td class="proto">void uspoof_closeCheckResult(USpoofCheckResult*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::~ConstChar16Ptr()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getCoarseChangesIterator()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getCoarseIterator()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getFineChangesIterator()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getFineIterator()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">edits.h</td><td class="proto">UBool icu::Edits::copyErrorTo(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">edits.h</td><td class="proto">UBool icu::Edits::hasChanges()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">edits.h</td><td class="proto">icu::Edits::Edits()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">edits.h</td><td class="proto">icu::Edits::~Edits()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">edits.h</td><td class="proto">int32_t icu::Edits::lengthDelta()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">edits.h</td><td class="proto">void icu::Edits::addReplace(int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">edits.h</td><td class="proto">void icu::Edits::addUnchanged(int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">edits.h</td><td class="proto">void icu::Edits::reset()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createPoint(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">ubrk.h</td><td class="proto">UBreakIterator* ubrk_openBinaryRules(const uint8_t*, int32_t, const UChar*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">ubrk.h</td><td class="proto">int32_t ubrk_getBinaryRules(UBreakIterator*, uint8_t*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">unistr.h</td><td class="proto">UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const uint16_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">unistr.h</td><td class="proto">UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const wchar_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const std::nullptr_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const std::nullptr_t, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const uint16_t*, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const wchar_t*, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(std::nullptr_t, int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(uint16_t*, int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(wchar_t*, int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row1">
+<td class="file">unum.h</td><td class="proto">int32_t unum_formatDoubleForFields(const UNumberFormat*, double, UChar*, int32_t, UFieldPositionIterator*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
+</tr>
+<tr class="row0">
+<td class="file">upluralrules.h</td><td class="proto">UEnumeration* uplrules_getKeywords(const UPluralRules*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 </table>
 <P></P>
 <a href="#_top">(jump back to top)</a>
 <hr>
 <a name="promoted"></a>
-<h2>Promoted to stable in ICU 60</h2>
+<h2>Promoted to stable in ICU 61</h2>
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 59</th><th>ICU 60</th>
+<th>File</th><th>API</th><th>ICU 60</th><th>ICU 61</th>
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">measfmt.h</td><td class="proto">UnicodeString icu::MeasureFormat::getUnitDisplayName(const MeasureUnit&amp;, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::fold(uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode {}</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::toLower(const char*, uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundCeiling</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::toTitle(const char*, uint32_t, BreakIterator*, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundDown</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::toUpper(const char*, uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundFloor</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8Fold(uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundHalfDown</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8ToLower(const char*, uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundHalfEven</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8ToTitle(const char*, uint32_t, BreakIterator*, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundHalfUp</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8ToUpper(const char*, uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundUnnecessary</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 4.8</span></span></td>
+<td class="file">char16ptr.h</td><td class="proto">char16_t* icu::Char16Ptr::get()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundUp</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
+<td class="file">char16ptr.h</td><td class="proto">const char16_t* icu::ConstChar16Ptr::get()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">ubiditransform.h</td><td class="proto">UBiDiTransform* ubiditransform_open(UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(char16_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">ubiditransform.h</td><td class="proto"><tt>enum</tt> UBiDiMirroring::UBIDI_MIRRORING_OFF</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(std::nullptr_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">ubiditransform.h</td><td class="proto"><tt>enum</tt> UBiDiMirroring::UBIDI_MIRRORING_ON</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(uint16_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">ubiditransform.h</td><td class="proto"><tt>enum</tt> UBiDiOrder::UBIDI_LOGICAL</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(wchar_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">ubiditransform.h</td><td class="proto"><tt>enum</tt> UBiDiOrder::UBIDI_VISUAL</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::operator char16_t* ()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">ubiditransform.h</td><td class="proto">uint32_t ubiditransform_transform(UBiDiTransform*, const UChar*, int32_t, UChar*, int32_t, UBiDiLevel, UBiDiOrder, UBiDiLevel, UBiDiOrder, UBiDiMirroring, uint32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::~Char16Ptr()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">ubiditransform.h</td><td class="proto">void ubiditransform_close(UBiDiTransform*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const char16_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_KANA_EXTENDED_A</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const uint16_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_MASARAM_GONDI</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const wchar_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_NUSHU</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::operator const char16_t* ()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_SOYOMBO</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::~ConstChar16Ptr()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_SYRIAC_SUPPLEMENT</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getCoarseChangesIterator()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_ZANABAZAR_SQUARE</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getCoarseIterator()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_BHA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getFineChangesIterator()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_JA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getFineIterator()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_LLA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">UBool icu::Edits::copyErrorTo(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_LLLA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">UBool icu::Edits::hasChanges()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_NGA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">icu::Edits::Edits()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_NNA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">icu::Edits::~Edits()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_NNNA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">int32_t icu::Edits::lengthDelta()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_NYA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">void icu::Edits::addReplace(int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_RA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">void icu::Edits::addUnchanged(int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_SSA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">edits.h</td><td class="proto">void icu::Edits::reset()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_TTA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createPoint(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_EMOJI_COMPONENT</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">ubrk.h</td><td class="proto">UBreakIterator* ubrk_openBinaryRules(const uint8_t*, int32_t, const UChar*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_PREPENDED_CONCATENATION_MARK</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">ubrk.h</td><td class="proto">int32_t ubrk_getBinaryRules(UBreakIterator*, uint8_t*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_REGIONAL_INDICATOR</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">unistr.h</td><td class="proto">UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const uint16_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">udisplaycontext.h</td><td class="proto"><tt>enum</tt> UDisplayContext::UDISPCTX_NO_SUBSTITUTE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">unistr.h</td><td class="proto">UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const wchar_t*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">udisplaycontext.h</td><td class="proto"><tt>enum</tt> UDisplayContext::UDISPCTX_SUBSTITUTE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const std::nullptr_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">udisplaycontext.h</td><td class="proto"><tt>enum</tt> UDisplayContextType::UDISPCTX_TYPE_SUBSTITUTE_HANDLING</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const std::nullptr_t, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_MASARAM_GONDI</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const uint16_t*, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_SOYOMBO</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const wchar_t*, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_ZANABAZAR_SQUARE</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(std::nullptr_t, int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uspoof.h</td><td class="proto">URestrictionLevel uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(uint16_t*, int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uspoof.h</td><td class="proto">USpoofCheckResult* uspoof_openCheckResult(UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(wchar_t*, int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uspoof.h</td><td class="proto">U_NAMESPACE_END int32_t uspoof_getCheckResultChecks(const USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">unum.h</td><td class="proto">int32_t unum_formatDoubleForFields(const UNumberFormat*, double, UChar*, int32_t, UFieldPositionIterator*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row0">
-<td class="file">uspoof.h</td><td class="proto">const USet* uspoof_getCheckResultNumerics(const USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">upluralrules.h</td><td class="proto">UEnumeration* uplrules_getKeywords(const UPluralRules*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 59</td>
 </tr>
 <tr class="row1">
-<td class="file">uspoof.h</td><td class="proto"><tt>enum</tt> USpoofChecks::USPOOF_CONFUSABLE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">utrans.h</td><td class="proto">void utrans_trans(const UTransliterator*, UReplaceable*, const UReplaceableCallbacks*, int32_t, int32_t*, UErrorCode*)</td><td class="">(missing)<br>old version (stable)<br>lacked “const”<br>on one param</td><td>Stable<br>
+<span class=""><span>ICU 2.0</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">uspoof.h</td><td class="proto">int32_t uspoof_check2(const USpoofChecker*, const UChar*, int32_t, USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
-</tr>
-<tr class="row1">
-<td class="file">uspoof.h</td><td class="proto">int32_t uspoof_check2UTF8(const USpoofChecker*, const char*, int32_t, USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
-</tr>
-<tr class="row0">
-<td class="file">uspoof.h</td><td class="proto">int32_t uspoof_check2UnicodeString(const USpoofChecker*, const icu::UnicodeString&amp;, USpoofCheckResult*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
-</tr>
-<tr class="row1">
-<td class="file">uspoof.h</td><td class="proto">void uspoof_closeCheckResult(USpoofCheckResult*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 58</td>
+<td class="file">utrans.h</td><td class="proto">void utrans_transIncremental(const UTransliterator*, UReplaceable*, const UReplaceableCallbacks*, UTransPosition*, UErrorCode*)</td><td class="">(missing)<br>old version (stable)<br>lacked “const”<br>on one param</td><td>Stable<br>
+<span class=""><span>ICU 2.0</span></span></td>
 </tr>
 </table>
 <P></P>
 <a href="#_top">(jump back to top)</a>
 <hr>
 <a name="added"></a>
-<h2>Added in ICU 60</h2>
+<h2>Added in ICU 61</h2>
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 59</th><th>ICU 60</th>
+<th>File</th><th>API</th><th>ICU 60</th><th>ICU 61</th>
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">bytestream.h</td><td class="proto">icu::StringByteSink&lt; StringClass &gt;::StringByteSink(StringClass*, int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">dcfmtsym.h</td><td class="proto">UChar32 icu::DecimalFormatSymbols::getCodePointZero()</td><td class="">(missing)</td><td>Internal<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> void icu::CaseMap::utf8Fold(uint32_t, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">dcfmtsym.h</td><td class="proto">const UnicodeString&amp; icu::DecimalFormatSymbols::getConstDigitSymbol(int32_t)</td><td class="">(missing)</td><td>Internal<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> void icu::CaseMap::utf8ToLower(const char*, uint32_t, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">dtptngen.h</td><td class="proto">UnicodeString icu::DateTimePatternGenerator::getFieldDisplayName(UDateTimePatternField, UDateTimePGDisplayWidth)</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> void icu::CaseMap::utf8ToTitle(const char*, uint32_t, BreakIterator*, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::resolveUnitPerUnit(const MeasureUnit&amp;, const MeasureUnit&amp;, bool*)</td><td class="">(missing)</td><td>Internal<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> void icu::CaseMap::utf8ToUpper(const char*, uint32_t, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::adoptPerUnit(icu::MeasureUnit*)</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">currunit.h</td><td class="proto">icu::CurrencyUnit::CurrencyUnit()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::adoptSymbols(NumberingSystem*)</td><td class="">(missing)<br>old version<br>had “const”<br>on param</td><td>Draft<br>
+<span class=""><span>ICU 60</span>
+<br>
+<b class="bigwarn" title="A draft API has the wrong version.">(should be ICU 61)</b><br>decided to keep draft ICU 60</span></td>
 </tr>
 <tr class="row1">
-<td class="file">currunit.h</td><td class="proto">icu::CurrencyUnit::CurrencyUnit(const MeasureUnit&amp;, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::adoptUnit(icu::MeasureUnit*)</td><td class="">(missing)<br>old version<br>had “const”<br>on param</td><td>Draft<br>
+<span class=""><span>ICU 60</span>
+<br>
+<b class="bigwarn" title="A draft API has the wrong version.">(should be ICU 61)</b><br>decided to keep draft ICU 60</span></td>
 </tr>
 <tr class="row0">
-<td class="file">dcfmtsym.h</td><td class="proto">icu::DecimalFormatSymbols::DecimalFormatSymbols(const Locale&amp;, const NumberingSystem&amp;, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::grouping(const UGroupingStrategy&amp;)</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">edits.h</td><td class="proto">Edits&amp; icu::Edits::mergeAndAppend(const Edits&amp;, const Edits&amp;, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::perUnit(const icu::MeasureUnit&amp;)</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">edits.h</td><td class="proto">Edits&amp; icu::Edits::operator=(Edits&amp;&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UGroupingStrategy::UNUM_GROUPING_AUTO</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">edits.h</td><td class="proto">Edits&amp; icu::Edits::operator=(const Edits&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UGroupingStrategy::UNUM_GROUPING_MIN2</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">edits.h</td><td class="proto">icu::Edits::Edits(Edits&amp;&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UGroupingStrategy::UNUM_GROUPING_OFF</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">edits.h</td><td class="proto">icu::Edits::Edits(const Edits&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UGroupingStrategy::UNUM_GROUPING_ON_ALIGNED</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">edits.h</td><td class="proto">int32_t icu::Edits::numberOfChanges()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UGroupingStrategy::UNUM_GROUPING_THOUSANDS</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">filteredbrk.h</td><td class="proto">BreakIterator* icu::FilteredBreakIteratorBuilder::wrapIteratorWithFilter(BreakIterator*, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">filteredbrk.h</td><td class="proto"><tt>static</tt> FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createEmptyInstance(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_EXCEPT_ZERO</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">normalizer2.h</td><td class="proto">UBool icu::FilteredNormalizer2::isNormalizedUTF8(StringPiece, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto">icu::number::impl::Grouper::Grouper(int16_t, int16_t, int16_t)</td><td class="">(missing)</td><td>Internal<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">normalizer2.h</td><td class="proto">UBool icu::Normalizer2::isNormalizedUTF8(StringPiece, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Grouper icu::number::impl::Grouper::forStrategy(UGroupingStrategy)</td><td class="">(missing)</td><td>Internal<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">normalizer2.h</td><td class="proto">void icu::FilteredNormalizer2::normalizeUTF8(uint32_t, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">rbbi.h</td><td class="proto">void icu::RuleBasedBreakIterator::dumpTables()</td><td class="">(missing)</td><td>Internal<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">normalizer2.h</td><td class="proto">void icu::Normalizer2::normalizeUTF8(uint32_t, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">ucurr.h</td><td class="proto"><tt>enum</tt> UCurrNameStyle::UCURR_NARROW_SYMBOL_NAME</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">nounit.h</td><td class="proto">UClassID icu::NoUnit::getDynamicClassID()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">udatpg.h</td><td class="proto"><tt>enum</tt> UDateTimePGDisplayWidth::UDATPG_ABBREVIATED</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">nounit.h</td><td class="proto">UObject* icu::NoUnit::clone()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">udatpg.h</td><td class="proto"><tt>enum</tt> UDateTimePGDisplayWidth::UDATPG_NARROW</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">nounit.h</td><td class="proto">icu::NoUnit::NoUnit(const NoUnit&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">udatpg.h</td><td class="proto"><tt>enum</tt> UDateTimePGDisplayWidth::UDATPG_WIDE</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">nounit.h</td><td class="proto">icu::NoUnit::~NoUnit()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">udatpg.h</td><td class="proto">int32_t udatpg_getFieldDisplayName(const UDateTimePatternGenerator*, UDateTimePatternField, UDateTimePGDisplayWidth, UChar*, int32_t, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">nounit.h</td><td class="proto"><tt>static</tt> NoUnit icu::NoUnit::base()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">utf8.h</td><td class="proto"><tt>#define</tt> U8_INTERNAL_NEXT_OR_SUB</td><td class="">(missing)</td><td>Internal<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">nounit.h</td><td class="proto"><tt>static</tt> NoUnit icu::NoUnit::percent()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
+<td class="file">utf8.h</td><td class="proto"><tt>#define</tt> U8_TRUNCATE_IF_INCOMPLETE</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 61</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">nounit.h</td><td class="proto"><tt>static</tt> NoUnit icu::NoUnit::permille()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">nounit.h</td><td class="proto"><tt>static</tt> UClassID icu::NoUnit::getStaticClassID()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Appendable&amp; icu::number::FormattedNumber::appendTo(Appendable&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::adoptSymbols(const NumberingSystem*)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::adoptUnit(const icu::MeasureUnit*)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::decimal(const UNumberDecimalSeparatorDisplay&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::grouping(const Grouper&amp;)</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::integerWidth(const IntegerWidth&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::notation(const Notation&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::padding(const impl::Padder&amp;)</td><td class="">(missing)</td><td>Internal<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::rounding(const Rounder&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::sign(const UNumberSignDisplay&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::symbols(const DecimalFormatSymbols&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::threshold(int32_t)</td><td class="">(missing)</td><td>Internal<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::unit(const icu::MeasureUnit&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::unitWidth(const UNumberUnitWidth&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">FormattedNumber icu::number::LocalizedNumberFormatter::formatDecimal(StringPiece, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">FormattedNumber icu::number::LocalizedNumberFormatter::formatDouble(double, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">FormattedNumber icu::number::LocalizedNumberFormatter::formatInt(int64_t, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">IntegerWidth icu::number::IntegerWidth::truncateAt(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">LocalizedNumberFormatter icu::number::UnlocalizedNumberFormatter::locale(const icu::Locale&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Rounder icu::number::CurrencyRounder::withCurrency(const CurrencyUnit&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Rounder icu::number::FractionRounder::withMaxDigits(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Rounder icu::number::FractionRounder::withMinDigits(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Rounder icu::number::IncrementRounder::withMinFraction(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Rounder icu::number::Rounder::withMode(UNumberFormatRoundingMode)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">ScientificNotation icu::number::ScientificNotation::withExponentSignDisplay(UNumberSignDisplay)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">ScientificNotation icu::number::ScientificNotation::withMinExponentDigits(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">SymbolsWrapper&amp; icu::number::impl::SymbolsWrapper::operator=(const SymbolsWrapper&amp;)</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">UBool icu::number::NumberFormatterSettings&lt; Derived &gt;::copyErrorTo(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">UBool icu::number::impl::SymbolsWrapper::copyErrorTo(UErrorCode&amp;)</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">UnicodeString icu::number::FormattedNumber::toString()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">bool icu::number::impl::SymbolsWrapper::isDecimalFormatSymbols()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">bool icu::number::impl::SymbolsWrapper::isNumberingSystem()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">const DecimalFormatSymbols* icu::number::impl::SymbolsWrapper::getDecimalFormatSymbols()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">const NumberingSystem* icu::number::impl::SymbolsWrapper::getNumberingSystem()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberDecimalSeparatorDisplay::UNUM_DECIMAL_SEPARATOR_ALWAYS</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberDecimalSeparatorDisplay::UNUM_DECIMAL_SEPARATOR_AUTO</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberDecimalSeparatorDisplay::UNUM_DECIMAL_SEPARATOR_COUNT</td><td class="">(missing)</td><td>Internal<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_ALWAYS</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ALWAYS</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_AUTO</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_COUNT</td><td class="">(missing)</td><td>Internal<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_NEVER</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_COUNT</td><td class="">(missing)</td><td>Internal<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_HIDDEN</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_ISO_CODE</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_SHORT</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">icu::number::FormattedNumber::~FormattedNumber()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">icu::number::LocalizedNumberFormatter::LocalizedNumberFormatter(const LocalizedNumberFormatter&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">icu::number::LocalizedNumberFormatter::~LocalizedNumberFormatter()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">icu::number::NumberFormatter::NumberFormatter()=delete</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">icu::number::UnlocalizedNumberFormatter::UnlocalizedNumberFormatter(const UnlocalizedNumberFormatter&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">icu::number::impl::SymbolsWrapper::SymbolsWrapper()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">icu::number::impl::SymbolsWrapper::SymbolsWrapper(const SymbolsWrapper&amp;)</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">icu::number::impl::SymbolsWrapper::~SymbolsWrapper()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> CompactNotation icu::number::Notation::compactLong()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> CompactNotation icu::number::Notation::compactShort()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> CurrencyRounder icu::number::Rounder::currency(UCurrencyUsage)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> DigitRounder icu::number::Rounder::fixedDigits(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> DigitRounder icu::number::Rounder::maxDigits(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> DigitRounder icu::number::Rounder::minDigits(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> DigitRounder icu::number::Rounder::minMaxDigits(int32_t, int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> FractionRounder icu::number::Rounder::fixedFraction(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> FractionRounder icu::number::Rounder::integer()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> FractionRounder icu::number::Rounder::maxFraction(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> FractionRounder icu::number::Rounder::minFraction(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> FractionRounder icu::number::Rounder::minMaxFraction(int32_t, int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Grouper icu::number::Grouper::defaults()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Grouper icu::number::Grouper::minTwoDigits()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Grouper icu::number::Grouper::none()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> IncrementRounder icu::number::Rounder::increment(double)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> IntegerWidth icu::number::IntegerWidth::zeroFillTo(int32_t)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> LocalizedNumberFormatter icu::number::NumberFormatter::withLocale(const Locale&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Padder icu::number::impl::Padder::codePoints(UChar32, int32_t, UNumberFormatPadPosition)</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Padder icu::number::impl::Padder::none()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Rounder icu::number::Rounder::unlimited()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> ScientificNotation icu::number::Notation::engineering()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> ScientificNotation icu::number::Notation::scientific()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> SimpleNotation icu::number::Notation::simple()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> UnlocalizedNumberFormatter icu::number::NumberFormatter::with()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">void icu::number::FormattedNumber::populateFieldPosition(FieldPosition&amp;, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">void icu::number::FormattedNumber::populateFieldPositionIterator(FieldPositionIterator&amp;, UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">void icu::number::impl::SymbolsWrapper::setTo(const DecimalFormatSymbols&amp;)</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">void icu::number::impl::SymbolsWrapper::setTo(const NumberingSystem*)</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">numfmt.h</td><td class="proto">ERoundingMode icu::NumberFormat::getRoundingMode()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode {}</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundCeiling</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundDown</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundFloor</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundHalfDown</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundHalfEven</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundHalfUp</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundUnnecessary</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 4.8</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">numfmt.h</td><td class="proto"><tt>enum</tt> 
-							icu::NumberFormat::ERoundingMode::kRoundUp</td><td class="">(moved from decimfmt.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.4</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">numfmt.h</td><td class="proto">void icu::NumberFormat::setRoundingMode(ERoundingMode)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">platform.h</td><td class="proto"><tt>#define</tt> U_CALLCONV_FPTR</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">platform.h</td><td class="proto"><tt>#define</tt> U_PF_FUCHSIA</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">plurrule.h</td><td class="proto">UnicodeString icu::PluralRules::select(const IFixedDecimal&amp;)</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">rbbi.h</td><td class="proto">void icu::RuleBasedBreakIterator::dumpCache()</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">rbnf.h</td><td class="proto">ERoundingMode icu::RuleBasedNumberFormat::getRoundingMode()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">rbnf.h</td><td class="proto">void icu::RuleBasedNumberFormat::setRoundingMode(ERoundingMode)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_COMPARE_CODE_POINT_ORDER</td><td class="">(moved from unorm2.h, ustring.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.2</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_COMPARE_IGNORE_CASE</td><td class="">(moved from unorm2.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.2</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_EDITS_NO_RESET</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_FOLD_CASE_DEFAULT</td><td class="">(moved from uchar.h)</td><td>Stable<br>
+<td class="file">utrans.h</td><td class="proto">void utrans_trans(const UTransliterator*, UReplaceable*, const UReplaceableCallbacks*, int32_t, int32_t*, UErrorCode*)</td><td class="">(missing) old version<br>(stable) lacked “const”<br>on one parameter</td><td>Stable<br>
 <span class=""><span>ICU 2.0</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_FOLD_CASE_EXCLUDE_SPECIAL_I</td><td class="">(moved from moved from uchar.h)</td><td>Stable<br>
+<td class="file">utrans.h</td><td class="proto">void utrans_transIncremental(const UTransliterator*, UReplaceable*, const UReplaceableCallbacks*, UTransPosition*, UErrorCode*)</td><td class="">(missing) old version<br>(stable) lacked “const”<br>on one parameter</td><td>Stable<br>
 <span class=""><span>ICU 2.0</span></span></td>
 </tr>
-<tr class="row1">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_OMIT_UNCHANGED_TEXT</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_TITLECASE_ADJUST_TO_CASED</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_TITLECASE_NO_BREAK_ADJUSTMENT</td><td class="">(moved from ucasemap.h)</td><td>Stable<br>
-<span class=""><span>ICU 3.8</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_TITLECASE_NO_LOWERCASE</td><td class="">(moved from ucasemap.h)</td><td>Stable<br>
-<span class=""><span>ICU 3.8</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_TITLECASE_SENTENCES</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_TITLECASE_WHOLE_STRING</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> UNORM_INPUT_IS_FCD</td><td class="">(moved from unorm2.h)</td><td>Stable<br>
-<span class=""><span>ICU 2.2</span></span></td>
-</tr>
-
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_KANA_EXTENDED_A</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_MASARAM_GONDI</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_NUSHU</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_SOYOMBO</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_SYRIAC_SUPPLEMENT</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_ZANABAZAR_SQUARE</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_BHA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_JA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_LLA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_LLLA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_NGA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_NNA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_NNNA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_NYA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_RA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_SSA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_MALAYALAM_TTA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_EMOJI_COMPONENT</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_PREPENDED_CONCATENATION_MARK</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_REGIONAL_INDICATOR</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_MASARAM_GONDI</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_SOYOMBO</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_ZANABAZAR_SQUARE</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 60</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in $rightVer.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">utf_old.h</td><td class="proto"><tt>#define</tt> U_HIDE_OBSOLETE_UTF_OLD_H</td><td class="">(missing)</td><td>Deprecated<br>
-<span class=""><span>ICU 2.4</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">utf16.h</td><td class="proto"><tt>#define</tt> U16_GET_OR_FFFD</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">utf16.h</td><td class="proto"><tt>#define</tt> U16_NEXT_OR_FFFD</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">utf16.h</td><td class="proto"><tt>#define</tt> U16_PREV_OR_FFFD</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 60</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">utf8.h</td><td class="proto"><tt>#define</tt> U8_IS_VALID_LEAD3_AND_T1</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">utf8.h</td><td class="proto"><tt>#define</tt> U8_IS_VALID_LEAD4_AND_T1</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row0">
-<td class="file">utf8.h</td><td class="proto"><tt>#define</tt> U8_LEAD3_T1_BITS</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
-<tr class="row1">
-<td class="file">utf8.h</td><td class="proto"><tt>#define</tt> U8_LEAD4_T1_BITS</td><td class="">(missing)</td><td>Internal<br>
-</td>
-</tr>
 </table>
 <P></P>
 <a href="#_top">(jump back to top)</a>
 <hr>
 <a name="other"></a>
-<h2>Other existing drafts in ICU 60</h2>
+<h2>Other existing drafts in ICU 61</h2>
 <div class="other">
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 59</th><th>ICU 60</th>
+<th>File</th><th>API</th><th>ICU 60</th><th>ICU 61</th>
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::fold(uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">bytestream.h</td><td class="proto">icu::StringByteSink&lt; StringClass &gt;::StringByteSink(StringClass*, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row0">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::toLower(const char*, uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> void icu::CaseMap::utf8Fold(uint32_t, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::toTitle(const char*, uint32_t, BreakIterator*, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> void icu::CaseMap::utf8ToLower(const char*, uint32_t, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row0">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::toUpper(const char*, uint32_t, const char16_t*, int32_t, char16_t*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> void icu::CaseMap::utf8ToTitle(const char*, uint32_t, BreakIterator*, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8Fold(uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">casemap.h</td><td class="proto"><tt>static</tt> void icu::CaseMap::utf8ToUpper(const char*, uint32_t, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row0">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8ToLower(const char*, uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">currunit.h</td><td class="proto">icu::CurrencyUnit::CurrencyUnit()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8ToTitle(const char*, uint32_t, BreakIterator*, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">currunit.h</td><td class="proto">icu::CurrencyUnit::CurrencyUnit(const MeasureUnit&amp;, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row0">
-<td class="file">casemap.h</td><td class="proto"><tt>static</tt> int32_t icu::CaseMap::utf8ToUpper(const char*, uint32_t, const char*, int32_t, char*, int32_t, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">dcfmtsym.h</td><td class="proto">icu::DecimalFormatSymbols::DecimalFormatSymbols(const Locale&amp;, const NumberingSystem&amp;, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
-<td class="file">char16ptr.h</td><td class="proto">char16_t* icu::Char16Ptr::get()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">edits.h</td><td class="proto">Edits&amp; icu::Edits::mergeAndAppend(const Edits&amp;, const Edits&amp;, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row0">
-<td class="file">char16ptr.h</td><td class="proto">const char16_t* icu::ConstChar16Ptr::get()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">edits.h</td><td class="proto">Edits&amp; icu::Edits::operator=(Edits&amp;&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
-<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(char16_t*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">edits.h</td><td class="proto">Edits&amp; icu::Edits::operator=(const Edits&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row0">
-<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(std::nullptr_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">edits.h</td><td class="proto">icu::Edits::Edits(Edits&amp;&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
-<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(uint16_t*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">edits.h</td><td class="proto">icu::Edits::Edits(const Edits&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row0">
-<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::Char16Ptr(wchar_t*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">edits.h</td><td class="proto">int32_t icu::Edits::numberOfChanges()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
-<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::operator char16_t* ()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">filteredbrk.h</td><td class="proto">BreakIterator* icu::FilteredBreakIteratorBuilder::wrapIteratorWithFilter(BreakIterator*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row0">
-<td class="file">char16ptr.h</td><td class="proto">icu::Char16Ptr::~Char16Ptr()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const char16_t*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const uint16_t*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::ConstChar16Ptr(const wchar_t*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::operator const char16_t* ()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">char16ptr.h</td><td class="proto">icu::ConstChar16Ptr::~ConstChar16Ptr()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getCoarseChangesIterator()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getCoarseIterator()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getFineChangesIterator()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">edits.h</td><td class="proto">Iterator icu::Edits::getFineIterator()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">edits.h</td><td class="proto">UBool icu::Edits::copyErrorTo(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">edits.h</td><td class="proto">UBool icu::Edits::hasChanges()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">edits.h</td><td class="proto">icu::Edits::Edits()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">edits.h</td><td class="proto">icu::Edits::~Edits()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">edits.h</td><td class="proto">int32_t icu::Edits::lengthDelta()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">edits.h</td><td class="proto">void icu::Edits::addReplace(int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">edits.h</td><td class="proto">void icu::Edits::addUnchanged(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">edits.h</td><td class="proto">void icu::Edits::reset()</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">filteredbrk.h</td><td class="proto"><tt>static</tt> FilteredBreakIteratorBuilder* icu::FilteredBreakIteratorBuilder::createEmptyInstance(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
 <td class="file">localpointer.h</td><td class="proto">LocalArray&lt;T&gt;&amp; icu::LocalArray&lt; T &gt;::moveFrom(LocalArray&lt; T &gt;&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 56</td>
@@ -1278,53 +615,279 @@
 <td class="file">measfmt.h</td><td class="proto">void icu::MeasureFormat::parseObject(const UnicodeString&amp;, Formattable&amp;, ParsePosition&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 53</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createPoint(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">normalizer2.h</td><td class="proto">UBool icu::FilteredNormalizer2::isNormalizedUTF8(StringPiece, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
-<td class="file">ubrk.h</td><td class="proto">UBreakIterator* ubrk_openBinaryRules(const uint8_t*, int32_t, const UChar*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">normalizer2.h</td><td class="proto">UBool icu::Normalizer2::isNormalizedUTF8(StringPiece, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row0">
-<td class="file">ubrk.h</td><td class="proto">int32_t ubrk_getBinaryRules(UBreakIterator*, uint8_t*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">normalizer2.h</td><td class="proto">void icu::FilteredNormalizer2::normalizeUTF8(uint32_t, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
-<td class="file">unistr.h</td><td class="proto">UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const uint16_t*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">normalizer2.h</td><td class="proto">void icu::Normalizer2::normalizeUTF8(uint32_t, StringPiece, ByteSink&amp;, Edits*, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row0">
-<td class="file">unistr.h</td><td class="proto">UNISTR_FROM_STRING_EXPLICIT icu::UnicodeString::UnicodeString(const wchar_t*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
+<td class="file">nounit.h</td><td class="proto">UClassID icu::NoUnit::getDynamicClassID()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">nounit.h</td><td class="proto">UObject* icu::NoUnit::clone()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">nounit.h</td><td class="proto">icu::NoUnit::NoUnit(const NoUnit&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">nounit.h</td><td class="proto">icu::NoUnit::~NoUnit()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">nounit.h</td><td class="proto"><tt>static</tt> NoUnit icu::NoUnit::base()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">nounit.h</td><td class="proto"><tt>static</tt> NoUnit icu::NoUnit::percent()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">nounit.h</td><td class="proto"><tt>static</tt> NoUnit icu::NoUnit::permille()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">nounit.h</td><td class="proto"><tt>static</tt> UClassID icu::NoUnit::getStaticClassID()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">Appendable&amp; icu::number::FormattedNumber::appendTo(Appendable&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::adoptSymbols(NumberingSystem*)</td><td class="">(missing)<br>
+</td><td>Draft<br>
+<span class=""><span>ICU 60</span></span></td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::adoptUnit(icu::MeasureUnit*)</td><td class="">(missing)<br>
+</td><td>Draft<br>
+<span class=""><span>ICU 60</span></span></td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::decimal(const UNumberDecimalSeparatorDisplay&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::integerWidth(const IntegerWidth&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::notation(const Notation&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::rounding(const Rounder&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::sign(const UNumberSignDisplay&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::symbols(const DecimalFormatSymbols&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::unit(const icu::MeasureUnit&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::unitWidth(const UNumberUnitWidth&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">FormattedNumber icu::number::LocalizedNumberFormatter::formatDecimal(StringPiece, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">FormattedNumber icu::number::LocalizedNumberFormatter::formatDouble(double, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">FormattedNumber icu::number::LocalizedNumberFormatter::formatInt(int64_t, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">IntegerWidth icu::number::IntegerWidth::truncateAt(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">LocalizedNumberFormatter icu::number::UnlocalizedNumberFormatter::locale(const icu::Locale&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">Rounder icu::number::CurrencyRounder::withCurrency(const CurrencyUnit&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">Rounder icu::number::FractionRounder::withMaxDigits(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">Rounder icu::number::FractionRounder::withMinDigits(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">Rounder icu::number::IncrementRounder::withMinFraction(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">Rounder icu::number::Rounder::withMode(UNumberFormatRoundingMode)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">ScientificNotation icu::number::ScientificNotation::withExponentSignDisplay(UNumberSignDisplay)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">ScientificNotation icu::number::ScientificNotation::withMinExponentDigits(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">UBool icu::number::NumberFormatterSettings&lt; Derived &gt;::copyErrorTo(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">UnicodeString icu::number::FormattedNumber::toString()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberDecimalSeparatorDisplay::UNUM_DECIMAL_SEPARATOR_ALWAYS</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberDecimalSeparatorDisplay::UNUM_DECIMAL_SEPARATOR_AUTO</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_ALWAYS</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ALWAYS</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_AUTO</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_NEVER</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_HIDDEN</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_ISO_CODE</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_SHORT</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">icu::number::FormattedNumber::~FormattedNumber()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">icu::number::LocalizedNumberFormatter::LocalizedNumberFormatter(const LocalizedNumberFormatter&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">icu::number::LocalizedNumberFormatter::~LocalizedNumberFormatter()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">icu::number::NumberFormatter::NumberFormatter()=delete</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">icu::number::UnlocalizedNumberFormatter::UnlocalizedNumberFormatter(const UnlocalizedNumberFormatter&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> CompactNotation icu::number::Notation::compactLong()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> CompactNotation icu::number::Notation::compactShort()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> CurrencyRounder icu::number::Rounder::currency(UCurrencyUsage)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> DigitRounder icu::number::Rounder::fixedDigits(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> DigitRounder icu::number::Rounder::maxDigits(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> DigitRounder icu::number::Rounder::minDigits(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> DigitRounder icu::number::Rounder::minMaxDigits(int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> FractionRounder icu::number::Rounder::fixedFraction(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> FractionRounder icu::number::Rounder::integer()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> FractionRounder icu::number::Rounder::maxFraction(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> FractionRounder icu::number::Rounder::minFraction(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> FractionRounder icu::number::Rounder::minMaxFraction(int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> IncrementRounder icu::number::Rounder::increment(double)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> IntegerWidth icu::number::IntegerWidth::zeroFillTo(int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> LocalizedNumberFormatter icu::number::NumberFormatter::withLocale(const Locale&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> Rounder icu::number::Rounder::unlimited()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> ScientificNotation icu::number::Notation::engineering()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> ScientificNotation icu::number::Notation::scientific()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> SimpleNotation icu::number::Notation::simple()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> UnlocalizedNumberFormatter icu::number::NumberFormatter::with()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numberformatter.h</td><td class="proto">void icu::number::FormattedNumber::populateFieldPosition(FieldPosition&amp;, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numberformatter.h</td><td class="proto">void icu::number::FormattedNumber::populateFieldPositionIterator(FieldPositionIterator&amp;, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">numfmt.h</td><td class="proto">ERoundingMode icu::NumberFormat::getRoundingMode()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">numfmt.h</td><td class="proto">void icu::NumberFormat::setRoundingMode(ERoundingMode)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">rbnf.h</td><td class="proto">ERoundingMode icu::RuleBasedNumberFormat::getRoundingMode()</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">rbnf.h</td><td class="proto">void icu::RuleBasedNumberFormat::setRoundingMode(ERoundingMode)</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_EDITS_NO_RESET</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_OMIT_UNCHANGED_TEXT</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_TITLECASE_ADJUST_TO_CASED</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_TITLECASE_SENTENCES</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">stringoptions.h</td><td class="proto"><tt>#define</tt> U_TITLECASE_WHOLE_STRING</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
 </tr>
 <tr class="row1">
 <td class="file">unistr.h</td><td class="proto">UnicodeString&amp; icu::UnicodeString::moveFrom(UnicodeString&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 56</td>
 </tr>
 <tr class="row0">
-<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const std::nullptr_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const std::nullptr_t, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const uint16_t*, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(const wchar_t*, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(std::nullptr_t, int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(uint16_t*, int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">unistr.h</td><td class="proto">icu::UnicodeString::UnicodeString(wchar_t*, int32_t, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
-<td class="file">unum.h</td><td class="proto">int32_t unum_formatDoubleForFields(const UNumberFormat*, double, UChar*, int32_t, UFieldPositionIterator*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row0">
-<td class="file">upluralrules.h</td><td class="proto">UEnumeration* uplrules_getKeywords(const UPluralRules*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft<br>ICU 59</td>
-</tr>
-<tr class="row1">
 <td class="file">uregex.h</td><td class="proto"><tt>enum</tt> URegexpFlag::UREGEX_CANON_EQ</td><td class="" colspan="2" align="center">Draft<br>ICU 2.4</td>
 </tr>
+<tr class="row1">
+<td class="file">utf16.h</td><td class="proto"><tt>#define</tt> U16_GET_OR_FFFD</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row0">
+<td class="file">utf16.h</td><td class="proto"><tt>#define</tt> U16_NEXT_OR_FFFD</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
+<tr class="row1">
+<td class="file">utf16.h</td><td class="proto"><tt>#define</tt> U16_PREV_OR_FFFD</td><td class="" colspan="2" align="center">Draft<br>ICU 60</td>
+</tr>
 </table>
 </div>
 <P></P>
@@ -1340,7 +903,7 @@
 <a href="#_top">(jump back to top)</a>
 <hr>
 <p>
-<i><font size="-1">Contents generated by StableAPI tool on Wed Oct 04 23:55:39 UTC 2017<br>Copyright (C) 2017, International Business Machines Corporation, All Rights Reserved.</font></i>
+<i><font size="-1">Contents generated by StableAPI tool on Wed Mar 07 19:18:25 UTC 2018<br>Copyright (C) 2018, International Business Machines Corporation, All Rights Reserved.</font></i>
 </p>
 </body>
 </html>
diff --git a/icu4c/LICENSE b/icu4c/LICENSE
index c84076c..25b6eb9 100644
--- a/icu4c/LICENSE
+++ b/icu4c/LICENSE
@@ -1,7 +1,7 @@
 COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later)
 
-Copyright © 1991-2017 Unicode, Inc. All rights reserved.
-Distributed under the Terms of Use in http://www.unicode.org/copyright.html
+Copyright © 1991-2018 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of the Unicode data files and any associated documentation
@@ -383,3 +383,32 @@
  #    by ICANN or the IETF Trust on the database or the code.  Any person
  #    making a contribution to the database or code waives all rights to
  #    future claims in that contribution or in the TZ Database.
+
+6. Google double-conversion
+
+Copyright 2006-2011, the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/icu4c/icu4c.css b/icu4c/icu4c.css
index b6f2400..b7631ff 100644
--- a/icu4c/icu4c.css
+++ b/icu4c/icu4c.css
@@ -500,7 +500,9 @@
 	font-size: smaller;
 }
 
-
+.no-left-margin {
+    margin-left: 0;
+}
 
 @media print {
 	div#toc {
diff --git a/icu4c/packaging/distrelease.ps1 b/icu4c/packaging/distrelease.ps1
new file mode 100644
index 0000000..c3d853b
--- /dev/null
+++ b/icu4c/packaging/distrelease.ps1
@@ -0,0 +1,54 @@
+# Copyright (C) 2016 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+#-------------------------
+# Script: icu\packaging\distrelease.ps1
+# Author: Steven R. Loomis
+# Date: 2017-04-14
+#-------------------------
+#
+# This builds a zipfile containing the *64 bit* Windows binaries.
+# (Note: The zipfile does not include the UWP binaries.)
+#
+# Usage: (after building ICU using MSVC) 
+#  (bring up Powershell ISE)
+#    cd C:\icu\icu4c\
+#    Set-ExecutionPolicy -Scope Process Unrestricted
+#    .\packaging\distrelease.ps1
+#
+# Will emit: c:\icu4c\icu\source\dist\icu-windows.zip
+#
+#
+# You will get warnings from the execution policy and the script itself.
+#  see https://docs.microsoft.com/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-5.1&viewFallbackFrom=powershell-Microsoft.PowerShell.Core 
+#    for more about execution policies.
+
+
+$icuDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
+$icuDir = Resolve-Path -Path '$icuDir\..'
+
+echo  $icuDir
+
+# ok, create some work areas
+New-Item -Path "$icuDir\source\dist" -ErrorAction SilentlyContinue -ItemType "directory"
+$source = "$icuDir\source\dist\icu"
+Get-ChildItem -Path $source -ErrorAction SilentlyContinue | Remove-Item -Recurse
+New-Item -Path $source -ItemType "directory" -ErrorAction SilentlyContinue
+
+# copy required stuff
+Copy-Item -Path "$icuDir\lib64" -Destination $source -Recurse
+Copy-Item -Path "$icuDir\include" -Destination $source -Recurse
+Copy-Item -Path "$icuDir\bin64" -Destination $source -Recurse
+Copy-Item -Path "$icuDir\APIChangeReport.html" -Destination $source -Recurse
+Copy-Item -Path "$icuDir\icu4c.css" -Destination $source -Recurse
+Copy-Item -Path "$icuDir\LICENSE" -Destination $source -Recurse
+Copy-Item -Path "$icuDir\readme.html" -Destination $source -Recurse
+
+
+$destination = "$icuDir\source\dist\icu-windows.zip"
+Remove-Item -Path $destination -ErrorAction Continue
+Add-Type -assembly "system.io.compression.filesystem"
+Echo $source
+Echo $destination
+[io.compression.zipfile]::CreateFromDirectory($source, $destination)
+
+echo $destination
\ No newline at end of file
diff --git a/icu4c/readme.html b/icu4c/readme.html
index dfa5e3b..5f99a22 100644
--- a/icu4c/readme.html
+++ b/icu4c/readme.html
@@ -3,7 +3,7 @@
 
 <html lang="en-US" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-    <title>ReadMe for ICU 60.2</title>
+    <title>ReadMe for ICU 61.1</title>
     <meta name="COPYRIGHT" content=
     "Copyright (C) 2016 and later: Unicode, Inc. and others. License &amp; terms of use: http://www.unicode.org/copyright.html"/>
     <!-- meta name="COPYRIGHT" content=
@@ -24,7 +24,7 @@
 -->
 
   <body>
-  <!-- <body> -->
+  <!-- <body class="rc"> -->
     <p class="only-draft"><b>Note:</b> This is a draft readme.</p>
 
     <h1>
@@ -32,7 +32,7 @@
       International Components for Unicode<br/>
       <span class="only-rc">Release Candidate</span>
       <span class="only-milestone">(Milestone Release)</span>
-      <abbr title="International Components for Unicode">ICU</abbr> 60.2 ReadMe
+      <abbr title="International Components for Unicode">ICU</abbr> 61.1 ReadMe
     </h1>
 
     <!-- Shouldn't need to comment/uncomment this paragraph, just change the body class -->
@@ -44,15 +44,12 @@
     <p class="note only-rc">This is a release candidate version of ICU4C.
       It is not recommended for production use.</p>
 
-    <p>Last updated: 2017-Dec-07<br/>
+    <p>Last updated: 2018-Mar-21<br/>
       Copyright &copy; 2016 and later: Unicode, Inc. and others. License &amp; terms of use:
       <a href="http://www.unicode.org/copyright.html">http://www.unicode.org/copyright.html</a><br/>
       Copyright &copy; 1997-2016 International Business Machines Corporation and others.
       All Rights Reserved.</p>
     <!-- Remember that there is a copyright at the end too -->
-
-    <p class="note">This is a maintenance update of ICU 60,
-      with a small number of bug fixes but no API changes.</p>
     <hr/>
 
     <h2 class="TOC">Table of Contents</h2>
@@ -236,7 +233,7 @@
 
     <h2><a name="News" href="#News" id="News">What Is New In This Release?</a></h2>
 
-    <p>See the <a href="http://site.icu-project.org/download/60">ICU 60 download page</a>
+    <p>See the <a href="http://site.icu-project.org/download/61">ICU 61 download page</a>
     for an overview of this release, important changes, new features, bug fixes, known issues,
     changes to supported platforms and build environments,
     and migration issues for existing applications migrating from previous ICU releases.</p>
@@ -554,12 +551,37 @@
     we recommend a small number of modifications and build options.
     Note that C99 compatibility is now required.</p>
     <ul>
-      <li><b>Namespace:</b> By default, unicode/uversion.h has
+      <li><b>Namespace (ICU 61 and later):</b>
+        Since ICU 61, call sites need to qualify ICU types explicitly,
+        for example <code>icu::UnicodeString</code>,
+        or do <code>using icu::UnicodeString;</code> where appropriate.
+        If your code relies on the "using namespace icu;" that used to be in unicode/uversion.h,
+        then you need to update your code.<br />
+        You could temporarily (until you have more time to update your code)
+        revert to the default "using"
+        via <code>-DU_USING_ICU_NAMESPACE=1</code>
+        or by modifying unicode/uversion.h:
+<pre>Index: icu4c/source/common/unicode/uversion.h
+===================================================================
+--- icu4c/source/common/unicode/uversion.h      (revision 40704)
++++ icu4c/source/common/unicode/uversion.h      (working copy)
+@@ -127,7 +127,7 @@
+                 defined(U_LAYOUTEX_IMPLEMENTATION) || defined(U_TOOLUTIL_IMPLEMENTATION)
+ #           define U_USING_ICU_NAMESPACE 0
+ #       else
+-#           define U_USING_ICU_NAMESPACE 0
++#           define U_USING_ICU_NAMESPACE 1
+ #       endif
+ #   endif
+ #   if U_USING_ICU_NAMESPACE
+</pre>
+      </li>
+      <li><b>Namespace (ICU 60 and earlier):</b> By default, unicode/uversion.h has
         "using namespace icu;" which defeats much of the purpose of the namespace.
         (This is for historical reasons: Originally, ICU4C did not use namespaces,
         and some compilers did not support them. The default "using" statement
         preserves source code compatibility.)<br />
-        If this compatibility is not an issue, we recommend you turn this off
+        You should turn this off
          via <code>-DU_USING_ICU_NAMESPACE=0</code>
         or by modifying unicode/uversion.h:
 <pre>Index: source/common/unicode/uversion.h
@@ -755,7 +777,7 @@
     <ul>
       <li>Microsoft Windows</li>
 
-      <li>Microsoft Visual C++ (part of <a href="https://www.visualstudio.com/">Visual Studio</a>) (see the ICU download page for the currently compatible version)</li>
+      <li>Microsoft Visual C++ (part of <a href="https://www.visualstudio.com/">Visual Studio</a>) (from either Visual Studio 2015 or Visual Studio 2017)</li>
       
       <li><i><b>Optional:</b></i> A version of the <a href="https://developer.microsoft.com/windows/downloads">Windows 10 SDK</a> (if you want to build the UWP projects)</li>
     </ul>
@@ -765,26 +787,36 @@
     <p>The steps are:</p>
 
     <ol>
-      <li>Unzip the icu-XXXX.zip file into any convenient location. Using command
-      line zip, type "unzip -a icu-XXXX.zip -d drive:\directory", or just use
-      WinZip.</li>
+      <li>Unzip the <tt>icu-XXXX.zip</tt> file into any convenient location.<br/>
+        <ul class="no-left-margin">
+          <li>You can use the built-in zip functionality of Windows Explorer to do this.
+          Right-click on the .zip file and choose the "Extract All" option from the context menu.
+          This will open a new window where you can choose the output location to put the files.</li>
+          <li>Alternatively, you can use a 3<sup>rd</sup> party GUI tool like 7-Zip or WinZip to do this as well.</li>
+        </ul>
+      </li>
 
-      <li>Be sure that the ICU binary directory, <i>&lt;ICU&gt;</i>\bin\, is
+      <li>Be sure that the ICU binary directory, (ex: <i>&lt;ICU&gt;</i><tt>\bin\</tt>), is
       included in the <strong>PATH</strong> environment variable. The tests will
-      not work without the location of the ICU DLL files in the path.</li>
+      not work without the location of the ICU DLL files in the path.
+      Note that the binary directory name can depend on what architecture you select when you compile ICU.
+      For x86 or 32-bit builds, the binary directory is "<tt>bin</tt>". Whereas for x64 or 64-bit builds
+      the binary directory is "<tt>bin64</tt>".
+      </li>
 
-      <li>Open the "<i>&lt;ICU&gt;</i>\source\allinone\allinone.sln" workspace
-      file in Microsoft Visual Studio. (This solution includes all the
+      <li>Open the "<i>&lt;ICU&gt;</i><tt>\source\allinone\allinone.sln</tt>" solution
+      file in 'Visual Studio 2017'. (This solution includes all the
       International Components for Unicode libraries, necessary ICU building
-      tools, and the test suite projects). Please see the <a href=
-      "#HowToBuildWindowsCommandLine">command line note below</a> if you want to
+      tools, and the test suite projects). Please see the 
+      <a href="#HowToBuildWindowsCommandLine">command line note below</a> if you want to
       build from the command line instead.</li>
 
-      <li>You may need to re-target the UWP projects to the version of the SDK that you have installed. In Visual Studio you can
-      right-click on the UWP projects and select the option 'Retarget SDK Version'. Note: You do not need to have a copy of 
-      the Windows 10 SDK installed in order to build the non-UWP projects in Visual Studio. If the SDK is not installed then the
-      UWP projects will simply not be loaded.</li>
-
+      <li>If you are building using 'Visual Studio 2015' instead, or if you are building the UWP projects and you have a different
+      version of the Windows 10 SDK installed you will first need to modify the two "<tt>Build.Windows.*.props</tt>" files
+      in the "<tt>allinone</tt>" directory before you can open the "allinone" solution file.
+      Please see the notes below about <a href="#HowToUseOtherVSVersions">building with other versions of Visual Studio</a> or the 
+      notes on <a href="#HowToRetargetTheWin10SDK">re-targeting the Windows 10 SDK for the UWP projects</a> for details.</li>
+      
       <li>Set the active platform to "Win32" or "x64" (See <a href="#HowToBuildWindowsPlatform">Windows platform note</a> below)
       and configuration to "Debug" or "Release" (See <a href="#HowToBuildWindowsConfig">Windows configuration note</a> below).</li>
 
@@ -792,62 +824,123 @@
       build the Debug and Release at the same time, see the <a href=
       "#HowToBuildWindowsBatch">batch configuration note</a> below.</li>
 
-
       <li>Run the tests. They can be run from the command line or from within Visual Studio.
 
-	 <h4>Running the Tests from the Windows Command Line (cmd)</h4>
-	<ul>
-	   <li>For x86 (32 bit) and Debug, use: <br />
+        <h4>Running the Tests from the Windows Command Line (cmd)</h4>
+        <ul>
+          <li>The general syntax is:<br />
+              <div class="indent">
+                <tt><i>&lt;ICU&gt;</i>\source\allinone\icucheck.bat  <i>Platform</i> <i>Configuration</i></tt>
+              </div>
+          </li>
+          <li>So, for example for x86 (32-bit) and Debug, use the following:<br />
+              <samp><i>&lt;ICU&gt;</i>\source\allinone\icucheck.bat  <b>x86</b> <b>Debug</b></samp>
+              For x86 (32-bit) and Release:
+              <samp><i>&lt;ICU&gt;</i>\source\allinone\icucheck.bat  <b>x86</b> <b>Release</b></samp>
+              For x64 (64-bit) and Debug:
+              <samp><i>&lt;ICU&gt;</i>\source\allinone\icucheck.bat  <b>x64</b> <b>Debug</b></samp>
+              For x64 (64-bit) and Release:
+              <samp><i>&lt;ICU&gt;</i>\source\allinone\icucheck.bat  <b>x64</b> <b>Release</b></samp>
+          </li>
+        </ul>
 
-	<tt><i>&lt;ICU&gt;</i>\source\allinone\icucheck.bat  <i>Platform</i> <i>Configuration</i>
-		</tt> <br />
-       </li>
-	<li>So, for example:
-				 <br />
-		<samp><i>&lt;ICU&gt;</i>\source\allinone\icucheck.bat  <b>x86</b> <b>Debug</b></samp>
-				or
-		<samp><i>&lt;ICU&gt;</i>\source\allinone\icucheck.bat  <b>x86</b> <b>Release</b></samp>
-				or
-		<samp><i>&lt;ICU&gt;</i>\source\allinone\icucheck.bat  <b>x64</b> <b>Release</b></samp></li>
-	</ul>
+        <h4>Running the Tests from within Visual Studio</h4>
 
-         <h4>Running the Tests from within Visual Studio</h4>
+        <ol>
+          <li>Run the C++ test suite, "<tt>intltest</tt>". To do this: set the active startup
+          project to "intltest", and press Ctrl+F5 to run it. Make sure that it
+          passes without any errors.</li>
 
-	<ol>
-      <li>Run the C++ test suite, "intltest". To do this: set the active startup
-      project to "intltest", and press Ctrl+F5 to run it. Make sure that it
-      passes without any errors.</li>
+          <li>Run the C test suite, "<tt>cintltst</tt>". To do this: set the active startup
+          project to "cintltst", and press Ctrl+F5 to run it. Make sure that it
+          passes without any errors.</li>
 
-      <li>Run the C test suite, "cintltst". To do this: set the active startup
-      project to "cintltst", and press Ctrl+F5 to run it. Make sure that it
-      passes without any errors.</li>
-
-      <li>Run the I/O test suite, "iotest". To do this: set the active startup
-      project to "iotest", and press Ctrl+F5 to run it. Make sure that it passes
-      without any errors.</li>
-
-	</ol>
-
+          <li>Run the I/O test suite, "<tt>iotest</tt>". To do this: set the active startup
+          project to "iotest", and press Ctrl+F5 to run it. Make sure that it passes
+          without any errors.</li>
+        </ol>
 	</li>
 
       <li>You are now able to develop applications with ICU by using the
-      libraries and tools in <i>&lt;ICU&gt;</i>\bin\. The headers are in
-      <i>&lt;ICU&gt;</i>\include\ and the link libraries are in
-      <i>&lt;ICU&gt;</i>\lib\. To install the ICU runtime on a machine, or ship
+      libraries and tools in <tt><i>&lt;ICU&gt;</i>\bin\</tt>. The headers are in
+      <tt><i>&lt;ICU&gt;</i>\include\</tt> and the link libraries are in
+      <tt><i>&lt;ICU&gt;</i>\lib\</tt>. To install the ICU runtime on a machine, or ship
       it with your application, copy the needed components from
-      <i>&lt;ICU&gt;</i>\bin\ to a location on the system PATH or to your
+      <tt><i>&lt;ICU&gt;</i>\bin\</tt> to a location on the system PATH or to your
       application directory.</li>
     </ol>
 
+    <p><a name="HowToUseOtherVSVersions" id="HowToUseOtherVSVersions">
+    <strong>Building with other versions of Visual Studio Note:</strong></a>
+    The particular version of the MSVC compiler tool-set (and thus the corresponding version of Visual Studio) that
+    is used to compile ICU is determined by the "<tt>PlatformToolset</tt>" property. This property is stored in two
+    different shared files that are used to set common configuration settings amongst the various ICU "<tt>*.vcxproj</tt>" project files.
+    
+    For the non-UWP projects, this setting is in the shared file called "<tt>Build.Windows.ProjectConfiguration.props</tt>" located
+    in the "allinone" directory.
+    
+    For the UWP projects, this setting is in the shared file called "<tt>Build.Windows.UWP.ProjectConfiguration.props</tt>", also 
+    located in the "allinone" directory.
+    <br/>
+    The value of <tt>v140</tt> corresponds to the Visual Studio 2015 compiler tool set, whereas the value of
+    <tt>v141</tt> corresponds to the Visual Studio 2017 compiler tool set.
+    
+    <br/>In order to build the non-UWP projects with Visual Studio 2015 you will need to modify the file
+    called "<tt>Build.Windows.ProjectConfiguration.props</tt>" to change the value of the <tt>PlatformToolset</tt> property.
+    
+    Note however that Visual Studio 2017 is required for building the UWP projects.
+    </p>
+    
+    <p>Please consider: Using older versions of the MSVC compiler is generally not recommended due to the improved support for the C++11 standard
+    in newer versions of the compiler.</p>
+    
+    <p><a name="HowToRetargetTheWin10SDK" id="HowToRetargetTheWin10SDK">
+    <strong>Re-targeting the Windows 10 SDK for the UWP projects Note:</strong></a>
+    
+      If the version of the Windows 10 SDK that you have installed does not match the version used by the UWP projects, then you 
+      will need to "retarget" them to use the version of the SDK that you have installed instead.
+      
+      There are two ways to do this:
+      <ul>
+        <li>In Visual Studio you can right-click on the UWP projects in the 'Solution Explorer' and select the
+            option 'Retarget Projects' from the context menu. This will open up a window where you can select the
+            SDK version to target from a drop-down list of the various SDKs that are installed on the machine.</li>
+
+        <li>Alternatively, you can manually edit the shared file called "<tt>Build.Windows.UWP.ProjectConfiguration.props</tt>"
+            which is located in the "allinone" directory. You will need to change the of the
+            "<tt>WindowsTargetPlatformVersion</tt>" property to the version of the SDK that you would like to use instead.</li>
+      </ul>
+    </p>
+    
     <p><a name="HowToBuildWindowsCommandLine" id=
-    "HowToBuildWindowsCommandLine"><strong>Using MSDEV At The Command Line
-    Note:</strong></a> You can build ICU from the command line. Assuming that you
-    have properly installed Microsoft Visual C++ to support command line
-    execution, you can run the following command to build the 32-bit Release version:
-    <code>'devenv.com <i>&lt;ICU&gt;</i>\source\allinone\allinone.sln /build "Release|Win32"'</code>.
-    Or to build the 64-bit Release version from the command line: 
-    <code>'devenv.com <i>&lt;ICU&gt;</i>\source\allinone\allinone.sln /build "Release|x64"'</code>.
-    <br />You can also use Cygwin with this compiler to build ICU, and you can refer to the <a href=
+    "HowToBuildWindowsCommandLine"><strong>Using MSBUILD At The Command Line Note:</strong></a>
+    You can build ICU from the command line instead of using the Visual Studio GUI.
+    
+    Assuming that you have properly installed Visual Studio to support command line building, you 
+    should have a shortcut for the "Developer Command Prompt" listed in the Start Menu.
+    (For Visual Studio 2017 you will need to install the "Desktop development with C++" option).</p>
+    
+    <ul>
+      <li>Open the "Developer Command Prompt" shortcut from the Start Menu. (This will open up a new command line window).</li>
+      <li>From within the "Developer Command Prompt" change directory (<tt>cd</tt>) to the ICU source directory.</li>
+      <li>You can then use either '<tt>msbuild</tt>' directly, or you can use the '<tt>devenv.com</tt>' command to build ICU.</li>
+      <li>Using <tt>MSBUILD</tt>:</li>
+      <ul class="no-left-margin">
+        <li>To build the 32-bit Debug version, use the following command line:
+          <code>'msbuild source\allinone\allinone.sln /p:Configuration=Debug /p:Platform=Win32'</code>.</li>
+        <li>To build the 64-bit Release version, use the following command line: 
+          <code>'msbuild source\allinone\allinone.sln /p:Configuration=Release /p:Platform=x64'</code>.</li>
+      </ul>
+      <li>Using <tt>devenv.com</tt>:</li>
+      <ul class="no-left-margin">
+        <li>To build the 32-bit Debug version, use the following command line:
+          <code>'devenv.com source\allinone\allinone.sln /build "Debug|Win32"'</code>.</li>
+        <li>To build the 64-bit Release version, use the following command line: 
+          <code>'devenv.com source\allinone\allinone.sln /build "Release|x64"'</code>.</li>
+      </ul>
+    </ul>
+    
+    <p>You can also use Cygwin with the MSVC compiler to build ICU, and you can refer to the <a href=
     "#HowToBuildCygwin">How To Build And Install On Windows with Cygwin</a>
     section for more details.</p>
 
@@ -1597,13 +1690,13 @@
     <h3><a name="ImportantNotesWindows" href="#ImportantNotesWindows" id=
     "ImportantNotesWindows">Windows Platform</a></h3>
 
-    <p>If you are building on the Win32 platform, it is important that you
+    <p>If you are building on the Windows platform, it is important that you
     understand a few of the following build details.</p>
 
     <h4>DLL directories and the PATH setting</h4>
 
     <p>As delivered, the International Components for Unicode build as several
-    DLLs, which are placed in the "<i>&lt;ICU&gt;</i>\bin" directory. You must
+    DLLs, which are placed in the "<i>&lt;ICU&gt;</i>\bin64" directory. You must
     add this directory to the PATH environment variable in your system, or any
     executables you build will not be able to access International Components for
     Unicode libraries. Alternatively, you can copy the DLL files into a directory
@@ -1613,12 +1706,12 @@
     <h4><a name="ImportantNotesWindowsPath" id=
     "ImportantNotesWindowsPath">Changing your PATH</a></h4>
 
-    <p><strong>Windows 2000/XP</strong>: Use the System Icon in the Control
+    <p><strong>Windows 2000/XP and above</strong>: Use the System Icon in the Control
     Panel. Pick the "Advanced" tab. Select the "Environment Variables..."
     button. Select the variable PATH in the lower box, and select the lower
     "Edit..." button. In the "Variable Value" box, append the string
-    ";<i>&lt;ICU&gt;</i>\bin" to the end of the path string. If there is
-    nothing there, just type in "<i>&lt;ICU&gt;</i>\bin". Click the Set button,
+    ";<i>&lt;ICU&gt;</i>\bin64" to the end of the path string. If there is
+    nothing there, just type in "<i>&lt;ICU&gt;</i>\bin64". Click the Set button,
     then the OK button.</p>
 
     <p>Note: When packaging a Windows application for distribution and
diff --git a/icu4c/source/allinone/Build.Windows.ProjectConfiguration.props b/icu4c/source/allinone/Build.Windows.ProjectConfiguration.props
new file mode 100644
index 0000000..0a16384
--- /dev/null
+++ b/icu4c/source/allinone/Build.Windows.ProjectConfiguration.props
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!-- Copyright (C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html -->

+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <!-- This file is used to set default configuration options for all non-UWP Visual Studio projects. -->

+  <!-- These are the default project configurations for building. -->

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|x64">

+      <Configuration>Debug</Configuration>

+      <Platform>x64</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|x64">

+      <Configuration>Release</Configuration>

+      <Platform>x64</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup>

+    <!-- This is the version of the MSVC tool-set to use. -->

+    <!-- v140 is the Visual Studio 2015 toolset. -->

+    <!-- v141 is the Visual Studio 2017 toolset. -->

+    <PlatformToolset>v141</PlatformToolset>

+  </PropertyGroup>

+  <PropertyGroup>

+    <!-- This is the default SDK target. -->

+    <!-- Note that the Windows 8.1 SDK is backwards compatible down-level to Windows 7, so

+         setting this to 8.1 does not actually imply targeting Windows 8.1. -->

+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>

+  </PropertyGroup>

+  <PropertyGroup>

+    <!-- We need to explicitly set the target version to Windows 7. -->

+    <Win32_WinNTVersion>0x0601</Win32_WinNTVersion>

+  </PropertyGroup>

+  <!-- Options that are common to *all* configurations for *all* projects. -->

+  <ItemDefinitionGroup>

+    <Midl>

+      <MkTypLibCompatible>true</MkTypLibCompatible>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+    </Midl>

+    <ClCompile>

+      <!-- Note: These preprocessor defines are for *all* configurations for *all* projects.  -->

+      <!-- Note: See ticket #5750 for the macro '_CRT_SECURE_NO_DEPRECATE'. -->

+      <PreprocessorDefinitions>

+        WINVER=$(Win32_WinNTVersion);

+        _WIN32_WINNT=$(Win32_WinNTVersion);

+        _CRT_SECURE_NO_DEPRECATE;

+        %(PreprocessorDefinitions)

+      </PreprocessorDefinitions>

+      <!-- We always want to treat wchar_t as a "real" C++ type, instead of a typedef. -->

+      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+      <!-- Set the source encoding and runtime encoding to UTF-8 by default. -->

+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>

+      <!-- Enable parallel compilation for faster builds. -->

+      <MultiProcessorCompilation>true</MultiProcessorCompilation>

+    </ClCompile>

+    <ResourceCompile>

+      <Culture>0x0409</Culture>

+    </ResourceCompile>

+    <Link>

+      <SuppressStartupBanner>true</SuppressStartupBanner>

+    </Link>

+  </ItemDefinitionGroup>

+  <!-- Options that are common to all 'Release' configurations for *all* projects. -->

+  <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">

+    <Midl>

+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </Midl>

+    <ClCompile>

+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <StringPooling>true</StringPooling>

+    </ClCompile>

+    <ResourceCompile>

+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ResourceCompile>

+    <Link>

+      <EnableCOMDATFolding>true</EnableCOMDATFolding>

+    </Link>

+  </ItemDefinitionGroup>

+  <!-- Options that are common to all 'Debug' configurations for *all* projects. -->

+  <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">

+    <Midl>

+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </Midl>

+    <ClCompile>

+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <Optimization>Disabled</Optimization>

+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>

+      <BufferSecurityCheck>true</BufferSecurityCheck>

+    </ClCompile>

+    <ResourceCompile>

+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ResourceCompile>

+    <Link>

+      <GenerateDebugInformation>true</GenerateDebugInformation>

+      <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>

+    </Link>

+  </ItemDefinitionGroup>

+  <!-- Options that are common to all 32-bit configurations for *all* projects. -->

+  <ItemDefinitionGroup Condition="'$(Platform)'=='Win32'">

+    <Midl>

+      <TargetEnvironment>Win32</TargetEnvironment>

+    </Midl>

+    <ClCompile>

+      <PreprocessorDefinitions>WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+    <Link>

+      <TargetMachine>MachineX86</TargetMachine>

+    </Link>

+  </ItemDefinitionGroup>

+  <!-- Options that are common to all 64-bit configurations for *all* projects. -->

+  <ItemDefinitionGroup Condition="'$(Platform)'=='x64'">

+    <Midl>

+      <TargetEnvironment>X64</TargetEnvironment>

+    </Midl>

+    <ClCompile>

+      <PreprocessorDefinitions>WIN64;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    </ClCompile>

+    <Link>

+      <TargetMachine>MachineX64</TargetMachine>

+    </Link>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/icu4c/source/allinone/Build.Windows.UWP.ProjectConfiguration.props b/icu4c/source/allinone/Build.Windows.UWP.ProjectConfiguration.props
new file mode 100644
index 0000000..4b51960
--- /dev/null
+++ b/icu4c/source/allinone/Build.Windows.UWP.ProjectConfiguration.props
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!-- Copyright (C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html -->

+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <!-- This file is used to set common configuration options for all *_uwp projects. -->

+  <PropertyGroup>

+    <!-- If not already set, use this version of the Win10 SDK -->

+    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>

+    <!-- If not already set, set the minimum Win10 SDK version to TH1/RTM -->

+    <WindowsTargetPlatformMinVersion>10.0.10240.0</WindowsTargetPlatformMinVersion>

+    

+    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>

+    <AppContainerApplication>true</AppContainerApplication>

+    <ApplicationType>Windows Store</ApplicationType>

+    <ApplicationTypeRevision>10.0</ApplicationTypeRevision>

+  </PropertyGroup>

+  <PropertyGroup>

+    <!-- This is the version of the MSVC tool-set to use. -->

+    <!-- v141 is the Visual Studio 2017 toolset. -->

+    <PlatformToolset>v141</PlatformToolset>

+  </PropertyGroup>

+  <ItemDefinitionGroup>

+    <Midl>

+      <PreprocessorDefinitions>

+        %(PreprocessorDefinitions)

+        U_PLATFORM_HAS_WINUWP_API=1;

+      </PreprocessorDefinitions>

+    </Midl>

+    <ClCompile>

+      <PreprocessorDefinitions>

+        %(PreprocessorDefinitions);

+        U_PLATFORM_HAS_WINUWP_API=1;

+      </PreprocessorDefinitions>

+    </ClCompile>

+    <ResourceCompile>

+      <PreprocessorDefinitions>

+        %(PreprocessorDefinitions)

+        U_PLATFORM_HAS_WINUWP_API=1;

+      </PreprocessorDefinitions>

+    </ResourceCompile>

+  </ItemDefinitionGroup>

+</Project>
\ No newline at end of file
diff --git a/icu4c/source/allinone/Windows.CopyUnicodeHeaderFiles.targets b/icu4c/source/allinone/Windows.CopyUnicodeHeaderFiles.targets
new file mode 100644
index 0000000..b6ece38
--- /dev/null
+++ b/icu4c/source/allinone/Windows.CopyUnicodeHeaderFiles.targets
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>

+<!-- Copyright (C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html -->

+<!--

+  This file is used to copy all of the header files (*.h) from a project's "unicode" folder to a common output folder.

+-->

+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <PropertyGroup>

+    <!-- This is the location of the common output folder. -->

+    <CopyDestionationPath>$(SolutionDir)\..\..\include\unicode</CopyDestionationPath>

+    <BuildDependsOn>

+      $(BuildDependsOn);

+      CopyUnicodeHeaderFiles;

+    </BuildDependsOn>

+  </PropertyGroup>

+  <Target Name="CopyUnicodeHeaderFiles">

+    <ItemGroup>

+      <!-- Generate a list of all files that end in .h from the 'unicode' folder, relative to the current project. -->

+      <OutputFiles Include=".\unicode\**\*.h" />

+    </ItemGroup>

+    <!-- This message will be logged in the project's build output. -->

+    <Message Text="Copying @(OutputFiles->Count()) header files to $(CopyDestionationPath). Files copied: @(OutputFiles)" Importance="high"/>

+    <!-- Perform the copy. -->

+    <Copy SourceFiles="@(OutputFiles)" 

+          DestinationFolder="$(CopyDestionationPath)\%(RecursiveDir)"

+          SkipUnchangedFiles="false"></Copy>

+  </Target>

+</Project>
\ No newline at end of file
diff --git a/icu4c/source/allinone/allinone.sln b/icu4c/source/allinone/allinone.sln
index 88a0d19..6245872 100644
--- a/icu4c/source/allinone/allinone.sln
+++ b/icu4c/source/allinone/allinone.sln
@@ -1,73 +1,198 @@
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
+# Visual Studio 15
+VisualStudioVersion = 15.0.27130.2036
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cal", "..\samples\cal\cal.vcxproj", "{F7659D77-09CF-4FE9-ACEE-927287AA9509}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cintltst", "..\test\cintltst\cintltst.vcxproj", "{3D1246AE-1B32-479B-BECA-AEFA97BE2321}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "..\common\common.vcxproj", "{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}"
+	ProjectSection(ProjectDependencies) = postProject
+		{203EC78A-0531-43F0-A636-285439BDE025} = {203EC78A-0531-43F0-A636-285439BDE025}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ctestfw", "..\tools\ctestfw\ctestfw.vcxproj", "{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "date", "..\samples\date\date.vcxproj", "{38B5751A-C6F9-4409-950C-F4F9DA17275F}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "derb", "..\tools\genrb\derb.vcxproj", "{D3065ADB-8820-4CC7-9B6C-9510833961A3}"
 	ProjectSection(ProjectDependencies) = postProject
 		{C2B04507-2521-4801-BF0D-5FD79D6D518C} = {C2B04507-2521-4801-BF0D-5FD79D6D518C}
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
 	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genbrk", "..\tools\genbrk\genbrk.vcxproj", "{C2BE5000-7501-4E87-9724-B8D82494FAE6}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genccode", "..\tools\genccode\genccode.vcxproj", "{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencmn", "..\tools\gencmn\gencmn.vcxproj", "{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencnval", "..\tools\gencnval\gencnval.vcxproj", "{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genrb", "..\tools\genrb\genrb.vcxproj", "{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gentest", "..\tools\gentest\gentest.vcxproj", "{77C78066-746F-4EA6-B3FE-B8C8A4A97891}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "i18n", "..\i18n\i18n.vcxproj", "{0178B127-6269-407D-B112-93877BB62776}"
+	ProjectSection(ProjectDependencies) = postProject
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intltest", "..\test\intltest\intltest.vcxproj", "{73632960-B3A6-464D-83A3-4B43365F19B8}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makeconv", "..\tools\makeconv\makeconv.vcxproj", "{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makedata", "..\data\makedata.vcxproj", "{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pkgdata", "..\tools\pkgdata\pkgdata.vcxproj", "{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stubdata", "..\stubdata\stubdata.vcxproj", "{203EC78A-0531-43F0-A636-285439BDE025}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "toolutil", "..\tools\toolutil\toolutil.vcxproj", "{6B231032-3CB5-4EED-9210-810D666A23A0}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uconv", "..\extra\uconv\uconv.vcxproj", "{DBA4088D-F6F9-4F8F-8820-082A4765C16C}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+		{D3065ADB-8820-4CC7-9B6C-9510833961A3} = {D3065ADB-8820-4CC7-9B6C-9510833961A3}
+		{4C8454FE-81D3-4CA3-9927-29BA96F03DAC} = {4C8454FE-81D3-4CA3-9927-29BA96F03DAC}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "io", "..\io\io.vcxproj", "{C2B04507-2521-4801-BF0D-5FD79D6D518C}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gensprep", "..\tools\gensprep\gensprep.vcxproj", "{631C23CE-6C1D-4875-88F0-85E0A42B36EA}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iotest", "..\test\iotest\iotest.vcxproj", "{E4993E82-D68A-46CA-BAE0-9D35E172E46F}"
+	ProjectSection(ProjectDependencies) = postProject
+		{C2B04507-2521-4801-BF0D-5FD79D6D518C} = {C2B04507-2521-4801-BF0D-5FD79D6D518C}
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "icupkg", "..\tools\icupkg\icupkg.vcxproj", "{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gendict", "..\tools\gendict\gendict.vcxproj", "{9D4211F7-2C77-439C-82F0-30A4E43BA569}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gencfu", "..\tools\gencfu\gencfu.vcxproj", "{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gennorm2", "..\tools\gennorm2\gennorm2.vcxproj", "{C7891A65-80AB-4245-912E-5F1E17B0E6C4}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "icuinfo", "..\tools\icuinfo\icuinfo.vcxproj", "{E7611F49-F088-4175-9446-6111444E72C8}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{ECA6B435-B4FA-4F9F-BF95-F451D078FC47} = {ECA6B435-B4FA-4F9F-BF95-F451D078FC47}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testplug", "..\tools\icuinfo\testplug.vcxproj", "{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}"
+	ProjectSection(ProjectDependencies) = postProject
+		{6B231032-3CB5-4EED-9210-810D666A23A0} = {6B231032-3CB5-4EED-9210-810D666A23A0}
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "makedata_uwp", "..\data\makedata_uwp.vcxproj", "{B1D53358-37BD-48BC-B27C-68BAF1E78508}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "i18n_uwp", "..\i18n\i18n_uwp.vcxproj", "{6786C051-383B-47E0-9E82-B8B994E06A25}"
+	ProjectSection(ProjectDependencies) = postProject
+		{0178B127-6269-407D-B112-93877BB62776} = {0178B127-6269-407D-B112-93877BB62776}
+		{C10CF34B-3F79-430E-AD38-5A32DC0589C2} = {C10CF34B-3F79-430E-AD38-5A32DC0589C2}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common_uwp", "..\common\common_uwp.vcxproj", "{C10CF34B-3F79-430E-AD38-5A32DC0589C2}"
+	ProjectSection(ProjectDependencies) = postProject
+		{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D} = {73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}
+	EndProjectSection
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -409,6 +534,9 @@
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {A714726C-FE2D-466C-95F3-06C5C4EAE54F}
+	EndGlobalSection
 	GlobalSection(SubversionScc) = preSolution
 		Svn-Managed = True
 		Manager = AnkhSVN - Subversion Support for Visual Studio
diff --git a/icu4c/source/common/bmpset.cpp b/icu4c/source/common/bmpset.cpp
index f84bfd7..35bc80d 100644
--- a/icu4c/source/common/bmpset.cpp
+++ b/icu4c/source/common/bmpset.cpp
@@ -100,9 +100,9 @@
             ++lead;
         }
         if(lead<limitLead) {
-            bits=~((1<<lead)-1);
+            bits=~(((unsigned)1<<lead)-1);
             if(limitLead<0x20) {
-                bits&=(1<<limitLead)-1;
+                bits&=((unsigned)1<<limitLead)-1;
             }
             for(trail=0; trail<64; ++trail) {
                 table[trail]|=bits;
diff --git a/icu4c/source/common/brkeng.cpp b/icu4c/source/common/brkeng.cpp
index 88024b2..7144af6 100644
--- a/icu4c/source/common/brkeng.cpp
+++ b/icu4c/source/common/brkeng.cpp
@@ -59,57 +59,46 @@
  ******************************************************************
  */
 
-UnhandledEngine::UnhandledEngine(UErrorCode &/*status*/) {
-    for (int32_t i = 0; i < UPRV_LENGTHOF(fHandled); ++i) {
-        fHandled[i] = 0;
-    }
+UnhandledEngine::UnhandledEngine(UErrorCode &status) : fHandled(nullptr) {
+    (void)status;
 }
 
 UnhandledEngine::~UnhandledEngine() {
-    for (int32_t i = 0; i < UPRV_LENGTHOF(fHandled); ++i) {
-        if (fHandled[i] != 0) {
-            delete fHandled[i];
-        }
-    }
+    delete fHandled;
+    fHandled = nullptr;
 }
 
 UBool
-UnhandledEngine::handles(UChar32 c, int32_t breakType) const {
-    return (breakType >= 0 && breakType < UPRV_LENGTHOF(fHandled)
-        && fHandled[breakType] != 0 && fHandled[breakType]->contains(c));
+UnhandledEngine::handles(UChar32 c) const {
+    return fHandled && fHandled->contains(c);
 }
 
 int32_t
 UnhandledEngine::findBreaks( UText *text,
                              int32_t /* startPos */,
                              int32_t endPos,
-                             int32_t breakType,
                              UVector32 &/*foundBreaks*/ ) const {
-    if (breakType >= 0 && breakType < UPRV_LENGTHOF(fHandled)) {
-        UChar32 c = utext_current32(text); 
-        while((int32_t)utext_getNativeIndex(text) < endPos && fHandled[breakType]->contains(c)) {
-            utext_next32(text);            // TODO:  recast loop to work with post-increment operations.
-            c = utext_current32(text);
-        }
+    UChar32 c = utext_current32(text); 
+    while((int32_t)utext_getNativeIndex(text) < endPos && fHandled->contains(c)) {
+        utext_next32(text);            // TODO:  recast loop to work with post-increment operations.
+        c = utext_current32(text);
     }
     return 0;
 }
 
 void
-UnhandledEngine::handleCharacter(UChar32 c, int32_t breakType) {
-    if (breakType >= 0 && breakType < UPRV_LENGTHOF(fHandled)) {
-        if (fHandled[breakType] == 0) {
-            fHandled[breakType] = new UnicodeSet();
-            if (fHandled[breakType] == 0) {
-                return;
-            }
+UnhandledEngine::handleCharacter(UChar32 c) {
+    if (fHandled == nullptr) {
+        fHandled = new UnicodeSet();
+        if (fHandled == nullptr) {
+            return;
         }
-        if (!fHandled[breakType]->contains(c)) {
-            UErrorCode status = U_ZERO_ERROR;
-            // Apply the entire script of the character.
-            int32_t script = u_getIntPropertyValue(c, UCHAR_SCRIPT);
-            fHandled[breakType]->applyIntPropertyValue(UCHAR_SCRIPT, script, status);
-        }
+    }
+    if (!fHandled->contains(c)) {
+        UErrorCode status = U_ZERO_ERROR;
+        // Apply the entire script of the character.
+        int32_t script = u_getIntPropertyValue(c, UCHAR_SCRIPT);
+        fHandled->applyIntPropertyValue(UCHAR_SCRIPT, script, status);
     }
 }
 
@@ -138,7 +127,7 @@
 static UMutex gBreakEngineMutex = U_MUTEX_INITIALIZER;
 
 const LanguageBreakEngine *
-ICULanguageBreakFactory::getEngineFor(UChar32 c, int32_t breakType) {
+ICULanguageBreakFactory::getEngineFor(UChar32 c) {
     const LanguageBreakEngine *lbe = NULL;
     UErrorCode  status = U_ZERO_ERROR;
 
@@ -156,14 +145,14 @@
         int32_t i = fEngines->size();
         while (--i >= 0) {
             lbe = (const LanguageBreakEngine *)(fEngines->elementAt(i));
-            if (lbe != NULL && lbe->handles(c, breakType)) {
+            if (lbe != NULL && lbe->handles(c)) {
                 return lbe;
             }
         }
     }
     
     // We didn't find an engine. Create one.
-    lbe = loadEngineFor(c, breakType);
+    lbe = loadEngineFor(c);
     if (lbe != NULL) {
         fEngines->push((void *)lbe, status);
     }
@@ -171,11 +160,11 @@
 }
 
 const LanguageBreakEngine *
-ICULanguageBreakFactory::loadEngineFor(UChar32 c, int32_t breakType) {
+ICULanguageBreakFactory::loadEngineFor(UChar32 c) {
     UErrorCode status = U_ZERO_ERROR;
     UScriptCode code = uscript_getScript(c, &status);
     if (U_SUCCESS(status)) {
-        DictionaryMatcher *m = loadDictionaryMatcherFor(code, breakType);
+        DictionaryMatcher *m = loadDictionaryMatcherFor(code);
         if (m != NULL) {
             const LanguageBreakEngine *engine = NULL;
             switch(code) {
@@ -236,7 +225,7 @@
 }
 
 DictionaryMatcher *
-ICULanguageBreakFactory::loadDictionaryMatcherFor(UScriptCode script, int32_t /* brkType */) { 
+ICULanguageBreakFactory::loadDictionaryMatcherFor(UScriptCode script) { 
     UErrorCode status = U_ZERO_ERROR;
     // open root from brkitr tree.
     UResourceBundle *b = ures_open(U_ICUDATA_BRKITR, "", &status);
diff --git a/icu4c/source/common/brkeng.h b/icu4c/source/common/brkeng.h
index f59e7df..e40fce1 100644
--- a/icu4c/source/common/brkeng.h
+++ b/icu4c/source/common/brkeng.h
@@ -54,11 +54,10 @@
   * a particular kind of break.</p>
   *
   * @param c A character which begins a run that the engine might handle
-  * @param breakType The type of text break which the caller wants to determine
   * @return TRUE if this engine handles the particular character and break
   * type.
   */
-  virtual UBool handles(UChar32 c, int32_t breakType) const = 0;
+  virtual UBool handles(UChar32 c) const = 0;
 
  /**
   * <p>Find any breaks within a run in the supplied text.</p>
@@ -68,14 +67,12 @@
   * is capable of handling.
   * @param startPos The start of the run within the supplied text.
   * @param endPos The end of the run within the supplied text.
-  * @param breakType The type of break desired, or -1.
   * @param foundBreaks A Vector of int32_t to receive the breaks.
   * @return The number of breaks found.
   */
   virtual int32_t findBreaks( UText *text,
                               int32_t startPos,
                               int32_t endPos,
-                              int32_t breakType,
                               UVector32 &foundBreaks ) const = 0;
 
 };
@@ -125,11 +122,9 @@
   *
   * @param c A character that begins a run for which a LanguageBreakEngine is
   * sought.
-  * @param breakType The kind of text break for which a LanguageBreakEngine is
-  * sought.
   * @return A LanguageBreakEngine with the desired characteristics, or 0.
   */
-  virtual const LanguageBreakEngine *getEngineFor(UChar32 c, int32_t breakType) = 0;
+  virtual const LanguageBreakEngine *getEngineFor(UChar32 c) = 0;
 
 };
 
@@ -152,11 +147,11 @@
  private:
 
     /**
-     * The sets of characters handled, for each break type
+     * The sets of characters handled.
      * @internal
      */
 
-  UnicodeSet    *fHandled[4];
+  UnicodeSet    *fHandled;
 
  public:
 
@@ -176,11 +171,10 @@
   * a particular kind of break.</p>
   *
   * @param c A character which begins a run that the engine might handle
-  * @param breakType The type of text break which the caller wants to determine
   * @return TRUE if this engine handles the particular character and break
   * type.
   */
-  virtual UBool handles(UChar32 c, int32_t breakType) const;
+  virtual UBool handles(UChar32 c) const;
 
  /**
   * <p>Find any breaks within a run in the supplied text.</p>
@@ -190,23 +184,20 @@
   * is capable of handling.
   * @param startPos The start of the run within the supplied text.
   * @param endPos The end of the run within the supplied text.
-  * @param breakType The type of break desired, or -1.
   * @param foundBreaks An allocated C array of the breaks found, if any
   * @return The number of breaks found.
   */
   virtual int32_t findBreaks( UText *text,
                               int32_t startPos,
                               int32_t endPos,
-                              int32_t breakType,
                               UVector32 &foundBreaks ) const;
 
  /**
   * <p>Tell the engine to handle a particular character and break type.</p>
   *
   * @param c A character which the engine should handle
-  * @param breakType The type of text break for which the engine should handle c
   */
-  virtual void handleCharacter(UChar32 c, int32_t breakType);
+  virtual void handleCharacter(UChar32 c);
 
 };
 
@@ -250,11 +241,9 @@
   *
   * @param c A character that begins a run for which a LanguageBreakEngine is
   * sought.
-  * @param breakType The kind of text break for which a LanguageBreakEngine is
-  * sought.
   * @return A LanguageBreakEngine with the desired characteristics, or 0.
   */
-  virtual const LanguageBreakEngine *getEngineFor(UChar32 c, int32_t breakType);
+  virtual const LanguageBreakEngine *getEngineFor(UChar32 c);
 
 protected:
  /**
@@ -263,21 +252,17 @@
   *
   * @param c A character that begins a run for which a LanguageBreakEngine is
   * sought.
-  * @param breakType The kind of text break for which a LanguageBreakEngine is
-  * sought.
   * @return A LanguageBreakEngine with the desired characteristics, or 0.
   */
-  virtual const LanguageBreakEngine *loadEngineFor(UChar32 c, int32_t breakType);
+  virtual const LanguageBreakEngine *loadEngineFor(UChar32 c);
 
   /**
    * <p>Create a DictionaryMatcher for the specified script and break type.</p>
    * @param script An ISO 15924 script code that identifies the dictionary to be
    * created.
-   * @param breakType The kind of text break for which a dictionary is 
-   * sought.
    * @return A DictionaryMatcher with the desired characteristics, or NULL.
    */
-  virtual DictionaryMatcher *loadDictionaryMatcherFor(UScriptCode script, int32_t breakType);
+  virtual DictionaryMatcher *loadDictionaryMatcherFor(UScriptCode script);
 };
 
 U_NAMESPACE_END
diff --git a/icu4c/source/common/brkiter.cpp b/icu4c/source/common/brkiter.cpp
index ab02f1c..52e5c7c 100644
--- a/icu4c/source/common/brkiter.cpp
+++ b/icu4c/source/common/brkiter.cpp
@@ -52,7 +52,7 @@
 // -------------------------------------
 
 BreakIterator*
-BreakIterator::buildInstance(const Locale& loc, const char *type, int32_t kind, UErrorCode &status)
+BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &status)
 {
     char fnbuff[256];
     char ext[4]={'\0'};
@@ -121,7 +121,6 @@
         U_LOCALE_BASED(locBased, *(BreakIterator*)result);
         locBased.setLocaleIDs(ures_getLocaleByType(b, ULOC_VALID_LOCALE, &status), 
                               actualLocale.data());
-        result->setBreakType(kind);
     }
 
     ures_close(b);
@@ -413,10 +412,10 @@
     BreakIterator *result = NULL;
     switch (kind) {
     case UBRK_CHARACTER:
-        result = BreakIterator::buildInstance(loc, "grapheme", kind, status);
+        result = BreakIterator::buildInstance(loc, "grapheme", status);
         break;
     case UBRK_WORD:
-        result = BreakIterator::buildInstance(loc, "word", kind, status);
+        result = BreakIterator::buildInstance(loc, "word", status);
         break;
     case UBRK_LINE:
         uprv_strcpy(lbType, "line");
@@ -429,10 +428,10 @@
                 uprv_strcat(lbType, lbKeyValue);
             }
         }
-        result = BreakIterator::buildInstance(loc, lbType, kind, status);
+        result = BreakIterator::buildInstance(loc, lbType, status);
         break;
     case UBRK_SENTENCE:
-        result = BreakIterator::buildInstance(loc, "sentence", kind, status);
+        result = BreakIterator::buildInstance(loc, "sentence", status);
 #if !UCONFIG_NO_FILTERED_BREAK_ITERATION
         {
             char ssKeyValue[kKeyValueLenMax] = {0};
@@ -449,7 +448,7 @@
 #endif
         break;
     case UBRK_TITLE:
-        result = BreakIterator::buildInstance(loc, "title", kind, status);
+        result = BreakIterator::buildInstance(loc, "title", status);
         break;
     default:
         status = U_ILLEGAL_ARGUMENT_ERROR;
diff --git a/icu4c/source/common/bytesinkutil.cpp b/icu4c/source/common/bytesinkutil.cpp
index bf1a2d4..6af7ddf 100644
--- a/icu4c/source/common/bytesinkutil.cpp
+++ b/icu4c/source/common/bytesinkutil.cpp
@@ -92,20 +92,16 @@
     sink.Append(s8, 2);
 }
 
-UBool
-ByteSinkUtil::appendUnchanged(const uint8_t *s, int32_t length,
-                              ByteSink &sink, uint32_t options, Edits *edits,
-                              UErrorCode &errorCode) {
-    if (U_FAILURE(errorCode)) { return FALSE; }
-    if (length > 0) {
-        if (edits != nullptr) {
-            edits->addUnchanged(length);
-        }
-        if ((options & U_OMIT_UNCHANGED_TEXT) == 0) {
-            sink.Append(reinterpret_cast<const char *>(s), length);
-        }
+void
+ByteSinkUtil::appendNonEmptyUnchanged(const uint8_t *s, int32_t length,
+                                      ByteSink &sink, uint32_t options, Edits *edits) {
+    U_ASSERT(length > 0);
+    if (edits != nullptr) {
+        edits->addUnchanged(length);
     }
-    return TRUE;
+    if ((options & U_OMIT_UNCHANGED_TEXT) == 0) {
+        sink.Append(reinterpret_cast<const char *>(s), length);
+    }
 }
 
 UBool
@@ -117,7 +113,11 @@
         errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
         return FALSE;
     }
-    return appendUnchanged(s, (int32_t)(limit - s), sink, options, edits, errorCode);
+    int32_t length = (int32_t)(limit - s);
+    if (length > 0) {
+        appendNonEmptyUnchanged(s, length, sink, options, edits);
+    }
+    return TRUE;
 }
 
 U_NAMESPACE_END
diff --git a/icu4c/source/common/bytesinkutil.h b/icu4c/source/common/bytesinkutil.h
index 004b49c..8287ffe 100644
--- a/icu4c/source/common/bytesinkutil.h
+++ b/icu4c/source/common/bytesinkutil.h
@@ -43,11 +43,19 @@
 
     static UBool appendUnchanged(const uint8_t *s, int32_t length,
                                  ByteSink &sink, uint32_t options, Edits *edits,
-                                 UErrorCode &errorCode);
+                                 UErrorCode &errorCode) {
+        if (U_FAILURE(errorCode)) { return FALSE; }
+        if (length > 0) { appendNonEmptyUnchanged(s, length, sink, options, edits); }
+        return TRUE;
+    }
 
     static UBool appendUnchanged(const uint8_t *s, const uint8_t *limit,
                                  ByteSink &sink, uint32_t options, Edits *edits,
                                  UErrorCode &errorCode);
+
+private:
+    static void appendNonEmptyUnchanged(const uint8_t *s, int32_t length,
+                                        ByteSink &sink, uint32_t options, Edits *edits);
 };
 
 U_NAMESPACE_END
diff --git a/icu4c/source/common/cmemory.cpp b/icu4c/source/common/cmemory.cpp
index 2176c92..663c141 100644
--- a/icu4c/source/common/cmemory.cpp
+++ b/icu4c/source/common/cmemory.cpp
@@ -41,30 +41,6 @@
 static long b=0; 
 #endif
 
-#if U_DEBUG
-
-static char gValidMemorySink = 0;
-
-U_CAPI void uprv_checkValidMemory(const void *p, size_t n) {
-    /*
-     * Access the memory to ensure that it's all valid.
-     * Load and save a computed value to try to ensure that the compiler
-     * does not throw away the whole loop.
-     * A thread analyzer might complain about un-mutexed access to gValidMemorySink
-     * which is true but harmless because no one ever uses the value in gValidMemorySink.
-     */
-    const char *s = (const char *)p;
-    char c = gValidMemorySink;
-    size_t i;
-    U_ASSERT(p != NULL);
-    for(i = 0; i < n; ++i) {
-        c ^= s[i];
-    }
-    gValidMemorySink = c;
-}
-
-#endif  /* U_DEBUG */
-
 U_CAPI void * U_EXPORT2
 uprv_malloc(size_t s) {
 #if U_DEBUG && defined(UPRV_MALLOC_COUNT)
diff --git a/icu4c/source/common/cmemory.h b/icu4c/source/common/cmemory.h
index ddf8e49..5cb5299 100644
--- a/icu4c/source/common/cmemory.h
+++ b/icu4c/source/common/cmemory.h
@@ -36,31 +36,10 @@
 #include <stdio.h>
 #endif
 
-#if U_DEBUG
-
-/*
- * The C++ standard requires that the source pointer for memcpy() & memmove()
- * is valid, not NULL, and not at the end of an allocated memory block.
- * In debug mode, we read one byte from the source point to verify that it's
- * a valid, readable pointer.
- */
-
-U_CAPI void uprv_checkValidMemory(const void *p, size_t n);
-
-#define uprv_memcpy(dst, src, size) ( \
-    uprv_checkValidMemory(src, 1), \
-    U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size))
-#define uprv_memmove(dst, src, size) ( \
-    uprv_checkValidMemory(src, 1), \
-    U_STANDARD_CPP_NAMESPACE memmove(dst, src, size))
-
-#else
 
 #define uprv_memcpy(dst, src, size) U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size)
 #define uprv_memmove(dst, src, size) U_STANDARD_CPP_NAMESPACE memmove(dst, src, size)
 
-#endif  /* U_DEBUG */
-
 /**
  * \def UPRV_LENGTHOF
  * Convenience macro to determine the length of a fixed array at compile-time.
diff --git a/icu4c/source/common/common.vcxproj b/icu4c/source/common/common.vcxproj
index 7a68814..833807f 100644
--- a/icu4c/source/common/common.vcxproj
+++ b/icu4c/source/common/common.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{73C0A65B-D1F2-4DE1-B3A6-15DAD2C23F3D}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,40 +47,47 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* "common" project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;U_COMMON_IMPLEMENTATION;U_PLATFORM_USES_ONLY_WIN32_API=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>icudt.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <BaseAddress>0x4a800000</BaseAddress>
+    </Link>
+  </ItemDefinitionGroup>
+  <!-- Options that are common to all 'Debug' project configurations -->
+  <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+    <ClCompile>
+      <PreprocessorDefinitions>RBBI_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <BrowseInformation>true</BrowseInformation>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+    </ClCompile>
+  </ItemDefinitionGroup>
+  <!-- Options that are common to all 'Release' project configurations -->
+  <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+    <ClCompile>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib\icuuc.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_COMMON_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/common.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin\icuuc60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin\icuuc61.dll</OutputFile>
+      <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib\icuuc.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <BaseAddress>0x4a800000</BaseAddress>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
       <ImportLibrary>..\..\lib\icuuc.lib</ImportLibrary>
@@ -123,41 +95,19 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib\icuucd.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_COMMON_IMPLEMENTATION;RBBI_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/common.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin\icuuc60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <OutputFile>..\..\bin\icuuc61d.dll</OutputFile>
+      <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib\icuucd.pdb</ProgramDatabaseFile>
-      <BaseAddress>0x4a800000</BaseAddress>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
       <ImportLibrary>..\..\lib\icuucd.lib</ImportLibrary>
@@ -165,79 +115,37 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib64\icuuc.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_COMMON_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/common.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin64\icuuc60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin64\icuuc61.dll</OutputFile>
+      <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib64\icuuc.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <BaseAddress>0x4a800000</BaseAddress>
       <ImportLibrary>..\..\lib64\icuuc.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib64\icuucd.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_COMMON_IMPLEMENTATION;RBBI_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/common.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin64\icuuc60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <OutputFile>..\..\bin64\icuuc61d.dll</OutputFile>
+      <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib64\icuucd.pdb</ProgramDatabaseFile>
-      <BaseAddress>0x4a800000</BaseAddress>
       <ImportLibrary>..\..\lib64\icuucd.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -249,35 +157,22 @@
     <ClCompile Include="ubidiwrt.cpp" />
     <ClCompile Include="uloc_keytype.cpp" />
     <ClCompile Include="ushape.cpp" />
-    <ClCompile Include="brkeng.cpp">
-    </ClCompile>
-    <ClCompile Include="brkiter.cpp">
-    </ClCompile>
+    <ClCompile Include="brkeng.cpp" />
+    <ClCompile Include="brkiter.cpp" />
     <ClCompile Include="dictbe.cpp" />
     <ClCompile Include="pluralmap.cpp" />
-    <ClCompile Include="rbbi.cpp">
-    </ClCompile>
-    <ClCompile Include="rbbidata.cpp">
-    </ClCompile>
+    <ClCompile Include="rbbi.cpp" />
+    <ClCompile Include="rbbidata.cpp" />
     <ClCompile Include="rbbinode.cpp" />
-    <ClCompile Include="rbbirb.cpp">
-    </ClCompile>
+    <ClCompile Include="rbbirb.cpp" />
     <ClCompile Include="rbbiscan.cpp" />
     <ClCompile Include="rbbisetb.cpp" />
-    <ClCompile Include="rbbistbl.cpp">
-    </ClCompile>
-    <ClCompile Include="rbbitblb.cpp">
-    </ClCompile>
-    <ClCompile Include="rbbi_cache.cpp">
-    </ClCompile>
+    <ClCompile Include="rbbistbl.cpp" />
+    <ClCompile Include="rbbitblb.cpp" />
+    <ClCompile Include="rbbi_cache.cpp" />
     <ClCompile Include="dictionarydata.cpp" />
     <ClCompile Include="ubrk.cpp" />
-    <ClCompile Include="ucol_swp.cpp">
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
+    <ClCompile Include="ucol_swp.cpp" />
     <ClCompile Include="propsvec.cpp" />
     <ClCompile Include="uarrsort.cpp" />
     <ClCompile Include="uenum.cpp" />
@@ -294,44 +189,22 @@
     <ClCompile Include="uvectr64.cpp" />
     <ClCompile Include="errorcode.cpp" />
     <ClCompile Include="icudataver.cpp" />
-    <ClCompile Include="locmap.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>
-    </ClCompile>
-    <ClCompile Include="putil.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>
-    </ClCompile>
+    <ClCompile Include="locmap.cpp" />
+    <ClCompile Include="putil.cpp" />
     <ClCompile Include="umath.cpp" />
-    <ClCompile Include="umutex.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>
-    </ClCompile>
+    <ClCompile Include="umutex.cpp" />
     <ClCompile Include="utrace.cpp" />
     <ClCompile Include="utypes.cpp" />
-    <ClCompile Include="wintz.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>
-    </ClCompile>
+    <ClCompile Include="wintz.cpp" />
     <ClCompile Include="ucnv.cpp" />
     <ClCompile Include="ucnv2022.cpp" />
-    <ClCompile Include="ucnv_bld.cpp">
-    </ClCompile>
+    <ClCompile Include="ucnv_bld.cpp" />
     <ClCompile Include="ucnv_cb.cpp" />
     <ClCompile Include="ucnv_cnv.cpp" />
     <ClCompile Include="ucnv_ct.cpp" />
     <ClCompile Include="ucnv_err.cpp" />
     <ClCompile Include="ucnv_ext.cpp" />
-    <ClCompile Include="ucnv_io.cpp">
-    </ClCompile>
+    <ClCompile Include="ucnv_io.cpp" />
     <ClCompile Include="ucnv_lmb.cpp" />
     <ClCompile Include="ucnv_set.cpp" />
     <ClCompile Include="ucnv_u16.cpp" />
@@ -345,25 +218,15 @@
     <ClCompile Include="ucnvlat1.cpp" />
     <ClCompile Include="ucnvmbcs.cpp" />
     <ClCompile Include="ucnvscsu.cpp" />
-    <ClCompile Include="ucnvsel.cpp">
-    </ClCompile>
+    <ClCompile Include="ucnvsel.cpp" />
     <ClCompile Include="cmemory.cpp" />
-    <ClCompile Include="ucln_cmn.cpp">
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-    </ClCompile>
+    <ClCompile Include="ucln_cmn.cpp" />
     <ClCompile Include="ucmndata.cpp" />
     <ClCompile Include="udata.cpp" />
     <ClCompile Include="udatamem.cpp" />
     <ClCompile Include="udataswp.cpp" />
-    <ClCompile Include="uinit.cpp">
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-    </ClCompile>
-    <ClCompile Include="umapfile.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>
-    </ClCompile>
+    <ClCompile Include="uinit.cpp" />
+    <ClCompile Include="umapfile.cpp" />
     <ClCompile Include="uobject.cpp" />
     <ClCompile Include="dtintrv.cpp" />
     <ClCompile Include="parsepos.cpp" />
@@ -373,19 +236,15 @@
     <ClCompile Include="punycode.cpp" />
     <ClCompile Include="uidna.cpp" />
     <ClCompile Include="uts46.cpp" />
-    <ClCompile Include="locavailable.cpp">
-    </ClCompile>
+    <ClCompile Include="locavailable.cpp" />
     <ClCompile Include="locbased.cpp" />
     <ClCompile Include="locdispnames.cpp" />
     <ClCompile Include="locdspnm.cpp" />
-    <ClCompile Include="locid.cpp">
-    </ClCompile>
+    <ClCompile Include="locid.cpp" />
     <ClCompile Include="loclikely.cpp" />
     <ClCompile Include="locresdata.cpp" />
-    <ClCompile Include="locutil.cpp">
-    </ClCompile>
-    <ClCompile Include="resbund.cpp">
-    </ClCompile>
+    <ClCompile Include="locutil.cpp" />
+    <ClCompile Include="resbund.cpp" />
     <ClCompile Include="resbund_cnv.cpp" />
     <ClCompile Include="ucat.cpp" />
     <ClCompile Include="uloc.cpp" />
@@ -395,28 +254,22 @@
     <ClCompile Include="uresdata.cpp" />
     <ClCompile Include="resource.cpp" />
     <ClCompile Include="ucurr.cpp" />
-    <ClCompile Include="caniter.cpp">
-    </ClCompile>
+    <ClCompile Include="caniter.cpp" />
     <ClCompile Include="filterednormalizer2.cpp" />
     <ClCompile Include="loadednormalizer2impl.cpp" />
     <ClCompile Include="normalizer2.cpp" />
     <ClCompile Include="normalizer2impl.cpp" />
-    <ClCompile Include="normlzr.cpp">
-    </ClCompile>
+    <ClCompile Include="normlzr.cpp" />
     <ClCompile Include="unorm.cpp" />
     <ClCompile Include="unormcmp.cpp" />
     <ClCompile Include="bmpset.cpp" />
     <ClCompile Include="patternprops.cpp" />
-    <ClCompile Include="propname.cpp">
-    </ClCompile>
+    <ClCompile Include="propname.cpp" />
     <ClCompile Include="ruleiter.cpp" />
-    <ClCompile Include="ucase.cpp">
-    </ClCompile>
+    <ClCompile Include="ucase.cpp" />
     <ClCompile Include="uchar.cpp" />
     <ClCompile Include="unames.cpp" />
-    <ClCompile Include="unifiedcache.cpp">
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-    </ClCompile>
+    <ClCompile Include="unifiedcache.cpp" />
     <ClCompile Include="unifilt.cpp" />
     <ClCompile Include="unifunct.cpp" />
     <ClCompile Include="uniset.cpp" />
@@ -431,20 +284,13 @@
     <ClCompile Include="uset_props.cpp" />
     <ClCompile Include="usetiter.cpp" />
     <ClCompile Include="icuplug.cpp" />
-    <ClCompile Include="serv.cpp">
-    </ClCompile>
-    <ClCompile Include="servlk.cpp">
-    </ClCompile>
-    <ClCompile Include="servlkf.cpp">
-    </ClCompile>
-    <ClCompile Include="servls.cpp">
-    </ClCompile>
-    <ClCompile Include="servnotf.cpp">
-    </ClCompile>
-    <ClCompile Include="servrbf.cpp">
-    </ClCompile>
-    <ClCompile Include="servslkf.cpp">
-    </ClCompile>
+    <ClCompile Include="serv.cpp" />
+    <ClCompile Include="servlk.cpp" />
+    <ClCompile Include="servlkf.cpp" />
+    <ClCompile Include="servls.cpp" />
+    <ClCompile Include="servnotf.cpp" />
+    <ClCompile Include="servrbf.cpp" />
+    <ClCompile Include="servslkf.cpp" />
     <ClCompile Include="usprep.cpp" />
     <ClCompile Include="appendable.cpp" />
     <ClCompile Include="bytesinkutil.cpp" />
@@ -488,86 +334,14 @@
     <ClCompile Include="utf_impl.cpp" />
     <ClCompile Include="listformatter.cpp" />
     <ClCompile Include="ulistformatter.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <CustomBuild Include="unicode\ubidi.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="localsvc.h" />
     <ClInclude Include="msvcres.h" />
     <ClInclude Include="pluralmap.h" />
     <ClInclude Include="propname_data.h" />
     <ClInclude Include="ubidi_props.h" />
     <ClInclude Include="ubidiimp.h" />
-    <CustomBuild Include="unicode\ushape.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="brkeng.h" />
-    <CustomBuild Include="unicode\brkiter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\dbbi.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="dictbe.h" />
-    <CustomBuild Include="unicode\rbbi.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="rbbidata.h" />
     <ClInclude Include="rbbinode.h" />
     <ClInclude Include="rbbirb.h" />
@@ -577,20 +351,6 @@
     <ClInclude Include="rbbitblb.h" />
     <ClInclude Include="rbbi_cache.h" />
     <ClInclude Include="dictionarydata.h" />
-    <CustomBuild Include="unicode\ubrk.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ubidi_props_data.h" />
     <ClInclude Include="ubrkimpl.h" />
     <ClInclude Include="ucase_props_data.h" />
@@ -601,53 +361,11 @@
     <ClInclude Include="unistrappender.h" />
     <ClInclude Include="hash.h" />
     <ClInclude Include="propsvec.h" />
-    <CustomBuild Include="unicode\strenum.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uarrsort.h" />
-    <CustomBuild Include="unicode\uenum.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uelement.h" />
     <ClInclude Include="uenumimp.h" />
     <ClInclude Include="uhash.h" />
     <ClInclude Include="ulist.h" />
-    <CustomBuild Include="unicode\enumset.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="unicode\filteredbrk.h" />
     <ClInclude Include="ustrenum.h" />
     <ClInclude Include="utrie.h" />
@@ -658,1270 +376,76 @@
     <ClInclude Include="uvectr32.h" />
     <ClInclude Include="uvectr64.h" />
     <ClInclude Include="cpputils.h" />
-    <CustomBuild Include="unicode\docmain.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\errorcode.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\icudataver.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="locmap.h" />
     <ClInclude Include="mutex.h" />
-    <CustomBuild Include="unicode\platform.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ptypes.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\putil.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="putilimp.h" />
-    <CustomBuild Include="unicode\std_string.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uassert.h" />
-    <CustomBuild Include="unicode\uconfig.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\umachine.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="umutex.h" />
     <ClInclude Include="uposixdefs.h" />
-    <CustomBuild Include="unicode\urename.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utrace.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="utracimp.h" />
-    <CustomBuild Include="unicode\utypes.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uvernum.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uversion.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="wintz.h" />
-    <CustomBuild Include="unicode\ucnv.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucnv_bld.h" />
-    <CustomBuild Include="unicode\ucnv_cb.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucnv_cnv.h" />
-    <CustomBuild Include="unicode\ucnv_err.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucnv_ext.h" />
     <ClInclude Include="ucnv_imp.h" />
     <ClInclude Include="ucnv_io.h" />
     <ClInclude Include="ucnvmbcs.h" />
-    <CustomBuild Include="unicode\ucnvsel.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="cmemory.h" />
-    <CustomBuild Include="unicode\localpointer.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uclean.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucln.h" />
     <ClInclude Include="ucln_cmn.h" />
     <ClInclude Include="ucln_imp.h" />
     <ClInclude Include="ucmndata.h" />
-    <CustomBuild Include="unicode\udata.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="udatamem.h" />
     <ClInclude Include="udataswp.h" />
     <ClInclude Include="umapfile.h" />
-    <CustomBuild Include="unicode\uobject.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\dtintrv.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\parseerr.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\parsepos.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\umisc.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ustrfmt.h" />
     <ClInclude Include="util.h" />
-    <CustomBuild Include="unicode\idna.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="punycode.h" />
-    <CustomBuild Include="unicode\uidna.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="locbased.h" />
-    <CustomBuild Include="unicode\locid.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="locutil.h" />
-    <CustomBuild Include="unicode\resbund.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="sharedobject.h" />
     <ClCompile Include="sharedobject.cpp" />
-    <CustomBuild Include="unicode\locdspnm.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\simpleformatter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucat.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\udisplaycontext.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uldnames.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uloc.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ulocimp.h" />
-    <CustomBuild Include="unicode\ures.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="unifiedcache.h" />
     <ClInclude Include="uresdata.h" />
     <ClInclude Include="uresimp.h" />
     <ClInclude Include="ureslocs.h" />
     <ClInclude Include="resource.h" />
-    <CustomBuild Include="unicode\ucurr.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucurrimp.h" />
-    <CustomBuild Include="unicode\caniter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="norm2allmodes.h" />
-    <CustomBuild Include="unicode\normalizer2.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="normalizer2impl.h" />
-    <CustomBuild Include="unicode\normlzr.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unorm.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unorm2.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="unormimp.h" />
     <ClInclude Include="bmpset.h" />
     <ClInclude Include="messageimpl.h" />
     <ClInclude Include="patternprops.h" />
     <ClInclude Include="propname.h" />
     <ClInclude Include="ruleiter.h" />
-    <CustomBuild Include="unicode\symtable.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucase.h" />
-    <CustomBuild Include="unicode\uchar.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unifilt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unifunct.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unimatch.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uniset.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="unisetspan.h" />
     <ClInclude Include="uprops.h" />
     <ClInclude Include="usc_impl.h" />
-    <CustomBuild Include="unicode\uscript.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uset.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uset_imp.h" />
-    <CustomBuild Include="unicode\usetiter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\icuplug.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="icuplugimp.h" />
     <ClInclude Include="serv.h" />
     <ClInclude Include="servloc.h" />
     <ClInclude Include="servnotf.h" />
     <ClInclude Include="sprpimpl.h" />
-    <CustomBuild Include="unicode\usprep.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\appendable.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="bytesinkutil.h" />
-    <CustomBuild Include="unicode\bytestream.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\bytestrie.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\bytestriebuilder.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\casemap.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\char16ptr.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\chariter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="charstr.h" />
     <ClInclude Include="cstring.h" />
     <ClInclude Include="cstr.h" />
     <ClInclude Include="cwchar.h" />
-    <CustomBuild Include="unicode\edits.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\messagepattern.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\rep.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\schriter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\stringpiece.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\stringtriebuilder.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucasemap.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucasemap_imp.h" />
-    <CustomBuild Include="unicode\ucharstrie.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucharstriebuilder.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uchriter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uinvchar.h" />
-    <CustomBuild Include="unicode\uiter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unistr.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\urep.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ustr_cnv.h" />
     <ClInclude Include="ustr_imp.h" />
-    <CustomBuild Include="unicode\ustring.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ustringtrie.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utext.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utf.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utf16.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utf32.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utf8.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utf_old.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\listformatter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ulistformatter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\stringoptions.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="common.rc" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\stubdata\stubdata.vcxproj">
-      <Project>{203ec78a-0531-43f0-a636-285439bde025}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <!-- The following import will copy all of the header files from this projects 'unicode' folder. -->
+  <Import Project="$(SolutionDir)\Windows.CopyUnicodeHeaderFiles.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/common/common_uwp.vcxproj b/icu4c/source/common/common_uwp.vcxproj
index 72fbf41..af2f653 100644
--- a/icu4c/source/common/common_uwp.vcxproj
+++ b/icu4c/source/common/common_uwp.vcxproj
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\allinone\Build.Windows.UWP.ProjectConfiguration.props" />
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
       <Configuration>Debug</Configuration>
@@ -30,19 +31,12 @@
     <ProjectGuid>{C10CF34B-3F79-430E-AD38-5A32DC0589C2}</ProjectGuid>
     <Keyword>DynamicLibrary</Keyword>
     <DefaultLanguage>en-US</DefaultLanguage>
-    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
-    <AppContainerApplication>true</AppContainerApplication>
-    <ApplicationType>Windows Store</ApplicationType>
-    <WindowsTargetPlatformVersion>10.0.10586.0</WindowsTargetPlatformVersion>
-    <WindowsTargetPlatformMinVersion>10.0.10240.0</WindowsTargetPlatformMinVersion>
-    <ApplicationTypeRevision>10.0</ApplicationTypeRevision>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -72,7 +66,6 @@
   <ItemDefinitionGroup>
     <!-- Options that are common to *all* configurations -->
     <Midl>
-      <PreprocessorDefinitions>U_PLATFORM_HAS_WINUWP_API=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MkTypLibCompatible>true</MkTypLibCompatible>
       <SuppressStartupBanner>true</SuppressStartupBanner>
     </Midl>
@@ -80,7 +73,7 @@
       <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <!-- U_DISABLE_RENAMING -->
       <!-- U_HIDE_DRAFT_API & U_HIDE_DEPRECATED_API -->
-      <PreprocessorDefinitions>U_PLATFORM_HAS_WINUWP_API=1;U_ATTRIBUTE_DEPRECATED=;_CRT_SECURE_NO_DEPRECATE;U_COMMON_IMPLEMENTATION;U_PLATFORM_USES_ONLY_WIN32_API=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;_CRT_SECURE_NO_DEPRECATE;U_COMMON_IMPLEMENTATION;U_PLATFORM_USES_ONLY_WIN32_API=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <ExceptionHandling>
       </ExceptionHandling>
@@ -95,7 +88,6 @@
       <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     <ResourceCompile>
-      <PreprocessorDefinitions>U_PLATFORM_HAS_WINUWP_API=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Culture>0x0409</Culture>
       <AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
@@ -192,7 +184,7 @@
       <ProgramDataBaseFileName>.\x86\ReleaseUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin32uwp\icuuc60.dll</OutputFile>
+      <OutputFile>..\..\bin32uwp\icuuc61.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\lib32uwp\icuuc.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\lib32uwp\icuuc.lib</ImportLibrary>
     </Link>
@@ -208,7 +200,7 @@
       <ProgramDataBaseFileName>.\x86\DebugUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin32uwp\icuuc60d.dll</OutputFile>
+      <OutputFile>..\..\bin32uwp\icuuc61d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\lib32uwp\icuucd.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\lib32uwp\icuucd.lib</ImportLibrary>
     </Link>
@@ -224,7 +216,7 @@
       <ProgramDataBaseFileName>.\x64\ReleaseUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin64uwp\icuuc60.dll</OutputFile>
+      <OutputFile>..\..\bin64uwp\icuuc61.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\lib64uwp\icuuc.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\lib64uwp\icuuc.lib</ImportLibrary>
     </Link>
@@ -240,7 +232,7 @@
       <ProgramDataBaseFileName>.\x64\DebugUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin64uwp\icuuc60d.dll</OutputFile>
+      <OutputFile>..\..\bin64uwp\icuuc61d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\lib64uwp\icuucd.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\lib64uwp\icuucd.lib</ImportLibrary>
     </Link>
@@ -256,7 +248,7 @@
       <ProgramDataBaseFileName>.\ARM\ReleaseUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\binARMuwp\icuuc60.dll</OutputFile>
+      <OutputFile>..\..\binARMuwp\icuuc61.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\libARMuwp\icuuc.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\libARMuwp\icuuc.lib</ImportLibrary>
     </Link>
@@ -272,7 +264,7 @@
       <ProgramDataBaseFileName>.\ARM\DebugUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\binARMuwp\icuuc60d.dll</OutputFile>
+      <OutputFile>..\..\binARMuwp\icuuc61d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\libARMuwp\icuucd.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\libARMuwp\icuucd.lib</ImportLibrary>
     </Link>
@@ -302,9 +294,7 @@
     <ClCompile Include="rbbi_cache.cpp" />
     <ClCompile Include="dictionarydata.cpp" />
     <ClCompile Include="ubrk.cpp" />
-    <ClCompile Include="ucol_swp.cpp">
-      <AdditionalIncludeDirectories>..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
+    <ClCompile Include="ucol_swp.cpp" />
     <ClCompile Include="propsvec.cpp" />
     <ClCompile Include="uarrsort.cpp" />
     <ClCompile Include="uenum.cpp" />
@@ -471,34 +461,14 @@
     <ClCompile Include="ulistformatter.cpp" />
   </ItemGroup>
   <ItemGroup>
-    <CustomBuild Include="unicode\ubidi.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="localsvc.h" />
     <ClInclude Include="msvcres.h" />
     <ClInclude Include="pluralmap.h" />
     <ClInclude Include="propname_data.h" />
     <ClInclude Include="ubidi_props.h" />
     <ClInclude Include="ubidiimp.h" />
-    <CustomBuild Include="unicode\ushape.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="brkeng.h" />
-    <CustomBuild Include="unicode\brkiter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\dbbi.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="dictbe.h" />
-    <CustomBuild Include="unicode\rbbi.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="rbbidata.h" />
     <ClInclude Include="rbbinode.h" />
     <ClInclude Include="rbbirb.h" />
@@ -508,10 +478,6 @@
     <ClInclude Include="rbbitblb.h" />
     <ClInclude Include="rbbi_cache.h" />
     <ClInclude Include="dictionarydata.h" />
-    <CustomBuild Include="unicode\ubrk.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ubidi_props_data.h" />
     <ClInclude Include="ubrkimpl.h" />
     <ClInclude Include="ucase_props_data.h" />
@@ -522,23 +488,11 @@
     <ClInclude Include="unistrappender.h" />
     <ClInclude Include="hash.h" />
     <ClInclude Include="propsvec.h" />
-    <CustomBuild Include="unicode\strenum.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uarrsort.h" />
-    <CustomBuild Include="unicode\uenum.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uelement.h" />
     <ClInclude Include="uenumimp.h" />
     <ClInclude Include="uhash.h" />
     <ClInclude Include="ulist.h" />
-    <CustomBuild Include="unicode\enumset.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="unicode\filteredbrk.h" />
     <ClInclude Include="ustrenum.h" />
     <ClInclude Include="utrie.h" />
@@ -549,396 +503,68 @@
     <ClInclude Include="uvectr32.h" />
     <ClInclude Include="uvectr64.h" />
     <ClInclude Include="cpputils.h" />
-    <CustomBuild Include="unicode\docmain.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\errorcode.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\icudataver.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="locmap.h" />
     <ClInclude Include="mutex.h" />
-    <CustomBuild Include="unicode\platform.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ptypes.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\putil.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="putilimp.h" />
-    <CustomBuild Include="unicode\std_string.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uassert.h" />
-    <CustomBuild Include="unicode\uconfig.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\umachine.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="umutex.h" />
     <ClInclude Include="uposixdefs.h" />
-    <CustomBuild Include="unicode\urename.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utrace.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="utracimp.h" />
-    <CustomBuild Include="unicode\utypes.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uvernum.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uversion.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="wintz.h" />
-    <CustomBuild Include="unicode\ucnv.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucnv_bld.h" />
-    <CustomBuild Include="unicode\ucnv_cb.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucnv_cnv.h" />
-    <CustomBuild Include="unicode\ucnv_err.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucnv_ext.h" />
     <ClInclude Include="ucnv_imp.h" />
     <ClInclude Include="ucnv_io.h" />
     <ClInclude Include="ucnvmbcs.h" />
-    <CustomBuild Include="unicode\ucnvsel.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="cmemory.h" />
-    <CustomBuild Include="unicode\localpointer.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uclean.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucln.h" />
     <ClInclude Include="ucln_cmn.h" />
     <ClInclude Include="ucln_imp.h" />
     <ClInclude Include="ucmndata.h" />
-    <CustomBuild Include="unicode\udata.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="udatamem.h" />
     <ClInclude Include="udataswp.h" />
     <ClInclude Include="umapfile.h" />
-    <CustomBuild Include="unicode\uobject.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\dtintrv.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\parseerr.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\parsepos.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\umisc.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ustrfmt.h" />
     <ClInclude Include="util.h" />
-    <CustomBuild Include="unicode\idna.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="punycode.h" />
-    <CustomBuild Include="unicode\uidna.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="locbased.h" />
-    <CustomBuild Include="unicode\locid.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="locutil.h" />
-    <CustomBuild Include="unicode\resbund.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="sharedobject.h" />
     <ClCompile Include="sharedobject.cpp" />
-    <CustomBuild Include="unicode\locdspnm.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\simpleformatter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucat.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\udisplaycontext.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uldnames.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uloc.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ulocimp.h" />
-    <CustomBuild Include="unicode\ures.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="unifiedcache.h" />
     <ClInclude Include="uresdata.h" />
     <ClInclude Include="uresimp.h" />
     <ClInclude Include="ureslocs.h" />
     <ClInclude Include="resource.h" />
-    <CustomBuild Include="unicode\ucurr.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucurrimp.h" />
-    <CustomBuild Include="unicode\caniter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="norm2allmodes.h" />
-    <CustomBuild Include="unicode\normalizer2.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="normalizer2impl.h" />
-    <CustomBuild Include="unicode\normlzr.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unorm.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unorm2.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="unormimp.h" />
     <ClInclude Include="bmpset.h" />
     <ClInclude Include="messageimpl.h" />
     <ClInclude Include="patternprops.h" />
     <ClInclude Include="propname.h" />
     <ClInclude Include="ruleiter.h" />
-    <CustomBuild Include="unicode\symtable.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ucase.h" />
-    <CustomBuild Include="unicode\uchar.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unifilt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unifunct.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unimatch.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uniset.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="unisetspan.h" />
     <ClInclude Include="uprops.h" />
     <ClInclude Include="usc_impl.h" />
-    <CustomBuild Include="unicode\uscript.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uset.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uset_imp.h" />
-    <CustomBuild Include="unicode\usetiter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\icuplug.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="icuplugimp.h" />
     <ClInclude Include="serv.h" />
     <ClInclude Include="servloc.h" />
     <ClInclude Include="servnotf.h" />
     <ClInclude Include="sprpimpl.h" />
-    <CustomBuild Include="unicode\usprep.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\appendable.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="bytesinkutil.h" />
-    <CustomBuild Include="unicode\bytestream.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\bytestrie.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\bytestriebuilder.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\chariter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="charstr.h" />
     <ClInclude Include="cstring.h" />
     <ClInclude Include="cstr.h" />
     <ClInclude Include="cwchar.h" />
-    <CustomBuild Include="unicode\messagepattern.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\rep.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\schriter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\stringpiece.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\stringtriebuilder.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucasemap.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucharstrie.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucharstriebuilder.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uchriter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uinvchar.h" />
-    <CustomBuild Include="unicode\uiter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unistr.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\urep.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ustr_cnv.h" />
     <ClInclude Include="ustr_imp.h" />
-    <CustomBuild Include="unicode\ustring.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ustringtrie.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utext.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utf.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utf16.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utf32.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utf8.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utf_old.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\listformatter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ulistformatter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\stringoptions.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode </Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="common.rc" />
diff --git a/icu4c/source/common/cstring.h b/icu4c/source/common/cstring.h
index 2232efc..ed0b1a7 100644
--- a/icu4c/source/common/cstring.h
+++ b/icu4c/source/common/cstring.h
@@ -40,28 +40,10 @@
 #define uprv_strchr(s, c) U_STANDARD_CPP_NAMESPACE strchr(s, c)
 #define uprv_strstr(s, c) U_STANDARD_CPP_NAMESPACE strstr(s, c)
 #define uprv_strrchr(s, c) U_STANDARD_CPP_NAMESPACE strrchr(s, c)
-
-#if U_DEBUG
-
-#define uprv_strncpy(dst, src, size) ( \
-    uprv_checkValidMemory(src, 1), \
-    U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size))
-#define uprv_strncmp(s1, s2, n) ( \
-    uprv_checkValidMemory(s1, 1), \
-    uprv_checkValidMemory(s2, 1), \
-    U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n))
-#define uprv_strncat(dst, src, n) ( \
-    uprv_checkValidMemory(src, 1), \
-    U_STANDARD_CPP_NAMESPACE strncat(dst, src, n))
-
-#else
-
 #define uprv_strncpy(dst, src, size) U_STANDARD_CPP_NAMESPACE strncpy(dst, src, size)
 #define uprv_strncmp(s1, s2, n) U_STANDARD_CPP_NAMESPACE strncmp(s1, s2, n)
 #define uprv_strncat(dst, src, n) U_STANDARD_CPP_NAMESPACE strncat(dst, src, n)
 
-#endif  /* U_DEBUG */
-
 /**
  * Is c an ASCII-repertoire letter a-z or A-Z?
  * Note: The implementation is specific to whether ICU is compiled for
diff --git a/icu4c/source/common/dictbe.cpp b/icu4c/source/common/dictbe.cpp
index 18fa188..d8ae45c 100644
--- a/icu4c/source/common/dictbe.cpp
+++ b/icu4c/source/common/dictbe.cpp
@@ -29,24 +29,21 @@
  ******************************************************************
  */
 
-DictionaryBreakEngine::DictionaryBreakEngine(uint32_t breakTypes) {
-    fTypes = breakTypes;
+DictionaryBreakEngine::DictionaryBreakEngine() {
 }
 
 DictionaryBreakEngine::~DictionaryBreakEngine() {
 }
 
 UBool
-DictionaryBreakEngine::handles(UChar32 c, int32_t breakType) const {
-    return (breakType >= 0 && breakType < 32 && (((uint32_t)1 << breakType) & fTypes)
-            && fSet.contains(c));
+DictionaryBreakEngine::handles(UChar32 c) const {
+    return fSet.contains(c);
 }
 
 int32_t
 DictionaryBreakEngine::findBreaks( UText *text,
                                  int32_t startPos,
                                  int32_t endPos,
-                                 int32_t breakType,
                                  UVector32 &foundBreaks ) const {
     (void)startPos;            // TODO: remove this param?
     int32_t result = 0;
@@ -66,10 +63,8 @@
     }
     rangeStart = start;
     rangeEnd = current;
-    if (breakType >= 0 && breakType < 32 && (((uint32_t)1 << breakType) & fTypes)) {
-        result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks);
-        utext_setNativeIndex(text, current);
-    }
+    result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks);
+    utext_setNativeIndex(text, current);
     
     return result;
 }
@@ -194,7 +189,7 @@
 static const int32_t THAI_MIN_WORD_SPAN = THAI_MIN_WORD * 2;
 
 ThaiBreakEngine::ThaiBreakEngine(DictionaryMatcher *adoptDictionary, UErrorCode &status)
-    : DictionaryBreakEngine((1<<UBRK_WORD) | (1<<UBRK_LINE)),
+    : DictionaryBreakEngine(),
       fDictionary(adoptDictionary)
 {
     fThaiWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Thai:]&[:LineBreak=SA:]]"), status);
@@ -436,7 +431,7 @@
 static const int32_t LAO_MIN_WORD_SPAN = LAO_MIN_WORD * 2;
 
 LaoBreakEngine::LaoBreakEngine(DictionaryMatcher *adoptDictionary, UErrorCode &status)
-    : DictionaryBreakEngine((1<<UBRK_WORD) | (1<<UBRK_LINE)),
+    : DictionaryBreakEngine(),
       fDictionary(adoptDictionary)
 {
     fLaoWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Laoo:]&[:LineBreak=SA:]]"), status);
@@ -632,7 +627,7 @@
 static const int32_t BURMESE_MIN_WORD_SPAN = BURMESE_MIN_WORD * 2;
 
 BurmeseBreakEngine::BurmeseBreakEngine(DictionaryMatcher *adoptDictionary, UErrorCode &status)
-    : DictionaryBreakEngine((1<<UBRK_WORD) | (1<<UBRK_LINE)),
+    : DictionaryBreakEngine(),
       fDictionary(adoptDictionary)
 {
     fBurmeseWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Mymr:]&[:LineBreak=SA:]]"), status);
@@ -825,7 +820,7 @@
 static const int32_t KHMER_MIN_WORD_SPAN = KHMER_MIN_WORD * 2;
 
 KhmerBreakEngine::KhmerBreakEngine(DictionaryMatcher *adoptDictionary, UErrorCode &status)
-    : DictionaryBreakEngine((1 << UBRK_WORD) | (1 << UBRK_LINE)),
+    : DictionaryBreakEngine(),
       fDictionary(adoptDictionary)
 {
     fKhmerWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Khmr:]&[:LineBreak=SA:]]"), status);
@@ -1047,7 +1042,7 @@
  */
 static const uint32_t kuint32max = 0xFFFFFFFF;
 CjkBreakEngine::CjkBreakEngine(DictionaryMatcher *adoptDictionary, LanguageType type, UErrorCode &status)
-: DictionaryBreakEngine(1 << UBRK_WORD), fDictionary(adoptDictionary) {
+: DictionaryBreakEngine(), fDictionary(adoptDictionary) {
     // Korean dictionary only includes Hangul syllables
     fHangulWordSet.applyPattern(UNICODE_STRING_SIMPLE("[\\uac00-\\ud7a3]"), status);
     fHanWordSet.applyPattern(UNICODE_STRING_SIMPLE("[:Han:]"), status);
@@ -1324,8 +1319,8 @@
             }
             if (katakanaRunLength < kMaxKatakanaGroupLength) {
                 uint32_t newSnlp = bestSnlp.elementAti(i) + getKatakanaCost(katakanaRunLength);
-                if (newSnlp < (uint32_t)bestSnlp.elementAti(j)) {
-                    bestSnlp.setElementAt(newSnlp, j);
+                if (newSnlp < (uint32_t)bestSnlp.elementAti(i+katakanaRunLength)) {
+                    bestSnlp.setElementAt(newSnlp, i+katakanaRunLength);
                     prev.setElementAt(i, i+katakanaRunLength);  // prev[j] = i;
                 }
             }
diff --git a/icu4c/source/common/dictbe.h b/icu4c/source/common/dictbe.h
index de1d49f..731bfdf 100644
--- a/icu4c/source/common/dictbe.h
+++ b/icu4c/source/common/dictbe.h
@@ -42,27 +42,12 @@
 
   UnicodeSet    fSet;
 
-    /**
-     * The set of break types handled by this engine
-     * @internal
-     */
-
-  uint32_t      fTypes;
-
-  /**
-   * <p>Default constructor.</p>
-   *
-   */
-  DictionaryBreakEngine();
-
  public:
 
   /**
-   * <p>Constructor setting the break types handled.</p>
-   *
-   * @param breakTypes A bitmap of types handled by the engine.
+   * <p>Constructor </p>
    */
-  DictionaryBreakEngine( uint32_t breakTypes );
+  DictionaryBreakEngine();
 
   /**
    * <p>Virtual destructor.</p>
@@ -74,11 +59,10 @@
    * a particular kind of break.</p>
    *
    * @param c A character which begins a run that the engine might handle
-   * @param breakType The type of text break which the caller wants to determine
    * @return TRUE if this engine handles the particular character and break
    * type.
    */
-  virtual UBool handles( UChar32 c, int32_t breakType ) const;
+  virtual UBool handles(UChar32 c) const;
 
   /**
    * <p>Find any breaks within a run in the supplied text.</p>
@@ -88,14 +72,12 @@
    * that starts from the first character in the range.
    * @param startPos The start of the run within the supplied text.
    * @param endPos The end of the run within the supplied text.
-   * @param breakType The type of break desired, or -1.
    * @param foundBreaks vector of int32_t to receive the break positions
    * @return The number of breaks found.
    */
   virtual int32_t findBreaks( UText *text,
                               int32_t startPos,
                               int32_t endPos,
-                              int32_t breakType,
                               UVector32 &foundBreaks ) const;
 
  protected:
@@ -108,13 +90,6 @@
   virtual void setCharacters( const UnicodeSet &set );
 
  /**
-  * <p>Set the break types handled by this engine.</p>
-  *
-  * @param breakTypes A bitmap of types handled by the engine.
-  */
-//  virtual void setBreakTypes( uint32_t breakTypes );
-
- /**
   * <p>Divide up a range of known dictionary characters handled by this break engine.</p>
   *
   * @param text A UText representing the text
diff --git a/icu4c/source/common/filteredbrk.cpp b/icu4c/source/common/filteredbrk.cpp
index 30f8617..20c3aa8 100644
--- a/icu4c/source/common/filteredbrk.cpp
+++ b/icu4c/source/common/filteredbrk.cpp
@@ -694,6 +694,11 @@
 }
 
 FilteredBreakIteratorBuilder *
+FilteredBreakIteratorBuilder::createInstance(UErrorCode &status) {
+  return createEmptyInstance(status);
+}
+
+FilteredBreakIteratorBuilder *
 FilteredBreakIteratorBuilder::createEmptyInstance(UErrorCode& status) {
   if(U_FAILURE(status)) return NULL;
   LocalPointer<FilteredBreakIteratorBuilder> ret(new SimpleFilteredBreakIteratorBuilder(status), status);
diff --git a/icu4c/source/common/rbbi.cpp b/icu4c/source/common/rbbi.cpp
index 54b289e..69f92d9 100644
--- a/icu4c/source/common/rbbi.cpp
+++ b/icu4c/source/common/rbbi.cpp
@@ -64,7 +64,9 @@
  * Constructs a RuleBasedBreakIterator that uses the already-created
  * tables object that is passed in as a parameter.
  */
-RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status) {
+RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status)
+ : fSCharIter(UnicodeString())
+{
     init(status);
     fData = new RBBIDataWrapper(data, status); // status checked in constructor
     if (U_FAILURE(status)) {return;}
@@ -80,7 +82,9 @@
 //
 RuleBasedBreakIterator::RuleBasedBreakIterator(const uint8_t *compiledRules,
                        uint32_t       ruleLength,
-                       UErrorCode     &status) {
+                       UErrorCode     &status)
+ : fSCharIter(UnicodeString())
+{
     init(status);
     if (U_FAILURE(status)) {
         return;
@@ -110,6 +114,7 @@
 //
 //-------------------------------------------------------------------------------
 RuleBasedBreakIterator::RuleBasedBreakIterator(UDataMemory* udm, UErrorCode &status)
+ : fSCharIter(UnicodeString())
 {
     init(status);
     fData = new RBBIDataWrapper(udm, status); // status checked in constructor
@@ -130,6 +135,7 @@
 RuleBasedBreakIterator::RuleBasedBreakIterator( const UnicodeString  &rules,
                                                 UParseError          &parseError,
                                                 UErrorCode           &status)
+ : fSCharIter(UnicodeString())
 {
     init(status);
     if (U_FAILURE(status)) {return;}
@@ -152,7 +158,9 @@
 //                           Used when creating a RuleBasedBreakIterator from a set
 //                           of rules.
 //-------------------------------------------------------------------------------
-RuleBasedBreakIterator::RuleBasedBreakIterator() {
+RuleBasedBreakIterator::RuleBasedBreakIterator()
+ : fSCharIter(UnicodeString())
+{
     UErrorCode status = U_ZERO_ERROR;
     init(status);
 }
@@ -165,7 +173,8 @@
 //
 //-------------------------------------------------------------------------------
 RuleBasedBreakIterator::RuleBasedBreakIterator(const RuleBasedBreakIterator& other)
-: BreakIterator(other)
+: BreakIterator(other),
+  fSCharIter(UnicodeString())
 {
     UErrorCode status = U_ZERO_ERROR;
     this->init(status);
@@ -177,17 +186,13 @@
  * Destructor
  */
 RuleBasedBreakIterator::~RuleBasedBreakIterator() {
-    if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) {
+    if (fCharIter != &fSCharIter) {
         // fCharIter was adopted from the outside.
         delete fCharIter;
     }
     fCharIter = NULL;
-    delete fSCharIter;
-    fSCharIter = NULL;
-    delete fDCharIter;
-    fDCharIter = NULL;
 
-    utext_close(fText);
+    utext_close(&fText);
 
     if (fData != NULL) {
         fData->removeReference();
@@ -217,26 +222,29 @@
     }
     BreakIterator::operator=(that);
 
-    fBreakType = that.fBreakType;
     if (fLanguageBreakEngines != NULL) {
         delete fLanguageBreakEngines;
         fLanguageBreakEngines = NULL;   // Just rebuild for now
     }
     // TODO: clone fLanguageBreakEngines from "that"
     UErrorCode status = U_ZERO_ERROR;
-    fText = utext_clone(fText, that.fText, FALSE, TRUE, &status);
+    utext_clone(&fText, &that.fText, FALSE, TRUE, &status);
 
-    if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) {
+    if (fCharIter != &fSCharIter) {
         delete fCharIter;
     }
-    fCharIter = NULL;
+    fCharIter = &fSCharIter;
 
-    if (that.fCharIter != NULL ) {
+    if (that.fCharIter != NULL && that.fCharIter != &that.fSCharIter) {
         // This is a little bit tricky - it will intially appear that
         //  this->fCharIter is adopted, even if that->fCharIter was
         //  not adopted.  That's ok.
         fCharIter = that.fCharIter->clone();
     }
+    fSCharIter = that.fSCharIter;
+    if (fCharIter == NULL) {
+        fCharIter = &fSCharIter;
+    }
 
     if (fData != NULL) {
         fData->removeReference();
@@ -269,33 +277,30 @@
 //
 //-----------------------------------------------------------------------------
 void RuleBasedBreakIterator::init(UErrorCode &status) {
-    fText                 = NULL;
     fCharIter             = NULL;
-    fSCharIter            = NULL;
-    fDCharIter            = NULL;
     fData                 = NULL;
     fPosition             = 0;
     fRuleStatusIndex      = 0;
     fDone                 = false;
     fDictionaryCharCount  = 0;
-    fBreakType            = UBRK_WORD;  // Defaulting BreakType to word gives reasonable
-                                        //   dictionary behavior for Break Iterators that are
-                                        //   built from rules.  Even better would be the ability to
-                                        //   declare the type in the rules.
-
     fLanguageBreakEngines = NULL;
     fUnhandledBreakEngine = NULL;
     fBreakCache           = NULL;
     fDictionaryCache      = NULL;
 
-    if (U_FAILURE(status)) {
+    // Note: IBM xlC is unable to assign or initialize member fText from UTEXT_INITIALIZER.
+    // fText                 = UTEXT_INITIALIZER;
+    static const UText initializedUText = UTEXT_INITIALIZER;
+    uprv_memcpy(&fText, &initializedUText, sizeof(UText));
+
+   if (U_FAILURE(status)) {
         return;
     }
 
-    fText            = utext_openUChars(NULL, NULL, 0, &status);
+    utext_openUChars(&fText, NULL, 0, &status);
     fDictionaryCache = new DictionaryCache(this, status);
     fBreakCache      = new BreakCache(this, status);
-    if (U_SUCCESS(status) && (fText == NULL || fDictionaryCache == NULL || fBreakCache == NULL)) {
+    if (U_SUCCESS(status) && (fDictionaryCache == NULL || fBreakCache == NULL)) {
         status = U_MEMORY_ALLOCATION_ERROR;
     }
 
@@ -344,7 +349,7 @@
 
     const RuleBasedBreakIterator& that2 = (const RuleBasedBreakIterator&) that;
 
-    if (!utext_equals(fText, that2.fText)) {
+    if (!utext_equals(&fText, &that2.fText)) {
         // The two break iterators are operating on different text,
         //   or have a different iteration position.
         //   Note that fText's position is always the same as the break iterator's position.
@@ -385,7 +390,7 @@
     }
     fBreakCache->reset();
     fDictionaryCache->reset();
-    fText = utext_clone(fText, ut, FALSE, TRUE, &status);
+    utext_clone(&fText, ut, FALSE, TRUE, &status);
 
     // Set up a dummy CharacterIterator to be returned if anyone
     //   calls getText().  With input from UText, there is no reasonable
@@ -393,27 +398,20 @@
     //   Return one over an empty string instead - this is the closest
     //   we can come to signaling a failure.
     //   (GetText() is obsolete, this failure is sort of OK)
-    if (fDCharIter == NULL) {
-        static const UChar c = 0;
-        fDCharIter = new UCharCharacterIterator(&c, 0);
-        if (fDCharIter == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-    }
+    fSCharIter.setText(UnicodeString());
 
-    if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) {
+    if (fCharIter != &fSCharIter) {
         // existing fCharIter was adopted from the outside.  Delete it now.
         delete fCharIter;
     }
-    fCharIter = fDCharIter;
+    fCharIter = &fSCharIter;
 
     this->first();
 }
 
 
 UText *RuleBasedBreakIterator::getUText(UText *fillIn, UErrorCode &status) const {
-    UText *result = utext_clone(fillIn, fText, FALSE, TRUE, &status);
+    UText *result = utext_clone(fillIn, &fText, FALSE, TRUE, &status);
     return result;
 }
 
@@ -439,7 +437,7 @@
 RuleBasedBreakIterator::adoptText(CharacterIterator* newText) {
     // If we are holding a CharacterIterator adopted from a
     //   previous call to this function, delete it now.
-    if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) {
+    if (fCharIter != &fSCharIter) {
         delete fCharIter;
     }
 
@@ -450,9 +448,9 @@
     if (newText==NULL || newText->startIndex() != 0) {
         // startIndex !=0 wants to be an error, but there's no way to report it.
         // Make the iterator text be an empty string.
-        fText = utext_openUChars(fText, NULL, 0, &status);
+        utext_openUChars(&fText, NULL, 0, &status);
     } else {
-        fText = utext_openCharacterIterator(fText, newText, &status);
+        utext_openCharacterIterator(&fText, newText, &status);
     }
     this->first();
 }
@@ -467,23 +465,19 @@
     UErrorCode status = U_ZERO_ERROR;
     fBreakCache->reset();
     fDictionaryCache->reset();
-    fText = utext_openConstUnicodeString(fText, &newText, &status);
+    utext_openConstUnicodeString(&fText, &newText, &status);
 
     // Set up a character iterator on the string.
     //   Needed in case someone calls getText().
     //  Can not, unfortunately, do this lazily on the (probably never)
     //  call to getText(), because getText is const.
-    if (fSCharIter == NULL) {
-        fSCharIter = new StringCharacterIterator(newText);
-    } else {
-        fSCharIter->setText(newText);
-    }
+    fSCharIter.setText(newText);
 
-    if (fCharIter!=fSCharIter && fCharIter!=fDCharIter) {
+    if (fCharIter != &fSCharIter) {
         // old fCharIter was adopted from the outside.  Delete it.
         delete fCharIter;
     }
-    fCharIter = fSCharIter;
+    fCharIter = &fSCharIter;
 
     this->first();
 }
@@ -503,14 +497,14 @@
         status = U_ILLEGAL_ARGUMENT_ERROR;
         return *this;
     }
-    int64_t pos = utext_getNativeIndex(fText);
+    int64_t pos = utext_getNativeIndex(&fText);
     //  Shallow read-only clone of the new UText into the existing input UText
-    fText = utext_clone(fText, input, FALSE, TRUE, &status);
+    utext_clone(&fText, input, FALSE, TRUE, &status);
     if (U_FAILURE(status)) {
         return *this;
     }
-    utext_setNativeIndex(fText, pos);
-    if (utext_getNativeIndex(fText) != pos) {
+    utext_setNativeIndex(&fText, pos);
+    if (utext_getNativeIndex(&fText) != pos) {
         // Sanity check.  The new input utext is supposed to have the exact same
         // contents as the old.  If we can't set to the same position, it doesn't.
         // The contents underlying the old utext might be invalid at this point,
@@ -540,7 +534,7 @@
  * @return The text's past-the-end offset.
  */
 int32_t RuleBasedBreakIterator::last(void) {
-    int32_t endPos = (int32_t)utext_nativeLength(fText);
+    int32_t endPos = (int32_t)utext_nativeLength(&fText);
     UBool endShouldBeBoundary = isBoundary(endPos);      // Has side effect of setting iterator position.
     (void)endShouldBeBoundary;
     U_ASSERT(endShouldBeBoundary);
@@ -611,8 +605,8 @@
 
     // Move requested offset to a code point start. It might be on a trail surrogate,
     // or on a trail byte if the input is UTF-8. Or it may be beyond the end of the text.
-    utext_setNativeIndex(fText, startPos);
-    startPos = (int32_t)utext_getNativeIndex(fText);
+    utext_setNativeIndex(&fText, startPos);
+    startPos = (int32_t)utext_getNativeIndex(&fText);
 
     UErrorCode status = U_ZERO_ERROR;
     fBreakCache->following(startPos, status);
@@ -626,15 +620,15 @@
  * @return The position of the last boundary before the starting position.
  */
 int32_t RuleBasedBreakIterator::preceding(int32_t offset) {
-    if (fText == NULL || offset > utext_nativeLength(fText)) {
+    if (offset > utext_nativeLength(&fText)) {
         return last();
     }
 
     // Move requested offset to a code point start. It might be on a trail surrogate,
     // or on a trail byte if the input is UTF-8.
 
-    utext_setNativeIndex(fText, offset);
-    int32_t adjustedOffset = utext_getNativeIndex(fText);
+    utext_setNativeIndex(&fText, offset);
+    int32_t adjustedOffset = utext_getNativeIndex(&fText);
 
     UErrorCode status = U_ZERO_ERROR;
     fBreakCache->preceding(adjustedOffset, status);
@@ -660,8 +654,8 @@
     // Note that isBoundary() is always be false for offsets that are not on code point boundaries.
     // But we still need the side effect of leaving iteration at the following boundary.
 
-    utext_setNativeIndex(fText, offset);
-    int32_t adjustedOffset = utext_getNativeIndex(fText);
+    utext_setNativeIndex(&fText, offset);
+    int32_t adjustedOffset = utext_getNativeIndex(&fText);
 
     bool result = false;
     UErrorCode status = U_ZERO_ERROR;
@@ -669,7 +663,7 @@
         result = (fBreakCache->current() == offset);
     }
 
-    if (result && adjustedOffset < offset && utext_char32At(fText, offset) == U_SENTINEL) {
+    if (result && adjustedOffset < offset && utext_char32At(&fText, offset) == U_SENTINEL) {
         // Original offset is beyond the end of the text. Return FALSE, it's not a boundary,
         // but the iteration position remains set to the end of the text, which is a boundary.
         return FALSE;
@@ -789,9 +783,9 @@
 
     // if we're already at the end of the text, return DONE.
     initialPosition = fPosition;
-    UTEXT_SETNATIVEINDEX(fText, initialPosition);
+    UTEXT_SETNATIVEINDEX(&fText, initialPosition);
     result          = initialPosition;
-    c               = UTEXT_NEXT32(fText);
+    c               = UTEXT_NEXT32(&fText);
     if (c==U_SENTINEL) {
         fDone = TRUE;
         return UBRK_DONE;
@@ -854,7 +848,7 @@
 
        #ifdef RBBI_DEBUG
             if (gTrace) {
-                RBBIDebugPrintf("             %4ld   ", utext_getNativeIndex(fText));
+                RBBIDebugPrintf("             %4ld   ", utext_getNativeIndex(&fText));
                 if (0x20<=c && c<0x7f) {
                     RBBIDebugPrintf("\"%c\"  ", c);
                 } else {
@@ -867,9 +861,7 @@
         // State Transition - move machine to its next state
         //
 
-        // Note: fNextState is defined as uint16_t[2], but we are casting
-        // a generated RBBI table to RBBIStateTableRow and some tables
-        // actually have more than 2 categories.
+        // fNextState is a variable-length array.
         U_ASSERT(category<fData->fHeader->fCatCount);
         state = row->fNextState[category];  /*Not accessing beyond memory*/
         row = (RBBIStateTableRow *)
@@ -880,7 +872,7 @@
         if (row->fAccepting == -1) {
             // Match found, common case.
             if (mode != RBBI_START) {
-                result = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+                result = (int32_t)UTEXT_GETNATIVEINDEX(&fText);
             }
             fRuleStatusIndex = row->fTagIdx;   // Remember the break status (tag) values.
         }
@@ -898,7 +890,7 @@
         int16_t rule = row->fLookAhead;
         if (rule != 0) {
             // At the position of a '/' in a look-ahead match. Record it.
-            int32_t  pos = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+            int32_t  pos = (int32_t)UTEXT_GETNATIVEINDEX(&fText);
             lookAheadMatches.setPosition(rule, pos);
         }
 
@@ -914,7 +906,7 @@
         //    the input position.  The next iteration will be processing the
         //    first real input character.
         if (mode == RBBI_RUN) {
-            c = UTEXT_NEXT32(fText);
+            c = UTEXT_NEXT32(&fText);
         } else {
             if (mode == RBBI_START) {
                 mode = RBBI_RUN;
@@ -928,9 +920,9 @@
     //   (This really indicates a defect in the break rules.  They should always match
     //    at least one character.)
     if (result == initialPosition) {
-        utext_setNativeIndex(fText, initialPosition);
-        utext_next32(fText);
-        result = (int32_t)utext_getNativeIndex(fText);
+        utext_setNativeIndex(&fText, initialPosition);
+        utext_next32(&fText);
+        result = (int32_t)utext_getNativeIndex(&fText);
         fRuleStatusIndex = 0;
     }
 
@@ -965,7 +957,7 @@
     int32_t             initialPosition = 0;
 
     const RBBIStateTable *stateTable = fData->fSafeRevTable;
-    UTEXT_SETNATIVEINDEX(fText, fromPosition);
+    UTEXT_SETNATIVEINDEX(&fText, fromPosition);
     #ifdef RBBI_DEBUG
         if (gTrace) {
             RBBIDebugPuts("Handle Previous   pos   char  state category");
@@ -973,14 +965,14 @@
     #endif
 
     // if we're already at the start of the text, return DONE.
-    if (fText == NULL || fData == NULL || UTEXT_GETNATIVEINDEX(fText)==0) {
+    if (fData == NULL || UTEXT_GETNATIVEINDEX(&fText)==0) {
         return BreakIterator::DONE;
     }
 
     //  Set up the starting char.
-    initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+    initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(&fText);
     result          = initialPosition;
-    c               = UTEXT_PREVIOUS32(fText);
+    c               = UTEXT_PREVIOUS32(&fText);
 
     //  Set the initial state for the state machine
     state = START_STATE;
@@ -1028,7 +1020,7 @@
 
         #ifdef RBBI_DEBUG
             if (gTrace) {
-                RBBIDebugPrintf("             %4d   ", (int32_t)utext_getNativeIndex(fText));
+                RBBIDebugPrintf("             %4d   ", (int32_t)utext_getNativeIndex(&fText));
                 if (0x20<=c && c<0x7f) {
                     RBBIDebugPrintf("\"%c\"  ", c);
                 } else {
@@ -1041,9 +1033,7 @@
         // State Transition - move machine to its next state
         //
 
-        // Note: fNextState is defined as uint16_t[2], but we are casting
-        // a generated RBBI table to RBBIStateTableRow and some tables
-        // actually have more than 2 categories.
+        // fNextState is a variable-length array.
         U_ASSERT(category<fData->fHeader->fCatCount);
         state = row->fNextState[category];  /*Not accessing beyond memory*/
         row = (RBBIStateTableRow *)
@@ -1051,7 +1041,7 @@
 
         if (row->fAccepting == -1) {
             // Match found, common case.
-            result = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+            result = (int32_t)UTEXT_GETNATIVEINDEX(&fText);
         }
 
         int16_t completedRule = row->fAccepting;
@@ -1059,14 +1049,14 @@
             // Lookahead match is completed.
             int32_t lookaheadResult = lookAheadMatches.getPosition(completedRule);
             if (lookaheadResult >= 0) {
-                UTEXT_SETNATIVEINDEX(fText, lookaheadResult);
+                UTEXT_SETNATIVEINDEX(&fText, lookaheadResult);
                 return lookaheadResult;
             }
         }
         int16_t rule = row->fLookAhead;
         if (rule != 0) {
             // At the position of a '/' in a look-ahead match. Record it.
-            int32_t  pos = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+            int32_t  pos = (int32_t)UTEXT_GETNATIVEINDEX(&fText);
             lookAheadMatches.setPosition(rule, pos);
         }
 
@@ -1082,7 +1072,7 @@
         //    the input position.  The next iteration will be processing the
         //    first real input character.
         if (mode == RBBI_RUN) {
-            c = UTEXT_PREVIOUS32(fText);
+            c = UTEXT_PREVIOUS32(&fText);
         } else {
             if (mode == RBBI_START) {
                 mode = RBBI_RUN;
@@ -1096,9 +1086,9 @@
     //   (This really indicates a defect in the break rules.  They should always match
     //    at least one character.)
     if (result == initialPosition) {
-        UTEXT_SETNATIVEINDEX(fText, initialPosition);
-        UTEXT_PREVIOUS32(fText);
-        result = (int32_t)UTEXT_GETNATIVEINDEX(fText);
+        UTEXT_SETNATIVEINDEX(&fText, initialPosition);
+        UTEXT_PREVIOUS32(&fText);
+        result = (int32_t)UTEXT_GETNATIVEINDEX(&fText);
     }
 
     #ifdef RBBI_DEBUG
@@ -1247,7 +1237,7 @@
 
 
 static const LanguageBreakEngine*
-getLanguageBreakEngineFromFactory(UChar32 c, int32_t breakType)
+getLanguageBreakEngineFromFactory(UChar32 c)
 {
     umtx_initOnce(gLanguageBreakFactoriesInitOnce, &initLanguageFactories);
     if (gLanguageBreakFactories == NULL) {
@@ -1258,7 +1248,7 @@
     const LanguageBreakEngine *lbe = NULL;
     while (--i >= 0) {
         LanguageBreakFactory *factory = (LanguageBreakFactory *)(gLanguageBreakFactories->elementAt(i));
-        lbe = factory->getEngineFor(c, breakType);
+        lbe = factory->getEngineFor(c);
         if (lbe != NULL) {
             break;
         }
@@ -1290,14 +1280,14 @@
     int32_t i = fLanguageBreakEngines->size();
     while (--i >= 0) {
         lbe = (const LanguageBreakEngine *)(fLanguageBreakEngines->elementAt(i));
-        if (lbe->handles(c, fBreakType)) {
+        if (lbe->handles(c)) {
             return lbe;
         }
     }
 
     // No existing dictionary took the character. See if a factory wants to
     // give us a new LanguageBreakEngine for this character.
-    lbe = getLanguageBreakEngineFromFactory(c, fBreakType);
+    lbe = getLanguageBreakEngineFromFactory(c);
 
     // If we got one, use it and push it on our stack.
     if (lbe != NULL) {
@@ -1313,6 +1303,7 @@
         fUnhandledBreakEngine = new UnhandledEngine(status);
         if (U_SUCCESS(status) && fUnhandledBreakEngine == NULL) {
             status = U_MEMORY_ALLOCATION_ERROR;
+            return nullptr;
         }
         // Put it last so that scripts for which we have an engine get tried
         // first.
@@ -1327,25 +1318,19 @@
 
     // Tell the reject engine about the character; at its discretion, it may
     // add more than just the one character.
-    fUnhandledBreakEngine->handleCharacter(c, fBreakType);
+    fUnhandledBreakEngine->handleCharacter(c);
 
     return fUnhandledBreakEngine;
 }
 
-
-
-/*int32_t RuleBasedBreakIterator::getBreakType() const {
-    return fBreakType;
-}*/
-
-void RuleBasedBreakIterator::setBreakType(int32_t type) {
-    fBreakType = type;
-}
-
 void RuleBasedBreakIterator::dumpCache() {
     fBreakCache->dumpCache();
 }
 
+void RuleBasedBreakIterator::dumpTables() {
+    fData->printData();
+}
+
 /**
  * Returns the description used to create this iterator
  */
diff --git a/icu4c/source/common/rbbi_cache.cpp b/icu4c/source/common/rbbi_cache.cpp
index b3c3a38..44c66fb 100644
--- a/icu4c/source/common/rbbi_cache.cpp
+++ b/icu4c/source/common/rbbi_cache.cpp
@@ -26,14 +26,11 @@
  */
 
 RuleBasedBreakIterator::DictionaryCache::DictionaryCache(RuleBasedBreakIterator *bi, UErrorCode &status) :
-        fBI(bi), fBreaks(NULL), fPositionInCache(-1),
+        fBI(bi), fBreaks(status), fPositionInCache(-1),
         fStart(0), fLimit(0), fFirstRuleStatusIndex(0), fOtherRuleStatusIndex(0) {
-    fBreaks = new UVector32(status);
 }
 
 RuleBasedBreakIterator::DictionaryCache::~DictionaryCache() {
-    delete fBreaks;
-    fBreaks = NULL;
 }
 
 void RuleBasedBreakIterator::DictionaryCache::reset() {
@@ -42,7 +39,7 @@
     fLimit = 0;
     fFirstRuleStatusIndex = 0;
     fOtherRuleStatusIndex = 0;
-    fBreaks->removeAllElements();
+    fBreaks.removeAllElements();
 }
 
 UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_t *result, int32_t *statusIndex) {
@@ -54,13 +51,13 @@
     // Sequential iteration, move from previous boundary to the following
 
     int32_t r = 0;
-    if (fPositionInCache >= 0 && fPositionInCache < fBreaks->size() && fBreaks->elementAti(fPositionInCache) == fromPos) {
+    if (fPositionInCache >= 0 && fPositionInCache < fBreaks.size() && fBreaks.elementAti(fPositionInCache) == fromPos) {
         ++fPositionInCache;
-        if (fPositionInCache >= fBreaks->size()) {
+        if (fPositionInCache >= fBreaks.size()) {
             fPositionInCache = -1;
             return FALSE;
         }
-        r = fBreaks->elementAti(fPositionInCache);
+        r = fBreaks.elementAti(fPositionInCache);
         U_ASSERT(r > fromPos);
         *result = r;
         *statusIndex = fOtherRuleStatusIndex;
@@ -69,8 +66,8 @@
 
     // Random indexing. Linear search for the boundary following the given position.
 
-    for (fPositionInCache = 0; fPositionInCache < fBreaks->size(); ++fPositionInCache) {
-        r= fBreaks->elementAti(fPositionInCache);
+    for (fPositionInCache = 0; fPositionInCache < fBreaks.size(); ++fPositionInCache) {
+        r= fBreaks.elementAti(fPositionInCache);
         if (r > fromPos) {
             *result = r;
             *statusIndex = fOtherRuleStatusIndex;
@@ -90,16 +87,16 @@
     }
 
     if (fromPos == fLimit) {
-        fPositionInCache = fBreaks->size() - 1;
+        fPositionInCache = fBreaks.size() - 1;
         if (fPositionInCache >= 0) {
-            U_ASSERT(fBreaks->elementAti(fPositionInCache) == fromPos);
+            U_ASSERT(fBreaks.elementAti(fPositionInCache) == fromPos);
         }
     }
 
     int32_t r;
-    if (fPositionInCache > 0 && fPositionInCache < fBreaks->size() && fBreaks->elementAti(fPositionInCache) == fromPos) {
+    if (fPositionInCache > 0 && fPositionInCache < fBreaks.size() && fBreaks.elementAti(fPositionInCache) == fromPos) {
         --fPositionInCache;
-        r = fBreaks->elementAti(fPositionInCache);
+        r = fBreaks.elementAti(fPositionInCache);
         U_ASSERT(r < fromPos);
         *result = r;
         *statusIndex = ( r== fStart) ? fFirstRuleStatusIndex : fOtherRuleStatusIndex;
@@ -111,8 +108,8 @@
         return FALSE;
     }
 
-    for (fPositionInCache = fBreaks->size()-1; fPositionInCache >= 0; --fPositionInCache) {
-        r = fBreaks->elementAti(fPositionInCache);
+    for (fPositionInCache = fBreaks.size()-1; fPositionInCache >= 0; --fPositionInCache) {
+        r = fBreaks.elementAti(fPositionInCache);
         if (r < fromPos) {
             *result = r;
             *statusIndex = ( r == fStart) ? fFirstRuleStatusIndex : fOtherRuleStatusIndex;
@@ -141,7 +138,7 @@
     int32_t     current;
     UErrorCode  status = U_ZERO_ERROR;
     int32_t     foundBreakCount = 0;
-    UText      *text = fBI->fText;
+    UText      *text = &fBI->fText;
 
     // Loop through the text, looking for ranges of dictionary characters.
     // For each span, find the appropriate break engine, and ask it to find
@@ -168,7 +165,7 @@
         // Ask the language object if there are any breaks. It will add them to the cache and
         // leave the text pointer on the other side of its range, ready to search for the next one.
         if (lbe != NULL) {
-            foundBreakCount += lbe->findBreaks(text, rangeStart, rangeEnd, fBI->fBreakType, *fBreaks);
+            foundBreakCount += lbe->findBreaks(text, rangeStart, rangeEnd, fBreaks);
         }
 
         // Reload the loop variables for the next go-round
@@ -182,21 +179,21 @@
 
     // printf("foundBreakCount = %d\n", foundBreakCount);
     if (foundBreakCount > 0) {
-        U_ASSERT(foundBreakCount == fBreaks->size());
-        if (startPos < fBreaks->elementAti(0)) {
+        U_ASSERT(foundBreakCount == fBreaks.size());
+        if (startPos < fBreaks.elementAti(0)) {
             // The dictionary did not place a boundary at the start of the segment of text.
             // Add one now. This should not commonly happen, but it would be easy for interactions
             // of the rules for dictionary segments and the break engine implementations to
             // inadvertently cause it. Cover it here, just in case.
-            fBreaks->insertElementAt(startPos, 0, status);
+            fBreaks.insertElementAt(startPos, 0, status);
         }
-        if (endPos > fBreaks->peeki()) {
-            fBreaks->push(endPos, status);
+        if (endPos > fBreaks.peeki()) {
+            fBreaks.push(endPos, status);
         }
         fPositionInCache = 0;
         // Note: Dictionary matching may extend beyond the original limit.
-        fStart = fBreaks->elementAti(0);
-        fLimit = fBreaks->peeki();
+        fStart = fBreaks.elementAti(0);
+        fLimit = fBreaks.peeki();
     } else {
         // there were no language-based breaks, even though the segment contained
         // dictionary characters. Subsequent attempts to fetch boundaries from the dictionary cache
diff --git a/icu4c/source/common/rbbi_cache.h b/icu4c/source/common/rbbi_cache.h
index dea017a..b4338c3 100644
--- a/icu4c/source/common/rbbi_cache.h
+++ b/icu4c/source/common/rbbi_cache.h
@@ -56,7 +56,7 @@
 
     RuleBasedBreakIterator *fBI;
     
-    UVector32          *fBreaks;                // A vector containing the boundaries.
+    UVector32           fBreaks;                // A vector containing the boundaries.
     int32_t             fPositionInCache;       // Index in fBreaks of last boundary returned by following()
                                                 //    or preceding(). Optimizes sequential access.
     int32_t             fStart;                 // Text position of first boundary in cache.
diff --git a/icu4c/source/common/rbbidata.cpp b/icu4c/source/common/rbbidata.cpp
index 3340570..5b00e95 100644
--- a/icu4c/source/common/rbbidata.cpp
+++ b/icu4c/source/common/rbbidata.cpp
@@ -267,8 +267,8 @@
 #endif
 
 
-#ifdef RBBI_DEBUG
 void  RBBIDataWrapper::printData() {
+#ifdef RBBI_DEBUG
     RBBIDebugPrintf("RBBI Data at %p\n", (void *)fHeader);
     RBBIDebugPrintf("   Version = {%d %d %d %d}\n", fHeader->fFormatVersion[0], fHeader->fFormatVersion[1],
                                                     fHeader->fFormatVersion[2], fHeader->fFormatVersion[3]);
@@ -285,8 +285,8 @@
         RBBIDebugPrintf("%c", fRuleSource[c]);
     }
     RBBIDebugPrintf("\n\n");
-}
 #endif
+}
 
 
 U_NAMESPACE_END
diff --git a/icu4c/source/common/rbbidata.h b/icu4c/source/common/rbbidata.h
index bd25e06..1244a11 100644
--- a/icu4c/source/common/rbbidata.h
+++ b/icu4c/source/common/rbbidata.h
@@ -116,9 +116,10 @@
                                     /*     StatusTable of the set of matching             */
                                     /*     tags (rule status values)                      */
     int16_t          fReserved;
-    uint16_t         fNextState[2]; /*  Next State, indexed by char category.             */
-                                    /*  This array does not have two elements             */
-                                    /*    Array Size is actually fData->fHeader->fCatCount         */
+    uint16_t         fNextState[1]; /*  Next State, indexed by char category.             */
+                                    /*    Variable-length array declared with length 1    */
+                                    /*    to disable bounds checkers.                     */
+                                    /*    Array Size is actually fData->fHeader->fCatCount*/
                                     /*    CAUTION:  see RBBITableBuilder::getTableSize()  */
                                     /*              before changing anything here.        */
 };
@@ -129,7 +130,9 @@
     uint32_t         fRowLen;       /*  Length of a state table row, in bytes.            */
     uint32_t         fFlags;        /*  Option Flags for this state table                 */
     uint32_t         fReserved;     /*  reserved                                          */
-    char             fTableData[4]; /*  First RBBIStateTableRow begins here.              */
+    char             fTableData[1]; /*  First RBBIStateTableRow begins here.              */
+                                    /*    Variable-length array declared with length 1    */
+                                    /*    to disable bounds checkers.                     */
                                     /*    (making it char[] simplifies ugly address       */
                                     /*     arithmetic for indexing variable length rows.) */
 };
@@ -162,13 +165,8 @@
     UBool                 operator ==(const RBBIDataWrapper &other) const;
     int32_t               hashCode();
     const UnicodeString  &getRuleSourceString() const;
-#ifdef RBBI_DEBUG
     void                  printData();
     void                  printTable(const char *heading, const RBBIStateTable *table);
-#else
-    #define printData()
-    #define printTable(heading, table)
-#endif
 
     /*                                     */
     /*   Pointers to items within the data */
diff --git a/icu4c/source/common/rbbirb.cpp b/icu4c/source/common/rbbirb.cpp
index 72447d8..61e596d 100644
--- a/icu4c/source/common/rbbirb.cpp
+++ b/icu4c/source/common/rbbirb.cpp
@@ -47,7 +47,7 @@
 RBBIRuleBuilder::RBBIRuleBuilder(const UnicodeString   &rules,
                                        UParseError     *parseErr,
                                        UErrorCode      &status)
- : fRules(rules)
+ : fRules(rules), fStrippedRules(rules)
 {
     fStatus = &status; // status is checked below
     fParseError = parseErr;
@@ -147,8 +147,9 @@
         return NULL;
     }
 
-    // Remove comments and whitespace from the rules to make it smaller.
-    UnicodeString strippedRules((const UnicodeString&)RBBIRuleScanner::stripRules(fRules));
+    // Remove whitespace from the rules to make it smaller.
+    // The rule parser has already removed comments.
+    fStrippedRules = fScanner->stripRules(fStrippedRules);
 
     // Calculate the size of each section in the data.
     //   Sizes here are padded up to a multiple of 8 for better memory alignment.
@@ -162,7 +163,7 @@
     int32_t safeRevTableSize  = align8(fSafeRevTables->getTableSize());
     int32_t trieSize          = align8(fSetBuilder->getTrieSize());
     int32_t statusTableSize   = align8(fRuleStatusVals->size() * sizeof(int32_t));
-    int32_t rulesSize         = align8((strippedRules.length()+1) * sizeof(UChar));
+    int32_t rulesSize         = align8((fStrippedRules.length()+1) * sizeof(UChar));
 
     (void)safeFwdTableSize;
 
@@ -225,7 +226,7 @@
     data->fStatusTable   = data->fTrie    + trieSize;
     data->fStatusTableLen= statusTableSize;
     data->fRuleSource    = data->fStatusTable + statusTableSize;
-    data->fRuleSourceLen = strippedRules.length() * sizeof(UChar);
+    data->fRuleSourceLen = fStrippedRules.length() * sizeof(UChar);
 
     uprv_memset(data->fReserved, 0, sizeof(data->fReserved));
 
@@ -245,7 +246,7 @@
         ruleStatusTable[i] = fRuleStatusVals->elementAti(i);
     }
 
-    strippedRules.extract((UChar *)((uint8_t *)data+data->fRuleSource), rulesSize/2+1, *fStatus);
+    fStrippedRules.extract((UChar *)((uint8_t *)data+data->fRuleSource), rulesSize/2+1, *fStatus);
 
     return data;
 }
@@ -281,10 +282,10 @@
     //
     // UnicodeSet processing.
     //    Munge the Unicode Sets to create a set of character categories.
-    //    Generate the mapping tables (TRIE) from input 32-bit characters to
+    //    Generate the mapping tables (TRIE) from input code points to
     //    the character categories.
     //
-    builder.fSetBuilder->build();
+    builder.fSetBuilder->buildRanges();
 
 
     //
@@ -316,6 +317,11 @@
     }
 #endif
 
+    builder.optimizeTables();
+    builder.fSetBuilder->buildTrie();
+
+
+
     //
     //   Package up the compiled data into a memory image
     //      in the run-time format.
@@ -347,6 +353,29 @@
     return This;
 }
 
+void RBBIRuleBuilder::optimizeTables() {
+    int32_t leftClass;
+    int32_t rightClass;
+
+    leftClass = 3;
+    rightClass = 0;
+    while (fForwardTables->findDuplCharClassFrom(leftClass, rightClass)) {
+        fSetBuilder->mergeCategories(leftClass, rightClass);
+        fForwardTables->removeColumn(rightClass);
+        fReverseTables->removeColumn(rightClass);
+        fSafeFwdTables->removeColumn(rightClass);
+        fSafeRevTables->removeColumn(rightClass);
+    }
+
+    fForwardTables->removeDuplicateStates();
+    fReverseTables->removeDuplicateStates();
+    fSafeFwdTables->removeDuplicateStates();
+    fSafeRevTables->removeDuplicateStates();
+
+
+
+}
+
 U_NAMESPACE_END
 
 #endif /* #if !UCONFIG_NO_BREAK_ITERATION */
diff --git a/icu4c/source/common/rbbirb.h b/icu4c/source/common/rbbirb.h
index f00f58e..f890cf6 100644
--- a/icu4c/source/common/rbbirb.h
+++ b/icu4c/source/common/rbbirb.h
@@ -126,10 +126,19 @@
         );
 
     virtual    ~RBBIRuleBuilder();
+
+    /**
+     * Fold together redundant character classes (table columns) and
+     * redundant states (table rows). Done after initial table generation,
+     * before serializing the result.
+     */
+    void optimizeTables();
+
     char                          *fDebugEnv;        // controls debug trace output
     UErrorCode                    *fStatus;          // Error reporting.  Keeping status
     UParseError                   *fParseError;      //   here avoids passing it everywhere.
     const UnicodeString           &fRules;           // The rule string that we are compiling
+    UnicodeString                 fStrippedRules;    // The rule string, with comments stripped.
 
     RBBIRuleScanner               *fScanner;         // The scanner.
     RBBINode                      *fForwardTree;     // The parse trees, generated by the scanner,
diff --git a/icu4c/source/common/rbbiscan.cpp b/icu4c/source/common/rbbiscan.cpp
index db0d761..60f3d19 100644
--- a/icu4c/source/common/rbbiscan.cpp
+++ b/icu4c/source/common/rbbiscan.cpp
@@ -822,27 +822,24 @@
 
 //------------------------------------------------------------------------------
 //
-//  stripRules    Return a rules string without unnecessary
-//                characters.
+//  stripRules    Return a rules string without extra spaces.
+//                (Comments are removed separately, during rule parsing.)
 //
 //------------------------------------------------------------------------------
 UnicodeString RBBIRuleScanner::stripRules(const UnicodeString &rules) {
     UnicodeString strippedRules;
-    int rulesLength = rules.length();
-    for (int idx = 0; idx < rulesLength; ) {
-        UChar ch = rules[idx++];
-        if (ch == chPound) {
-            while (idx < rulesLength
-                && ch != chCR && ch != chLF && ch != chNEL)
-            {
-                ch = rules[idx++];
-            }
+    int32_t rulesLength = rules.length();
+    bool skippingSpaces = false;
+
+    for (int32_t idx=0; idx<rulesLength; idx = rules.moveIndex32(idx, 1)) {
+        UChar32 cp = rules.char32At(idx);
+        bool whiteSpace = u_hasBinaryProperty(cp, UCHAR_PATTERN_WHITE_SPACE);
+        if (skippingSpaces && whiteSpace) {
+            continue;
         }
-        if (!u_isISOControl(ch)) {
-            strippedRules.append(ch);
-        }
+        strippedRules.append(cp);
+        skippingSpaces = whiteSpace;
     }
-    // strippedRules = strippedRules.unescape();
     return strippedRules;
 }
 
@@ -942,6 +939,7 @@
             //  It will be treated as white-space, and serves to break up anything
             //    that might otherwise incorrectly clump together with a comment in
             //    the middle (a variable name, for example.)
+            int32_t commentStart = fScanIndex;
             for (;;) {
                 c.fChar = nextCharLL();
                 if (c.fChar == (UChar32)-1 ||  // EOF
@@ -950,6 +948,9 @@
                     c.fChar == chNEL    ||
                     c.fChar == chLS)       {break;}
             }
+            for (int32_t i=commentStart; i<fNextIndex-1; ++i) {
+                fRB->fStrippedRules.setCharAt(i, u' ');
+            }
         }
         if (c.fChar == (UChar32)-1) {
             return;
diff --git a/icu4c/source/common/rbbisetb.cpp b/icu4c/source/common/rbbisetb.cpp
index e97eba8..108d127 100644
--- a/icu4c/source/common/rbbisetb.cpp
+++ b/icu4c/source/common/rbbisetb.cpp
@@ -91,7 +91,7 @@
 //                  from the Unicode Sets.
 //
 //------------------------------------------------------------------------
-void RBBISetBuilder::build() {
+void RBBISetBuilder::buildRanges() {
     RBBINode        *usetNode;
     RangeDescriptor *rlRange;
 
@@ -245,11 +245,16 @@
 
     if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "rgroup")) {printRangeGroups();}
     if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "esets")) {printSets();}
+}
 
-    //
-    // Build the Trie table for mapping UChar32 values to the corresponding
-    //   range group number
-    //
+
+//
+// Build the Trie table for mapping UChar32 values to the corresponding
+// range group number.
+//
+void RBBISetBuilder::buildTrie() {
+    RangeDescriptor *rlRange;
+
     fTrie = utrie2_open(0,       //  Initial value for all code points.
                         0,       //  Error value for out-of-range input.
                         fStatus);
@@ -265,6 +270,22 @@
 }
 
 
+void RBBISetBuilder::mergeCategories(int32_t left, int32_t right) {
+    U_ASSERT(left >= 1);
+    U_ASSERT(right > left);
+    for (RangeDescriptor *rd = fRangeList; rd != nullptr; rd = rd->fNext) {
+        int32_t rangeNum = rd->fNum & ~DICT_BIT;
+        int32_t rangeDict = rd->fNum & DICT_BIT;
+        if (rangeNum == right) {
+            rd->fNum = left | rangeDict;
+        } else if (rangeNum > right) {
+            rd->fNum--;
+        }
+    }
+    --fGroupCount;
+}
+
+
 //-----------------------------------------------------------------------------------
 //
 //  getTrieSize()    Return the size that will be required to serialize the Trie.
@@ -446,7 +467,7 @@
             lastPrintedGroupNum = groupNum;
             RBBIDebugPrintf("%2i  ", groupNum);
 
-            if (rlRange->fNum & 0x4000) { RBBIDebugPrintf(" <DICT> ");}
+            if (rlRange->fNum & DICT_BIT) { RBBIDebugPrintf(" <DICT> ");}
 
             for (i=0; i<rlRange->fIncludesSets->size(); i++) {
                 RBBINode       *usetNode    = (RBBINode *)rlRange->fIncludesSets->elementAt(i);
@@ -639,20 +660,20 @@
 void RangeDescriptor::setDictionaryFlag() {
     int i;
 
-    for (i=0; i<this->fIncludesSets->size(); i++) {
-        RBBINode       *usetNode    = (RBBINode *)fIncludesSets->elementAt(i);
-        UnicodeString   setName;
-        RBBINode       *setRef = usetNode->fParent;
-        if (setRef != NULL) {
+    static const char16_t *dictionary = u"dictionary";
+    for (i=0; i<fIncludesSets->size(); i++) {
+        RBBINode *usetNode  = (RBBINode *)fIncludesSets->elementAt(i);
+        RBBINode *setRef = usetNode->fParent;
+        if (setRef != nullptr) {
             RBBINode *varRef = setRef->fParent;
-            if (varRef != NULL  &&  varRef->fType == RBBINode::varRef) {
-                setName = varRef->fText;
+            if (varRef && varRef->fType == RBBINode::varRef) {
+                const UnicodeString *setName = &varRef->fText;
+                if (setName->compare(dictionary, -1) == 0) {
+                    fNum |= RBBISetBuilder::DICT_BIT;
+                    break;
+                }
             }
         }
-        if (setName.compare(UNICODE_STRING("dictionary", 10)) == 0) {   // TODO:  no string literals.
-            this->fNum |= 0x4000;
-            break;
-        }
     }
 }
 
diff --git a/icu4c/source/common/rbbisetb.h b/icu4c/source/common/rbbisetb.h
index 7cedb45..a7a91b3 100644
--- a/icu4c/source/common/rbbisetb.h
+++ b/icu4c/source/common/rbbisetb.h
@@ -82,7 +82,8 @@
     RBBISetBuilder(RBBIRuleBuilder *rb);
     ~RBBISetBuilder();
 
-    void     build();
+    void     buildRanges();
+    void     buildTrie();
     void     addValToSets(UVector *sets,      uint32_t val);
     void     addValToSet (RBBINode *usetNode, uint32_t val);
     int32_t  getNumCharCategories() const;   // CharCategories are the same as input symbol set to the
@@ -93,6 +94,13 @@
     UChar32  getFirstChar(int32_t  val) const;
     UBool    sawBOF() const;                 // Indicate whether any references to the {bof} pseudo
                                              //   character were encountered.
+    /** merge two character categories that have been identified as having equivalent behavior.
+     *  The ranges belonging to the right category (table column) will be added to the left.
+     */
+    void     mergeCategories(int32_t left, int32_t right);
+
+    static constexpr int32_t DICT_BIT = 0x4000;
+
 #ifdef RBBI_DEBUG
     void     printSets();
     void     printRanges();
diff --git a/icu4c/source/common/rbbitblb.cpp b/icu4c/source/common/rbbitblb.cpp
index 0f1a901..5816892 100644
--- a/icu4c/source/common/rbbitblb.cpp
+++ b/icu4c/source/common/rbbitblb.cpp
@@ -22,6 +22,7 @@
 #include "rbbidata.h"
 #include "cstring.h"
 #include "uassert.h"
+#include "uvectr32.h"
 #include "cmemory.h"
 
 U_NAMESPACE_BEGIN
@@ -761,7 +762,7 @@
                 // if sd->fAccepting already had a value other than 0 or -1, leave it be.
 
                 // If the end marker node is from a look-ahead rule, set
-                //   the fLookAhead field or this state also.
+                //   the fLookAhead field for this state also.
                 if (endMarker->fLookAheadEnd) {
                     // TODO:  don't change value if already set?
                     // TODO:  allow for more than one active look-ahead rule in engine.
@@ -1077,7 +1078,128 @@
 }
 #endif
 
+//
+//    findDuplCharClassFrom()
+//
+bool RBBITableBuilder::findDuplCharClassFrom(int32_t &baseCategory, int32_t &duplCategory) {
+    int32_t numStates = fDStates->size();
+    int32_t numCols = fRB->fSetBuilder->getNumCharCategories();
 
+    uint16_t table_base;
+    uint16_t table_dupl;
+    for (; baseCategory < numCols-1; ++baseCategory) {
+        for (duplCategory=baseCategory+1; duplCategory < numCols; ++duplCategory) {
+             for (int32_t state=0; state<numStates; state++) {
+                 RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(state);
+                 table_base = (uint16_t)sd->fDtran->elementAti(baseCategory);
+                 table_dupl = (uint16_t)sd->fDtran->elementAti(duplCategory);
+                 if (table_base != table_dupl) {
+                     break;
+                 }
+             }
+             if (table_base == table_dupl) {
+                 return true;
+             }
+        }
+    }
+    return false;
+}
+
+
+//
+//    removeColumn()
+//
+void RBBITableBuilder::removeColumn(int32_t column) {
+    int32_t numStates = fDStates->size();
+    for (int32_t state=0; state<numStates; state++) {
+        RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(state);
+        U_ASSERT(column < sd->fDtran->size());
+        sd->fDtran->removeElementAt(column);
+    }
+}
+
+/*
+ * findDuplicateState
+ */
+bool RBBITableBuilder::findDuplicateState(int32_t &firstState, int32_t &duplState) {
+    int32_t numStates = fDStates->size();
+    int32_t numCols = fRB->fSetBuilder->getNumCharCategories();
+
+    for (; firstState<numStates-1; ++firstState) {
+        RBBIStateDescriptor *firstSD = (RBBIStateDescriptor *)fDStates->elementAt(firstState);
+        for (duplState=firstState+1; duplState<numStates; ++duplState) {
+            RBBIStateDescriptor *duplSD = (RBBIStateDescriptor *)fDStates->elementAt(duplState);
+            if (firstSD->fAccepting != duplSD->fAccepting ||
+                firstSD->fLookAhead != duplSD->fLookAhead ||
+                firstSD->fTagsIdx   != duplSD->fTagsIdx) {
+                continue;
+            }
+            bool rowsMatch = true;
+            for (int32_t col=0; col < numCols; ++col) {
+                int32_t firstVal = firstSD->fDtran->elementAti(col);
+                int32_t duplVal = duplSD->fDtran->elementAti(col);
+                if (!((firstVal == duplVal) ||
+                        ((firstVal == firstState || firstVal == duplState) &&
+                        (duplVal  == firstState || duplVal  == duplState)))) {
+                    rowsMatch = false;
+                    break;
+                }
+            }
+            if (rowsMatch) {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+void RBBITableBuilder::removeState(int32_t keepState, int32_t duplState) {
+    U_ASSERT(keepState < duplState);
+    U_ASSERT(duplState < fDStates->size());
+
+    RBBIStateDescriptor *duplSD = (RBBIStateDescriptor *)fDStates->elementAt(duplState);
+    fDStates->removeElementAt(duplState);
+    delete duplSD;
+
+    int32_t numStates = fDStates->size();
+    int32_t numCols = fRB->fSetBuilder->getNumCharCategories();
+    for (int32_t state=0; state<numStates; ++state) {
+        RBBIStateDescriptor *sd = (RBBIStateDescriptor *)fDStates->elementAt(state);
+        for (int32_t col=0; col<numCols; col++) {
+            int32_t existingVal = sd->fDtran->elementAti(col);
+            int32_t newVal = existingVal;
+            if (existingVal == duplState) {
+                newVal = keepState;
+            } else if (existingVal > duplState) {
+                newVal = existingVal - 1;
+            }
+            sd->fDtran->setElementAt(newVal, col);
+        }
+        if (sd->fAccepting == duplState) {
+            sd->fAccepting = keepState;
+        } else if (sd->fAccepting > duplState) {
+            sd->fAccepting--;
+        }
+        if (sd->fLookAhead == duplState) {
+            sd->fLookAhead = keepState;
+        } else if (sd->fLookAhead > duplState) {
+            sd->fLookAhead--;
+        }
+    }
+}
+
+
+/*
+ * RemoveDuplicateStates
+ */
+void RBBITableBuilder::removeDuplicateStates() {
+    int32_t firstState = 3;
+    int32_t duplicateState = 0;
+    while (findDuplicateState(firstState, duplicateState)) {
+        // printf("Removing duplicate states (%d, %d)\n", firstState, duplicateState);
+        removeState(firstState, duplicateState);
+    }
+}
 
 //-----------------------------------------------------------------------------
 //
@@ -1095,21 +1217,17 @@
         return 0;
     }
 
-    size    = sizeof(RBBIStateTable) - 4;    // The header, with no rows to the table.
+    size    = offsetof(RBBIStateTable, fTableData);    // The header, with no rows to the table.
 
     numRows = fDStates->size();
     numCols = fRB->fSetBuilder->getNumCharCategories();
 
-    //  Note  The declaration of RBBIStateTableRow is for a table of two columns.
-    //        Therefore we subtract two from numCols when determining
-    //        how much storage to add to a row for the total columns.
-    rowSize = sizeof(RBBIStateTableRow) + sizeof(uint16_t)*(numCols-2);
+    rowSize = offsetof(RBBIStateTableRow, fNextState) + sizeof(uint16_t)*numCols;
     size   += numRows * rowSize;
     return size;
 }
 
 
-
 //-----------------------------------------------------------------------------
 //
 //   exportTable()    export the state transition table in the format required
@@ -1126,14 +1244,14 @@
         return;
     }
 
-    if (fRB->fSetBuilder->getNumCharCategories() > 0x7fff ||
+    int32_t catCount = fRB->fSetBuilder->getNumCharCategories();
+    if (catCount > 0x7fff ||
         fDStates->size() > 0x7fff) {
         *fStatus = U_BRK_INTERNAL_ERROR;
         return;
     }
 
-    table->fRowLen    = sizeof(RBBIStateTableRow) +
-                            sizeof(uint16_t) * (fRB->fSetBuilder->getNumCharCategories() - 2);
+    table->fRowLen    = offsetof(RBBIStateTableRow, fNextState) + sizeof(uint16_t) * catCount;
     table->fNumStates = fDStates->size();
     table->fFlags     = 0;
     if (fRB->fLookAheadHardBreak) {
@@ -1152,7 +1270,7 @@
         row->fAccepting = (int16_t)sd->fAccepting;
         row->fLookAhead = (int16_t)sd->fLookAhead;
         row->fTagIdx    = (int16_t)sd->fTagsIdx;
-        for (col=0; col<fRB->fSetBuilder->getNumCharCategories(); col++) {
+        for (col=0; col<catCount; col++) {
             row->fNextState[col] = (uint16_t)sd->fDtran->elementAti(col);
         }
     }
@@ -1259,7 +1377,7 @@
     fPositions = NULL;
     fDtran     = NULL;
 
-    fDtran     = new UVector(lastInputSymbol+1, *fStatus);
+    fDtran     = new UVector32(lastInputSymbol+1, *fStatus);
     if (U_FAILURE(*fStatus)) {
         return;
     }
@@ -1267,7 +1385,7 @@
         *fStatus = U_MEMORY_ALLOCATION_ERROR;
         return;
     }
-    fDtran->setSize(lastInputSymbol+1, *fStatus);    // fDtran needs to be pre-sized.
+    fDtran->setSize(lastInputSymbol+1);    // fDtran needs to be pre-sized.
                                            //   It is indexed by input symbols, and will
                                            //   hold  the next state number for each
                                            //   symbol.
diff --git a/icu4c/source/common/rbbitblb.h b/icu4c/source/common/rbbitblb.h
index 1041501..09b57b5 100644
--- a/icu4c/source/common/rbbitblb.h
+++ b/icu4c/source/common/rbbitblb.h
@@ -24,6 +24,7 @@
 
 class RBBIRuleScanner;
 class RBBIRuleBuilder;
+class UVector32;
 
 //
 //  class RBBITableBuilder is part of the RBBI rule compiler.
@@ -42,9 +43,24 @@
     void     build();
     int32_t  getTableSize() const;      // Return the runtime size in bytes of
                                         //     the built state table
-    void     exportTable(void *where);  // fill in the runtime state table.
-                                        //     Sufficient memory must exist at
-                                        //     the specified location.
+
+    /** Fill in the runtime state table. Sufficient memory must exist at the specified location.
+     */
+    void     exportTable(void *where);
+
+    /** Find duplicate (redundant) character classes, beginning after the specifed
+     *  pair, within this state table. This is an iterator-like function, used to
+     *  identify char classes (state table columns) that can be eliminated.
+     */
+    bool     findDuplCharClassFrom(int &baseClass, int &duplClass);
+
+    /** Remove a column from the state table. Used when two character categories
+     *  have been found equivalent, and merged together, to eliminate the uneeded table column.
+     */
+    void     removeColumn(int32_t column);
+
+    /** Check for, and remove dupicate states (table rows). */
+    void     removeDuplicateStates();
 
 
 private:
@@ -60,8 +76,29 @@
     void     flagTaggedStates();
     void     mergeRuleStatusVals();
 
+    /**
+     * Merge redundant state table columns, eliminating character classes with identical behavior.
+     * Done after the state tables are generated, just before converting to their run-time format.
+     */
+    int32_t  mergeColumns();
+
     void     addRuleRootNodes(UVector *dest, RBBINode *node);
 
+    /** Find the next duplicate state. An iterator function.
+     * @param firstState (in/out) begin looking at this state, return the first of the
+     *                   pair of duplicates.
+     * @param duplicateState returns the duplicate state of fistState
+     * @return true if a duplicate pair of states was found.
+     */
+    bool findDuplicateState(int32_t &firstState, int32_t &duplicateState);
+
+    /** Remove a duplicate state/
+     * @param keepState First of the duplicate pair. Keep it.
+     * @param duplState Duplicate state. Remove it. Redirect all references to the duplicate state
+     *                  to refer to keepState instead.
+     */
+    void removeState(int32_t keepState, int32_t duplState);
+
     // Set functions for UVector.
     //   TODO:  make a USet subclass of UVector
 
@@ -112,7 +149,7 @@
                                            //   with this state.  Unordered (it's a set).
                                            //   UVector contents are RBBINode *
 
-    UVector          *fDtran;              // Transitions out of this state.
+    UVector32        *fDtran;              // Transitions out of this state.
                                            //   indexed by input character
                                            //   contents is int index of dest state
                                            //   in RBBITableBuilder.fDStates
diff --git a/icu4c/source/common/sharedobject.cpp b/icu4c/source/common/sharedobject.cpp
index 37aa458..6eeca86 100644
--- a/icu4c/source/common/sharedobject.cpp
+++ b/icu4c/source/common/sharedobject.cpp
@@ -8,7 +8,10 @@
 * sharedobject.cpp
 */
 #include "sharedobject.h"
+#include "mutex.h"
 #include "uassert.h"
+#include "umutex.h"
+#include "unifiedcache.h"
 
 U_NAMESPACE_BEGIN
 
@@ -17,69 +20,41 @@
 UnifiedCacheBase::~UnifiedCacheBase() {}
 
 void
-SharedObject::addRef(UBool fromWithinCache) const {
-    umtx_atomic_inc(&totalRefCount);
-
-    // Although items in use may not be correct immediately, it
-    // will be correct eventually.
-    if (umtx_atomic_inc(&hardRefCount) == 1 && cachePtr != NULL) {
-        // If this object is cached, and the hardRefCount goes from 0 to 1,
-        // then the increment must happen from within the cache while the
-        // cache global mutex is locked. In this way, we can be rest assured
-        // that data races can't happen if the cache performs some task if
-        // the hardRefCount is zero while the global cache mutex is locked.
-        (void)fromWithinCache;   // Suppress unused variable warning in non-debug builds.
-        U_ASSERT(fromWithinCache);
-        cachePtr->incrementItemsInUse();
-    }
+SharedObject::addRef() const {
+    umtx_atomic_inc(&hardRefCount);
 }
 
+// removeRef Decrement the reference count and delete if it is zero.
+//           Note that SharedObjects with a non-null cachePtr are owned by the
+//           unified cache, and the cache will be responsible for the actual deletion.
+//           The deletion could be as soon as immediately following the
+//           update to the reference count, if another thread is running
+//           a cache eviction cycle concurrently.
+//           NO ACCESS TO *this PERMITTED AFTER REFERENCE COUNT == 0 for cached objects.
+//           THE OBJECT MAY ALREADY BE GONE.
 void
-SharedObject::removeRef(UBool fromWithinCache) const {
-    UBool decrementItemsInUse = (umtx_atomic_dec(&hardRefCount) == 0);
-    UBool allReferencesGone = (umtx_atomic_dec(&totalRefCount) == 0);
-
-    // Although items in use may not be correct immediately, it
-    // will be correct eventually.
-    if (decrementItemsInUse && cachePtr != NULL) {
-        if (fromWithinCache) {
-            cachePtr->decrementItemsInUse();
+SharedObject::removeRef() const {
+    const UnifiedCacheBase *cache = this->cachePtr;
+    int32_t updatedRefCount = umtx_atomic_dec(&hardRefCount);
+    U_ASSERT(updatedRefCount >= 0);
+    if (updatedRefCount == 0) {
+        if (cache) {
+            cache->handleUnreferencedObject();
         } else {
-            cachePtr->decrementItemsInUseWithLockingAndEviction();
+            delete this;
         }
     }
-    if (allReferencesGone) {
-        delete this;
-    }
 }
 
-void
-SharedObject::addSoftRef() const {
-    umtx_atomic_inc(&totalRefCount);
-    ++softRefCount;
-}
-
-void
-SharedObject::removeSoftRef() const {
-    --softRefCount;
-    if (umtx_atomic_dec(&totalRefCount) == 0) {
-        delete this;
-    }
-}
 
 int32_t
 SharedObject::getRefCount() const {
-    return umtx_loadAcquire(totalRefCount);
-}
-
-int32_t
-SharedObject::getHardRefCount() const {
     return umtx_loadAcquire(hardRefCount);
 }
 
 void
 SharedObject::deleteIfZeroRefCount() const {
-    if(getRefCount() == 0) {
+    if (this->cachePtr == nullptr && getRefCount() == 0) {
         delete this;
     }
 }
diff --git a/icu4c/source/common/sharedobject.h b/icu4c/source/common/sharedobject.h
index d132651..75c4ec3 100644
--- a/icu4c/source/common/sharedobject.h
+++ b/icu4c/source/common/sharedobject.h
@@ -17,6 +17,8 @@
 
 U_NAMESPACE_BEGIN
 
+class SharedObject;
+
 /**
  * Base class for unified cache exposing enough methods to SharedObject
  * instances to allow their addRef() and removeRef() methods to
@@ -28,22 +30,12 @@
     UnifiedCacheBase() { }
 
     /**
-     * Called by addRefWhileHoldingCacheLock() when the hard reference count
-     * of its instance goes from 0 to 1.
+     * Notify the cache implementation that an object was seen transitioning to
+     * zero hard references. The cache may use this to keep track the number of
+     * unreferenced SharedObjects, and to trigger evictions.
      */
-    virtual void incrementItemsInUse() const = 0;
+    virtual void handleUnreferencedObject() const = 0;
 
-    /**
-     * Called by removeRef() when the hard reference count of its instance
-     * drops from 1 to 0.
-     */
-    virtual void decrementItemsInUseWithLockingAndEviction() const = 0;
-
-    /**
-     * Called by removeRefWhileHoldingCacheLock() when the hard reference
-     * count of its instance drops from 1 to 0.
-     */
-    virtual void decrementItemsInUse() const = 0;
     virtual ~UnifiedCacheBase();
 private:
     UnifiedCacheBase(const UnifiedCacheBase &);
@@ -63,7 +55,6 @@
 public:
     /** Initializes totalRefCount, softRefCount to 0. */
     SharedObject() :
-            totalRefCount(0),
             softRefCount(0),
             hardRefCount(0),
             cachePtr(NULL) {}
@@ -71,7 +62,6 @@
     /** Initializes totalRefCount, softRefCount to 0. */
     SharedObject(const SharedObject &other) :
             UObject(other),
-            totalRefCount(0),
             softRefCount(0),
             hardRefCount(0),
             cachePtr(NULL) {}
@@ -79,93 +69,45 @@
     virtual ~SharedObject();
 
     /**
-     * Increments the number of references to this object. Thread-safe.
+     * Increments the number of hard references to this object. Thread-safe.
+     * Not for use from within the Unified Cache implementation.
      */
-    void addRef() const { addRef(FALSE); }
+    void addRef() const;
 
     /**
-     * Increments the number of references to this object.
-     * Must be called only from within the internals of UnifiedCache and
-     * only while the cache global mutex is held.
+     * Decrements the number of hard references to this object, and
+     * arrange for possible cache-eviction and/or deletion if ref
+     * count goes to zero. Thread-safe.
+     * 
+     * Not for use from within the UnifiedCache implementation.
      */
-    void addRefWhileHoldingCacheLock() const { addRef(TRUE); }
+    void removeRef() const;
 
     /**
-     * Increments the number of soft references to this object.
-     * Must be called only from within the internals of UnifiedCache and
-     * only while the cache global mutex is held.
-     */
-    void addSoftRef() const;
-
-    /**
-     * Decrements the number of references to this object. Thread-safe.
-     */
-    void removeRef() const { removeRef(FALSE); }
-
-    /**
-     * Decrements the number of references to this object.
-     * Must be called only from within the internals of UnifiedCache and
-     * only while the cache global mutex is held.
-     */
-    void removeRefWhileHoldingCacheLock() const { removeRef(TRUE); }
-
-    /**
-     * Decrements the number of soft references to this object.
-     * Must be called only from within the internals of UnifiedCache and
-     * only while the cache global mutex is held.
-     */
-    void removeSoftRef() const;
-
-    /**
-     * Returns the reference counter including soft references.
+     * Returns the number of hard references for this object.
      * Uses a memory barrier.
      */
     int32_t getRefCount() const;
 
     /**
-     * Returns the count of soft references only.
-     * Must be called only from within the internals of UnifiedCache and
-     * only while the cache global mutex is held.
-     */
-    int32_t getSoftRefCount() const { return softRefCount; }
-
-    /**
-     * Returns the count of hard references only. Uses a memory barrier.
-     * Used for testing the cache. Regular clients won't need this.
-     */
-    int32_t getHardRefCount() const;
-
-    /**
      * If noHardReferences() == TRUE then this object has no hard references.
      * Must be called only from within the internals of UnifiedCache.
      */
-    inline UBool noHardReferences() const { return getHardRefCount() == 0; }
+    inline UBool noHardReferences() const { return getRefCount() == 0; }
 
     /**
      * If hasHardReferences() == TRUE then this object has hard references.
      * Must be called only from within the internals of UnifiedCache.
      */
-    inline UBool hasHardReferences() const { return getHardRefCount() != 0; }
+    inline UBool hasHardReferences() const { return getRefCount() != 0; }
 
     /**
-     * If noSoftReferences() == TRUE then this object has no soft references.
-     * Must be called only from within the internals of UnifiedCache and
-     * only while the cache global mutex is held.
-     */
-    UBool noSoftReferences() const { return (softRefCount == 0); }
-
-    /**
-     * Deletes this object if it has no references or soft references.
+     * Deletes this object if it has no references.
+     * Available for non-cached SharedObjects only. Ownership of cached objects
+     * is with the UnifiedCache, which is soley responsible for eviction and deletion.
      */
     void deleteIfZeroRefCount() const;
 
-    /**
-     * @internal For UnifedCache use only to register this object with itself.
-     *   Must be called before this object is exposed to multiple threads.
-     */ 
-    void registerWithCache(const UnifiedCacheBase *ptr) const {
-        cachePtr = ptr;
-    }
         
     /**
      * Returns a writable version of ptr.
@@ -219,15 +161,21 @@
     }
 
 private:
-    mutable u_atomic_int32_t totalRefCount;
-
-    // Any thread modifying softRefCount must hold the global cache mutex
+    /**
+     * The number of references from the UnifiedCache, which is
+     * the number of times that the sharedObject is stored as a hash table value.
+     * For use by UnifiedCache implementation code only.
+     * All access is synchronized by UnifiedCache's gCacheMutex
+     */
     mutable int32_t softRefCount;
+    friend class UnifiedCache;
 
+    /**
+     * Reference count, excluding references from within the UnifiedCache implementation.
+     */
     mutable u_atomic_int32_t hardRefCount;
+    
     mutable const UnifiedCacheBase *cachePtr;
-    void addRef(UBool withCacheLock) const;
-    void removeRef(UBool withCacheLock) const;
 
 };
 
diff --git a/icu4c/source/common/sprpimpl.h b/icu4c/source/common/sprpimpl.h
index 12f18a5..ca0bcdb 100644
--- a/icu4c/source/common/sprpimpl.h
+++ b/icu4c/source/common/sprpimpl.h
@@ -90,7 +90,6 @@
     UTrie sprepTrie;
     const uint16_t* mappingData;
     UDataMemory* sprepData;
-    const UBiDiProps *bdp; /* used only if checkBiDi is set */
     int32_t refCount;
     UBool isDataLoaded;
     UBool doNFKC;
diff --git a/icu4c/source/common/ubidi.cpp b/icu4c/source/common/ubidi.cpp
index 8e2fc36..531ed64 100644
--- a/icu4c/source/common/ubidi.cpp
+++ b/icu4c/source/common/ubidi.cpp
@@ -152,9 +152,6 @@
     /* reset the object, all pointers NULL, all flags FALSE, all sizes 0 */
     uprv_memset(pBiDi, 0, sizeof(UBiDi));
 
-    /* get BiDi properties */
-    pBiDi->bdp=ubidi_getSingleton();
-
     /* allocate memory for arrays as requested */
     if(maxLength>0) {
         if( !getInitialDirPropsMemory(pBiDi, maxLength) ||
@@ -925,7 +922,7 @@
         else
             match=0;
         if(match!=c &&                  /* has a matching char */
-           ubidi_getPairedBracketType(bd->pBiDi->bdp, c)==U_BPT_OPEN) { /* opening bracket */
+           ubidi_getPairedBracketType(c)==U_BPT_OPEN) { /* opening bracket */
             /* special case: process synonyms
                create an opening entry for each synonym */
             if(match==0x232A) {     /* RIGHT-POINTING ANGLE BRACKET */
@@ -3033,7 +3030,7 @@
     if( pBiDi->fnClassCallback == NULL ||
         (dir = (*pBiDi->fnClassCallback)(pBiDi->coClassCallback, c)) == U_BIDI_CLASS_DEFAULT )
     {
-        dir = ubidi_getClass(pBiDi->bdp, c);
+        dir = ubidi_getClass(c);
     }
     if(dir >= U_CHAR_DIRECTION_COUNT) {
         dir = (UCharDirection)ON;
diff --git a/icu4c/source/common/ubidi_props.cpp b/icu4c/source/common/ubidi_props.cpp
index 103e21c..4141c21 100644
--- a/icu4c/source/common/ubidi_props.cpp
+++ b/icu4c/source/common/ubidi_props.cpp
@@ -44,13 +44,6 @@
 #define INCLUDED_FROM_UBIDI_PROPS_C
 #include "ubidi_props_data.h"
 
-/* UBiDiProps singleton ----------------------------------------------------- */
-
-U_CFUNC const UBiDiProps *
-ubidi_getSingleton() {
-    return &ubidi_props_singleton;
-}
-
 /* set of property starts for UnicodeSet ------------------------------------ */
 
 static UBool U_CALLCONV
@@ -64,7 +57,7 @@
 }
 
 U_CFUNC void
-ubidi_addPropertyStarts(const UBiDiProps *bdp, const USetAdder *sa, UErrorCode *pErrorCode) {
+ubidi_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) {
     int32_t i, length;
     UChar32 c, start, limit;
 
@@ -76,19 +69,19 @@
     }
 
     /* add the start code point of each same-value range of the trie */
-    utrie2_enum(&bdp->trie, NULL, _enumPropertyStartsRange, sa);
+    utrie2_enum(&ubidi_props_singleton.trie, NULL, _enumPropertyStartsRange, sa);
 
     /* add the code points from the bidi mirroring table */
-    length=bdp->indexes[UBIDI_IX_MIRROR_LENGTH];
+    length=ubidi_props_singleton.indexes[UBIDI_IX_MIRROR_LENGTH];
     for(i=0; i<length; ++i) {
-        c=UBIDI_GET_MIRROR_CODE_POINT(bdp->mirrors[i]);
+        c=UBIDI_GET_MIRROR_CODE_POINT(ubidi_props_singleton.mirrors[i]);
         sa->addRange(sa->set, c, c+1);
     }
 
     /* add the code points from the Joining_Group array where the value changes */
-    start=bdp->indexes[UBIDI_IX_JG_START];
-    limit=bdp->indexes[UBIDI_IX_JG_LIMIT];
-    jgArray=bdp->jgArray;
+    start=ubidi_props_singleton.indexes[UBIDI_IX_JG_START];
+    limit=ubidi_props_singleton.indexes[UBIDI_IX_JG_LIMIT];
+    jgArray=ubidi_props_singleton.jgArray;
     for(;;) {
         prev=0;
         while(start<limit) {
@@ -103,11 +96,11 @@
             /* add the limit code point if the last value was not 0 (it is now start==limit) */
             sa->add(sa->set, limit);
         }
-        if(limit==bdp->indexes[UBIDI_IX_JG_LIMIT]) {
+        if(limit==ubidi_props_singleton.indexes[UBIDI_IX_JG_LIMIT]) {
             /* switch to the second Joining_Group range */
-            start=bdp->indexes[UBIDI_IX_JG_START2];
-            limit=bdp->indexes[UBIDI_IX_JG_LIMIT2];
-            jgArray=bdp->jgArray2;
+            start=ubidi_props_singleton.indexes[UBIDI_IX_JG_START2];
+            limit=ubidi_props_singleton.indexes[UBIDI_IX_JG_LIMIT2];
+            jgArray=ubidi_props_singleton.jgArray2;
         } else {
             break;
         }
@@ -121,14 +114,8 @@
 /* property access functions ------------------------------------------------ */
 
 U_CFUNC int32_t
-ubidi_getMaxValue(const UBiDiProps *bdp, UProperty which) {
-    int32_t max;
-
-    if(bdp==NULL) {
-        return -1;
-    }
-
-    max=bdp->indexes[UBIDI_MAX_VALUES_INDEX];
+ubidi_getMaxValue(UProperty which) {
+    int32_t max=ubidi_props_singleton.indexes[UBIDI_MAX_VALUES_INDEX];
     switch(which) {
     case UCHAR_BIDI_CLASS:
         return (max&UBIDI_CLASS_MASK);
@@ -144,19 +131,19 @@
 }
 
 U_CAPI UCharDirection
-ubidi_getClass(const UBiDiProps *bdp, UChar32 c) {
-    uint16_t props=UTRIE2_GET16(&bdp->trie, c);
+ubidi_getClass(UChar32 c) {
+    uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c);
     return (UCharDirection)UBIDI_GET_CLASS(props);
 }
 
 U_CFUNC UBool
-ubidi_isMirrored(const UBiDiProps *bdp, UChar32 c) {
-    uint16_t props=UTRIE2_GET16(&bdp->trie, c);
+ubidi_isMirrored(UChar32 c) {
+    uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c);
     return (UBool)UBIDI_GET_FLAG(props, UBIDI_IS_MIRRORED_SHIFT);
 }
 
 static UChar32
-getMirror(const UBiDiProps *bdp, UChar32 c, uint16_t props) {
+getMirror(UChar32 c, uint16_t props) {
     int32_t delta=UBIDI_GET_MIRROR_DELTA(props);
     if(delta!=UBIDI_ESC_MIRROR_DELTA) {
         return c+delta;
@@ -167,8 +154,8 @@
         int32_t i, length;
         UChar32 c2;
 
-        mirrors=bdp->mirrors;
-        length=bdp->indexes[UBIDI_IX_MIRROR_LENGTH];
+        mirrors=ubidi_props_singleton.mirrors;
+        length=ubidi_props_singleton.indexes[UBIDI_IX_MIRROR_LENGTH];
 
         /* linear search */
         for(i=0; i<length; ++i) {
@@ -188,80 +175,80 @@
 }
 
 U_CFUNC UChar32
-ubidi_getMirror(const UBiDiProps *bdp, UChar32 c) {
-    uint16_t props=UTRIE2_GET16(&bdp->trie, c);
-    return getMirror(bdp, c, props);
+ubidi_getMirror(UChar32 c) {
+    uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c);
+    return getMirror(c, props);
 }
 
 U_CFUNC UBool
-ubidi_isBidiControl(const UBiDiProps *bdp, UChar32 c) {
-    uint16_t props=UTRIE2_GET16(&bdp->trie, c);
+ubidi_isBidiControl(UChar32 c) {
+    uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c);
     return (UBool)UBIDI_GET_FLAG(props, UBIDI_BIDI_CONTROL_SHIFT);
 }
 
 U_CFUNC UBool
-ubidi_isJoinControl(const UBiDiProps *bdp, UChar32 c) {
-    uint16_t props=UTRIE2_GET16(&bdp->trie, c);
+ubidi_isJoinControl(UChar32 c) {
+    uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c);
     return (UBool)UBIDI_GET_FLAG(props, UBIDI_JOIN_CONTROL_SHIFT);
 }
 
 U_CFUNC UJoiningType
-ubidi_getJoiningType(const UBiDiProps *bdp, UChar32 c) {
-    uint16_t props=UTRIE2_GET16(&bdp->trie, c);
+ubidi_getJoiningType(UChar32 c) {
+    uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c);
     return (UJoiningType)((props&UBIDI_JT_MASK)>>UBIDI_JT_SHIFT);
 }
 
 U_CFUNC UJoiningGroup
-ubidi_getJoiningGroup(const UBiDiProps *bdp, UChar32 c) {
+ubidi_getJoiningGroup(UChar32 c) {
     UChar32 start, limit;
 
-    start=bdp->indexes[UBIDI_IX_JG_START];
-    limit=bdp->indexes[UBIDI_IX_JG_LIMIT];
+    start=ubidi_props_singleton.indexes[UBIDI_IX_JG_START];
+    limit=ubidi_props_singleton.indexes[UBIDI_IX_JG_LIMIT];
     if(start<=c && c<limit) {
-        return (UJoiningGroup)bdp->jgArray[c-start];
+        return (UJoiningGroup)ubidi_props_singleton.jgArray[c-start];
     }
-    start=bdp->indexes[UBIDI_IX_JG_START2];
-    limit=bdp->indexes[UBIDI_IX_JG_LIMIT2];
+    start=ubidi_props_singleton.indexes[UBIDI_IX_JG_START2];
+    limit=ubidi_props_singleton.indexes[UBIDI_IX_JG_LIMIT2];
     if(start<=c && c<limit) {
-        return (UJoiningGroup)bdp->jgArray2[c-start];
+        return (UJoiningGroup)ubidi_props_singleton.jgArray2[c-start];
     }
     return U_JG_NO_JOINING_GROUP;
 }
 
 U_CFUNC UBidiPairedBracketType
-ubidi_getPairedBracketType(const UBiDiProps *bdp, UChar32 c) {
-    uint16_t props=UTRIE2_GET16(&bdp->trie, c);
+ubidi_getPairedBracketType(UChar32 c) {
+    uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c);
     return (UBidiPairedBracketType)((props&UBIDI_BPT_MASK)>>UBIDI_BPT_SHIFT);
 }
 
 U_CFUNC UChar32
-ubidi_getPairedBracket(const UBiDiProps *bdp, UChar32 c) {
-    uint16_t props=UTRIE2_GET16(&bdp->trie, c);
+ubidi_getPairedBracket(UChar32 c) {
+    uint16_t props=UTRIE2_GET16(&ubidi_props_singleton.trie, c);
     if((props&UBIDI_BPT_MASK)==0) {
         return c;
     } else {
-        return getMirror(bdp, c, props);
+        return getMirror(c, props);
     }
 }
 
 /* public API (see uchar.h) ------------------------------------------------- */
 
 U_CFUNC UCharDirection
-u_charDirection(UChar32 c) {   
-    return ubidi_getClass(&ubidi_props_singleton, c);
+u_charDirection(UChar32 c) {
+    return ubidi_getClass(c);
 }
 
 U_CFUNC UBool
 u_isMirrored(UChar32 c) {
-    return ubidi_isMirrored(&ubidi_props_singleton, c);
+    return ubidi_isMirrored(c);
 }
 
 U_CFUNC UChar32
 u_charMirror(UChar32 c) {
-    return ubidi_getMirror(&ubidi_props_singleton, c);
+    return ubidi_getMirror(c);
 }
 
 U_STABLE UChar32 U_EXPORT2
 u_getBidiPairedBracket(UChar32 c) {
-    return ubidi_getPairedBracket(&ubidi_props_singleton, c);
+    return ubidi_getPairedBracket(c);
 }
diff --git a/icu4c/source/common/ubidi_props.h b/icu4c/source/common/ubidi_props.h
index 69e8853..698ee9c 100644
--- a/icu4c/source/common/ubidi_props.h
+++ b/icu4c/source/common/ubidi_props.h
@@ -31,46 +31,40 @@
 
 /* library API -------------------------------------------------------------- */
 
-struct UBiDiProps;
-typedef struct UBiDiProps UBiDiProps;
-
-U_CFUNC const UBiDiProps *
-ubidi_getSingleton(void);
-
 U_CFUNC void
-ubidi_addPropertyStarts(const UBiDiProps *bdp, const USetAdder *sa, UErrorCode *pErrorCode);
+ubidi_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode);
 
 /* property access functions */
 
 U_CFUNC int32_t
-ubidi_getMaxValue(const UBiDiProps *bdp, UProperty which);
+ubidi_getMaxValue(UProperty which);
 
 U_CAPI UCharDirection
-ubidi_getClass(const UBiDiProps *bdp, UChar32 c);
+ubidi_getClass(UChar32 c);
 
 U_CFUNC UBool
-ubidi_isMirrored(const UBiDiProps *bdp, UChar32 c);
+ubidi_isMirrored(UChar32 c);
 
 U_CFUNC UChar32
-ubidi_getMirror(const UBiDiProps *bdp, UChar32 c);
+ubidi_getMirror(UChar32 c);
 
 U_CFUNC UBool
-ubidi_isBidiControl(const UBiDiProps *bdp, UChar32 c);
+ubidi_isBidiControl(UChar32 c);
 
 U_CFUNC UBool
-ubidi_isJoinControl(const UBiDiProps *bdp, UChar32 c);
+ubidi_isJoinControl(UChar32 c);
 
 U_CFUNC UJoiningType
-ubidi_getJoiningType(const UBiDiProps *bdp, UChar32 c);
+ubidi_getJoiningType(UChar32 c);
 
 U_CFUNC UJoiningGroup
-ubidi_getJoiningGroup(const UBiDiProps *bdp, UChar32 c);
+ubidi_getJoiningGroup(UChar32 c);
 
 U_CFUNC UBidiPairedBracketType
-ubidi_getPairedBracketType(const UBiDiProps *bdp, UChar32 c);
+ubidi_getPairedBracketType(UChar32 c);
 
 U_CFUNC UChar32
-ubidi_getPairedBracket(const UBiDiProps *bdp, UChar32 c);
+ubidi_getPairedBracket(UChar32 c);
 
 /* file definitions --------------------------------------------------------- */
 
diff --git a/icu4c/source/common/ubidiimp.h b/icu4c/source/common/ubidiimp.h
index fd64fac..a5d0727 100644
--- a/icu4c/source/common/ubidiimp.h
+++ b/icu4c/source/common/ubidiimp.h
@@ -254,8 +254,6 @@
      */
     const UBiDi * pParaBiDi;
 
-    const UBiDiProps *bdp;
-
     /* alias pointer to the current text */
     const UChar *text;
 
diff --git a/icu4c/source/common/ucase.cpp b/icu4c/source/common/ucase.cpp
index 6b22f9e..95b27ac 100644
--- a/icu4c/source/common/ucase.cpp
+++ b/icu4c/source/common/ucase.cpp
@@ -77,9 +77,12 @@
 
 /* data access primitives --------------------------------------------------- */
 
-#define GET_EXCEPTIONS(csp, props) ((csp)->exceptions+((props)>>UCASE_EXC_SHIFT))
+U_CFUNC const UTrie2 * U_EXPORT2
+ucase_getTrie() {
+    return &ucase_props_singleton.trie;
+}
 
-#define PROPS_HAS_EXCEPTION(props) ((props)&UCASE_EXCEPTION)
+#define GET_EXCEPTIONS(csp, props) ((csp)->exceptions+((props)>>UCASE_EXC_SHIFT))
 
 /* number of bits in an 8-bit integer value */
 static const uint8_t flagsOffset[256]={
@@ -128,8 +131,8 @@
 U_CAPI UChar32 U_EXPORT2
 ucase_tolower(UChar32 c) {
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
-    if(!PROPS_HAS_EXCEPTION(props)) {
-        if(UCASE_GET_TYPE(props)>=UCASE_UPPER) {
+    if(!UCASE_HAS_EXCEPTION(props)) {
+        if(UCASE_IS_UPPER_OR_TITLE(props)) {
             c+=UCASE_GET_DELTA(props);
         }
     } else {
@@ -145,7 +148,7 @@
 U_CAPI UChar32 U_EXPORT2
 ucase_toupper(UChar32 c) {
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
-    if(!PROPS_HAS_EXCEPTION(props)) {
+    if(!UCASE_HAS_EXCEPTION(props)) {
         if(UCASE_GET_TYPE(props)==UCASE_LOWER) {
             c+=UCASE_GET_DELTA(props);
         }
@@ -162,7 +165,7 @@
 U_CAPI UChar32 U_EXPORT2
 ucase_totitle(UChar32 c) {
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
-    if(!PROPS_HAS_EXCEPTION(props)) {
+    if(!UCASE_HAS_EXCEPTION(props)) {
         if(UCASE_GET_TYPE(props)==UCASE_LOWER) {
             c+=UCASE_GET_DELTA(props);
         }
@@ -223,7 +226,7 @@
     }
 
     props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
-    if(!PROPS_HAS_EXCEPTION(props)) {
+    if(!UCASE_HAS_EXCEPTION(props)) {
         if(UCASE_GET_TYPE(props)!=UCASE_NONE) {
             /* add the one simple case mapping, no matter what type it is */
             int32_t delta=UCASE_GET_DELTA(props);
@@ -419,6 +422,138 @@
     return c;
 }
 
+namespace LatinCase {
+
+const int8_t TO_LOWER_NORMAL[LIMIT] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+    32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, EXC,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    EXC, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
+
+    0, 1, 0, 1, 0, 1, 0, 1, 0, EXC, 1, 0, 1, 0, 1, 0,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    1, 0, 1, 0, 1, 0, 1, 0, -121, 1, 0, 1, 0, 1, 0, EXC
+};
+
+const int8_t TO_LOWER_TR_LT[LIMIT] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 32, 32, 32, 32, 32, 32, 32, 32, EXC, EXC, 32, 32, 32, 32, 32,
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, EXC, EXC, 32, 32,
+    32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, EXC,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    1, 0, 1, 0, 1, 0, 1, 0, EXC, 0, 1, 0, 1, 0, EXC, 0,
+    EXC, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
+
+    0, 1, 0, 1, 0, 1, 0, 1, 0, EXC, 1, 0, 1, 0, 1, 0,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+    1, 0, 1, 0, 1, 0, 1, 0, -121, 1, 0, 1, 0, 1, 0, EXC
+};
+
+const int8_t TO_UPPER_NORMAL[LIMIT] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+    -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EXC,
+    -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+    -32, -32, -32, -32, -32, -32, -32, 0, -32, -32, -32, -32, -32, -32, -32, 121,
+
+    0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+    0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+    0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+    0, EXC, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0,
+
+    -1, 0, -1, 0, -1, 0, -1, 0, -1, EXC, 0, -1, 0, -1, 0, -1,
+    0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+    0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+    0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, EXC
+};
+
+const int8_t TO_UPPER_TR[LIMIT] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, -32, -32, -32, -32, -32, -32, -32, -32, EXC, -32, -32, -32, -32, -32, -32,
+    -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EXC,
+    -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+    -32, -32, -32, -32, -32, -32, -32, 0, -32, -32, -32, -32, -32, -32, -32, 121,
+
+    0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+    0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+    0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+    0, EXC, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0,
+
+    -1, 0, -1, 0, -1, 0, -1, 0, -1, EXC, 0, -1, 0, -1, 0, -1,
+    0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+    0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+    0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, EXC
+};
+
+}  // namespace LatinCase
+
 U_NAMESPACE_END
 
 /** @return UCASE_NONE, UCASE_LOWER, UCASE_UPPER, UCASE_TITLE */
@@ -439,7 +574,7 @@
 static inline int32_t
 getDotType(UChar32 c) {
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
-    if(!PROPS_HAS_EXCEPTION(props)) {
+    if(!UCASE_HAS_EXCEPTION(props)) {
         return props&UCASE_DOT_MASK;
     } else {
         const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props);
@@ -878,8 +1013,8 @@
     U_ASSERT(c >= 0);
     UChar32 result=c;
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
-    if(!PROPS_HAS_EXCEPTION(props)) {
-        if(UCASE_GET_TYPE(props)>=UCASE_UPPER) {
+    if(!UCASE_HAS_EXCEPTION(props)) {
+        if(UCASE_IS_UPPER_OR_TITLE(props)) {
             result=c+UCASE_GET_DELTA(props);
         }
     } else {
@@ -1024,7 +1159,7 @@
     U_ASSERT(c >= 0);
     UChar32 result=c;
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
-    if(!PROPS_HAS_EXCEPTION(props)) {
+    if(!UCASE_HAS_EXCEPTION(props)) {
         if(UCASE_GET_TYPE(props)==UCASE_LOWER) {
             result=c+UCASE_GET_DELTA(props);
         }
@@ -1169,8 +1304,8 @@
 U_CAPI UChar32 U_EXPORT2
 ucase_fold(UChar32 c, uint32_t options) {
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
-    if(!PROPS_HAS_EXCEPTION(props)) {
-        if(UCASE_GET_TYPE(props)>=UCASE_UPPER) {
+    if(!UCASE_HAS_EXCEPTION(props)) {
+        if(UCASE_IS_UPPER_OR_TITLE(props)) {
             c+=UCASE_GET_DELTA(props);
         }
     } else {
@@ -1234,8 +1369,8 @@
     U_ASSERT(c >= 0);
     UChar32 result=c;
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
-    if(!PROPS_HAS_EXCEPTION(props)) {
-        if(UCASE_GET_TYPE(props)>=UCASE_UPPER) {
+    if(!UCASE_HAS_EXCEPTION(props)) {
+        if(UCASE_IS_UPPER_OR_TITLE(props)) {
             result=c+UCASE_GET_DELTA(props);
         }
     } else {
diff --git a/icu4c/source/common/ucase.h b/icu4c/source/common/ucase.h
index 9d6365e..a7a8c9f 100644
--- a/icu4c/source/common/ucase.h
+++ b/icu4c/source/common/ucase.h
@@ -26,6 +26,7 @@
 #include "putilimp.h"
 #include "uset_imp.h"
 #include "udataswp.h"
+#include "utrie2.h"
 
 #ifdef __cplusplus
 U_NAMESPACE_BEGIN
@@ -148,6 +149,33 @@
     int32_t rowCpIndex;
 };
 
+/**
+ * Fast case mapping data for ASCII/Latin.
+ * Linear arrays of delta bytes: 0=no mapping; EXC=exception.
+ * Deltas must not cross the ASCII boundary, or else they cannot be easily used
+ * in simple UTF-8 code.
+ */
+namespace LatinCase {
+
+/** Case mapping/folding data for code points up to U+017F. */
+constexpr UChar LIMIT = 0x180;
+/** U+017F case-folds and uppercases crossing the ASCII boundary. */
+constexpr UChar LONG_S = 0x17f;
+/** Exception: Complex mapping, or too-large delta. */
+constexpr int8_t EXC = -0x80;
+
+/** Deltas for lowercasing for most locales, and default case folding. */
+extern const int8_t TO_LOWER_NORMAL[LIMIT];
+/** Deltas for lowercasing for tr/az/lt, and Turkic case folding. */
+extern const int8_t TO_LOWER_TR_LT[LIMIT];
+
+/** Deltas for uppercasing for most locales. */
+extern const int8_t TO_UPPER_NORMAL[LIMIT];
+/** Deltas for uppercasing for tr/az. */
+extern const int8_t TO_UPPER_TR[LIMIT];
+
+}  // namespace LatinCase
+
 U_NAMESPACE_END
 #endif
 
@@ -308,6 +336,9 @@
 
 /* definitions for 16-bit case properties word ------------------------------ */
 
+U_CFUNC const UTrie2 * U_EXPORT2
+ucase_getTrie();
+
 /* 2-bit constants for types of cased characters */
 #define UCASE_TYPE_MASK     3
 enum {
@@ -320,10 +351,14 @@
 #define UCASE_GET_TYPE(props) ((props)&UCASE_TYPE_MASK)
 #define UCASE_GET_TYPE_AND_IGNORABLE(props) ((props)&7)
 
+#define UCASE_IS_UPPER_OR_TITLE(props) ((props)&2)
+
 #define UCASE_IGNORABLE         4
 #define UCASE_SENSITIVE         8
 #define UCASE_EXCEPTION         0x10
 
+#define UCASE_HAS_EXCEPTION(props) ((props)&UCASE_EXCEPTION)
+
 #define UCASE_DOT_MASK      0x60
 enum {
     UCASE_NO_DOT=0,         /* normal characters with cc=0 */
diff --git a/icu4c/source/common/ucasemap.cpp b/icu4c/source/common/ucasemap.cpp
index 8eec93c..99e30c9 100644
--- a/icu4c/source/common/ucasemap.cpp
+++ b/icu4c/source/common/ucasemap.cpp
@@ -165,9 +165,7 @@
 inline uint8_t getTwoByteLead(UChar32 c) { return (uint8_t)((c >> 6) | 0xc0); }
 inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); }
 
-}  // namespace
-
-static UChar32 U_CALLCONV
+UChar32 U_CALLCONV
 utf8_caseContextIterator(void *context, int8_t dir) {
     UCaseContext *csc=(UCaseContext *)context;
     UChar32 c;
@@ -199,36 +197,227 @@
     return U_SENTINEL;
 }
 
-/*
- * Case-maps [srcStart..srcLimit[ but takes
- * context [0..srcLength[ into account.
+/**
+ * caseLocale >= 0: Lowercases [srcStart..srcLimit[ but takes context [0..srcLength[ into account.
+ * caseLocale < 0: Case-folds [srcStart..srcLimit[.
  */
-static void
-_caseMap(int32_t caseLocale, uint32_t options, UCaseMapFull *map,
-         const uint8_t *src, UCaseContext *csc,
-         int32_t srcStart, int32_t srcLimit,
-         icu::ByteSink &sink, icu::Edits *edits,
-         UErrorCode &errorCode) {
-    /* case mapping loop */
-    int32_t srcIndex=srcStart;
-    while (U_SUCCESS(errorCode) && srcIndex<srcLimit) {
+void toLower(int32_t caseLocale, uint32_t options,
+             const uint8_t *src, UCaseContext *csc, int32_t srcStart, int32_t srcLimit,
+             icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) {
+    const int8_t *latinToLower;
+    if (caseLocale == UCASE_LOC_ROOT ||
+            (caseLocale >= 0 ?
+                !(caseLocale == UCASE_LOC_TURKISH || caseLocale == UCASE_LOC_LITHUANIAN) :
+                (options & _FOLD_CASE_OPTIONS_MASK) == U_FOLD_CASE_DEFAULT)) {
+        latinToLower = LatinCase::TO_LOWER_NORMAL;
+    } else {
+        latinToLower = LatinCase::TO_LOWER_TR_LT;
+    }
+    const UTrie2 *trie = ucase_getTrie();
+    int32_t prev = srcStart;
+    int32_t srcIndex = srcStart;
+    for (;;) {
+        // fast path for simple cases
         int32_t cpStart;
-        csc->cpStart=cpStart=srcIndex;
         UChar32 c;
-        U8_NEXT(src, srcIndex, srcLimit, c);
-        csc->cpLimit=srcIndex;
-        if(c<0) {
-            // Malformed UTF-8.
-            ByteSinkUtil::appendUnchanged(src+cpStart, srcIndex-cpStart,
+        for (;;) {
+            if (U_FAILURE(errorCode) || srcIndex >= srcLimit) {
+                c = U_SENTINEL;
+                break;
+            }
+            uint8_t lead = src[srcIndex++];
+            if (lead <= 0x7f) {
+                int8_t d = latinToLower[lead];
+                if (d == LatinCase::EXC) {
+                    cpStart = srcIndex - 1;
+                    c = lead;
+                    break;
+                }
+                if (d == 0) { continue; }
+                ByteSinkUtil::appendUnchanged(src + prev, srcIndex - 1 - prev,
+                                              sink, options, edits, errorCode);
+                char ascii = (char)(lead + d);
+                sink.Append(&ascii, 1);
+                if (edits != nullptr) {
+                    edits->addReplace(1, 1);
+                }
+                prev = srcIndex;
+                continue;
+            } else if (lead < 0xe3) {
+                uint8_t t;
+                if (0xc2 <= lead && lead <= 0xc5 && srcIndex < srcLimit &&
+                        (t = src[srcIndex] - 0x80) <= 0x3f) {
+                    // U+0080..U+017F
+                    ++srcIndex;
+                    c = ((lead - 0xc0) << 6) | t;
+                    int8_t d = latinToLower[c];
+                    if (d == LatinCase::EXC) {
+                        cpStart = srcIndex - 2;
+                        break;
+                    }
+                    if (d == 0) { continue; }
+                    ByteSinkUtil::appendUnchanged(src + prev, srcIndex - 2 - prev,
+                                                  sink, options, edits, errorCode);
+                    ByteSinkUtil::appendTwoBytes(c + d, sink);
+                    if (edits != nullptr) {
+                        edits->addReplace(2, 2);
+                    }
+                    prev = srcIndex;
+                    continue;
+                }
+            } else if ((lead <= 0xe9 || lead == 0xeb || lead == 0xec) &&
+                    (srcIndex + 2) <= srcLimit &&
+                    U8_IS_TRAIL(src[srcIndex]) && U8_IS_TRAIL(src[srcIndex + 1])) {
+                // most of CJK: no case mappings
+                srcIndex += 2;
+                continue;
+            }
+            cpStart = --srcIndex;
+            U8_NEXT(src, srcIndex, srcLimit, c);
+            if (c < 0) {
+                // ill-formed UTF-8
+                continue;
+            }
+            uint16_t props = UTRIE2_GET16(trie, c);
+            if (UCASE_HAS_EXCEPTION(props)) { break; }
+            int32_t delta;
+            if (!UCASE_IS_UPPER_OR_TITLE(props) || (delta = UCASE_GET_DELTA(props)) == 0) {
+                continue;
+            }
+            ByteSinkUtil::appendUnchanged(src + prev, cpStart - prev,
                                           sink, options, edits, errorCode);
+            ByteSinkUtil::appendCodePoint(srcIndex - cpStart, c + delta, sink, edits);
+            prev = srcIndex;
+        }
+        if (c < 0) {
+            break;
+        }
+        // slow path
+        const UChar *s;
+        if (caseLocale >= 0) {
+            csc->cpStart = cpStart;
+            csc->cpLimit = srcIndex;
+            c = ucase_toFullLower(c, utf8_caseContextIterator, csc, &s, caseLocale);
         } else {
-            const UChar *s;
-            c=map(c, utf8_caseContextIterator, csc, &s, caseLocale);
+            c = ucase_toFullFolding(c, &s, options);
+        }
+        if (c >= 0) {
+            ByteSinkUtil::appendUnchanged(src + prev, cpStart - prev,
+                                          sink, options, edits, errorCode);
             appendResult(srcIndex - cpStart, c, s, sink, options, edits, errorCode);
+            prev = srcIndex;
         }
     }
+    ByteSinkUtil::appendUnchanged(src + prev, srcIndex - prev,
+                                  sink, options, edits, errorCode);
 }
 
+void toUpper(int32_t caseLocale, uint32_t options,
+             const uint8_t *src, UCaseContext *csc, int32_t srcLength,
+             icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) {
+    const int8_t *latinToUpper;
+    if (caseLocale == UCASE_LOC_TURKISH) {
+        latinToUpper = LatinCase::TO_UPPER_TR;
+    } else {
+        latinToUpper = LatinCase::TO_UPPER_NORMAL;
+    }
+    const UTrie2 *trie = ucase_getTrie();
+    int32_t prev = 0;
+    int32_t srcIndex = 0;
+    for (;;) {
+        // fast path for simple cases
+        int32_t cpStart;
+        UChar32 c;
+        for (;;) {
+            if (U_FAILURE(errorCode) || srcIndex >= srcLength) {
+                c = U_SENTINEL;
+                break;
+            }
+            uint8_t lead = src[srcIndex++];
+            if (lead <= 0x7f) {
+                int8_t d = latinToUpper[lead];
+                if (d == LatinCase::EXC) {
+                    cpStart = srcIndex - 1;
+                    c = lead;
+                    break;
+                }
+                if (d == 0) { continue; }
+                ByteSinkUtil::appendUnchanged(src + prev, srcIndex - 1 - prev,
+                                              sink, options, edits, errorCode);
+                char ascii = (char)(lead + d);
+                sink.Append(&ascii, 1);
+                if (edits != nullptr) {
+                    edits->addReplace(1, 1);
+                }
+                prev = srcIndex;
+                continue;
+            } else if (lead < 0xe3) {
+                uint8_t t;
+                if (0xc2 <= lead && lead <= 0xc5 && srcIndex < srcLength &&
+                        (t = src[srcIndex] - 0x80) <= 0x3f) {
+                    // U+0080..U+017F
+                    ++srcIndex;
+                    c = ((lead - 0xc0) << 6) | t;
+                    int8_t d = latinToUpper[c];
+                    if (d == LatinCase::EXC) {
+                        cpStart = srcIndex - 2;
+                        break;
+                    }
+                    if (d == 0) { continue; }
+                    ByteSinkUtil::appendUnchanged(src + prev, srcIndex - 2 - prev,
+                                                  sink, options, edits, errorCode);
+                    ByteSinkUtil::appendTwoBytes(c + d, sink);
+                    if (edits != nullptr) {
+                        edits->addReplace(2, 2);
+                    }
+                    prev = srcIndex;
+                    continue;
+                }
+            } else if ((lead <= 0xe9 || lead == 0xeb || lead == 0xec) &&
+                    (srcIndex + 2) <= srcLength &&
+                    U8_IS_TRAIL(src[srcIndex]) && U8_IS_TRAIL(src[srcIndex + 1])) {
+                // most of CJK: no case mappings
+                srcIndex += 2;
+                continue;
+            }
+            cpStart = --srcIndex;
+            U8_NEXT(src, srcIndex, srcLength, c);
+            if (c < 0) {
+                // ill-formed UTF-8
+                continue;
+            }
+            uint16_t props = UTRIE2_GET16(trie, c);
+            if (UCASE_HAS_EXCEPTION(props)) { break; }
+            int32_t delta;
+            if (UCASE_GET_TYPE(props) != UCASE_LOWER || (delta = UCASE_GET_DELTA(props)) == 0) {
+                continue;
+            }
+            ByteSinkUtil::appendUnchanged(src + prev, cpStart - prev,
+                                          sink, options, edits, errorCode);
+            ByteSinkUtil::appendCodePoint(srcIndex - cpStart, c + delta, sink, edits);
+            prev = srcIndex;
+        }
+        if (c < 0) {
+            break;
+        }
+        // slow path
+        csc->cpStart = cpStart;
+        csc->cpLimit = srcIndex;
+        const UChar *s;
+        c = ucase_toFullUpper(c, utf8_caseContextIterator, csc, &s, caseLocale);
+        if (c >= 0) {
+            ByteSinkUtil::appendUnchanged(src + prev, cpStart - prev,
+                                          sink, options, edits, errorCode);
+            appendResult(srcIndex - cpStart, c, s, sink, options, edits, errorCode);
+            prev = srcIndex;
+        }
+    }
+    ByteSinkUtil::appendUnchanged(src + prev, srcIndex - prev,
+                                  sink, options, edits, errorCode);
+}
+
+}  // namespace
+
 #if !UCONFIG_NO_BREAK_ITERATION
 
 U_CFUNC void U_CALLCONV
@@ -335,10 +524,9 @@
                 if(titleLimit<index) {
                     if((options&U_TITLECASE_NO_LOWERCASE)==0) {
                         /* Normal operation: Lowercase the rest of the word. */
-                        _caseMap(caseLocale, options, ucase_toFullLower,
-                                 src, &csc,
-                                 titleLimit, index,
-                                 sink, edits, errorCode);
+                        toLower(caseLocale, options,
+                                src, &csc, titleLimit, index,
+                                sink, edits, errorCode);
                         if(U_FAILURE(errorCode)) {
                             return;
                         }
@@ -538,8 +726,8 @@
     UCaseContext csc=UCASECONTEXT_INITIALIZER;
     csc.p=(void *)src;
     csc.limit=srcLength;
-    _caseMap(
-        caseLocale, options, ucase_toFullLower,
+    toLower(
+        caseLocale, options,
         src, &csc, 0, srcLength,
         sink, edits, errorCode);
 }
@@ -555,9 +743,9 @@
         UCaseContext csc=UCASECONTEXT_INITIALIZER;
         csc.p=(void *)src;
         csc.limit=srcLength;
-        _caseMap(
-            caseLocale, options, ucase_toFullUpper,
-            src, &csc, 0, srcLength,
+        toUpper(
+            caseLocale, options,
+            src, &csc, srcLength,
             sink, edits, errorCode);
     }
 }
@@ -567,22 +755,10 @@
                           const uint8_t *src, int32_t srcLength,
                           icu::ByteSink &sink, icu::Edits *edits,
                           UErrorCode &errorCode) {
-    /* case mapping loop */
-    int32_t srcIndex = 0;
-    while (U_SUCCESS(errorCode) && srcIndex < srcLength) {
-        int32_t cpStart = srcIndex;
-        UChar32 c;
-        U8_NEXT(src, srcIndex, srcLength, c);
-        if(c<0) {
-            // Malformed UTF-8.
-            ByteSinkUtil::appendUnchanged(src+cpStart, srcIndex-cpStart,
-                                          sink, options, edits, errorCode);
-        } else {
-            const UChar *s;
-            c = ucase_toFullFolding(c, &s, options);
-            appendResult(srcIndex - cpStart, c, s, sink, options, edits, errorCode);
-        }
-    }
+    toLower(
+        -1, options,
+        src, nullptr, 0, srcLength,
+        sink, edits, errorCode);
 }
 
 void
diff --git a/icu4c/source/common/ucasemap_imp.h b/icu4c/source/common/ucasemap_imp.h
index 99a6490..7788fd9 100644
--- a/icu4c/source/common/ucasemap_imp.h
+++ b/icu4c/source/common/ucasemap_imp.h
@@ -60,15 +60,6 @@
                              int32_t *matchLen1, int32_t *matchLen2,
                              UErrorCode *pErrorCode);
 
-/**
- * Are the Unicode properties loaded?
- * This must be used before internal functions are called that do
- * not perform this check.
- * Generate a debug assertion failure if data is not loaded.
- */
-U_CFUNC UBool
-uprv_haveProperties(UErrorCode *pErrorCode);
-
 #ifdef __cplusplus
 
 U_NAMESPACE_BEGIN
diff --git a/icu4c/source/common/uchar.cpp b/icu4c/source/common/uchar.cpp
index a7374b7..1b84a1d 100644
--- a/icu4c/source/common/uchar.cpp
+++ b/icu4c/source/common/uchar.cpp
@@ -42,14 +42,6 @@
 /* getting a uint32_t properties word from the data */
 #define GET_PROPS(c, result) ((result)=UTRIE2_GET16(&propsTrie, c));
 
-U_CFUNC UBool
-uprv_haveProperties(UErrorCode *pErrorCode) {
-    if(U_FAILURE(*pErrorCode)) {
-        return FALSE;
-    }
-    return TRUE;
-}
-
 /* API functions ------------------------------------------------------------ */
 
 /* Gets the Unicode character's general category.*/
diff --git a/icu4c/source/common/ucmndata.cpp b/icu4c/source/common/ucmndata.cpp
index 251c7ba..ba2310b 100644
--- a/icu4c/source/common/ucmndata.cpp
+++ b/icu4c/source/common/ucmndata.cpp
@@ -77,7 +77,11 @@
 typedef struct  {
     uint32_t          count;
     uint32_t          reserved;
-    PointerTOCEntry   entry[2];   /* Actual size is from count. */
+    /**
+     * Variable-length array declared with length 1 to disable bounds checkers.
+     * The actual array length is in the count field.
+     */
+    PointerTOCEntry   entry[1];
 }  PointerTOC;
 
 
diff --git a/icu4c/source/common/ucmndata.h b/icu4c/source/common/ucmndata.h
index cc126d5..c3eba9f 100644
--- a/icu4c/source/common/ucmndata.h
+++ b/icu4c/source/common/ucmndata.h
@@ -52,7 +52,11 @@
 
 typedef struct {
     uint32_t count;
-    UDataOffsetTOCEntry entry[2];    /* Actual size of array is from count. */
+    /**
+     * Variable-length array declared with length 1 to disable bounds checkers.
+     * The actual array length is in the count field.
+     */
+    UDataOffsetTOCEntry entry[1];
 } UDataOffsetTOC;
 
 /**
diff --git a/icu4c/source/common/ucnv2022.cpp b/icu4c/source/common/ucnv2022.cpp
index 6300ae2..5b34696 100644
--- a/icu4c/source/common/ucnv2022.cpp
+++ b/icu4c/source/common/ucnv2022.cpp
@@ -3518,14 +3518,14 @@
     case 'k':
         if(myConverterData->version == 0) {
             if(length == 1) {
-                if((UBool)args->converter->fromUnicodeStatus) {
+                if(args->converter->fromUnicodeStatus) {
                     /* in DBCS mode: switch to SBCS */
                     args->converter->fromUnicodeStatus = 0;
                     *p++ = UCNV_SI;
                 }
                 *p++ = subchar[0];
             } else /* length == 2*/ {
-                if(!(UBool)args->converter->fromUnicodeStatus) {
+                if(!args->converter->fromUnicodeStatus) {
                     /* in SBCS mode: switch to DBCS */
                     args->converter->fromUnicodeStatus = 1;
                     *p++ = UCNV_SO;
diff --git a/icu4c/source/common/ucnv_err.cpp b/icu4c/source/common/ucnv_err.cpp
index 31bb2ac..6b738fa 100644
--- a/icu4c/source/common/ucnv_err.cpp
+++ b/icu4c/source/common/ucnv_err.cpp
@@ -60,11 +60,12 @@
  * To avoid dependency on other code, this list is hard coded here.
  * When an ignorable code point is found and is unmappable, the default callbacks
  * will ignore them.
- * For a list of the default ignorable code points, use this link: http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[%3ADI%3A]&g=
+ * For a list of the default ignorable code points, use this link:
+ * https://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3ADI%3A%5D&abb=on&g=&i=
  *
  * This list should be sync with the one in CharsetCallback.java
  */
-#define IS_DEFAULT_IGNORABLE_CODE_POINT(c) (\
+#define IS_DEFAULT_IGNORABLE_CODE_POINT(c) ( \
     (c == 0x00AD) || \
     (c == 0x034F) || \
     (c == 0x061C) || \
@@ -74,26 +75,15 @@
     (0x180B <= c && c <= 0x180E) || \
     (0x200B <= c && c <= 0x200F) || \
     (0x202A <= c && c <= 0x202E) || \
-    (c == 0x2060) || \
-    (0x2066 <= c && c <= 0x2069) || \
-    (0x2061 <= c && c <= 0x2064) || \
-    (0x206A <= c && c <= 0x206F) || \
+    (0x2060 <= c && c <= 0x206F) || \
     (c == 0x3164) || \
-    (0x0FE00 <= c && c <= 0x0FE0F) || \
-    (c == 0x0FEFF) || \
-    (c == 0x0FFA0) || \
-    (0x01BCA0  <= c && c <= 0x01BCA3) || \
-    (0x01D173 <= c && c <= 0x01D17A) || \
-    (c == 0x0E0001) || \
-    (0x0E0020 <= c && c <= 0x0E007F) || \
-    (0x0E0100 <= c && c <= 0x0E01EF) || \
-    (c == 0x2065) || \
-    (0x0FFF0 <= c && c <= 0x0FFF8) || \
-    (c == 0x0E0000) || \
-    (0x0E0002 <= c && c <= 0x0E001F) || \
-    (0x0E0080 <= c && c <= 0x0E00FF) || \
-    (0x0E01F0 <= c && c <= 0x0E0FFF) \
-    )
+    (0xFE00 <= c && c <= 0xFE0F) || \
+    (c == 0xFEFF) || \
+    (c == 0xFFA0) || \
+    (0xFFF0 <= c && c <= 0xFFF8) || \
+    (0x1BCA0 <= c && c <= 0x1BCA3) || \
+    (0x1D173 <= c && c <= 0x1D17A) || \
+    (0xE0000 <= c && c <= 0xE0FFF))
 
 
 /*Function Pointer STOPS at the ILLEGAL_SEQUENCE */
diff --git a/icu4c/source/common/ucnv_u32.cpp b/icu4c/source/common/ucnv_u32.cpp
index e1b755a..5777117 100644
--- a/icu4c/source/common/ucnv_u32.cpp
+++ b/icu4c/source/common/ucnv_u32.cpp
@@ -55,7 +55,7 @@
     uint32_t ch, i;
 
     /* Restore state of current sequence */
-    if (args->converter->toUnicodeStatus && myTarget < targetLimit) {
+    if (args->converter->toULength > 0 && myTarget < targetLimit) {
         i = args->converter->toULength;       /* restore # of bytes consumed */
         args->converter->toULength = 0;
 
@@ -136,7 +136,7 @@
     int32_t offsetNum = 0;
 
     /* Restore state of current sequence */
-    if (args->converter->toUnicodeStatus && myTarget < targetLimit) {
+    if (args->converter->toULength > 0 && myTarget < targetLimit) {
         i = args->converter->toULength;       /* restore # of bytes consumed */
         args->converter->toULength = 0;
 
@@ -517,7 +517,7 @@
     uint32_t ch, i;
 
     /* Restore state of current sequence */
-    if (args->converter->toUnicodeStatus && myTarget < targetLimit)
+    if (args->converter->toULength > 0 && myTarget < targetLimit)
     {
         i = args->converter->toULength;       /* restore # of bytes consumed */
         args->converter->toULength = 0;
@@ -604,7 +604,7 @@
     int32_t offsetNum = 0;
 
     /* Restore state of current sequence */
-    if (args->converter->toUnicodeStatus && myTarget < targetLimit)
+    if (args->converter->toULength > 0 && myTarget < targetLimit)
     {
         i = args->converter->toULength;       /* restore # of bytes consumed */
         args->converter->toULength = 0;
diff --git a/icu4c/source/common/ucnv_u8.cpp b/icu4c/source/common/ucnv_u8.cpp
index 5d72f8e..7089d94 100644
--- a/icu4c/source/common/ucnv_u8.cpp
+++ b/icu4c/source/common/ucnv_u8.cpp
@@ -76,7 +76,7 @@
     int32_t i, inBytes;
 
     /* Restore size of current sequence */
-    if (cnv->toUnicodeStatus && myTarget < targetLimit)
+    if (cnv->toULength > 0 && myTarget < targetLimit)
     {
         inBytes = cnv->mode;            /* restore # of bytes to consume */
         i = cnv->toULength;             /* restore # of bytes consumed */
@@ -194,7 +194,7 @@
     int32_t i, inBytes;
 
     /* Restore size of current sequence */
-    if (cnv->toUnicodeStatus && myTarget < targetLimit)
+    if (cnv->toULength > 0 && myTarget < targetLimit)
     {
         inBytes = cnv->mode;            /* restore # of bytes to consume */
         i = cnv->toULength;             /* restore # of bytes consumed */
@@ -670,12 +670,13 @@
     targetCapacity=(int32_t)(pFromUArgs->targetLimit-pFromUArgs->target);
 
     /* get the converter state from the UTF-8 UConverter */
-    c=(UChar32)utf8->toUnicodeStatus;
-    if(c!=0) {
+    if(utf8->toULength > 0) {
         toULength=oldToULength=utf8->toULength;
         toULimit=(int8_t)utf8->mode;
+        c=(UChar32)utf8->toUnicodeStatus;
     } else {
         toULength=oldToULength=toULimit=0;
+        c = 0;
     }
 
     count=(int32_t)(sourceLimit-source)+oldToULength;
@@ -695,36 +696,20 @@
         // Use a single counter for source and target, counting the minimum of
         // the source length and the target capacity.
         // Let the standard converter handle edge cases.
-        const uint8_t *limit=sourceLimit;
         if(count>targetCapacity) {
-            limit-=(count-targetCapacity);
             count=targetCapacity;
         }
 
-        // The conversion loop checks count>0 only once per 1/2/3-byte character.
-        // If the buffer ends with a truncated 2- or 3-byte sequence,
+        // The conversion loop checks count>0 only once per character.
+        // If the buffer ends with a truncated sequence,
         // then we reduce the count to stop before that,
         // and collect the remaining bytes after the conversion loop.
-        {
-            // Do not go back into the bytes that will be read for finishing a partial
-            // sequence from the previous buffer.
-            int32_t length=count-toULimit;
-            if(length>0) {
-                uint8_t b1=*(limit-1);
-                if(U8_IS_SINGLE(b1)) {
-                    // common ASCII character
-                } else if(U8_IS_TRAIL(b1) && length>=2) {
-                    uint8_t b2=*(limit-2);
-                    if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) {
-                        // truncated 3-byte sequence
-                        count-=2;
-                    }
-                } else if(0xc2<=b1 && b1<0xf0) {
-                    // truncated 2- or 3-byte sequence
-                    --count;
-                }
-            }
-        }
+
+        // Do not go back into the bytes that will be read for finishing a partial
+        // sequence from the previous buffer.
+        int32_t length=count-toULimit;
+        U8_TRUNCATE_IF_INCOMPLETE(source, 0, length);
+        count=toULimit+length;
     }
 
     if(c!=0) {
@@ -814,7 +799,7 @@
             }
 
             /* copy the legal byte sequence to the target */
-            if(count>=toULength) {
+            {
                 int8_t i;
 
                 for(i=0; i<oldToULength; ++i) {
@@ -825,14 +810,6 @@
                     *target++=*source++;
                 }
                 count-=toULength;
-            } else {
-                // A supplementary character that does not fit into the target.
-                // Let the standard converter handle this.
-                source-=(toULength-oldToULength);
-                pToUArgs->source=(char *)source;
-                pFromUArgs->target=(char *)target;
-                *pErrorCode=U_USING_DEFAULT_WARNING;
-                return;
             }
         }
     }
@@ -856,8 +833,7 @@
                         utf8->toULength=toULength;
                         utf8->mode=toULimit;
                         break;
-                    } else if(!U8_IS_TRAIL(b=*source)) {
-                        /* lead byte in trail byte position */
+                    } else if(!icu::UTF8::isValidTrail(c, b=*source, toULength, toULimit)) {
                         utf8->toULength=toULength;
                         *pErrorCode=U_ILLEGAL_CHAR_FOUND;
                         break;
diff --git a/icu4c/source/common/ucnvlat1.cpp b/icu4c/source/common/ucnvlat1.cpp
index 23e918a..358bc0c 100644
--- a/icu4c/source/common/ucnvlat1.cpp
+++ b/icu4c/source/common/ucnvlat1.cpp
@@ -340,7 +340,11 @@
     targetCapacity=(int32_t)(pFromUArgs->targetLimit-pFromUArgs->target);
 
     /* get the converter state from the UTF-8 UConverter */
-    c=(UChar32)utf8->toUnicodeStatus;
+    if (utf8->toULength > 0) {
+        c=(UChar32)utf8->toUnicodeStatus;
+    } else {
+        c = 0;
+    }
     if(c!=0 && source<sourceLimit) {
         if(targetCapacity==0) {
             *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
@@ -620,7 +624,7 @@
 
     uint8_t c;
 
-    if(pToUArgs->converter->toUnicodeStatus!=0) {
+    if(pToUArgs->converter->toULength > 0) {
         /* no handling of partial UTF-8 characters here, fall back to pivoting */
         *pErrorCode=U_USING_DEFAULT_WARNING;
         return;
diff --git a/icu4c/source/common/ucnvmbcs.cpp b/icu4c/source/common/ucnvmbcs.cpp
index 4b36cc6..2d0c857 100644
--- a/icu4c/source/common/ucnvmbcs.cpp
+++ b/icu4c/source/common/ucnvmbcs.cpp
@@ -5064,12 +5064,13 @@
     hasSupplementary=(UBool)(cnv->sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY);
 
     /* get the converter state from the UTF-8 UConverter */
-    c=(UChar32)utf8->toUnicodeStatus;
-    if(c!=0) {
+    if(utf8->toULength > 0) {
         toULength=oldToULength=utf8->toULength;
         toULimit=(int8_t)utf8->mode;
+        c=(UChar32)utf8->toUnicodeStatus;
     } else {
         toULength=oldToULength=toULimit=0;
+        c = 0;
     }
 
     // The conversion loop checks source<sourceLimit only once per 1/2/3-byte character.
@@ -5359,12 +5360,13 @@
     hasSupplementary=(UBool)(cnv->sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY);
 
     /* get the converter state from the UTF-8 UConverter */
-    c=(UChar32)utf8->toUnicodeStatus;
-    if(c!=0) {
+    if(utf8->toULength > 0) {
         toULength=oldToULength=utf8->toULength;
         toULimit=(int8_t)utf8->mode;
+        c=(UChar32)utf8->toUnicodeStatus;
     } else {
         toULength=oldToULength=toULimit=0;
+        c = 0;
     }
 
     // The conversion loop checks source<sourceLimit only once per 1/2/3-byte character.
diff --git a/icu4c/source/common/ucurr.cpp b/icu4c/source/common/ucurr.cpp
index a772da9..37c3d79 100644
--- a/icu4c/source/common/ucurr.cpp
+++ b/icu4c/source/common/ucurr.cpp
@@ -17,6 +17,7 @@
 #include "unicode/ustring.h"
 #include "unicode/parsepos.h"
 #include "ustr_imp.h"
+#include "charstr.h"
 #include "cmemory.h"
 #include "cstring.h"
 #include "uassert.h"
@@ -28,9 +29,12 @@
 #include "uinvchar.h"
 #include "uresimp.h"
 #include "ulist.h"
+#include "uresimp.h"
 #include "ureslocs.h"
 #include "ulocimp.h"
 
+using namespace icu;
+
 //#define UCURR_DEBUG_EQUIV 1
 #ifdef UCURR_DEBUG_EQUIV
 #include "stdio.h"
@@ -104,6 +108,7 @@
 
 // Tag for localized display names (symbols) of currencies
 static const char CURRENCIES[] = "Currencies";
+static const char CURRENCIES_NARROW[] = "Currencies%narrow";
 static const char CURRENCYPLURALS[] = "CurrencyPlurals";
 
 static const UChar EUR_STR[] = {0x0045,0x0055,0x0052,0};
@@ -698,7 +703,7 @@
     }
 
     int32_t choice = (int32_t) nameStyle;
-    if (choice < 0 || choice > 1) {
+    if (choice < 0 || choice > 2) {
         *ec = U_ILLEGAL_ARGUMENT_ERROR;
         return 0;
     }
@@ -731,15 +736,19 @@
     
     const UChar* s = NULL;
     ec2 = U_ZERO_ERROR;
-    UResourceBundle* rb = ures_open(U_ICUDATA_CURR, loc, &ec2);
+    LocalUResourceBundlePointer rb(ures_open(U_ICUDATA_CURR, loc, &ec2));
 
-    rb = ures_getByKey(rb, CURRENCIES, rb, &ec2);
-
-    // Fetch resource with multi-level resource inheritance fallback
-    rb = ures_getByKeyWithFallback(rb, buf, rb, &ec2);
-
-    s = ures_getStringByIndex(rb, choice, len, &ec2);
-    ures_close(rb);
+    if (nameStyle == UCURR_NARROW_SYMBOL_NAME) {
+        CharString key;
+        key.append(CURRENCIES_NARROW, ec2);
+        key.append("/", ec2);
+        key.append(buf, ec2);
+        s = ures_getStringByKeyWithFallback(rb.getAlias(), key.data(), len, &ec2);
+    } else {
+        ures_getByKey(rb.getAlias(), CURRENCIES, rb.getAlias(), &ec2);
+        ures_getByKeyWithFallback(rb.getAlias(), buf, rb.getAlias(), &ec2);
+        s = ures_getStringByIndex(rb.getAlias(), choice, len, &ec2);
+    }
 
     // If we've succeeded we're done.  Otherwise, try to fallback.
     // If that fails (because we are already at root) then exit.
diff --git a/icu4c/source/common/unicode/brkiter.h b/icu4c/source/common/unicode/brkiter.h
index c64bb71..607f3ec 100644
--- a/icu4c/source/common/unicode/brkiter.h
+++ b/icu4c/source/common/unicode/brkiter.h
@@ -298,15 +298,14 @@
     virtual int32_t next(int32_t n) = 0;
 
    /**
-     * For RuleBasedBreakIterators, return the status tag from the
-     * break rule that determined the most recently
-     * returned break position.
+     * For RuleBasedBreakIterators, return the status tag from the break rule
+     * that determined the boundary at the current iteration position.
      * <p>
      * For break iterator types that do not support a rule status,
      * a default value of 0 is returned.
      * <p>
-     * @return the status from the break rule that determined the most recently
-     *         returned break position.
+     * @return the status from the break rule that determined the boundary at
+     *         the current iteration position.
      * @see RuleBaseBreakIterator::getRuleStatus()
      * @see UWordBreak
      * @stable ICU 52
@@ -315,7 +314,7 @@
 
    /**
     * For RuleBasedBreakIterators, get the status (tag) values from the break rule(s)
-    * that determined the most recently returned break position.
+    * that determined the boundary at the current iteration position.
     * <p>
     * For break iterator types that do not support rule status,
     * no values are returned.
@@ -334,7 +333,7 @@
     *                  normal way, without attempting to store any values.
     * @param status    receives error codes.
     * @return          The number of rule status values from rules that determined
-    *                  the most recent boundary returned by the break iterator.
+    *                  the boundary at the current iteration position.
     *                  In the event of a U_BUFFER_OVERFLOW_ERROR, the return value
     *                  is the total number of status values that were available,
     *                  not the reduced number that were actually returned.
@@ -616,7 +615,7 @@
     virtual BreakIterator &refreshInputText(UText *input, UErrorCode &status) = 0;
 
  private:
-    static BreakIterator* buildInstance(const Locale& loc, const char *type, int32_t kind, UErrorCode& status);
+    static BreakIterator* buildInstance(const Locale& loc, const char *type, UErrorCode& status);
     static BreakIterator* createInstance(const Locale& loc, int32_t kind, UErrorCode& status);
     static BreakIterator* makeInstance(const Locale& loc, int32_t kind, UErrorCode& status);
 
diff --git a/icu4c/source/common/unicode/bytestriebuilder.h b/icu4c/source/common/unicode/bytestriebuilder.h
index a8412d3..97814fc 100644
--- a/icu4c/source/common/unicode/bytestriebuilder.h
+++ b/icu4c/source/common/unicode/bytestriebuilder.h
@@ -154,7 +154,6 @@
         const char *s;
     };
     
-    // don't use #ifndef U_HIDE_INTERNAL_API with private class members or virtual methods.
     virtual Node *createLinearMatchNode(int32_t i, int32_t byteIndex, int32_t length,
                                         Node *nextNode) const;
 
diff --git a/icu4c/source/common/unicode/casemap.h b/icu4c/source/common/unicode/casemap.h
index 4a4917b..4b77256 100644
--- a/icu4c/source/common/unicode/casemap.h
+++ b/icu4c/source/common/unicode/casemap.h
@@ -18,8 +18,6 @@
 
 U_NAMESPACE_BEGIN
 
-#ifndef U_HIDE_DRAFT_API
-
 class BreakIterator;
 class ByteSink;
 class Edits;
@@ -27,7 +25,7 @@
 /**
  * Low-level C++ case mapping functions.
  *
- * @draft ICU 59
+ * @stable ICU 59
  */
 class U_COMMON_API CaseMap U_FINAL : public UMemory {
 public:
@@ -59,7 +57,7 @@
      *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.
      *
      * @see u_strToLower
-     * @draft ICU 59
+     * @stable ICU 59
      */
      static int32_t toLower(
             const char *locale, uint32_t options,
@@ -95,7 +93,7 @@
      *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.
      *
      * @see u_strToUpper
-     * @draft ICU 59
+     * @stable ICU 59
      */
     static int32_t toUpper(
             const char *locale, uint32_t options,
@@ -146,7 +144,7 @@
      *
      * @see u_strToTitle
      * @see ucasemap_toTitle
-     * @draft ICU 59
+     * @stable ICU 59
      */
     static int32_t toTitle(
             const char *locale, uint32_t options, BreakIterator *iter,
@@ -188,7 +186,7 @@
      *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.
      *
      * @see u_strFoldCase
-     * @draft ICU 59
+     * @stable ICU 59
      */
     static int32_t fold(
             uint32_t options,
@@ -196,6 +194,7 @@
             char16_t *dest, int32_t destCapacity, Edits *edits,
             UErrorCode &errorCode);
 
+#ifndef U_HIDE_DRAFT_API
     /**
      * Lowercases a UTF-8 string and optionally records edits.
      * Casing is locale-dependent and context-sensitive.
@@ -318,6 +317,7 @@
             uint32_t options,
             StringPiece src, ByteSink &sink, Edits *edits,
             UErrorCode &errorCode);
+#endif  // U_HIDE_DRAFT_API
 
     /**
      * Lowercases a UTF-8 string and optionally records edits.
@@ -347,7 +347,7 @@
      *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.
      *
      * @see ucasemap_utf8ToLower
-     * @draft ICU 59
+     * @stable ICU 59
      */
     static int32_t utf8ToLower(
             const char *locale, uint32_t options,
@@ -383,7 +383,7 @@
      *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.
      *
      * @see ucasemap_utf8ToUpper
-     * @draft ICU 59
+     * @stable ICU 59
      */
     static int32_t utf8ToUpper(
             const char *locale, uint32_t options,
@@ -433,7 +433,7 @@
      *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.
      *
      * @see ucasemap_utf8ToTitle
-     * @draft ICU 59
+     * @stable ICU 59
      */
     static int32_t utf8ToTitle(
             const char *locale, uint32_t options, BreakIterator *iter,
@@ -475,7 +475,7 @@
      *         the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set.
      *
      * @see ucasemap_utf8FoldCase
-     * @draft ICU 59
+     * @stable ICU 59
      */
     static int32_t utf8Fold(
             uint32_t options,
@@ -489,8 +489,6 @@
     CaseMap &operator=(const CaseMap &other) = delete;
 };
 
-#endif  // U_HIDE_DRAFT_API
-
 U_NAMESPACE_END
 
 #endif  // __CASEMAP_H__
diff --git a/icu4c/source/common/unicode/char16ptr.h b/icu4c/source/common/unicode/char16ptr.h
index fbce177..49d0e02 100644
--- a/icu4c/source/common/unicode/char16ptr.h
+++ b/icu4c/source/common/unicode/char16ptr.h
@@ -30,25 +30,23 @@
 #   define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory")
 #endif
 
-// Do not use #ifndef U_HIDE_DRAFT_API for the following class, it
-// is now used in place of UChar* in several stable C++ methods
 /**
  * char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types.
- * @draft ICU 59
+ * @stable ICU 59
  */
 class U_COMMON_API Char16Ptr U_FINAL {
 public:
     /**
      * Copies the pointer.
      * @param p pointer
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline Char16Ptr(char16_t *p);
 #if !U_CHAR16_IS_TYPEDEF
     /**
      * Converts the pointer to char16_t *.
      * @param p pointer to be converted
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline Char16Ptr(uint16_t *p);
 #endif
@@ -57,32 +55,32 @@
      * Converts the pointer to char16_t *.
      * (Only defined if U_SIZEOF_WCHAR_T==2.)
      * @param p pointer to be converted
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline Char16Ptr(wchar_t *p);
 #endif
     /**
      * nullptr constructor.
      * @param p nullptr
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline Char16Ptr(std::nullptr_t p);
     /**
      * Destructor.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline ~Char16Ptr();
 
     /**
      * Pointer access.
      * @return the wrapped pointer
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline char16_t *get() const;
     /**
      * char16_t pointer access via type conversion (e.g., static_cast).
      * @return the wrapped pointer
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline operator char16_t *() const { return get(); }
 
@@ -137,25 +135,23 @@
 
 #endif
 
-// Do not use #ifndef U_HIDE_DRAFT_API for the following class, it is
-// now used in place of const UChar* in several stable C++ methods
 /**
  * const char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types.
- * @draft ICU 59
+ * @stable ICU 59
  */
 class U_COMMON_API ConstChar16Ptr U_FINAL {
 public:
     /**
      * Copies the pointer.
      * @param p pointer
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline ConstChar16Ptr(const char16_t *p);
 #if !U_CHAR16_IS_TYPEDEF
     /**
      * Converts the pointer to char16_t *.
      * @param p pointer to be converted
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline ConstChar16Ptr(const uint16_t *p);
 #endif
@@ -164,33 +160,33 @@
      * Converts the pointer to char16_t *.
      * (Only defined if U_SIZEOF_WCHAR_T==2.)
      * @param p pointer to be converted
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline ConstChar16Ptr(const wchar_t *p);
 #endif
     /**
      * nullptr constructor.
      * @param p nullptr
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline ConstChar16Ptr(const std::nullptr_t p);
 
     /**
      * Destructor.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline ~ConstChar16Ptr();
 
     /**
      * Pointer access.
      * @return the wrapped pointer
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline const char16_t *get() const;
     /**
      * char16_t pointer access via type conversion (e.g., static_cast).
      * @return the wrapped pointer
-     * @draft ICU 59
+     * @stable ICU 59
      */
     inline operator const char16_t *() const { return get(); }
 
@@ -250,7 +246,7 @@
  * Includes an aliasing barrier if available.
  * @param p pointer
  * @return p as const UChar *
- * @draft ICU 59
+ * @stable ICU 59
  */
 inline const UChar *toUCharPtr(const char16_t *p) {
 #ifdef U_ALIASING_BARRIER
@@ -264,7 +260,7 @@
  * Includes an aliasing barrier if available.
  * @param p pointer
  * @return p as UChar *
- * @draft ICU 59
+ * @stable ICU 59
  */
 inline UChar *toUCharPtr(char16_t *p) {
 #ifdef U_ALIASING_BARRIER
@@ -278,7 +274,7 @@
  * Includes an aliasing barrier if available.
  * @param p pointer
  * @return p as const OldUChar *
- * @draft ICU 59
+ * @stable ICU 59
  */
 inline const OldUChar *toOldUCharPtr(const char16_t *p) {
 #ifdef U_ALIASING_BARRIER
@@ -292,7 +288,7 @@
  * Includes an aliasing barrier if available.
  * @param p pointer
  * @return p as OldUChar *
- * @draft ICU 59
+ * @stable ICU 59
  */
 inline OldUChar *toOldUCharPtr(char16_t *p) {
 #ifdef U_ALIASING_BARRIER
diff --git a/icu4c/source/common/unicode/chariter.h b/icu4c/source/common/unicode/chariter.h
index 7a4e1a2..70d7a24 100644
--- a/icu4c/source/common/unicode/chariter.h
+++ b/icu4c/source/common/unicode/chariter.h
@@ -569,7 +569,7 @@
      * Returns the numeric index in the underlying text-storage
      * object of the character the iterator currently refers to
      * (i.e., the character returned by current()).  
-     * @return the numberic index in the text-storage object of 
+     * @return the numeric index in the text-storage object of 
      * the character the iterator currently refers to
      * @stable ICU 2.0
      */
diff --git a/icu4c/source/common/unicode/dtintrv.h b/icu4c/source/common/unicode/dtintrv.h
index 10b566a..c3f1058 100644
--- a/icu4c/source/common/unicode/dtintrv.h
+++ b/icu4c/source/common/unicode/dtintrv.h
@@ -69,7 +69,7 @@
      * <pre>
      * .   Base* polymorphic_pointer = createPolymorphicObject();
      * .   if (polymorphic_pointer->getDynamicClassID() ==
-     * .       erived::getStaticClassID()) ...
+     * .       derived::getStaticClassID()) ...
      * </pre>
      * @return          The class ID for all objects of this class.
      * @stable ICU 4.0
diff --git a/icu4c/source/common/unicode/edits.h b/icu4c/source/common/unicode/edits.h
index 082c373..5a72574 100644
--- a/icu4c/source/common/unicode/edits.h
+++ b/icu4c/source/common/unicode/edits.h
@@ -17,8 +17,6 @@
 
 U_NAMESPACE_BEGIN
 
-#ifndef U_HIDE_DRAFT_API
-
 /**
  * Records lengths of string edits but not replacement text.
  * Supports replacements, insertions, deletions in linear progression.
@@ -27,13 +25,13 @@
  * An Edits object tracks a separate UErrorCode, but ICU string transformation functions
  * (e.g., case mapping functions) merge any such errors into their API's UErrorCode.
  *
- * @draft ICU 59
+ * @stable ICU 59
  */
 class U_COMMON_API Edits U_FINAL : public UMemory {
 public:
     /**
      * Constructs an empty object.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     Edits() :
             array(stackArray), capacity(STACK_CAPACITY), length(0), delta(0), numChanges(0),
@@ -64,7 +62,7 @@
 
     /**
      * Destructor.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     ~Edits();
 
@@ -88,20 +86,20 @@
 
     /**
      * Resets the data but may not release memory.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     void reset() U_NOEXCEPT;
 
     /**
      * Adds a record for an unchanged segment of text.
      * Normally called from inside ICU string transformation functions, not user code.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     void addUnchanged(int32_t unchangedLength);
     /**
      * Adds a record for a text replacement/insertion/deletion.
      * Normally called from inside ICU string transformation functions, not user code.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     void addReplace(int32_t oldLength, int32_t newLength);
     /**
@@ -112,33 +110,35 @@
      *                  and an error occurred while recording edits.
      *                  Otherwise unchanged.
      * @return TRUE if U_FAILURE(outErrorCode)
-     * @draft ICU 59
+     * @stable ICU 59
      */
     UBool copyErrorTo(UErrorCode &outErrorCode);
 
     /**
      * How much longer is the new text compared with the old text?
      * @return new length minus old length
-     * @draft ICU 59
+     * @stable ICU 59
      */
     int32_t lengthDelta() const { return delta; }
     /**
      * @return TRUE if there are any change edits
-     * @draft ICU 59
+     * @stable ICU 59
      */
     UBool hasChanges() const { return numChanges != 0; }
 
+#ifndef U_HIDE_DRAFT_API
     /**
      * @return the number of change edits
      * @draft ICU 60
      */
     int32_t numberOfChanges() const { return numChanges; }
+#endif  // U_HIDE_DRAFT_API
 
     /**
      * Access to the list of edits.
      * @see getCoarseIterator
      * @see getFineIterator
-     * @draft ICU 59
+     * @stable ICU 59
      */
     struct U_COMMON_API Iterator U_FINAL : public UMemory {
         /**
@@ -152,12 +152,12 @@
                 srcIndex(0), replIndex(0), destIndex(0) {}
         /**
          * Copy constructor.
-         * @draft ICU 59
+         * @stable ICU 59
          */
         Iterator(const Iterator &other) = default;
         /**
          * Assignment operator.
-         * @draft ICU 59
+         * @stable ICU 59
          */
         Iterator &operator=(const Iterator &other) = default;
 
@@ -167,7 +167,7 @@
          *                  or else the function returns immediately. Check for U_FAILURE()
          *                  on output or use with function chaining. (See User Guide for details.)
          * @return TRUE if there is another edit
-         * @draft ICU 59
+         * @stable ICU 59
          */
         UBool next(UErrorCode &errorCode) { return next(onlyChanges_, errorCode); }
 
@@ -188,12 +188,13 @@
          *                  or else the function returns immediately. Check for U_FAILURE()
          *                  on output or use with function chaining. (See User Guide for details.)
          * @return TRUE if the edit for the source index was found
-         * @draft ICU 59
+         * @stable ICU 59
          */
         UBool findSourceIndex(int32_t i, UErrorCode &errorCode) {
             return findIndex(i, TRUE, errorCode) == 0;
         }
 
+#ifndef U_HIDE_DRAFT_API
         /**
          * Finds the edit that contains the destination index.
          * The destination index may be found in a non-change
@@ -264,39 +265,40 @@
          * @draft ICU 60
          */
         int32_t sourceIndexFromDestinationIndex(int32_t i, UErrorCode &errorCode);
+#endif  // U_HIDE_DRAFT_API
 
         /**
          * @return TRUE if this edit replaces oldLength() units with newLength() different ones.
          *         FALSE if oldLength units remain unchanged.
-         * @draft ICU 59
+         * @stable ICU 59
          */
         UBool hasChange() const { return changed; }
         /**
          * @return the number of units in the original string which are replaced or remain unchanged.
-         * @draft ICU 59
+         * @stable ICU 59
          */
         int32_t oldLength() const { return oldLength_; }
         /**
          * @return the number of units in the modified string, if hasChange() is TRUE.
          *         Same as oldLength if hasChange() is FALSE.
-         * @draft ICU 59
+         * @stable ICU 59
          */
         int32_t newLength() const { return newLength_; }
 
         /**
          * @return the current index into the source string
-         * @draft ICU 59
+         * @stable ICU 59
          */
         int32_t sourceIndex() const { return srcIndex; }
         /**
          * @return the current index into the replacement-characters-only string,
          *         not counting unchanged spans
-         * @draft ICU 59
+         * @stable ICU 59
          */
         int32_t replacementIndex() const { return replIndex; }
         /**
          * @return the current index into the full destination string
-         * @draft ICU 59
+         * @stable ICU 59
          */
         int32_t destinationIndex() const { return destIndex; }
 
@@ -331,7 +333,7 @@
      * Returns an Iterator for coarse-grained changes for simple string updates.
      * Skips non-changes.
      * @return an Iterator that merges adjacent changes.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     Iterator getCoarseChangesIterator() const {
         return Iterator(array, length, TRUE, TRUE);
@@ -340,7 +342,7 @@
     /**
      * Returns an Iterator for coarse-grained changes and non-changes for simple string updates.
      * @return an Iterator that merges adjacent changes.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     Iterator getCoarseIterator() const {
         return Iterator(array, length, FALSE, TRUE);
@@ -350,7 +352,7 @@
      * Returns an Iterator for fine-grained changes for modifying styled text.
      * Skips non-changes.
      * @return an Iterator that separates adjacent changes.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     Iterator getFineChangesIterator() const {
         return Iterator(array, length, TRUE, FALSE);
@@ -359,12 +361,13 @@
     /**
      * Returns an Iterator for fine-grained changes and non-changes for modifying styled text.
      * @return an Iterator that separates adjacent changes.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     Iterator getFineIterator() const {
         return Iterator(array, length, FALSE, FALSE);
     }
 
+#ifndef U_HIDE_DRAFT_API
     /**
      * Merges the two input Edits and appends the result to this object.
      *
@@ -393,6 +396,7 @@
      * @draft ICU 60
      */
     Edits &mergeAndAppend(const Edits &ab, const Edits &bc, UErrorCode &errorCode);
+#endif  // U_HIDE_DRAFT_API
 
 private:
     void releaseArray() U_NOEXCEPT;
@@ -415,8 +419,6 @@
     uint16_t stackArray[STACK_CAPACITY];
 };
 
-#endif  // U_HIDE_DRAFT_API
-
 U_NAMESPACE_END
 
 #endif  // __EDITS_H__
diff --git a/icu4c/source/common/unicode/filteredbrk.h b/icu4c/source/common/unicode/filteredbrk.h
index a0319bf..751d1fa 100644
--- a/icu4c/source/common/unicode/filteredbrk.h
+++ b/icu4c/source/common/unicode/filteredbrk.h
@@ -64,9 +64,7 @@
    * @deprecated ICU 60 use createEmptyInstance instead
    * @see createEmptyInstance()
    */
-  static inline FilteredBreakIteratorBuilder *createInstance(UErrorCode &status) {
-    return createEmptyInstance(status);
-  }
+  static FilteredBreakIteratorBuilder *createInstance(UErrorCode &status);
 #endif  /* U_HIDE_DEPRECATED_API */
 
 #ifndef U_HIDE_DRAFT_API
@@ -105,7 +103,6 @@
    */
   virtual UBool unsuppressBreakAfter(const UnicodeString& string, UErrorCode& status) = 0;
 
-#ifndef U_HIDE_DEPRECATED_API
   /**
    * This function has been deprecated in favor of wrapIteratorWithFilter()
    * The behavior is identical.
@@ -116,7 +113,6 @@
    * @see wrapBreakIteratorWithFilter()
    */
   virtual BreakIterator *build(BreakIterator* adoptBreakIterator, UErrorCode& status) = 0;
-#endif  /* U_HIDE_DEPRECATED_API */
 
 #ifndef U_HIDE_DRAFT_API
   /**
diff --git a/icu4c/source/common/unicode/locid.h b/icu4c/source/common/unicode/locid.h
index dd7d068..9ccf471 100644
--- a/icu4c/source/common/unicode/locid.h
+++ b/icu4c/source/common/unicode/locid.h
@@ -353,7 +353,7 @@
      * the default locale ID of the runtime environment.
      *
      * @param newLocale Locale to set to.  If NULL, set to the value obtained
-     *                  from the runtime environement.
+     *                  from the runtime environment.
      * @param success The error code.
      * @system
      * @stable ICU 2.0
@@ -629,7 +629,7 @@
 
     /**
      * Fills in "name" with the name of this locale in a format suitable for user display
-     * in the locale specfied by "displayLocale".  This function uses getDisplayLanguage(),
+     * in the locale specified by "displayLocale".  This function uses getDisplayLanguage(),
      * getDisplayCountry(), and getDisplayVariant() to do its work, and outputs the display
      * name in the format "language (country[,variant])".  For example, if displayLocale is
      * fr_FR, then en_US's display name would be "Anglais (&Eacute;tats-Unis)", and no_NO_NY's
diff --git a/icu4c/source/common/unicode/parseerr.h b/icu4c/source/common/unicode/parseerr.h
index fc1e3f4..c23cc27 100644
--- a/icu4c/source/common/unicode/parseerr.h
+++ b/icu4c/source/common/unicode/parseerr.h
@@ -58,9 +58,9 @@
 typedef struct UParseError {
 
     /**
-     * The line on which the error occured.  If the parser uses this
+     * The line on which the error occurred.  If the parser uses this
      * field, it sets it to the line number of the source text line on
-     * which the error appears, which will be be a value >= 1.  If the
+     * which the error appears, which will be a value >= 1.  If the
      * parse does not support line numbers, the value will be <= 0.
      * @stable ICU 2.0
      */
diff --git a/icu4c/source/common/unicode/platform.h b/icu4c/source/common/unicode/platform.h
index e8a5d60..c63fce6 100644
--- a/icu4c/source/common/unicode/platform.h
+++ b/icu4c/source/common/unicode/platform.h
@@ -482,9 +482,9 @@
     /* Otherwise use the predefined value. */
 #elif !defined(__cplusplus)
 #   define U_CPLUSPLUS_VERSION 0
-#elif __cplusplus >= 201402L
+#elif __cplusplus >= 201402L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)
 #   define U_CPLUSPLUS_VERSION 14
-#elif __cplusplus >= 201103L
+#elif __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
 #   define U_CPLUSPLUS_VERSION 11
 #else
     // C++98 or C++03
@@ -631,13 +631,7 @@
  */
 #ifdef U_CHARSET_IS_UTF8
     /* Use the predefined value. */
-#elif U_PLATFORM == U_PF_ANDROID || U_PLATFORM_IS_DARWIN_BASED
-#   define U_CHARSET_IS_UTF8 1
-#elif U_PLATFORM_IS_LINUX_BASED
-   /*
-    * Google-specific: Set to 1 to match the google3 execution environment's
-    * use of UTF-8, on both Linux server and workstation machines.
-    */
+#elif U_PLATFORM_IS_LINUX_BASED || U_PLATFORM_IS_DARWIN_BASED
 #   define U_CHARSET_IS_UTF8 1
 #else
 #   define U_CHARSET_IS_UTF8 0
@@ -755,8 +749,10 @@
 #else
     /*
      * Notes:
-     * Visual Studio 10 (_MSC_VER>=1600) defines char16_t but
-     * does not support u"abc" string literals.
+     * Visual Studio 2010 (_MSC_VER==1600) defines char16_t as a typedef
+     * and does not support u"abc" string literals.
+     * Visual Studio 2015 (_MSC_VER>=1900) and above adds support for
+     * both char16_t and u"abc" string literals.
      * gcc 4.4 defines the __CHAR16_TYPE__ macro to a usable type but
      * does not support u"abc" string literals.
      * C++11 and C11 require support for UTF-16 literals
diff --git a/icu4c/source/common/unicode/putil.h b/icu4c/source/common/unicode/putil.h
index 406551a..759b136 100644
--- a/icu4c/source/common/unicode/putil.h
+++ b/icu4c/source/common/unicode/putil.h
@@ -38,7 +38,7 @@
 
 /**
  * Platform utilities isolates the platform dependencies of the
- * libarary.  For each platform which this code is ported to, these
+ * library.  For each platform which this code is ported to, these
  * functions may have to be re-implemented.
  */
 
@@ -53,7 +53,7 @@
  * The data directory is determined as follows:
  *    If u_setDataDirectory() has been called, that is it, otherwise
  *    if the ICU_DATA environment variable is set, use that, otherwise
- *    If a data directory was specifed at ICU build time
+ *    If a data directory was specified at ICU build time
  *      <code>
  * \code
  *        #define ICU_DATA_DIR "path" 
@@ -93,7 +93,7 @@
 #ifndef U_HIDE_INTERNAL_API
 /**
   * Return the time zone files override directory, or an empty string if
-  * no directory was specified. Certain time zone resources will be preferrentially
+  * no directory was specified. Certain time zone resources will be preferentially
   * loaded from individual files in this directory.
   *
   * @return the time zone data override directory.
diff --git a/icu4c/source/common/unicode/rbbi.h b/icu4c/source/common/unicode/rbbi.h
index 521e502..f0ac4bc 100644
--- a/icu4c/source/common/unicode/rbbi.h
+++ b/icu4c/source/common/unicode/rbbi.h
@@ -29,7 +29,6 @@
 #include "unicode/udata.h"
 #include "unicode/parseerr.h"
 #include "unicode/schriter.h"
-#include "unicode/uchriter.h"
 
 U_NAMESPACE_BEGIN
 
@@ -58,34 +57,18 @@
      * The UText through which this BreakIterator accesses the text
      * @internal
      */
-    UText  *fText;
+    UText  fText;
 
+#ifndef U_HIDE_INTERNAL_API
+public:
+#endif /* U_HIDE_INTERNAL_API */
     /**
-     *   A character iterator that refers to the same text as the UText, above.
-     *   Only included for compatibility with old API, which was based on CharacterIterators.
-     *   Value may be adopted from outside, or one of fSCharIter or fDCharIter, below.
-     */
-    CharacterIterator  *fCharIter;
-
-    /**
-     *   When the input text is provided by a UnicodeString, this will point to
-     *    a characterIterator that wraps that data.  Needed only for the
-     *    implementation of getText(), a backwards compatibility issue.
-     */
-    StringCharacterIterator *fSCharIter;
-
-    /**
-     *  When the input text is provided by a UText, this
-     *    dummy CharacterIterator over an empty string will
-     *    be returned from getText()
-     */
-    UCharCharacterIterator *fDCharIter;
-
-    /**
-     * The rule data for this BreakIterator instance
+     * The rule data for this BreakIterator instance.
+     * Not for general use; Public only for testing purposes.
      * @internal
      */
     RBBIDataWrapper    *fData;
+private:
 
     /** 
      *  The iteration state - current position, rule status for the current position,
@@ -106,23 +89,10 @@
     int32_t         fRuleStatusIndex;
 
     /**
-      * True when iteration has run off the end, and iterator functions should return UBRK_DONE.
-      */
-    UBool           fDone;
-
-    /**
      *   Cache of previously determined boundary positions.
      */
-  public:    // TODO: debug, return to private.
     class BreakCache;
     BreakCache         *fBreakCache;
-  private:
-    /**
-     * Counter for the number of characters encountered with the "dictionary"
-     *   flag set.
-     * @internal
-     */
-    uint32_t            fDictionaryCharCount;
 
     /**
      *  Cache of boundary positions within a region of text that has been
@@ -150,11 +120,30 @@
     UnhandledEngine     *fUnhandledBreakEngine;
 
     /**
-     *
-     * The type of the break iterator, or -1 if it has not been set.
+     * Counter for the number of characters encountered with the "dictionary"
+     *   flag set.
      * @internal
      */
-    int32_t             fBreakType;
+    uint32_t            fDictionaryCharCount;
+
+    /**
+     *   A character iterator that refers to the same text as the UText, above.
+     *   Only included for compatibility with old API, which was based on CharacterIterators.
+     *   Value may be adopted from outside, or one of fSCharIter or fDCharIter, below.
+     */
+    CharacterIterator  *fCharIter;
+
+    /**
+     *   When the input text is provided by a UnicodeString, this will point to
+     *    a characterIterator that wraps that data.  Needed only for the
+     *    implementation of getText(), a backwards compatibility issue.
+     */
+    StringCharacterIterator fSCharIter;
+
+    /**
+      * True when iteration has run off the end, and iterator functions should return UBRK_DONE.
+      */
+    UBool           fDone;
 
     //=======================================================================
     // constructors
@@ -206,17 +195,17 @@
                              UErrorCode            &status);
 
     /**
-     * Contruct a RuleBasedBreakIterator from a set of precompiled binary rules.
+     * Construct a RuleBasedBreakIterator from a set of precompiled binary rules.
      * Binary rules are obtained from RulesBasedBreakIterator::getBinaryRules().
      * Construction of a break iterator in this way is substantially faster than
-     * constuction from source rules.
+     * construction from source rules.
      *
      * Ownership of the storage containing the compiled rules remains with the
      * caller of this function.  The compiled rules must not be  modified or
      * deleted during the life of the break iterator.
      *
      * The compiled rules are not compatible across different major versions of ICU.
-     * The compiled rules are comaptible only between machines with the same
+     * The compiled rules are compatible only between machines with the same
      * byte ordering (little or big endian) and the same base character set family
      * (ASCII or EBCDIC).
      *
@@ -285,7 +274,7 @@
      * behavior, and iterating over the same text, as this one.
      * Differs from the copy constructor in that it is polymorphic, and
      * will correctly clone (copy) a derived class.
-     * clone() is thread safe.  Multiple threads may simultaeneously
+     * clone() is thread safe.  Multiple threads may simultaneously
      * clone the same source break iterator.
      * @return a newly-constructed RuleBasedBreakIterator
      * @stable ICU 2.0
@@ -450,7 +439,7 @@
     virtual int32_t preceding(int32_t offset);
 
     /**
-     * Returns true if the specfied position is a boundary position.  As a side
+     * Returns true if the specified position is a boundary position.  As a side
      * effect, leaves the iterator pointing to the first boundary position at
      * or after "offset".
      * @param offset the offset to check.
@@ -471,8 +460,8 @@
 
 
     /**
-     * Return the status tag from the break rule that determined the most recently
-     * returned break position.  For break rules that do not specify a
+     * Return the status tag from the break rule that determined the boundary at
+     * the current iteration position.  For break rules that do not specify a
      * status, a default value of 0 is returned.  If more than one break rule
      * would cause a boundary to be located at some position in the text,
      * the numerically largest of the applicable status values is returned.
@@ -489,16 +478,14 @@
      * position from <code>next()</code>, <code>previous()</code>, or
      * any other break iterator functions that returns a boundary position.
      * <p>
+     * Note that <code>getRuleStatus()</code> returns the value corresponding to
+     * <code>current()</code> index even after <code>next()</code> has returned DONE.
+     * <p>
      * When creating custom break rules, one is free to define whatever
      * status values may be convenient for the application.
      * <p>
-     * Note: this function is not thread safe.  It should not have been
-     *       declared const, and the const remains only for compatibility
-     *       reasons.  (The function is logically const, but not bit-wise const).
-     *   TODO: check this. Probably thread safe now.
-     * <p>
-     * @return the status from the break rule that determined the most recently
-     * returned break position.
+     * @return the status from the break rule that determined the boundary
+     * at the current iteration position.
      *
      * @see UWordBreak
      * @stable ICU 2.2
@@ -506,8 +493,8 @@
     virtual int32_t getRuleStatus() const;
 
    /**
-    * Get the status (tag) values from the break rule(s) that determined the most
-    * recently returned break position.
+    * Get the status (tag) values from the break rule(s) that determined the boundary
+    * at the current iteration position.
     * <p>
     * The returned status value(s) are stored into an array provided by the caller.
     * The values are stored in sorted (ascending) order.
@@ -518,10 +505,10 @@
     * @param fillInVec an array to be filled in with the status values.
     * @param capacity  the length of the supplied vector.  A length of zero causes
     *                  the function to return the number of status values, in the
-    *                  normal way, without attemtping to store any values.
+    *                  normal way, without attempting to store any values.
     * @param status    receives error codes.
-    * @return          The number of rule status values from rules that determined
-    *                  the most recent boundary returned by the break iterator.
+    * @return          The number of rule status values from the rules that determined
+    *                  the boundary at the current iteration position.
     *                  In the event of a U_BUFFER_OVERFLOW_ERROR, the return value
     *                  is the total number of status values that were available,
     *                  not the reduced number that were actually returned.
@@ -561,7 +548,7 @@
      *
      * Create a clone (copy) of this break iterator in memory provided
      *  by the caller.  The idea is to increase performance by avoiding
-     *  a storage allocation.  Use of this functoin is NOT RECOMMENDED.
+     *  a storage allocation.  Use of this function is NOT RECOMMENDED.
      *  Performance gains are minimal, and correct buffer management is
      *  tricky.  Use clone() instead.
      *
@@ -574,7 +561,7 @@
      *                     storage for the cloned object.
      *
      * @param status       Error status.  U_SAFECLONE_ALLOCATED_WARNING will be
-     *                     returned if the the provided buffer was too small, and
+     *                     returned if the provided buffer was too small, and
      *                     the clone was therefore put on the heap.
      *
      * @return  Pointer to the clone object.  This may differ from the stackBuffer
@@ -597,7 +584,7 @@
      * The binary data can only be used with the same version of ICU
      *  and on the same platform type (processor endian-ness)
      *
-     * @param length Returns the length of the binary data.  (Out paramter.)
+     * @param length Returns the length of the binary data.  (Out parameter.)
      *
      * @return   A pointer to the binary (compiled) rule data.  The storage
      *           belongs to the RulesBasedBreakIterator object, not the
@@ -646,12 +633,6 @@
     void reset(void);
 
     /**
-      * Set the type of the break iterator.
-      * @internal
-      */
-    void setBreakType(int32_t type);
-
-    /**
       * Common initialization function, used by constructors and bufferClone.
       * @internal
       */
@@ -697,6 +678,13 @@
      *   @internal
      */
      void dumpCache();
+
+    /**
+     * Debugging function only.
+     * @internal
+     */
+    void dumpTables();
+
 #endif  /* U_HIDE_INTERNAL_API */
 };
 
diff --git a/icu4c/source/common/unicode/resbund.h b/icu4c/source/common/unicode/resbund.h
index b522a7a..ad58990 100644
--- a/icu4c/source/common/unicode/resbund.h
+++ b/icu4c/source/common/unicode/resbund.h
@@ -132,7 +132,7 @@
     ResourceBundle(UErrorCode &err);
 
     /**
-     * Standard constructor, onstructs a resource bundle for the locale-specific
+     * Standard constructor, constructs a resource bundle for the locale-specific
      * bundle in the specified package.
      *
      * @param packageName   The packageName and locale together point to an ICU udata object, 
diff --git a/icu4c/source/common/unicode/schriter.h b/icu4c/source/common/unicode/schriter.h
index b1dc939..42f0269 100644
--- a/icu4c/source/common/unicode/schriter.h
+++ b/icu4c/source/common/unicode/schriter.h
@@ -69,7 +69,7 @@
    * Create an iterator over the UnicodeString referred to by "textStr".
    * The UnicodeString object is copied.
    * The iteration range begins with the code unit specified by
-   * "textBegin" and ends with the code unit BEFORE the code unit specfied
+   * "textBegin" and ends with the code unit BEFORE the code unit specified
    * by "textEnd".  The starting position is specified by "textPos".  If
    * "textBegin" and "textEnd" don't form a valid range on "text" (i.e.,
    * textBegin >= textEnd or either is negative or greater than text.size()),
diff --git a/icu4c/source/common/unicode/ubidi.h b/icu4c/source/common/unicode/ubidi.h
index ef21f24..254a5bf 100644
--- a/icu4c/source/common/unicode/ubidi.h
+++ b/icu4c/source/common/unicode/ubidi.h
@@ -692,7 +692,7 @@
       * @stable ICU 3.6 */
     UBIDI_REORDER_DEFAULT = 0,
     /** Logical to Visual algorithm which handles numbers in a way which
-      * mimicks the behavior of Windows XP.
+      * mimics the behavior of Windows XP.
       * @stable ICU 3.6 */
     UBIDI_REORDER_NUMBERS_SPECIAL,
     /** Logical to Visual algorithm grouping numbers with adjacent R characters
@@ -1142,7 +1142,7 @@
 
 /**
  * Perform the Unicode Bidi algorithm. It is defined in the
- * <a href="http://www.unicode.org/unicode/reports/tr9/">Unicode Standard Anned #9</a>,
+ * <a href="http://www.unicode.org/unicode/reports/tr9/">Unicode Standard Annex #9</a>,
  * version 13,
  * also described in The Unicode Standard, Version 4.0 .<p>
  *
diff --git a/icu4c/source/common/unicode/ubrk.h b/icu4c/source/common/unicode/ubrk.h
index 600328c..73c1553 100644
--- a/icu4c/source/common/unicode/ubrk.h
+++ b/icu4c/source/common/unicode/ubrk.h
@@ -268,7 +268,6 @@
                UParseError     *parseErr,
                UErrorCode      *status);
 
-#ifndef U_HIDE_DRAFT_API
 /**
  * Open a new UBreakIterator for locating text boundaries using precompiled binary rules.
  * Opening a UBreakIterator this way is substantially faster than using ubrk_openRules.
@@ -287,15 +286,13 @@
  * @param status      Pointer to UErrorCode to receive any errors.
  * @return            UBreakIterator for the specified rules.
  * @see ubrk_getBinaryRules
- * @draft ICU 59
+ * @stable ICU 59
  */
-U_DRAFT UBreakIterator* U_EXPORT2
+U_STABLE UBreakIterator* U_EXPORT2
 ubrk_openBinaryRules(const uint8_t *binaryRules, int32_t rulesLength,
                      const UChar *  text, int32_t textLength,
                      UErrorCode *   status);
 
-#endif  /* U_HIDE_DRAFT_API */
-
 /**
  * Thread safe cloning operation
  * @param bi iterator to be cloned
@@ -510,7 +507,7 @@
 
 
 /**
-* Returns true if the specfied position is a boundary position.  As a side
+* Returns true if the specified position is a boundary position.  As a side
 * effect, leaves the iterator pointing to the first boundary position at
 * or after "offset".
 * @param bi The break iterator to use.
@@ -544,7 +541,7 @@
  * @param fillInVec an array to be filled in with the status values.
  * @param capacity  the length of the supplied vector.  A length of zero causes
  *                  the function to return the number of status values, in the
- *                  normal way, without attemtping to store any values.
+ *                  normal way, without attempting to store any values.
  * @param status    receives error codes.
  * @return          The number of rule status values from rules that determined
  *                  the most recent boundary returned by the break iterator.
@@ -596,7 +593,6 @@
                        UErrorCode     *status);
 
 
-#ifndef U_HIDE_DRAFT_API
 /**
  * Get a compiled binary version of the rules specifying the behavior of a UBreakIterator.
  * The binary rules may be used with ubrk_openBinaryRules to open a new UBreakIterator
@@ -620,15 +616,13 @@
  *                      otherwise 0. If not preflighting and this is larger than
  *                      rulesCapacity, *status will be set to an error.
  * @see ubrk_openBinaryRules
- * @draft ICU 59
+ * @stable ICU 59
  */
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
 ubrk_getBinaryRules(UBreakIterator *bi,
                     uint8_t *       binaryRules, int32_t rulesCapacity,
                     UErrorCode *    status);
 
-#endif  /* U_HIDE_DRAFT_API */
-
 #endif /* #if !UCONFIG_NO_BREAK_ITERATION */
 
 #endif
diff --git a/icu4c/source/common/unicode/uchar.h b/icu4c/source/common/unicode/uchar.h
index 3613374..4b72ecf 100644
--- a/icu4c/source/common/unicode/uchar.h
+++ b/icu4c/source/common/unicode/uchar.h
@@ -112,11 +112,11 @@
  * Comparison:
  * - u_isUWhiteSpace=UCHAR_WHITE_SPACE: Unicode White_Space property;
  *       most of general categories "Z" (separators) + most whitespace ISO controls
- *       (including no-break spaces, but excluding IS1..IS4 and ZWSP)
+ *       (including no-break spaces, but excluding IS1..IS4)
  * - u_isWhitespace: Java isWhitespace; Z + whitespace ISO controls but excluding no-break spaces
  * - u_isJavaSpaceChar: Java isSpaceChar; just Z (including no-break spaces)
  * - u_isspace: Z + whitespace ISO controls (including no-break spaces)
- * - u_isblank: "horizontal spaces" = TAB + Zs - ZWSP
+ * - u_isblank: "horizontal spaces" = TAB + Zs
  */
 
 /**
@@ -2702,8 +2702,7 @@
  *
  * same as
  *
- * TRUE for U+0009 (TAB) and characters with general category "Zs" (space separators)
- * except Zero Width Space (ZWSP, U+200B).
+ * TRUE for U+0009 (TAB) and characters with general category "Zs" (space separators).
  *
  * Note: There are several ICU whitespace functions; please see the uchar.h
  * file documentation for a detailed comparison.
diff --git a/icu4c/source/common/unicode/uclean.h b/icu4c/source/common/unicode/uclean.h
index 5b0486d..7cef6db 100644
--- a/icu4c/source/common/unicode/uclean.h
+++ b/icu4c/source/common/unicode/uclean.h
@@ -70,7 +70,7 @@
  * This has the effect of restoring ICU to its initial condition, before
  * any of these override functions were installed.  Refer to
  * u_setMemoryFunctions(), u_setMutexFunctions and 
- * utrace_setFunctions().  If ICU is to be reinitialized after after
+ * utrace_setFunctions().  If ICU is to be reinitialized after
  * calling u_cleanup(), these runtime override functions will need to
  * be set up again if they are still required.
  * <p>
@@ -104,7 +104,7 @@
 U_CDECL_BEGIN
 /**
   *  Pointer type for a user supplied memory allocation function.
-  *  @param context user supplied value, obtained from from u_setMemoryFunctions().
+  *  @param context user supplied value, obtained from u_setMemoryFunctions().
   *  @param size    The number of bytes to be allocated
   *  @return        Pointer to the newly allocated memory, or NULL if the allocation failed.
   *  @stable ICU 2.8
@@ -113,7 +113,7 @@
 typedef void *U_CALLCONV UMemAllocFn(const void *context, size_t size);
 /**
   *  Pointer type for a user supplied memory re-allocation function.
-  *  @param context user supplied value, obtained from from u_setMemoryFunctions().
+  *  @param context user supplied value, obtained from u_setMemoryFunctions().
   *  @param size    The number of bytes to be allocated
   *  @return        Pointer to the newly allocated memory, or NULL if the allocation failed.
   *  @stable ICU 2.8
@@ -123,7 +123,7 @@
 /**
   *  Pointer type for a user supplied memory free  function.  Behavior should be
   *  similar the standard C library free().
-  *  @param context user supplied value, obtained from from u_setMemoryFunctions().
+  *  @param context user supplied value, obtained from u_setMemoryFunctions().
   *  @param mem     Pointer to the memory block to be resized
   *  @param size    The new size for the block
   *  @return        Pointer to the resized memory block, or NULL if the resizing failed.
@@ -179,8 +179,8 @@
   *  The user-supplied function will be called by ICU whenever ICU needs to create a
   *  new mutex.  The function implementation should create a mutex, and store a pointer
   *  to something that uniquely identifies the mutex into the UMTX that is supplied
-  *  as a paramter.
-  *  @param context user supplied value, obtained from from u_setMutexFunctions().
+  *  as a parameter.
+  *  @param context user supplied value, obtained from u_setMutexFunctions().
   *  @param mutex   Receives a pointer that identifies the new mutex.
   *                 The mutex init function must set the UMTX to a non-null value.   
   *                 Subsequent calls by ICU to lock, unlock, or destroy a mutex will 
@@ -197,7 +197,7 @@
   *  Function Pointer type for a user supplied mutex functions.
   *  One of the  user-supplied functions with this signature will be called by ICU
   *  whenever ICU needs to lock, unlock, or destroy a mutex.
-  *  @param context user supplied value, obtained from from u_setMutexFunctions().
+  *  @param context user supplied value, obtained from u_setMutexFunctions().
   *  @param mutex   specify the mutex on which to operate.
   *  @deprecated ICU 52. This function is no longer supported.
   *  @system
@@ -229,7 +229,7 @@
 
 /**
   *  Pointer type for a user supplied atomic increment or decrement function.
-  *  @param context user supplied value, obtained from from u_setAtomicIncDecFunctions().
+  *  @param context user supplied value, obtained from u_setAtomicIncDecFunctions().
   *  @param p   Pointer to a 32 bit int to be incremented or decremented
   *  @return    The value of the variable after the inc or dec operation.
   *  @deprecated ICU 52. This function is no longer supported.
diff --git a/icu4c/source/common/unicode/ucnv.h b/icu4c/source/common/unicode/ucnv.h
index 05d0050..53b4c6f 100644
--- a/icu4c/source/common/unicode/ucnv.h
+++ b/icu4c/source/common/unicode/ucnv.h
@@ -207,7 +207,7 @@
 
 /**
  * Function pointer for error callback in the unicode to codepage direction.
- * Called when an error has occured in conversion from unicode, or on open/close of the callback (see reason).
+ * Called when an error has occurred in conversion from unicode, or on open/close of the callback (see reason).
  * @param context Pointer to the callback's private data
  * @param args Information about the conversion in progress
  * @param codeUnits Points to 'length' UChars of the concerned Unicode sequence
@@ -353,7 +353,7 @@
  *          ucnv_getAlias for a complete list that is available.
  *          If this parameter is NULL, the default converter will be used.
  * @param err outgoing error status <TT>U_MEMORY_ALLOCATION_ERROR, U_FILE_ACCESS_ERROR</TT>
- * @return the created Unicode converter object, or <TT>NULL</TT> if an error occured
+ * @return the created Unicode converter object, or <TT>NULL</TT> if an error occurred
  * @see ucnv_openU
  * @see ucnv_openCCSID
  * @see ucnv_getAvailableName
@@ -386,7 +386,7 @@
  * @param err outgoing error status <TT>U_MEMORY_ALLOCATION_ERROR,
  *        U_FILE_ACCESS_ERROR</TT>
  * @return the created Unicode converter object, or <TT>NULL</TT> if an
- *        error occured
+ *        error occurred
  * @see ucnv_open
  * @see ucnv_openCCSID
  * @see ucnv_close
@@ -489,7 +489,7 @@
  * @param packageName name of the package (equivalent to 'path' in udata_open() call)
  * @param converterName name of the data item to be used, without suffix.
  * @param err outgoing error status <TT>U_MEMORY_ALLOCATION_ERROR, U_FILE_ACCESS_ERROR</TT>
- * @return the created Unicode converter object, or <TT>NULL</TT> if an error occured
+ * @return the created Unicode converter object, or <TT>NULL</TT> if an error occurred
  * @see udata_open
  * @see ucnv_open
  * @see ucnv_safeClone
diff --git a/icu4c/source/common/unicode/ucnv_err.h b/icu4c/source/common/unicode/ucnv_err.h
index 2f74754..d234710 100644
--- a/icu4c/source/common/unicode/ucnv_err.h
+++ b/icu4c/source/common/unicode/ucnv_err.h
@@ -119,19 +119,19 @@
 #define UCNV_ESCAPE_JAVA      "J"
 /**
  * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to C (\\uXXXX \\UXXXXXXXX)
- * TO_U_CALLBACK_ESCAPE option to escape the character value accoding to C (\\xXXXX)
+ * TO_U_CALLBACK_ESCAPE option to escape the character value according to C (\\xXXXX)
  * @stable ICU 2.0
  */
 #define UCNV_ESCAPE_C         "C"
 /**
  * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to XML Decimal escape \htmlonly(&amp;#DDDD;)\endhtmlonly
- * TO_U_CALLBACK_ESCAPE context option to escape the character value accoding to XML Decimal escape \htmlonly(&amp;#DDDD;)\endhtmlonly
+ * TO_U_CALLBACK_ESCAPE context option to escape the character value according to XML Decimal escape \htmlonly(&amp;#DDDD;)\endhtmlonly
  * @stable ICU 2.0
  */
 #define UCNV_ESCAPE_XML_DEC   "D"
 /**
  * FROM_U_CALLBACK_ESCAPE context option to escape the code unit according to XML Hex escape \htmlonly(&amp;#xXXXX;)\endhtmlonly
- * TO_U_CALLBACK_ESCAPE context option to escape the character value accoding to XML Hex escape \htmlonly(&amp;#xXXXX;)\endhtmlonly
+ * TO_U_CALLBACK_ESCAPE context option to escape the character value according to XML Hex escape \htmlonly(&amp;#xXXXX;)\endhtmlonly
  * @stable ICU 2.0
  */
 #define UCNV_ESCAPE_XML_HEX   "X"
@@ -171,7 +171,7 @@
                              code points.
                              The error code U_INVALID_CHAR_FOUND will be set. */
     UCNV_RESET = 3,       /**< The callback is called with this reason when a
-                             'reset' has occured. Callback should reset all
+                             'reset' has occurred. Callback should reset all
                              state. */
     UCNV_CLOSE = 4,        /**< Called when the converter is closed. The
                              callback should release any allocated memory.*/
@@ -199,7 +199,7 @@
     const UChar *sourceLimit;   /**< Pointer to the limit (end + 1) of source buffer. @stable ICU 2.0    */
     char *target;               /**< Pointer to the target buffer. @stable ICU 2.0    */
     const char *targetLimit;    /**< Pointer to the limit (end + 1) of target buffer. @stable ICU 2.0     */
-    int32_t *offsets;           /**< Pointer to the buffer that recieves the offsets. *offset = blah ; offset++;. @stable ICU 2.0  */
+    int32_t *offsets;           /**< Pointer to the buffer that receives the offsets. *offset = blah ; offset++;. @stable ICU 2.0  */
 } UConverterFromUnicodeArgs;
 
 
@@ -215,7 +215,7 @@
     const char *sourceLimit;    /**< Pointer to the limit (end + 1) of source buffer. @stable ICU 2.0    */
     UChar *target;              /**< Pointer to the target buffer. @stable ICU 2.0    */
     const UChar *targetLimit;   /**< Pointer to the limit (end + 1) of target buffer. @stable ICU 2.0     */
-    int32_t *offsets;           /**< Pointer to the buffer that recieves the offsets. *offset = blah ; offset++;. @stable ICU 2.0  */
+    int32_t *offsets;           /**< Pointer to the buffer that receives the offsets. *offset = blah ; offset++;. @stable ICU 2.0  */
 } UConverterToUnicodeArgs;
 
 
diff --git a/icu4c/source/common/unicode/ucurr.h b/icu4c/source/common/unicode/ucurr.h
index 1abb3b2..192bc29 100644
--- a/icu4c/source/common/unicode/ucurr.h
+++ b/icu4c/source/common/unicode/ucurr.h
@@ -103,6 +103,19 @@
      * @stable ICU 2.6
      */
     UCURR_LONG_NAME
+
+#ifndef U_HIDE_DRAFT_API
+    ,
+    /**
+     * Selector for getName() indicating the narrow currency symbol.
+     * The narrow currency symbol is similar to the regular currency
+     * symbol, but it always takes the shortest form: for example,
+     * "$" instead of "US$" for USD in en-CA.
+     *
+     * @draft ICU 61
+     */
+    UCURR_NARROW_SYMBOL_NAME
+#endif  // U_HIDE_DRAFT_API
 } UCurrNameStyle;
 
 #if !UCONFIG_NO_SERVICE
diff --git a/icu4c/source/common/unicode/umachine.h b/icu4c/source/common/unicode/umachine.h
index 3ba9161..2bcaaf4 100644
--- a/icu4c/source/common/unicode/umachine.h
+++ b/icu4c/source/common/unicode/umachine.h
@@ -299,6 +299,10 @@
 // for AIX, uchar.h needs to be included
 # include <uchar.h>
 # define U_CHAR16_IS_TYPEDEF 1
+#elif defined(_MSC_VER) && (_MSC_VER < 1900)
+// Versions of Visual Studio/MSVC below 2015 do not support char16_t as a real type,
+// and instead use a typedef.  https://msdn.microsoft.com/library/bb531344.aspx
+# define U_CHAR16_IS_TYPEDEF 1
 #else
 # define U_CHAR16_IS_TYPEDEF 0
 #endif
@@ -366,7 +370,7 @@
  * Exception: ICU 58 UChar was defined to UCHAR_TYPE if that macro was defined.
  * The current UChar responds to UCHAR_TYPE but OldUChar does not.
  *
- * @draft ICU 59
+ * @stable ICU 59
  */
 #if U_SIZEOF_WCHAR_T==2
     typedef wchar_t OldUChar;
diff --git a/icu4c/source/common/unicode/uniset.h b/icu4c/source/common/unicode/uniset.h
index 4a4ce19..ed9a3eb 100644
--- a/icu4c/source/common/unicode/uniset.h
+++ b/icu4c/source/common/unicode/uniset.h
@@ -1521,6 +1521,7 @@
                       UnicodeString& rebuiltPat,
                       uint32_t options,
                       UnicodeSet& (UnicodeSet::*caseClosure)(int32_t attribute),
+                      int32_t depth,
                       UErrorCode& ec);
 
     //----------------------------------------------------------------
diff --git a/icu4c/source/common/unicode/unistr.h b/icu4c/source/common/unicode/unistr.h
index b99a686..d0b2717 100644
--- a/icu4c/source/common/unicode/unistr.h
+++ b/icu4c/source/common/unicode/unistr.h
@@ -2995,10 +2995,6 @@
    */
   UNISTR_FROM_STRING_EXPLICIT UnicodeString(const char16_t *text);
 
-  /*
-   * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor,
-   * it should always be available regardless of U_HIDE_DRAFT_API status
-   */
 #if !U_CHAR16_IS_TYPEDEF
   /**
    * uint16_t * constructor.
@@ -3008,16 +3004,12 @@
    * <code>-DUNISTR_FROM_STRING_EXPLICIT=explicit</code>
    * on the compiler command line or similar.
    * @param text NUL-terminated UTF-16 string
-   * @draft ICU 59
+   * @stable ICU 59
    */
   UNISTR_FROM_STRING_EXPLICIT UnicodeString(const uint16_t *text) :
       UnicodeString(ConstChar16Ptr(text)) {}
 #endif
 
-  /*
-   * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor,
-   * it should always be available regardless of U_HIDE_DRAFT_API status
-   */
 #if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN)
   /**
    * wchar_t * constructor.
@@ -3028,16 +3020,12 @@
    * <code>-DUNISTR_FROM_STRING_EXPLICIT=explicit</code>
    * on the compiler command line or similar.
    * @param text NUL-terminated UTF-16 string
-   * @draft ICU 59
+   * @stable ICU 59
    */
   UNISTR_FROM_STRING_EXPLICIT UnicodeString(const wchar_t *text) :
       UnicodeString(ConstChar16Ptr(text)) {}
 #endif
 
-  /*
-   * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor,
-   * it should always be available regardless of U_HIDE_DRAFT_API status
-   */
   /**
    * nullptr_t constructor.
    * Effectively the same as the default constructor, makes an empty string object.
@@ -3046,7 +3034,7 @@
    * <code>-DUNISTR_FROM_STRING_EXPLICIT=explicit</code>
    * on the compiler command line or similar.
    * @param text nullptr
-   * @draft ICU 59
+   * @stable ICU 59
    */
   UNISTR_FROM_STRING_EXPLICIT inline UnicodeString(const std::nullptr_t text);
 
@@ -3060,26 +3048,18 @@
   UnicodeString(const char16_t *text,
         int32_t textLength);
 
-  /*
-   * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor,
-   * it should always be available regardless of U_HIDE_DRAFT_API status
-   */
 #if !U_CHAR16_IS_TYPEDEF
   /**
    * uint16_t * constructor.
    * Delegates to UnicodeString(const char16_t *, int32_t).
    * @param text UTF-16 string
    * @param length string length
-   * @draft ICU 59
+   * @stable ICU 59
    */
   UnicodeString(const uint16_t *text, int32_t length) :
       UnicodeString(ConstChar16Ptr(text), length) {}
 #endif
 
-  /*
-   * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor,
-   * it should always be available regardless of U_HIDE_DRAFT_API status
-   */
 #if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN)
   /**
    * wchar_t * constructor.
@@ -3087,22 +3067,18 @@
    * Delegates to UnicodeString(const char16_t *, int32_t).
    * @param text NUL-terminated UTF-16 string
    * @param length string length
-   * @draft ICU 59
+   * @stable ICU 59
    */
   UnicodeString(const wchar_t *text, int32_t length) :
       UnicodeString(ConstChar16Ptr(text), length) {}
 #endif
 
-  /*
-   * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor,
-   * it should always be available regardless of U_HIDE_DRAFT_API status
-   */
   /**
    * nullptr_t constructor.
    * Effectively the same as the default constructor, makes an empty string object.
    * @param text nullptr
    * @param length ignored
-   * @draft ICU 59
+   * @stable ICU 59
    */
   inline UnicodeString(const std::nullptr_t text, int32_t length);
 
@@ -3152,10 +3128,6 @@
    */
   UnicodeString(char16_t *buffer, int32_t buffLength, int32_t buffCapacity);
 
-  /*
-   * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor,
-   * it should always be available regardless of U_HIDE_DRAFT_API status
-   */
 #if !U_CHAR16_IS_TYPEDEF
   /**
    * Writable-aliasing uint16_t * constructor.
@@ -3163,16 +3135,12 @@
    * @param buffer writable buffer of/for UTF-16 text
    * @param buffLength length of the current buffer contents
    * @param buffCapacity buffer capacity
-   * @draft ICU 59
+   * @stable ICU 59
    */
   UnicodeString(uint16_t *buffer, int32_t buffLength, int32_t buffCapacity) :
       UnicodeString(Char16Ptr(buffer), buffLength, buffCapacity) {}
 #endif
 
-  /*
-   * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor,
-   * it should always be available regardless of U_HIDE_DRAFT_API status
-   */
 #if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN)
   /**
    * Writable-aliasing wchar_t * constructor.
@@ -3181,23 +3149,19 @@
    * @param buffer writable buffer of/for UTF-16 text
    * @param buffLength length of the current buffer contents
    * @param buffCapacity buffer capacity
-   * @draft ICU 59
+   * @stable ICU 59
    */
   UnicodeString(wchar_t *buffer, int32_t buffLength, int32_t buffCapacity) :
       UnicodeString(Char16Ptr(buffer), buffLength, buffCapacity) {}
 #endif
 
-  /*
-   * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor,
-   * it should always be available regardless of U_HIDE_DRAFT_API status
-   */
   /**
    * Writable-aliasing nullptr_t constructor.
    * Effectively the same as the default constructor, makes an empty string object.
    * @param buffer nullptr
    * @param buffLength ignored
    * @param buffCapacity ignored
-   * @draft ICU 59
+   * @stable ICU 59
    */
   inline UnicodeString(std::nullptr_t buffer, int32_t buffLength, int32_t buffCapacity);
 
diff --git a/icu4c/source/common/unicode/urename.h b/icu4c/source/common/unicode/urename.h
index 982655c..d8ab850 100644
--- a/icu4c/source/common/unicode/urename.h
+++ b/icu4c/source/common/unicode/urename.h
@@ -107,7 +107,6 @@
 #define _UTF7Data U_ICU_ENTRY_POINT_RENAME(_UTF7Data)
 #define _UTF8Data U_ICU_ENTRY_POINT_RENAME(_UTF8Data)
 #define allowedHourFormatsCleanup U_ICU_ENTRY_POINT_RENAME(allowedHourFormatsCleanup)
-#define checkImpl U_ICU_ENTRY_POINT_RENAME(checkImpl)
 #define cmemory_cleanup U_ICU_ENTRY_POINT_RENAME(cmemory_cleanup)
 #define dayPeriodRulesCleanup U_ICU_ENTRY_POINT_RENAME(dayPeriodRulesCleanup)
 #define deleteAllowedHourFormats U_ICU_ENTRY_POINT_RENAME(deleteAllowedHourFormats)
@@ -446,7 +445,6 @@
 #define ubidi_getReorderingOptions U_ICU_ENTRY_POINT_RENAME(ubidi_getReorderingOptions)
 #define ubidi_getResultLength U_ICU_ENTRY_POINT_RENAME(ubidi_getResultLength)
 #define ubidi_getRuns U_ICU_ENTRY_POINT_RENAME(ubidi_getRuns)
-#define ubidi_getSingleton U_ICU_ENTRY_POINT_RENAME(ubidi_getSingleton)
 #define ubidi_getText U_ICU_ENTRY_POINT_RENAME(ubidi_getText)
 #define ubidi_getVisualIndex U_ICU_ENTRY_POINT_RENAME(ubidi_getVisualIndex)
 #define ubidi_getVisualMap U_ICU_ENTRY_POINT_RENAME(ubidi_getVisualMap)
@@ -551,6 +549,7 @@
 #define ucase_addStringCaseClosure U_ICU_ENTRY_POINT_RENAME(ucase_addStringCaseClosure)
 #define ucase_fold U_ICU_ENTRY_POINT_RENAME(ucase_fold)
 #define ucase_getCaseLocale U_ICU_ENTRY_POINT_RENAME(ucase_getCaseLocale)
+#define ucase_getTrie U_ICU_ENTRY_POINT_RENAME(ucase_getTrie)
 #define ucase_getType U_ICU_ENTRY_POINT_RENAME(ucase_getType)
 #define ucase_getTypeOrIgnorable U_ICU_ENTRY_POINT_RENAME(ucase_getTypeOrIgnorable)
 #define ucase_hasBinaryProperty U_ICU_ENTRY_POINT_RENAME(ucase_hasBinaryProperty)
@@ -862,6 +861,7 @@
 #define udatpg_getBestPatternWithOptions U_ICU_ENTRY_POINT_RENAME(udatpg_getBestPatternWithOptions)
 #define udatpg_getDateTimeFormat U_ICU_ENTRY_POINT_RENAME(udatpg_getDateTimeFormat)
 #define udatpg_getDecimal U_ICU_ENTRY_POINT_RENAME(udatpg_getDecimal)
+#define udatpg_getFieldDisplayName U_ICU_ENTRY_POINT_RENAME(udatpg_getFieldDisplayName)
 #define udatpg_getPatternForSkeleton U_ICU_ENTRY_POINT_RENAME(udatpg_getPatternForSkeleton)
 #define udatpg_getSkeleton U_ICU_ENTRY_POINT_RENAME(udatpg_getSkeleton)
 #define udatpg_open U_ICU_ENTRY_POINT_RENAME(udatpg_open)
@@ -1326,7 +1326,6 @@
 #define uprv_getRawUTCtime U_ICU_ENTRY_POINT_RENAME(uprv_getRawUTCtime)
 #define uprv_getStaticCurrencyName U_ICU_ENTRY_POINT_RENAME(uprv_getStaticCurrencyName)
 #define uprv_getUTCtime U_ICU_ENTRY_POINT_RENAME(uprv_getUTCtime)
-#define uprv_haveProperties U_ICU_ENTRY_POINT_RENAME(uprv_haveProperties)
 #define uprv_int32Comparator U_ICU_ENTRY_POINT_RENAME(uprv_int32Comparator)
 #define uprv_isASCIILetter U_ICU_ENTRY_POINT_RENAME(uprv_isASCIILetter)
 #define uprv_isInfinite U_ICU_ENTRY_POINT_RENAME(uprv_isInfinite)
diff --git a/icu4c/source/common/unicode/ures.h b/icu4c/source/common/unicode/ures.h
index 918b9f2..af0ce76 100644
--- a/icu4c/source/common/unicode/ures.h
+++ b/icu4c/source/common/unicode/ures.h
@@ -16,7 +16,7 @@
 *   04/04/99    helena      Fixed internal header inclusion.
 *   04/15/99    Madhu       Updated Javadoc
 *   06/14/99    stephen     Removed functions taking a filename suffix.
-*   07/20/99    stephen     Language-independent ypedef to void*
+*   07/20/99    stephen     Language-independent typedef to void*
 *   11/09/99    weiv        Added ures_getLocale()
 *   06/24/02    weiv        Added support for resource sharing
 ******************************************************************************
@@ -138,7 +138,7 @@
 /**
  * Opens a UResourceBundle, from which users can extract strings by using
  * their corresponding keys.
- * Note that the caller is responsible of calling <TT>ures_close</TT> on each succesfully
+ * Note that the caller is responsible of calling <TT>ures_close</TT> on each successfully
  * opened resource bundle.
  * @param packageName   The packageName and locale together point to an ICU udata object,
  *                      as defined by <code> udata_open( packageName, "res", locale, err) </code>
@@ -301,7 +301,7 @@
  * you to query for the real locale of the resource. For example, if you requested
  * "en_US_CALIFORNIA" and only "en_US" bundle exists, "en_US" will be returned.
  * For subresources, the locale where this resource comes from will be returned.
- * If fallback has occured, getLocale will reflect this.
+ * If fallback has occurred, getLocale will reflect this.
  *
  * @param resourceBundle resource bundle in question
  * @param status just for catching illegal arguments
@@ -580,7 +580,7 @@
  * @param fillIn            if NULL a new UResourceBundle struct is allocated and must be closed by the caller.
  *                          Alternatively, you can supply a struct to be filled by this function.
  * @param status            fills in the outgoing error code. You may still get a non NULL result even if an
- *                          error occured. Check status instead.
+ *                          error occurred. Check status instead.
  * @return                  a pointer to a UResourceBundle struct. If fill in param was NULL, caller must close it
  * @stable ICU 2.0
  */
@@ -596,7 +596,7 @@
  * @param resourceBundle    a resource
  * @param len               fill in length of the string
  * @param key               fill in for key associated with this string. NULL if no key
- * @param status            fills in the outgoing error code. If an error occured, we may return NULL, but don't
+ * @param status            fills in the outgoing error code. If an error occurred, we may return NULL, but don't
  *                          count on it. Check status instead!
  * @return a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file.
  * @stable ICU 2.0
@@ -615,7 +615,7 @@
  * @param fillIn            if NULL a new UResourceBundle struct is allocated and must be closed by the caller.
  *                          Alternatively, you can supply a struct to be filled by this function.
  * @param status            fills in the outgoing error code. Don't count on NULL being returned if an error has
- *                          occured. Check status instead.
+ *                          occurred. Check status instead.
  * @return                  a pointer to a UResourceBundle struct. If fill in param was NULL, caller must close it
  * @stable ICU 2.0
  */
@@ -631,7 +631,7 @@
  * @param resourceBundle    a resource
  * @param indexS            an index to the wanted string.
  * @param len               fill in length of the string
- * @param status            fills in the outgoing error code. If an error occured, we may return NULL, but don't
+ * @param status            fills in the outgoing error code. If an error occurred, we may return NULL, but don't
  *                          count on it. Check status instead!
  * @return                  a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file.
  * @stable ICU 2.0
@@ -722,7 +722,7 @@
  * @param resB              a resource
  * @param key               a key associated with the wanted string
  * @param len               fill in length of the string
- * @param status            fills in the outgoing error code. If an error occured, we may return NULL, but don't
+ * @param status            fills in the outgoing error code. If an error occurred, we may return NULL, but don't
  *                          count on it. Check status instead!
  * @return                  a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file.
  * @stable ICU 2.0
diff --git a/icu4c/source/common/unicode/uscript.h b/icu4c/source/common/unicode/uscript.h
index 3ec235d..0befa1c 100644
--- a/icu4c/source/common/unicode/uscript.h
+++ b/icu4c/source/common/unicode/uscript.h
@@ -476,7 +476,7 @@
  * @param nameOrAbbrOrLocale name of the script, as given in
  * PropertyValueAliases.txt, or ISO 15924 code or locale
  * @param fillIn the UScriptCode buffer to fill in the script code
- * @param capacity the capacity (size) fo UScriptCode buffer passed in.
+ * @param capacity the capacity (size) of UScriptCode buffer passed in.
  * @param err the error status code.
  * @return The number of script codes filled in the buffer passed in
  * @stable ICU 2.4
diff --git a/icu4c/source/common/unicode/ushape.h b/icu4c/source/common/unicode/ushape.h
index c64fe22..78b4d02 100644
--- a/icu4c/source/common/unicode/ushape.h
+++ b/icu4c/source/common/unicode/ushape.h
@@ -93,7 +93,7 @@
  *        which must not indicate a failure before the function call.
  *
  * @return The number of UChars written to the destination buffer.
- *         If an error occured, then no output was written, or it may be
+ *         If an error occurred, then no output was written, or it may be
  *         incomplete. If <code>U_BUFFER_OVERFLOW_ERROR</code> is set, then
  *         the return value indicates the necessary destination buffer size.
  * @stable ICU 2.0
diff --git a/icu4c/source/common/unicode/usprep.h b/icu4c/source/common/unicode/usprep.h
index da0848d..914eb84 100644
--- a/icu4c/source/common/unicode/usprep.h
+++ b/icu4c/source/common/unicode/usprep.h
@@ -33,14 +33,14 @@
  * StringPrep prepares Unicode strings for use in network protocols.
  * Profiles of StingPrep are set of rules and data according to with the
  * Unicode Strings are prepared. Each profiles contains tables which describe
- * how a code point should be treated. The tables are broadly classied into
+ * how a code point should be treated. The tables are broadly classified into
  * <ul>
- *     <li> Unassinged Table: Contains code points that are unassigned 
+ *     <li> Unassigned Table: Contains code points that are unassigned 
  *          in the Unicode Version supported by StringPrep. Currently 
  *          RFC 3454 supports Unicode 3.2. </li>
- *     <li> Prohibited Table: Contains code points that are prohibted from
+ *     <li> Prohibited Table: Contains code points that are prohibited from
  *          the output of the StringPrep processing function. </li>
- *     <li> Mapping Table: Contains code ponts that are deleted from the output or case mapped. </li>
+ *     <li> Mapping Table: Contains code points that are deleted from the output or case mapped. </li>
  * </ul>
  * 
  * The procedure for preparing Unicode strings:
@@ -230,7 +230,7 @@
 
 /**
  * Prepare the input buffer for use in applications with the given profile. This operation maps, normalizes(NFKC),
- * checks for prohited and BiDi characters in the order defined by RFC 3454
+ * checks for prohibited and BiDi characters in the order defined by RFC 3454
  * depending on the options specified in the profile.
  *
  * @param prep          The profile to use 
diff --git a/icu4c/source/common/unicode/ustring.h b/icu4c/source/common/unicode/ustring.h
index 3daa28e..f9fc41a 100644
--- a/icu4c/source/common/unicode/ustring.h
+++ b/icu4c/source/common/unicode/ustring.h
@@ -403,7 +403,7 @@
  * @param saveState The current pointer within the original string,
  *              which is set by this function. The saveState
  *              parameter should the address of a local variable of type
- *              UChar *. (i.e. defined "Uhar *myLocalSaveState" and use
+ *              UChar *. (i.e. defined "UChar *myLocalSaveState" and use
  *              &myLocalSaveState for this parameter).
  * @return A pointer to the next token found in src, or NULL
  *         when there are no more tokens.
@@ -884,7 +884,7 @@
  * Unicode String literals in C.
  * We need one macro to declare a variable for the string
  * and to statically preinitialize it if possible,
- * and a second macro to dynamically intialize such a string variable if necessary.
+ * and a second macro to dynamically initialize such a string variable if necessary.
  *
  * The macros are defined for maximum performance.
  * They work only for strings that contain "invariant characters", i.e.,
diff --git a/icu4c/source/common/unicode/utext.h b/icu4c/source/common/unicode/utext.h
index 33f2f4c..ad21d70 100644
--- a/icu4c/source/common/unicode/utext.h
+++ b/icu4c/source/common/unicode/utext.h
@@ -655,10 +655,10 @@
  * @param  ut    the UText from which to extract data.
  * @param  nativeStart the native index of the first character to extract.\
  *               If the specified index is out of range,
- *               it will be pinned to to be within 0 <= index <= textLength
+ *               it will be pinned to be within 0 <= index <= textLength
  * @param  nativeLimit the native string index of the position following the last
  *               character to extract.  If the specified index is out of range,
- *               it will be pinned to to be within 0 <= index <= textLength.
+ *               it will be pinned to be within 0 <= index <= textLength.
  *               nativeLimit must be >= nativeStart.
  * @param  dest  the UChar (UTF-16) buffer into which the extracted text is placed
  * @param  destCapacity  The size, in UChars, of the destination buffer.  May be zero
@@ -906,7 +906,7 @@
   *  Caution:  freezing a UText will disable changes made via the specific
   *   frozen UText wrapper only; it will not have any effect on the ability to
   *   directly modify the text by bypassing the UText.  Any such backdoor modifications
-  *   are always an error while UText access is occuring because the underlying
+  *   are always an error while UText access is occurring because the underlying
   *   text can get out of sync with UText's buffering.
   *  </p>
   *
@@ -1452,7 +1452,7 @@
     void          *pExtra;
 
     /**
-     * (protected) Pointer to string or text-containin object or similar.
+     * (protected) Pointer to string or text-containing object or similar.
      * This is the source of the text that this UText is wrapping, in a format
      *  that is known to the text provider functions.
      * @stable ICU 3.4
diff --git a/icu4c/source/common/unicode/utf8.h b/icu4c/source/common/unicode/utf8.h
index df08d34..4bb063c 100644
--- a/icu4c/source/common/unicode/utf8.h
+++ b/icu4c/source/common/unicode/utf8.h
@@ -348,29 +348,7 @@
  * @see U8_NEXT_UNSAFE
  * @stable ICU 2.4
  */
-#define U8_NEXT(s, i, length, c) { \
-    (c)=(uint8_t)(s)[(i)++]; \
-    if(!U8_IS_SINGLE(c)) { \
-        uint8_t __t1, __t2; \
-        if( /* handle U+0800..U+FFFF inline */ \
-                (0xe0<=(c) && (c)<0xf0) && \
-                (((i)+1)<(length) || (length)<0) && \
-                U8_IS_VALID_LEAD3_AND_T1((c), __t1=(s)[i]) && \
-                (__t2=(s)[(i)+1]-0x80)<=0x3f) { \
-            (c)=(((c)&0xf)<<12)|((__t1&0x3f)<<6)|__t2; \
-            (i)+=2; \
-        } else if( /* handle U+0080..U+07FF inline */ \
-                ((c)<0xe0 && (c)>=0xc2) && \
-                ((i)!=(length)) && \
-                (__t1=(s)[i]-0x80)<=0x3f) { \
-            (c)=(((c)&0x1f)<<6)|__t1; \
-            ++(i); \
-        } else { \
-            /* function call for "complicated" and error cases */ \
-            (c)=utf8_nextCharSafeBody((const uint8_t *)s, &(i), (length), c, -1); \
-        } \
-    } \
-}
+#define U8_NEXT(s, i, length, c) U8_INTERNAL_NEXT_OR_SUB(s, i, length, c, U_SENTINEL)
 
 /**
  * Get a code point from a string at a code point boundary offset,
@@ -396,26 +374,33 @@
  * @see U8_NEXT
  * @stable ICU 51
  */
-#define U8_NEXT_OR_FFFD(s, i, length, c) { \
+#define U8_NEXT_OR_FFFD(s, i, length, c) U8_INTERNAL_NEXT_OR_SUB(s, i, length, c, 0xfffd)
+
+/** @internal */
+#define U8_INTERNAL_NEXT_OR_SUB(s, i, length, c, sub) { \
     (c)=(uint8_t)(s)[(i)++]; \
     if(!U8_IS_SINGLE(c)) { \
-        uint8_t __t1, __t2; \
-        if( /* handle U+0800..U+FFFF inline */ \
-                (0xe0<=(c) && (c)<0xf0) && \
-                (((i)+1)<(length) || (length)<0) && \
-                U8_IS_VALID_LEAD3_AND_T1((c), __t1=(s)[i]) && \
-                (__t2=(s)[(i)+1]-0x80)<=0x3f) { \
-            (c)=(((c)&0xf)<<12)|((__t1&0x3f)<<6)|__t2; \
-            (i)+=2; \
-        } else if( /* handle U+0080..U+07FF inline */ \
-                ((c)<0xe0 && (c)>=0xc2) && \
-                ((i)!=(length)) && \
-                (__t1=(s)[i]-0x80)<=0x3f) { \
-            (c)=(((c)&0x1f)<<6)|__t1; \
-            ++(i); \
+        uint8_t __t = 0; \
+        if((i)!=(length) && \
+            /* fetch/validate/assemble all but last trail byte */ \
+            ((c)>=0xe0 ? \
+                ((c)<0xf0 ?  /* U+0800..U+FFFF except surrogates */ \
+                    U8_LEAD3_T1_BITS[(c)&=0xf]&(1<<((__t=(s)[i])>>5)) && \
+                    (__t&=0x3f, 1) \
+                :  /* U+10000..U+10FFFF */ \
+                    ((c)-=0xf0)<=4 && \
+                    U8_LEAD4_T1_BITS[(__t=(s)[i])>>4]&(1<<(c)) && \
+                    ((c)=((c)<<6)|(__t&0x3f), ++(i)!=(length)) && \
+                    (__t=(s)[i]-0x80)<=0x3f) && \
+                /* valid second-to-last trail byte */ \
+                ((c)=((c)<<6)|__t, ++(i)!=(length)) \
+            :  /* U+0080..U+07FF */ \
+                (c)>=0xc2 && ((c)&=0x1f, 1)) && \
+            /* last trail byte */ \
+            (__t=(s)[i]-0x80)<=0x3f && \
+            ((c)=((c)<<6)|__t, ++(i), 1)) { \
         } else { \
-            /* function call for "complicated" and error cases */ \
-            (c)=utf8_nextCharSafeBody((const uint8_t *)s, &(i), (length), c, -3); \
+            (c)=(sub);  /* ill-formed*/ \
         } \
     } \
 }
@@ -434,21 +419,22 @@
  * @stable ICU 2.4
  */
 #define U8_APPEND_UNSAFE(s, i, c) { \
-    if((uint32_t)(c)<=0x7f) { \
-        (s)[(i)++]=(uint8_t)(c); \
+    uint32_t __uc=(c); \
+    if(__uc<=0x7f) { \
+        (s)[(i)++]=(uint8_t)__uc; \
     } else { \
-        if((uint32_t)(c)<=0x7ff) { \
-            (s)[(i)++]=(uint8_t)(((c)>>6)|0xc0); \
+        if(__uc<=0x7ff) { \
+            (s)[(i)++]=(uint8_t)((__uc>>6)|0xc0); \
         } else { \
-            if((uint32_t)(c)<=0xffff) { \
-                (s)[(i)++]=(uint8_t)(((c)>>12)|0xe0); \
+            if(__uc<=0xffff) { \
+                (s)[(i)++]=(uint8_t)((__uc>>12)|0xe0); \
             } else { \
-                (s)[(i)++]=(uint8_t)(((c)>>18)|0xf0); \
-                (s)[(i)++]=(uint8_t)((((c)>>12)&0x3f)|0x80); \
+                (s)[(i)++]=(uint8_t)((__uc>>18)|0xf0); \
+                (s)[(i)++]=(uint8_t)(((__uc>>12)&0x3f)|0x80); \
             } \
-            (s)[(i)++]=(uint8_t)((((c)>>6)&0x3f)|0x80); \
+            (s)[(i)++]=(uint8_t)(((__uc>>6)&0x3f)|0x80); \
         } \
-        (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); \
+        (s)[(i)++]=(uint8_t)((__uc&0x3f)|0x80); \
     } \
 }
 
@@ -470,17 +456,23 @@
  * @stable ICU 2.4
  */
 #define U8_APPEND(s, i, capacity, c, isError) { \
-    if((uint32_t)(c)<=0x7f) { \
-        (s)[(i)++]=(uint8_t)(c); \
-    } else if((uint32_t)(c)<=0x7ff && (i)+1<(capacity)) { \
-        (s)[(i)++]=(uint8_t)(((c)>>6)|0xc0); \
-        (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); \
-    } else if((uint32_t)(c)<=0xd7ff && (i)+2<(capacity)) { \
-        (s)[(i)++]=(uint8_t)(((c)>>12)|0xe0); \
-        (s)[(i)++]=(uint8_t)((((c)>>6)&0x3f)|0x80); \
-        (s)[(i)++]=(uint8_t)(((c)&0x3f)|0x80); \
+    uint32_t __uc=(c); \
+    if(__uc<=0x7f) { \
+        (s)[(i)++]=(uint8_t)__uc; \
+    } else if(__uc<=0x7ff && (i)+1<(capacity)) { \
+        (s)[(i)++]=(uint8_t)((__uc>>6)|0xc0); \
+        (s)[(i)++]=(uint8_t)((__uc&0x3f)|0x80); \
+    } else if((__uc<=0xd7ff || (0xe000<=__uc && __uc<=0xffff)) && (i)+2<(capacity)) { \
+        (s)[(i)++]=(uint8_t)((__uc>>12)|0xe0); \
+        (s)[(i)++]=(uint8_t)(((__uc>>6)&0x3f)|0x80); \
+        (s)[(i)++]=(uint8_t)((__uc&0x3f)|0x80); \
+    } else if(0xffff<__uc && __uc<=0x10ffff && (i)+3<(capacity)) { \
+        (s)[(i)++]=(uint8_t)((__uc>>18)|0xf0); \
+        (s)[(i)++]=(uint8_t)(((__uc>>12)&0x3f)|0x80); \
+        (s)[(i)++]=(uint8_t)(((__uc>>6)&0x3f)|0x80); \
+        (s)[(i)++]=(uint8_t)((__uc&0x3f)|0x80); \
     } else { \
-        (i)=utf8_appendCharSafeBody(s, (i), (capacity), c, &(isError)); \
+        (isError)=TRUE; \
     } \
 }
 
@@ -600,12 +592,15 @@
  * If the offset points to a UTF-8 trail byte,
  * then the offset is moved backward to the corresponding lead byte.
  * Otherwise, it is not modified.
+ *
  * "Safe" macro, checks for illegal sequences and for string boundaries.
+ * Unlike U8_TRUNCATE_IF_INCOMPLETE(), this macro always reads s[i].
  *
  * @param s const uint8_t * string
  * @param start int32_t starting string offset (usually 0)
  * @param i int32_t string offset, must be start<=i
  * @see U8_SET_CP_START_UNSAFE
+ * @see U8_TRUNCATE_IF_INCOMPLETE
  * @stable ICU 2.4
  */
 #define U8_SET_CP_START(s, start, i) { \
@@ -614,6 +609,57 @@
     } \
 }
 
+#ifndef U_HIDE_DRAFT_API
+/**
+ * If the string ends with a UTF-8 byte sequence that is valid so far
+ * but incomplete, then reduce the length of the string to end before
+ * the lead byte of that incomplete sequence.
+ * For example, if the string ends with E1 80, the length is reduced by 2.
+ *
+ * In all other cases (the string ends with a complete sequence, or it is not
+ * possible for any further trail byte to extend the trailing sequence)
+ * the length remains unchanged.
+ *
+ * Useful for processing text split across multiple buffers
+ * (save the incomplete sequence for later)
+ * and for optimizing iteration
+ * (check for string length only once per character).
+ *
+ * "Safe" macro, checks for illegal sequences and for string boundaries.
+ * Unlike U8_SET_CP_START(), this macro never reads s[length].
+ *
+ * (In UTF-16, simply check for U16_IS_LEAD(last code unit).)
+ *
+ * @param s const uint8_t * string
+ * @param start int32_t starting string offset (usually 0)
+ * @param length int32_t string length (usually start<=length)
+ * @see U8_SET_CP_START
+ * @draft ICU 61
+ */
+#define U8_TRUNCATE_IF_INCOMPLETE(s, start, length) \
+    if((length)>(start)) { \
+        uint8_t __b1=s[(length)-1]; \
+        if(U8_IS_SINGLE(__b1)) { \
+            /* common ASCII character */ \
+        } else if(U8_IS_LEAD(__b1)) { \
+            --(length); \
+        } else if(U8_IS_TRAIL(__b1) && ((length)-2)>=(start)) { \
+            uint8_t __b2=s[(length)-2]; \
+            if(0xe0<=__b2 && __b2<=0xf4) { \
+                if(__b2<0xf0 ? U8_IS_VALID_LEAD3_AND_T1(__b2, __b1) : \
+                        U8_IS_VALID_LEAD4_AND_T1(__b2, __b1)) { \
+                    (length)-=2; \
+                } \
+            } else if(U8_IS_TRAIL(__b2) && ((length)-3)>=(start)) { \
+                uint8_t __b3=s[(length)-3]; \
+                if(0xf0<=__b3 && __b3<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(__b3, __b2)) { \
+                    (length)-=3; \
+                } \
+            } \
+        } \
+    }
+#endif  // U_HIDE_DRAFT_API
+
 /* definitions with backward iteration -------------------------------------- */
 
 /**
diff --git a/icu4c/source/common/unicode/utrace.h b/icu4c/source/common/unicode/utrace.h
index 6b4c4df..6626978 100644
--- a/icu4c/source/common/unicode/utrace.h
+++ b/icu4c/source/common/unicode/utrace.h
@@ -183,7 +183,7 @@
   *  tracing functions must themselves filter by checking that the
   *  current thread is the desired thread.
   *
-  *  @param context an uninterpretted pointer.  Whatever is passed in
+  *  @param context an uninterpreted pointer.  Whatever is passed in
   *                 here will in turn be passed to each of the tracing
   *                 functions UTraceEntry, UTraceExit and UTraceData.
   *                 ICU does not use or alter this pointer.
@@ -320,7 +320,7 @@
   *                 human readable form.  Note that a UTraceData function may choose
   *                 to not format the data;  it could, for example, save it in
   *                 in the raw form it was received (more compact), leaving
-  *                 formatting for a later trace analyis tool.
+  *                 formatting for a later trace analysis tool.
   *  @param outBuf  pointer to a buffer to receive the formatted output.  Output
   *                 will be nul terminated if there is space in the buffer -
   *                 if the length of the requested output < the output buffer size.
diff --git a/icu4c/source/common/unicode/utypes.h b/icu4c/source/common/unicode/utypes.h
index d60450b..dd89f39 100644
--- a/icu4c/source/common/unicode/utypes.h
+++ b/icu4c/source/common/unicode/utypes.h
@@ -145,7 +145,7 @@
 /**
  *  U_ICU_ENTRY_POINT is the name of the DLL entry point to the ICU data library.
  *    Defined as a literal, not a string.
- *    Tricky Preprocessor use - ## operator replaces macro paramters with the literal string
+ *    Tricky Preprocessor use - ## operator replaces macro parameters with the literal string
  *                              from the corresponding macro invocation, _before_ other macro substitutions.
  *                              Need a nested \#defines to get the actual version numbers rather than
  *                              the literal text U_ICU_VERSION_MAJOR_NUM into the name.
@@ -446,14 +446,14 @@
     U_BUFFER_OVERFLOW_ERROR   = 15,     /**< A result would not fit in the supplied buffer */
     U_UNSUPPORTED_ERROR       = 16,     /**< Requested operation not supported in current context */
     U_RESOURCE_TYPE_MISMATCH  = 17,     /**< an operation is requested over a resource that does not support it */
-    U_ILLEGAL_ESCAPE_SEQUENCE = 18,     /**< ISO-2022 illlegal escape sequence */
+    U_ILLEGAL_ESCAPE_SEQUENCE = 18,     /**< ISO-2022 illegal escape sequence */
     U_UNSUPPORTED_ESCAPE_SEQUENCE = 19, /**< ISO-2022 unsupported escape sequence */
     U_NO_SPACE_AVAILABLE      = 20,     /**< No space available for in-buffer expansion for Arabic shaping */
     U_CE_NOT_FOUND_ERROR      = 21,     /**< Currently used only while setting variable top, but can be used generally */
     U_PRIMARY_TOO_LONG_ERROR  = 22,     /**< User tried to set variable top to a primary that is longer than two bytes */
     U_STATE_TOO_OLD_ERROR     = 23,     /**< ICU cannot construct a service from this state, as it is no longer supported */
     U_TOO_MANY_ALIASES_ERROR  = 24,     /**< There are too many aliases in the path to the requested resource.
-                                             It is very possible that a circular alias definition has occured */
+                                             It is very possible that a circular alias definition has occurred */
     U_ENUM_OUT_OF_SYNC_ERROR  = 25,     /**< UEnumeration out of sync with underlying collection */
     U_INVARIANT_CONVERSION_ERROR = 26,  /**< Unable to convert a UChar* string to char* with the invariant converter. */
     U_INVALID_STATE_ERROR     = 27,     /**< Requested operation can not be completed with ICU in its current state */
@@ -499,7 +499,7 @@
     U_MULTIPLE_COMPOUND_FILTERS,      /**< More than one compound filter */
     U_INVALID_RBT_SYNTAX,             /**< A "::id" rule was passed to the RuleBasedTransliterator parser */
     U_INVALID_PROPERTY_PATTERN,       /**< UNUSED as of ICU 2.4 */
-    U_MALFORMED_PRAGMA,               /**< A 'use' pragma is invlalid */
+    U_MALFORMED_PRAGMA,               /**< A 'use' pragma is invalid */
     U_UNCLOSED_SEGMENT,               /**< A closing ')' is missing */
     U_ILLEGAL_CHAR_IN_SEGMENT,        /**< UNUSED as of ICU 2.4 */
     U_VARIABLE_RANGE_EXHAUSTED,       /**< Too many stand-ins generated for the given variable range */
@@ -539,12 +539,15 @@
     U_DEFAULT_KEYWORD_MISSING,        /**< Missing DEFAULT rule in plural rules */
     U_DECIMAL_NUMBER_SYNTAX_ERROR,    /**< Decimal number syntax error */
     U_FORMAT_INEXACT_ERROR,           /**< Cannot format a number exactly and rounding mode is ROUND_UNNECESSARY @stable ICU 4.8 */
+#ifndef U_HIDE_DRAFT_API
+    U_NUMBER_ARG_OUTOFBOUNDS_ERROR,   /**< The argument to a NumberFormatter helper method was out of bounds; the bounds are usually 0 to 999. @draft ICU 61 */
+#endif  // U_HIDE_DRAFT_API
 #ifndef U_HIDE_DEPRECATED_API
     /**
      * One more than the highest normal formatting API error code.
      * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
      */
-    U_FMT_PARSE_ERROR_LIMIT,
+    U_FMT_PARSE_ERROR_LIMIT = 0x10113,
 #endif  // U_HIDE_DEPRECATED_API
 
     /*
@@ -555,7 +558,7 @@
     U_BRK_HEX_DIGITS_EXPECTED,             /**< Hex digits expected as part of a escaped char in a rule. */
     U_BRK_SEMICOLON_EXPECTED,              /**< Missing ';' at the end of a RBBI rule.            */
     U_BRK_RULE_SYNTAX,                     /**< Syntax error in RBBI rule.                        */
-    U_BRK_UNCLOSED_SET,                    /**< UnicodeSet witing an RBBI rule missing a closing ']'.  */
+    U_BRK_UNCLOSED_SET,                    /**< UnicodeSet writing an RBBI rule missing a closing ']'. */
     U_BRK_ASSIGN_ERROR,                    /**< Syntax error in RBBI rule assignment statement.   */
     U_BRK_VARIABLE_REDFINITION,            /**< RBBI rule $Variable redefined.                    */
     U_BRK_MISMATCHED_PAREN,                /**< Mis-matched parentheses in an RBBI rule.          */
@@ -564,7 +567,7 @@
     U_BRK_INIT_ERROR,                      /**< Initialization failure.  Probable missing ICU Data. */
     U_BRK_RULE_EMPTY_SET,                  /**< Rule contains an empty Unicode Set.               */
     U_BRK_UNRECOGNIZED_OPTION,             /**< !!option in RBBI rules not recognized.            */
-    U_BRK_MALFORMED_RULE_TAG,              /**< The {nnn} tag on a rule is mal formed             */
+    U_BRK_MALFORMED_RULE_TAG,              /**< The {nnn} tag on a rule is malformed              */
 #ifndef U_HIDE_DEPRECATED_API
     /**
      * One more than the highest normal BreakIterator error code.
diff --git a/icu4c/source/common/unicode/uvernum.h b/icu4c/source/common/unicode/uvernum.h
index d905a0f..0427bcb 100644
--- a/icu4c/source/common/unicode/uvernum.h
+++ b/icu4c/source/common/unicode/uvernum.h
@@ -58,13 +58,13 @@
  *  This value will change in the subsequent releases of ICU
  *  @stable ICU 2.4
  */
-#define U_ICU_VERSION_MAJOR_NUM 60
+#define U_ICU_VERSION_MAJOR_NUM 61
 
 /** The current ICU minor version as an integer.
  *  This value will change in the subsequent releases of ICU
  *  @stable ICU 2.6
  */
-#define U_ICU_VERSION_MINOR_NUM 2
+#define U_ICU_VERSION_MINOR_NUM 1
 
 /** The current ICU patchlevel version as an integer.
  *  This value will change in the subsequent releases of ICU
@@ -84,7 +84,7 @@
  *  This value will change in the subsequent releases of ICU
  *  @stable ICU 2.6
  */
-#define U_ICU_VERSION_SUFFIX _60
+#define U_ICU_VERSION_SUFFIX _61
 
 /**
  * \def U_DEF2_ICU_ENTRY_POINT_RENAME
@@ -119,19 +119,26 @@
  *  This value will change in the subsequent releases of ICU
  *  @stable ICU 2.4
  */
-#define U_ICU_VERSION "60.2"
+#define U_ICU_VERSION "61.1"
 
-/** The current ICU library major/minor version as a string without dots, for library name suffixes.
- *  This value will change in the subsequent releases of ICU
- *  @stable ICU 2.6
+/**
+ * The current ICU library major version number as a string, for library name suffixes.
+ * This value will change in subsequent releases of ICU.
+ *
+ * Until ICU 4.8, this was the combination of the single-digit major and minor ICU version numbers
+ * into one string without dots ("48").
+ * Since ICU 49, it is the double-digit major ICU version number.
+ * See http://userguide.icu-project.org/design#TOC-Version-Numbers-in-ICU
+ *
+ * @stable ICU 2.6
  */
-#define U_ICU_VERSION_SHORT "60"
+#define U_ICU_VERSION_SHORT "61"
 
 #ifndef U_HIDE_INTERNAL_API
 /** Data version in ICU4C.
  * @internal ICU 4.4 Internal Use Only
  **/
-#define U_ICU_DATA_VERSION "60.2"
+#define U_ICU_DATA_VERSION "61.1"
 #endif  /* U_HIDE_INTERNAL_API */
 
 /*===========================================================================
diff --git a/icu4c/source/common/unicode/uversion.h b/icu4c/source/common/unicode/uversion.h
index e24068d..4aaa8b4 100644
--- a/icu4c/source/common/unicode/uversion.h
+++ b/icu4c/source/common/unicode/uversion.h
@@ -105,7 +105,7 @@
  * @stable ICU 2.4
  */
 
-/* Define namespace symbols if the compiler supports it. */
+/* Define C++ namespace symbols. */
 #ifdef __cplusplus
 #   if U_DISABLE_RENAMING
 #       define U_ICU_NAMESPACE icu
@@ -122,7 +122,13 @@
 #   define U_NAMESPACE_QUALIFIER U_ICU_NAMESPACE::
 
 #   ifndef U_USING_ICU_NAMESPACE
-#       define U_USING_ICU_NAMESPACE 1
+#       if defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || \
+                defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION) || \
+                defined(U_LAYOUTEX_IMPLEMENTATION) || defined(U_TOOLUTIL_IMPLEMENTATION)
+#           define U_USING_ICU_NAMESPACE 0
+#       else
+#           define U_USING_ICU_NAMESPACE 0
+#       endif
 #   endif
 #   if U_USING_ICU_NAMESPACE
         U_NAMESPACE_USE
diff --git a/icu4c/source/common/unifiedcache.cpp b/icu4c/source/common/unifiedcache.cpp
index d023882..f0f660e 100644
--- a/icu4c/source/common/unifiedcache.cpp
+++ b/icu4c/source/common/unifiedcache.cpp
@@ -2,28 +2,30 @@
 // License & terms of use: http://www.unicode.org/copyright.html
 /*
 ******************************************************************************
-* Copyright (C) 2015, International Business Machines Corporation and         
-* others. All Rights Reserved.                                                
+* Copyright (C) 2015, International Business Machines Corporation and
+* others. All Rights Reserved.
 ******************************************************************************
-*                                                                             
-* File UNIFIEDCACHE.CPP 
+*
+* File unifiedcache.cpp
 ******************************************************************************
 */
 
-#include "uhash.h"
 #include "unifiedcache.h"
-#include "umutex.h"
+
+#include <algorithm>      // For std::max()
+
 #include "mutex.h"
 #include "uassert.h"
+#include "uhash.h"
 #include "ucln_cmn.h"
+#include "umutex.h"
 
 static icu::UnifiedCache *gCache = NULL;
-static icu::SharedObject *gNoValue = NULL;
 static UMutex gCacheMutex = U_MUTEX_INITIALIZER;
 static UConditionVar gInProgressValueAddedCond = U_CONDITION_INITIALIZER;
 static icu::UInitOnce gCacheInitOnce = U_INITONCE_INITIALIZER;
-static const int32_t MAX_EVICT_ITERATIONS = 10;
 
+static const int32_t MAX_EVICT_ITERATIONS = 10;
 static const int32_t DEFAULT_MAX_UNUSED = 1000;
 static const int32_t DEFAULT_PERCENTAGE_OF_IN_USE = 100;
 
@@ -35,10 +37,6 @@
         delete gCache;
         gCache = NULL;
     }
-    if (gNoValue) {
-        delete gNoValue;
-        gNoValue = NULL;
-    }
     return TRUE;
 }
 U_CDECL_END
@@ -73,23 +71,15 @@
     ucln_common_registerCleanup(
             UCLN_COMMON_UNIFIED_CACHE, unifiedcache_cleanup);
 
-    // gNoValue must be created first to avoid assertion error in
-    // cache constructor.
-    gNoValue = new SharedObject();
     gCache = new UnifiedCache(status);
     if (gCache == NULL) {
         status = U_MEMORY_ALLOCATION_ERROR;
     }
     if (U_FAILURE(status)) {
         delete gCache;
-        delete gNoValue;
         gCache = NULL;
-        gNoValue = NULL;
         return;
     }
-    // We add a softref because we want hash elements with gNoValue to be
-    // elligible for purging but we don't ever want gNoValue to be deleted.
-    gNoValue->addSoftRef();
 }
 
 UnifiedCache *UnifiedCache::getInstance(UErrorCode &status) {
@@ -104,14 +94,24 @@
 UnifiedCache::UnifiedCache(UErrorCode &status) :
         fHashtable(NULL),
         fEvictPos(UHASH_FIRST),
-        fItemsInUseCount(0),
+        fNumValuesTotal(0),
+        fNumValuesInUse(0),
         fMaxUnused(DEFAULT_MAX_UNUSED),
         fMaxPercentageOfInUse(DEFAULT_PERCENTAGE_OF_IN_USE),
-        fAutoEvictedCount(0) {
+        fAutoEvictedCount(0),
+        fNoValue(nullptr) {
     if (U_FAILURE(status)) {
         return;
     }
-    U_ASSERT(gNoValue != NULL);
+    fNoValue = new SharedObject();
+    if (fNoValue == nullptr) {
+        status = U_MEMORY_ALLOCATION_ERROR;
+        return;
+    }
+    fNoValue->softRefCount = 1;  // Add fake references to prevent fNoValue from being deleted
+    fNoValue->hardRefCount = 1;  // when other references to it are removed.
+    fNoValue->cachePtr = this;
+
     fHashtable = uhash_open(
             &ucache_hashKeys,
             &ucache_compareKeys,
@@ -139,7 +139,7 @@
 
 int32_t UnifiedCache::unusedCount() const {
     Mutex lock(&gCacheMutex);
-    return uhash_count(fHashtable) - fItemsInUseCount;
+    return uhash_count(fHashtable) - fNumValuesInUse;
 }
 
 int64_t UnifiedCache::autoEvictedCount() const {
@@ -161,6 +161,12 @@
     while (_flush(FALSE));
 }
 
+void UnifiedCache::handleUnreferencedObject() const {
+    Mutex lock(&gCacheMutex);
+    --fNumValuesInUse;
+    _runEvictionSlice();
+}
+
 #ifdef UNIFIED_CACHE_DEBUG
 #include <stdio.h>
 
@@ -196,10 +202,10 @@
             ++cnt;
             fprintf(
                     stderr,
-                    "Unified Cache: Key '%s', error %d, value %p, total refcount %d, soft refcount %d\n", 
+                    "Unified Cache: Key '%s', error %d, value %p, total refcount %d, soft refcount %d\n",
                     key->writeDescription(buffer, 256),
                     key->creationStatus,
-                    sharedObject == gNoValue ? NULL :sharedObject,
+                    sharedObject == fNoValue ? NULL :sharedObject,
                     sharedObject->getRefCount(),
                     sharedObject->getSoftRefCount());
         }
@@ -213,16 +219,17 @@
     flush();
     {
         // Now all that should be left in the cache are entries that refer to
-        // each other and entries with hard references from outside the cache. 
+        // each other and entries with hard references from outside the cache.
         // Nothing we can do about these so proceed to wipe out the cache.
         Mutex lock(&gCacheMutex);
         _flush(TRUE);
     }
     uhash_close(fHashtable);
+    fHashtable = nullptr;
+    delete fNoValue;
+    fNoValue = nullptr;
 }
 
-// Returns the next element in the cache round robin style.
-// On entry, gCacheMutex must be held.
 const UHashElement *
 UnifiedCache::_nextElement() const {
     const UHashElement *element = uhash_nextElement(fHashtable, &fEvictPos);
@@ -233,46 +240,36 @@
     return element;
 }
 
-// Flushes the contents of the cache. If cache values hold references to other
-// cache values then _flush should be called in a loop until it returns FALSE.
-// On entry, gCacheMutex must be held.
-// On exit, those values with are evictable are flushed. If all is true
-// then every value is flushed even if it is not evictable.
-// Returns TRUE if any value in cache was flushed or FALSE otherwise.
 UBool UnifiedCache::_flush(UBool all) const {
     UBool result = FALSE;
     int32_t origSize = uhash_count(fHashtable);
     for (int32_t i = 0; i < origSize; ++i) {
         const UHashElement *element = _nextElement();
+        if (element == nullptr) {
+            break;
+        }
         if (all || _isEvictable(element)) {
             const SharedObject *sharedObject =
                     (const SharedObject *) element->value.pointer;
+            U_ASSERT(sharedObject->cachePtr = this);
             uhash_removeElement(fHashtable, element);
-            sharedObject->removeSoftRef();
+            removeSoftRef(sharedObject);    // Deletes the sharedObject when softRefCount goes to zero.
             result = TRUE;
         }
     }
     return result;
 }
 
-// Computes how many items should be evicted.
-// On entry, gCacheMutex must be held.
-// Returns number of items that should be evicted or a value <= 0 if no
-// items need to be evicted.
 int32_t UnifiedCache::_computeCountOfItemsToEvict() const {
-    int32_t maxPercentageOfInUseCount =
-            fItemsInUseCount * fMaxPercentageOfInUse / 100;
-    int32_t maxUnusedCount = fMaxUnused;
-    if (maxUnusedCount < maxPercentageOfInUseCount) {
-        maxUnusedCount = maxPercentageOfInUseCount;
-    }
-    return uhash_count(fHashtable) - fItemsInUseCount - maxUnusedCount;
+    int32_t totalItems = uhash_count(fHashtable);
+    int32_t evictableItems = totalItems - fNumValuesInUse;
+
+    int32_t unusedLimitByPercentage = fNumValuesInUse * fMaxPercentageOfInUse / 100;
+    int32_t unusedLimit = std::max(unusedLimitByPercentage, fMaxUnused);
+    int32_t countOfItemsToEvict = std::max(0, evictableItems - unusedLimit);
+    return countOfItemsToEvict;
 }
 
-// Run an eviction slice.
-// On entry, gCacheMutex must be held.
-// _runEvictionSlice runs a slice of the evict pipeline by examining the next
-// 10 entries in the cache round robin style evicting them if they are eligible.
 void UnifiedCache::_runEvictionSlice() const {
     int32_t maxItemsToEvict = _computeCountOfItemsToEvict();
     if (maxItemsToEvict <= 0) {
@@ -280,11 +277,14 @@
     }
     for (int32_t i = 0; i < MAX_EVICT_ITERATIONS; ++i) {
         const UHashElement *element = _nextElement();
+        if (element == nullptr) {
+            break;
+        }
         if (_isEvictable(element)) {
             const SharedObject *sharedObject =
                     (const SharedObject *) element->value.pointer;
             uhash_removeElement(fHashtable, element);
-            sharedObject->removeSoftRef();
+            removeSoftRef(sharedObject);   // Deletes sharedObject when SoftRefCount goes to zero.
             ++fAutoEvictedCount;
             if (--maxItemsToEvict == 0) {
                 break;
@@ -293,13 +293,8 @@
     }
 }
 
-
-// Places a new value and creationStatus in the cache for the given key.
-// On entry, gCacheMutex must be held. key must not exist in the cache. 
-// On exit, value and creation status placed under key. Soft reference added
-// to value on successful add. On error sets status.
 void UnifiedCache::_putNew(
-        const CacheKeyBase &key, 
+        const CacheKeyBase &key,
         const SharedObject *value,
         const UErrorCode creationStatus,
         UErrorCode &status) const {
@@ -312,24 +307,17 @@
         return;
     }
     keyToAdopt->fCreationStatus = creationStatus;
-    if (value->noSoftReferences()) {
+    if (value->softRefCount == 0) {
         _registerMaster(keyToAdopt, value);
     }
-    uhash_put(fHashtable, keyToAdopt, (void *) value, &status);
+    void *oldValue = uhash_put(fHashtable, keyToAdopt, (void *) value, &status);
+    U_ASSERT(oldValue == nullptr);
+    (void)oldValue;
     if (U_SUCCESS(status)) {
-        value->addSoftRef();
+        value->softRefCount++;
     }
 }
 
-// Places value and status at key if there is no value at key or if cache
-// entry for key is in progress. Otherwise, it leaves the current value and
-// status there.
-// On entry. gCacheMutex must not be held. value must be
-// included in the reference count of the object to which it points.
-// On exit, value and status are changed to what was already in the cache if
-// something was there and not in progress. Otherwise, value and status are left
-// unchanged in which case they are placed in the cache on a best-effort basis.
-// Caller must call removeRef() on value.
 void UnifiedCache::_putIfAbsentAndGet(
         const CacheKeyBase &key,
         const SharedObject *&value,
@@ -352,15 +340,7 @@
     _runEvictionSlice();
 }
 
-// Attempts to fetch value and status for key from cache.
-// On entry, gCacheMutex must not be held value must be NULL and status must
-// be U_ZERO_ERROR.
-// On exit, either returns FALSE (In this
-// case caller should try to create the object) or returns TRUE with value
-// pointing to the fetched value and status set to fetched status. When
-// FALSE is returned status may be set to failure if an in progress hash
-// entry could not be made but value will remain unchanged. When TRUE is
-// returned, caler must call removeRef() on value.
+
 UBool UnifiedCache::_poll(
         const CacheKeyBase &key,
         const SharedObject *&value,
@@ -369,27 +349,29 @@
     U_ASSERT(status == U_ZERO_ERROR);
     Mutex lock(&gCacheMutex);
     const UHashElement *element = uhash_find(fHashtable, &key);
-    while (element != NULL && _inProgress(element)) {
+
+    // If the hash table contains an inProgress placeholder entry for this key,
+    // this means that another thread is currently constructing the value object.
+    // Loop, waiting for that construction to complete.
+     while (element != NULL && _inProgress(element)) {
         umtx_condWait(&gInProgressValueAddedCond, &gCacheMutex);
         element = uhash_find(fHashtable, &key);
     }
+
+    // If the hash table contains an entry for the key,
+    // fetch out the contents and return them.
     if (element != NULL) {
-        _fetch(element, value, status);
+         _fetch(element, value, status);
         return TRUE;
     }
-    _putNew(key, gNoValue, U_ZERO_ERROR, status);
+
+    // The hash table contained nothing for this key.
+    // Insert an inProgress place holder value.
+    // Our caller will create the final value and update the hash table.
+    _putNew(key, fNoValue, U_ZERO_ERROR, status);
     return FALSE;
 }
 
-// Gets value out of cache.
-// On entry. gCacheMutex must not be held. value must be NULL. status
-// must be U_ZERO_ERROR.
-// On exit. value and status set to what is in cache at key or on cache
-// miss the key's createObject() is called and value and status are set to
-// the result of that. In this latter case, best effort is made to add the
-// value and status to the cache. If createObject() fails to create a value,
-// gNoValue is stored in cache, and value is set to NULL. Caller must call
-// removeRef on value if non NULL.
 void UnifiedCache::_get(
         const CacheKeyBase &key,
         const SharedObject *&value,
@@ -398,7 +380,7 @@
     U_ASSERT(value == NULL);
     U_ASSERT(status == U_ZERO_ERROR);
     if (_poll(key, value, status)) {
-        if (value == gNoValue) {
+        if (value == fNoValue) {
             SharedObject::clearPtr(value);
         }
         return;
@@ -410,134 +392,76 @@
     U_ASSERT(value == NULL || value->hasHardReferences());
     U_ASSERT(value != NULL || status != U_ZERO_ERROR);
     if (value == NULL) {
-        SharedObject::copyPtr(gNoValue, value);
+        SharedObject::copyPtr(fNoValue, value);
     }
     _putIfAbsentAndGet(key, value, status);
-    if (value == gNoValue) {
+    if (value == fNoValue) {
         SharedObject::clearPtr(value);
     }
 }
 
-void UnifiedCache::decrementItemsInUseWithLockingAndEviction() const {
-    Mutex mutex(&gCacheMutex);
-    decrementItemsInUse();
-    _runEvictionSlice();
-}
-
-void UnifiedCache::incrementItemsInUse() const {
-    ++fItemsInUseCount;
-}
-
-void UnifiedCache::decrementItemsInUse() const {
-    --fItemsInUseCount;
-}
-
-// Register a master cache entry.
-// On entry, gCacheMutex must be held.
-// On exit, items in use count incremented, entry is marked as a master
-// entry, and value registered with cache so that subsequent calls to
-// addRef() and removeRef() on it correctly updates items in use count
 void UnifiedCache::_registerMaster(
-        const CacheKeyBase *theKey, const SharedObject *value) const {
-    theKey->fIsMaster = TRUE;
-    ++fItemsInUseCount;
-    value->registerWithCache(this);
+            const CacheKeyBase *theKey, const SharedObject *value) const {
+    theKey->fIsMaster = true;
+    value->cachePtr = this;
+    ++fNumValuesTotal;
+    ++fNumValuesInUse;
 }
 
-// Store a value and error in given hash entry.
-// On entry, gCacheMutex must be held. Hash entry element must be in progress.
-// value must be non NULL.
-// On Exit, soft reference added to value. value and status stored in hash
-// entry. Soft reference removed from previous stored value. Waiting
-// threads notified.
 void UnifiedCache::_put(
-        const UHashElement *element, 
+        const UHashElement *element,
         const SharedObject *value,
         const UErrorCode status) const {
     U_ASSERT(_inProgress(element));
     const CacheKeyBase *theKey = (const CacheKeyBase *) element->key.pointer;
     const SharedObject *oldValue = (const SharedObject *) element->value.pointer;
     theKey->fCreationStatus = status;
-    if (value->noSoftReferences()) {
+    if (value->softRefCount == 0) {
         _registerMaster(theKey, value);
     }
-    value->addSoftRef();
+    value->softRefCount++;
     UHashElement *ptr = const_cast<UHashElement *>(element);
     ptr->value.pointer = (void *) value;
-    oldValue->removeSoftRef();
+    U_ASSERT(oldValue == fNoValue);
+    removeSoftRef(oldValue);
 
     // Tell waiting threads that we replace in-progress status with
     // an error.
     umtx_condBroadcast(&gInProgressValueAddedCond);
 }
 
-void
-UnifiedCache::copyPtr(const SharedObject *src, const SharedObject *&dest) {
-    if(src != dest) {
-        if(dest != NULL) {
-            dest->removeRefWhileHoldingCacheLock();
-        }
-        dest = src;
-        if(src != NULL) {
-            src->addRefWhileHoldingCacheLock();
-        }
-    }
-}
-
-void
-UnifiedCache::clearPtr(const SharedObject *&ptr) {
-    if (ptr != NULL) {
-        ptr->removeRefWhileHoldingCacheLock();
-        ptr = NULL;
-    }
-}
-
-
-// Fetch value and error code from a particular hash entry.
-// On entry, gCacheMutex must be held. value must be either NULL or must be
-// included in the ref count of the object to which it points.
-// On exit, value and status set to what is in the hash entry. Caller must
-// eventually call removeRef on value.
-// If hash entry is in progress, value will be set to gNoValue and status will
-// be set to U_ZERO_ERROR.
 void UnifiedCache::_fetch(
         const UHashElement *element,
         const SharedObject *&value,
-        UErrorCode &status) {
+        UErrorCode &status) const {
     const CacheKeyBase *theKey = (const CacheKeyBase *) element->key.pointer;
     status = theKey->fCreationStatus;
 
-    // Since we have the cache lock, calling regular SharedObject methods
+    // Since we have the cache lock, calling regular SharedObject add/removeRef
     // could cause us to deadlock on ourselves since they may need to lock
     // the cache mutex.
-    UnifiedCache::copyPtr((const SharedObject *) element->value.pointer, value);
+    removeHardRef(value);
+    value = static_cast<const SharedObject *>(element->value.pointer);
+    addHardRef(value);
 }
 
-// Determine if given hash entry is in progress.
-// On entry, gCacheMutex must be held.
-UBool UnifiedCache::_inProgress(const UHashElement *element) {
-    const SharedObject *value = NULL;
+
+UBool UnifiedCache::_inProgress(const UHashElement* element) const {
     UErrorCode status = U_ZERO_ERROR;
+    const SharedObject * value = NULL;
     _fetch(element, value, status);
     UBool result = _inProgress(value, status);
-
-    // Since we have the cache lock, calling regular SharedObject methods
-    // could cause us to deadlock on ourselves since they may need to lock
-    // the cache mutex.
-    UnifiedCache::clearPtr(value);
+    removeHardRef(value);
     return result;
 }
 
-// Determine if given hash entry is in progress.
-// On entry, gCacheMutex must be held.
 UBool UnifiedCache::_inProgress(
-        const SharedObject *theValue, UErrorCode creationStatus) {
-    return (theValue == gNoValue && creationStatus == U_ZERO_ERROR);
+        const SharedObject* theValue, UErrorCode creationStatus) const {
+    return (theValue == fNoValue && creationStatus == U_ZERO_ERROR);
 }
 
-// Determine if given hash entry is eligible for eviction.
-// On entry, gCacheMutex must be held.
-UBool UnifiedCache::_isEvictable(const UHashElement *element) {
+UBool UnifiedCache::_isEvictable(const UHashElement *element) const
+{
     const CacheKeyBase *theKey = (const CacheKeyBase *) element->key.pointer;
     const SharedObject *theValue =
             (const SharedObject *) element->value.pointer;
@@ -549,7 +473,47 @@
 
     // We can evict entries that are either not a master or have just
     // one reference (The one reference being from the cache itself).
-    return (!theKey->fIsMaster || (theValue->getSoftRefCount() == 1 && theValue->noHardReferences()));
+    return (!theKey->fIsMaster || (theValue->softRefCount == 1 && theValue->noHardReferences()));
+}
+
+void UnifiedCache::removeSoftRef(const SharedObject *value) const {
+    U_ASSERT(value->cachePtr == this);
+    U_ASSERT(value->softRefCount > 0);
+    if (--value->softRefCount == 0) {
+        --fNumValuesTotal;
+        if (value->noHardReferences()) {
+            delete value;
+        } else {
+            // This path only happens from flush(all). Which only happens from the
+            // UnifiedCache destructor.  Nulling out value.cacheptr changes the behavior
+            // of value.removeRef(), causing the deletion to be done there.
+            value->cachePtr = nullptr;
+        }
+    }
+}
+
+int32_t UnifiedCache::removeHardRef(const SharedObject *value) const {
+    int refCount = 0;
+    if (value) {
+        refCount = umtx_atomic_dec(&value->hardRefCount);
+        U_ASSERT(refCount >= 0);
+        if (refCount == 0) {
+            --fNumValuesInUse;
+        }
+    }
+    return refCount;
+}
+
+int32_t UnifiedCache::addHardRef(const SharedObject *value) const {
+    int refCount = 0;
+    if (value) {
+        refCount = umtx_atomic_inc(&value->hardRefCount);
+        U_ASSERT(refCount >= 1);
+        if (refCount == 1) {
+            fNumValuesInUse++;
+        }
+    }
+    return refCount;
 }
 
 U_NAMESPACE_END
diff --git a/icu4c/source/common/unifiedcache.h b/icu4c/source/common/unifiedcache.h
index 957c0db..4c9992b 100644
--- a/icu4c/source/common/unifiedcache.h
+++ b/icu4c/source/common/unifiedcache.h
@@ -190,7 +190,7 @@
    UnifiedCache(UErrorCode &status);
 
    /**
-    * Returns the cache instance.
+    * Return a pointer to the global cache instance.
     */
    static UnifiedCache *getInstance(UErrorCode &status);
 
@@ -294,7 +294,7 @@
 
    /**
     * Configures at what point evcition of unused entries will begin.
-    * Eviction is triggered whenever the number of unused entries exeeds
+    * Eviction is triggered whenever the number of evictable keys exeeds
     * BOTH count AND (number of in-use items) * (percentageOfInUseItems / 100).
     * Once the number of unused entries drops below one of these,
     * eviction ceases. Because eviction happens incrementally,
@@ -341,60 +341,214 @@
     */
    int32_t unusedCount() const;
 
-   virtual void incrementItemsInUse() const;
-   virtual void decrementItemsInUseWithLockingAndEviction() const;
-   virtual void decrementItemsInUse() const;
+   virtual void handleUnreferencedObject() const;
    virtual ~UnifiedCache();
+   
  private:
    UHashtable *fHashtable;
    mutable int32_t fEvictPos;
-   mutable int32_t fItemsInUseCount;
+   mutable int32_t fNumValuesTotal;
+   mutable int32_t fNumValuesInUse;
    int32_t fMaxUnused;
    int32_t fMaxPercentageOfInUse;
    mutable int64_t fAutoEvictedCount;
+   SharedObject *fNoValue;
+   
    UnifiedCache(const UnifiedCache &other);
    UnifiedCache &operator=(const UnifiedCache &other);
+   
+   /**
+    * Flushes the contents of the cache. If cache values hold references to other
+    * cache values then _flush should be called in a loop until it returns FALSE.
+    * 
+    * On entry, gCacheMutex must be held.
+    * On exit, those values with are evictable are flushed.
+    * 
+    *  @param all if false flush evictable items only, which are those with no external
+    *                    references, plus those that can be safely recreated.<br>
+    *            if true, flush all elements. Any values (sharedObjects) with remaining
+    *                     hard (external) references are not deleted, but are detached from
+    *                     the cache, so that a subsequent removeRefs can delete them.
+    *                     _flush is not thread safe when all is true.
+    *   @return TRUE if any value in cache was flushed or FALSE otherwise.
+    */
    UBool _flush(UBool all) const;
+   
+   /**
+    * Gets value out of cache.
+    * On entry. gCacheMutex must not be held. value must be NULL. status
+    * must be U_ZERO_ERROR.
+    * On exit. value and status set to what is in cache at key or on cache
+    * miss the key's createObject() is called and value and status are set to
+    * the result of that. In this latter case, best effort is made to add the
+    * value and status to the cache. If createObject() fails to create a value,
+    * fNoValue is stored in cache, and value is set to NULL. Caller must call
+    * removeRef on value if non NULL.
+    */
    void _get(
            const CacheKeyBase &key,
            const SharedObject *&value,
            const void *creationContext,
            UErrorCode &status) const;
-   UBool _poll(
-           const CacheKeyBase &key,
-           const SharedObject *&value,
-           UErrorCode &status) const;
-   void _putNew(
-           const CacheKeyBase &key,
-           const SharedObject *value,
-           const UErrorCode creationStatus,
-           UErrorCode &status) const;
+
+    /**
+     * Attempts to fetch value and status for key from cache.
+     * On entry, gCacheMutex must not be held value must be NULL and status must
+     * be U_ZERO_ERROR.
+     * On exit, either returns FALSE (In this
+     * case caller should try to create the object) or returns TRUE with value
+     * pointing to the fetched value and status set to fetched status. When
+     * FALSE is returned status may be set to failure if an in progress hash
+     * entry could not be made but value will remain unchanged. When TRUE is
+     * returned, caller must call removeRef() on value.
+     */
+    UBool _poll(
+            const CacheKeyBase &key,
+            const SharedObject *&value,
+            UErrorCode &status) const;
+    
+    /**
+     * Places a new value and creationStatus in the cache for the given key.
+     * On entry, gCacheMutex must be held. key must not exist in the cache. 
+     * On exit, value and creation status placed under key. Soft reference added
+     * to value on successful add. On error sets status.
+     */
+    void _putNew(
+        const CacheKeyBase &key,
+        const SharedObject *value,
+        const UErrorCode creationStatus,
+        UErrorCode &status) const;
+           
+    /**
+     * Places value and status at key if there is no value at key or if cache
+     * entry for key is in progress. Otherwise, it leaves the current value and
+     * status there.
+     * 
+     * On entry. gCacheMutex must not be held. Value must be
+     * included in the reference count of the object to which it points.
+     * 
+     * On exit, value and status are changed to what was already in the cache if
+     * something was there and not in progress. Otherwise, value and status are left
+     * unchanged in which case they are placed in the cache on a best-effort basis.
+     * Caller must call removeRef() on value.
+     */
    void _putIfAbsentAndGet(
            const CacheKeyBase &key,
            const SharedObject *&value,
            UErrorCode &status) const;
-   const UHashElement *_nextElement() const;
+
+    /**
+     * Returns the next element in the cache round robin style.
+     * Returns nullptr if the cache is empty.
+     * On entry, gCacheMutex must be held.
+     */
+    const UHashElement *_nextElement() const;
+   
+   /**
+    * Return the number of cache items that would need to be evicted
+    * to bring usage into conformance with eviction policy.
+    * 
+    * An item corresponds to an entry in the hash table, a hash table element.
+    * 
+    * On entry, gCacheMutex must be held.
+    */
    int32_t _computeCountOfItemsToEvict() const;
+   
+   /**
+    * Run an eviction slice.
+    * On entry, gCacheMutex must be held.
+    * _runEvictionSlice runs a slice of the evict pipeline by examining the next
+    * 10 entries in the cache round robin style evicting them if they are eligible.
+    */
    void _runEvictionSlice() const;
-   void _registerMaster( 
-        const CacheKeyBase *theKey, const SharedObject *value) const;
+ 
+   /**
+    * Register a master cache entry. A master key is the first key to create
+    * a given  SharedObject value. Subsequent keys whose create function
+    * produce referneces to an already existing SharedObject are not masters -
+    * they can be evicted and subsequently recreated.
+    * 
+    * On entry, gCacheMutex must be held.
+    * On exit, items in use count incremented, entry is marked as a master
+    * entry, and value registered with cache so that subsequent calls to
+    * addRef() and removeRef() on it correctly interact with the cache.
+    */
+   void _registerMaster(const CacheKeyBase *theKey, const SharedObject *value) const;
+        
+   /**
+    * Store a value and creation error status in given hash entry.
+    * On entry, gCacheMutex must be held. Hash entry element must be in progress.
+    * value must be non NULL.
+    * On Exit, soft reference added to value. value and status stored in hash
+    * entry. Soft reference removed from previous stored value. Waiting
+    * threads notified.
+    */
    void _put(
            const UHashElement *element,
            const SharedObject *value,
            const UErrorCode status) const;
+    /**
+     * Remove a soft reference, and delete the SharedObject if no references remain.
+     * To be used from within the UnifiedCache implementation only.
+     * gCacheMutex must be held by caller.
+     * @param value the SharedObject to be acted on.
+     */
+   void removeSoftRef(const SharedObject *value) const;
+   
+   /**
+    * Increment the hard reference count of the given SharedObject.
+    * gCacheMutex must be held by the caller.
+    * Update numValuesEvictable on transitions between zero and one reference.
+    * 
+    * @param value The SharedObject to be referenced.
+    * @return the hard reference count after the addition.
+    */
+   int32_t addHardRef(const SharedObject *value) const;
+   
+  /**
+    * Decrement the hard reference count of the given SharedObject.
+    * gCacheMutex must be held by the caller.
+    * Update numValuesEvictable on transitions between one and zero reference.
+    * 
+    * @param value The SharedObject to be referenced.
+    * @return the hard reference count after the removal.
+    */
+   int32_t removeHardRef(const SharedObject *value) const;
+
+   
 #ifdef UNIFIED_CACHE_DEBUG
    void _dumpContents() const;
 #endif
-   static void copyPtr(const SharedObject *src, const SharedObject *&dest);
-   static void clearPtr(const SharedObject *&ptr);
-   static void _fetch(
-           const UHashElement *element,
-           const SharedObject *&value,
-           UErrorCode &status);
-   static UBool _inProgress(const UHashElement *element);
-   static UBool _inProgress(
-           const SharedObject *theValue, UErrorCode creationStatus);
-   static UBool _isEvictable(const UHashElement *element);
+   
+   /**
+    *  Fetch value and error code from a particular hash entry.
+    *  On entry, gCacheMutex must be held. value must be either NULL or must be
+    *  included in the ref count of the object to which it points.
+    *  On exit, value and status set to what is in the hash entry. Caller must
+    *  eventually call removeRef on value.
+    *  If hash entry is in progress, value will be set to gNoValue and status will
+    *  be set to U_ZERO_ERROR.
+    */
+   void _fetch(const UHashElement *element, const SharedObject *&value,
+                       UErrorCode &status) const;
+                       
+    /**
+     * Determine if given hash entry is in progress.
+     * On entry, gCacheMutex must be held.
+     */
+   UBool _inProgress(const UHashElement *element) const;
+   
+   /**
+    * Determine if given hash entry is in progress.
+    * On entry, gCacheMutex must be held.
+    */
+   UBool _inProgress(const SharedObject *theValue, UErrorCode creationStatus) const;
+   
+   /**
+    * Determine if given hash entry is eligible for eviction.
+    * On entry, gCacheMutex must be held.
+    */
+   UBool _isEvictable(const UHashElement *element) const;
 };
 
 U_NAMESPACE_END
diff --git a/icu4c/source/common/uniset_closure.cpp b/icu4c/source/common/uniset_closure.cpp
index 44bb4bc..0b7da79 100644
--- a/icu4c/source/common/uniset_closure.cpp
+++ b/icu4c/source/common/uniset_closure.cpp
@@ -129,7 +129,7 @@
     // _applyPattern calls add() etc., which set pat to empty.
     UnicodeString rebuiltPat;
     RuleCharacterIterator chars(pattern, symbols, pos);
-    applyPattern(chars, symbols, rebuiltPat, options, &UnicodeSet::closeOver, status);
+    applyPattern(chars, symbols, rebuiltPat, options, &UnicodeSet::closeOver, 0, status);
     if (U_FAILURE(status)) return *this;
     if (chars.inVariable()) {
         // syntaxError(chars, "Extra chars in variable value");
diff --git a/icu4c/source/common/uniset_props.cpp b/icu4c/source/common/uniset_props.cpp
index 1c28a2d..6ae6e71 100644
--- a/icu4c/source/common/uniset_props.cpp
+++ b/icu4c/source/common/uniset_props.cpp
@@ -231,7 +231,7 @@
         ucase_addPropertyStarts(&sa, &status);
         break;
     case UPROPS_SRC_BIDI:
-        ubidi_addPropertyStarts(ubidi_getSingleton(), &sa, &status);
+        ubidi_addPropertyStarts(&sa, &status);
         break;
     default:
         status = U_INTERNAL_PROGRAM_ERROR;
@@ -257,6 +257,7 @@
     return i.fSet;
 }
 
+namespace {
 
 // Cache some sets for other services -------------------------------------- ***
 void U_CALLCONV createUni32Set(UErrorCode &errorCode) {
@@ -315,6 +316,8 @@
 // memory leak checker tools
 #define _dbgct(me)
 
+}  // namespace
+
 //----------------------------------------------------------------
 // Constructors &c
 //----------------------------------------------------------------
@@ -382,7 +385,7 @@
     // _applyPattern calls add() etc., which set pat to empty.
     UnicodeString rebuiltPat;
     RuleCharacterIterator chars(pattern, symbols, pos);
-    applyPattern(chars, symbols, rebuiltPat, USET_IGNORE_SPACE, NULL, status);
+    applyPattern(chars, symbols, rebuiltPat, USET_IGNORE_SPACE, NULL, 0, status);
     if (U_FAILURE(status)) return;
     if (chars.inVariable()) {
         // syntaxError(chars, "Extra chars in variable value");
@@ -406,6 +409,8 @@
 // Implementation: Pattern parsing
 //----------------------------------------------------------------
 
+namespace {
+
 /**
  * A small all-inline class to manage a UnicodeSet pointer.  Add
  * operator->() etc. as needed.
@@ -424,6 +429,10 @@
     }
 };
 
+constexpr int32_t MAX_DEPTH = 100;
+
+}  // namespace
+
 /**
  * Parse the pattern from the given RuleCharacterIterator.  The
  * iterator is advanced over the parsed pattern.
@@ -443,8 +452,13 @@
                               UnicodeString& rebuiltPat,
                               uint32_t options,
                               UnicodeSet& (UnicodeSet::*caseClosure)(int32_t attribute),
+                              int32_t depth,
                               UErrorCode& ec) {
     if (U_FAILURE(ec)) return;
+    if (depth > MAX_DEPTH) {
+        ec = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
 
     // Syntax characters: [ ] ^ - & { }
 
@@ -579,7 +593,7 @@
             }
             switch (setMode) {
             case 1:
-                nested->applyPattern(chars, symbols, patLocal, options, caseClosure, ec);
+                nested->applyPattern(chars, symbols, patLocal, options, caseClosure, depth + 1, ec);
                 break;
             case 2:
                 chars.skipIgnored(opts);
@@ -837,6 +851,8 @@
 // Property set implementation
 //----------------------------------------------------------------
 
+namespace {
+
 static UBool numericValueFilter(UChar32 ch, void* context) {
     return u_getNumericValue(ch) == *(double*)context;
 }
@@ -868,6 +884,8 @@
     return uscript_hasScript(ch, *(UScriptCode*)context);
 }
 
+}  // namespace
+
 /**
  * Generic filter-based scanning code for UCD property UnicodeSets.
  */
@@ -924,6 +942,8 @@
     }
 }
 
+namespace {
+
 static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) {
     /* Note: we use ' ' in compiler code page */
     int32_t j = 0;
@@ -941,6 +961,8 @@
     return TRUE;
 }
 
+}  // namespace
+
 //----------------------------------------------------------------
 // Property set API
 //----------------------------------------------------------------
diff --git a/icu4c/source/common/uprops.cpp b/icu4c/source/common/uprops.cpp
index ace3c4d..b76896d 100644
--- a/icu4c/source/common/uprops.cpp
+++ b/icu4c/source/common/uprops.cpp
@@ -38,8 +38,6 @@
 
 U_NAMESPACE_USE
 
-#define GET_BIDI_PROPS() ubidi_getSingleton()
-
 /* general properties API functions ----------------------------------------- */
 
 struct BinaryProperty;
@@ -62,15 +60,15 @@
 }
 
 static UBool isBidiControl(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) {
-    return ubidi_isBidiControl(GET_BIDI_PROPS(), c);
+    return ubidi_isBidiControl(c);
 }
 
 static UBool isMirrored(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) {
-    return ubidi_isMirrored(GET_BIDI_PROPS(), c);
+    return ubidi_isMirrored(c);
 }
 
 static UBool isJoinControl(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) {
-    return ubidi_isJoinControl(GET_BIDI_PROPS(), c);
+    return ubidi_isJoinControl(c);
 }
 
 #if UCONFIG_NO_NORMALIZATION
@@ -329,11 +327,11 @@
 }
 
 static int32_t getBiDiPairedBracketType(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) {
-    return (int32_t)ubidi_getPairedBracketType(GET_BIDI_PROPS(), c);
+    return (int32_t)ubidi_getPairedBracketType(c);
 }
 
 static int32_t biDiGetMaxValue(const IntProperty &/*prop*/, UProperty which) {
-    return ubidi_getMaxValue(GET_BIDI_PROPS(), which);
+    return ubidi_getMaxValue(which);
 }
 
 #if UCONFIG_NO_NORMALIZATION
@@ -351,11 +349,11 @@
 }
 
 static int32_t getJoiningGroup(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) {
-    return ubidi_getJoiningGroup(GET_BIDI_PROPS(), c);
+    return ubidi_getJoiningGroup(c);
 }
 
 static int32_t getJoiningType(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) {
-    return ubidi_getJoiningType(GET_BIDI_PROPS(), c);
+    return ubidi_getJoiningType(c);
 }
 
 static int32_t getNumericType(const IntProperty &/*prop*/, UChar32 c, UProperty /*which*/) {
diff --git a/icu4c/source/common/ushape.cpp b/icu4c/source/common/ushape.cpp
index 90f339b..a640ae2 100644
--- a/icu4c/source/common/ushape.cpp
+++ b/icu4c/source/common/ushape.cpp
@@ -342,18 +342,16 @@
 _shapeToArabicDigitsWithContext(UChar *s, int32_t length,
                                 UChar digitBase,
                                 UBool isLogical, UBool lastStrongWasAL) {
-    const UBiDiProps *bdp;
     int32_t i;
     UChar c;
 
-    bdp=ubidi_getSingleton();
     digitBase-=0x30;
 
     /* the iteration direction depends on the type of input */
     if(isLogical) {
         for(i=0; i<length; ++i) {
             c=s[i];
-            switch(ubidi_getClass(bdp, c)) {
+            switch(ubidi_getClass(c)) {
             case U_LEFT_TO_RIGHT: /* L */
             case U_RIGHT_TO_LEFT: /* R */
                 lastStrongWasAL=FALSE;
@@ -373,7 +371,7 @@
     } else {
         for(i=length; i>0; /* pre-decrement in the body */) {
             c=s[--i];
-            switch(ubidi_getClass(bdp, c)) {
+            switch(ubidi_getClass(c)) {
             case U_LEFT_TO_RIGHT: /* L */
             case U_RIGHT_TO_LEFT: /* R */
                 lastStrongWasAL=FALSE;
diff --git a/icu4c/source/common/usprep.cpp b/icu4c/source/common/usprep.cpp
index d96e825..cc8069d 100644
--- a/icu4c/source/common/usprep.cpp
+++ b/icu4c/source/common/usprep.cpp
@@ -347,10 +347,6 @@
         newProfile->doNFKC = (UBool)((newProfile->indexes[_SPREP_OPTIONS] & _SPREP_NORMALIZATION_ON) > 0);
         newProfile->checkBiDi = (UBool)((newProfile->indexes[_SPREP_OPTIONS] & _SPREP_CHECK_BIDI_ON) > 0);
 
-        if(newProfile->checkBiDi) {
-            newProfile->bdp = ubidi_getSingleton();
-        }
-
         LocalMemory<UStringPrepKey> key;
         LocalMemory<char> keyName;
         LocalMemory<char> keyPath;
@@ -735,7 +731,7 @@
         }
 
         if(profile->checkBiDi) {
-            direction = ubidi_getClass(profile->bdp, ch);
+            direction = ubidi_getClass(ch);
             if(firstCharDir == U_CHAR_DIRECTION_COUNT){
                 firstCharDir = direction;
             }
diff --git a/icu4c/source/common/ustr_wcs.cpp b/icu4c/source/common/ustr_wcs.cpp
index e720549..e9f278e 100644
--- a/icu4c/source/common/ustr_wcs.cpp
+++ b/icu4c/source/common/ustr_wcs.cpp
@@ -342,7 +342,7 @@
         pSrcLimit = src + srcLength;
 
         for(;;){
-            register int32_t nulLen = 0;
+            int32_t nulLen = 0;
 
             /* find nulls in the string */
             while(nulLen<srcLength && pSrc[nulLen++]!=0){
diff --git a/icu4c/source/common/ustrcase.cpp b/icu4c/source/common/ustrcase.cpp
index b1beb34..978bd3b 100644
--- a/icu4c/source/common/ustrcase.cpp
+++ b/icu4c/source/common/ustrcase.cpp
@@ -52,16 +52,8 @@
     return destIndex;
 }
 
-}  // namespace
-
-U_NAMESPACE_END
-
-U_NAMESPACE_USE
-
-/* string casing ------------------------------------------------------------ */
-
 /* Appends a full case mapping result, see UCASE_MAX_STRING_LENGTH. */
-static inline int32_t
+inline int32_t
 appendResult(UChar *dest, int32_t destIndex, int32_t destCapacity,
              int32_t result, const UChar *s,
              int32_t cpLength, uint32_t options, icu::Edits *edits) {
@@ -134,7 +126,7 @@
     return destIndex;
 }
 
-static inline int32_t
+inline int32_t
 appendUChar(UChar *dest, int32_t destIndex, int32_t destCapacity, UChar c) {
     if(destIndex<destCapacity) {
         dest[destIndex]=c;
@@ -144,28 +136,34 @@
     return destIndex+1;
 }
 
-static inline int32_t
-appendUnchanged(UChar *dest, int32_t destIndex, int32_t destCapacity,
-                const UChar *s, int32_t length, uint32_t options, icu::Edits *edits) {
-    if(length>0) {
-        if(edits!=NULL) {
-            edits->addUnchanged(length);
-        }
-        if(options & U_OMIT_UNCHANGED_TEXT) {
-            return destIndex;
-        }
-        if(length>(INT32_MAX-destIndex)) {
-            return -1;  // integer overflow
-        }
-        if((destIndex+length)<=destCapacity) {
-            u_memcpy(dest+destIndex, s, length);
-        }
-        destIndex+=length;
+int32_t
+appendNonEmptyUnchanged(UChar *dest, int32_t destIndex, int32_t destCapacity,
+                        const UChar *s, int32_t length, uint32_t options, icu::Edits *edits) {
+    if(edits!=NULL) {
+        edits->addUnchanged(length);
     }
-    return destIndex;
+    if(options & U_OMIT_UNCHANGED_TEXT) {
+        return destIndex;
+    }
+    if(length>(INT32_MAX-destIndex)) {
+        return -1;  // integer overflow
+    }
+    if((destIndex+length)<=destCapacity) {
+        u_memcpy(dest+destIndex, s, length);
+    }
+    return destIndex + length;
 }
 
-static UChar32 U_CALLCONV
+inline int32_t
+appendUnchanged(UChar *dest, int32_t destIndex, int32_t destCapacity,
+                const UChar *s, int32_t length, uint32_t options, icu::Edits *edits) {
+    if (length <= 0) {
+        return destIndex;
+    }
+    return appendNonEmptyUnchanged(dest, destIndex, destCapacity, s, length, options, edits);
+}
+
+UChar32 U_CALLCONV
 utf16_caseContextIterator(void *context, int8_t dir) {
     UCaseContext *csc=(UCaseContext *)context;
     UChar32 c;
@@ -197,39 +195,205 @@
     return U_SENTINEL;
 }
 
-/*
- * Case-maps [srcStart..srcLimit[ but takes
- * context [0..srcLength[ into account.
+/**
+ * caseLocale >= 0: Lowercases [srcStart..srcLimit[ but takes context [0..srcLength[ into account.
+ * caseLocale < 0: Case-folds [srcStart..srcLimit[.
  */
-static int32_t
-_caseMap(int32_t caseLocale, uint32_t options, UCaseMapFull *map,
-         UChar *dest, int32_t destCapacity,
-         const UChar *src, UCaseContext *csc,
-         int32_t srcStart, int32_t srcLimit,
-         icu::Edits *edits,
-         UErrorCode &errorCode) {
-    /* case mapping loop */
-    int32_t srcIndex=srcStart;
-    int32_t destIndex=0;
-    while(srcIndex<srcLimit) {
-        int32_t cpStart;
-        csc->cpStart=cpStart=srcIndex;
+int32_t toLower(int32_t caseLocale, uint32_t options,
+                UChar *dest, int32_t destCapacity,
+                const UChar *src, UCaseContext *csc, int32_t srcStart, int32_t srcLimit,
+                icu::Edits *edits, UErrorCode &errorCode) {
+    const int8_t *latinToLower;
+    if (caseLocale == UCASE_LOC_ROOT ||
+            (caseLocale >= 0 ?
+                !(caseLocale == UCASE_LOC_TURKISH || caseLocale == UCASE_LOC_LITHUANIAN) :
+                (options & _FOLD_CASE_OPTIONS_MASK) == U_FOLD_CASE_DEFAULT)) {
+        latinToLower = LatinCase::TO_LOWER_NORMAL;
+    } else {
+        latinToLower = LatinCase::TO_LOWER_TR_LT;
+    }
+    const UTrie2 *trie = ucase_getTrie();
+    int32_t destIndex = 0;
+    int32_t prev = srcStart;
+    int32_t srcIndex = srcStart;
+    for (;;) {
+        // fast path for simple cases
+        UChar lead;
+        while (srcIndex < srcLimit) {
+            lead = src[srcIndex];
+            int32_t delta;
+            if (lead < LatinCase::LONG_S) {
+                int8_t d = latinToLower[lead];
+                if (d == LatinCase::EXC) { break; }
+                ++srcIndex;
+                if (d == 0) { continue; }
+                delta = d;
+            } else if (lead >= 0xd800) {
+                break;  // surrogate or higher
+            } else {
+                uint16_t props = UTRIE2_GET16_FROM_U16_SINGLE_LEAD(trie, lead);
+                if (UCASE_HAS_EXCEPTION(props)) { break; }
+                ++srcIndex;
+                if (!UCASE_IS_UPPER_OR_TITLE(props) || (delta = UCASE_GET_DELTA(props)) == 0) {
+                    continue;
+                }
+            }
+            lead += delta;
+            destIndex = appendUnchanged(dest, destIndex, destCapacity,
+                                        src + prev, srcIndex - 1 - prev, options, edits);
+            if (destIndex >= 0) {
+                destIndex = appendUChar(dest, destIndex, destCapacity, lead);
+                if (edits != nullptr) {
+                    edits->addReplace(1, 1);
+                }
+            }
+            if (destIndex < 0) {
+                errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+                return 0;
+            }
+            prev = srcIndex;
+        }
+        if (srcIndex >= srcLimit) {
+            break;
+        }
+        // slow path
+        int32_t cpStart = srcIndex++;
+        UChar trail;
         UChar32 c;
-        U16_NEXT(src, srcIndex, srcLimit, c);
-        csc->cpLimit=srcIndex;
+        if (U16_IS_LEAD(lead) && srcIndex < srcLimit && U16_IS_TRAIL(trail = src[srcIndex])) {
+            c = U16_GET_SUPPLEMENTARY(lead, trail);
+            ++srcIndex;
+        } else {
+            c = lead;
+        }
         const UChar *s;
-        c=map(c, utf16_caseContextIterator, csc, &s, caseLocale);
-        destIndex = appendResult(dest, destIndex, destCapacity, c, s,
-                                 srcIndex - cpStart, options, edits);
-        if (destIndex < 0) {
-            errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
-            return 0;
+        if (caseLocale >= 0) {
+            csc->cpStart = cpStart;
+            csc->cpLimit = srcIndex;
+            c = ucase_toFullLower(c, utf16_caseContextIterator, csc, &s, caseLocale);
+        } else {
+            c = ucase_toFullFolding(c, &s, options);
+        }
+        if (c >= 0) {
+            destIndex = appendUnchanged(dest, destIndex, destCapacity,
+                                        src + prev, cpStart - prev, options, edits);
+            if (destIndex >= 0) {
+                destIndex = appendResult(dest, destIndex, destCapacity, c, s,
+                                         srcIndex - cpStart, options, edits);
+            }
+            if (destIndex < 0) {
+                errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+                return 0;
+            }
+            prev = srcIndex;
         }
     }
-
+    destIndex = appendUnchanged(dest, destIndex, destCapacity,
+                                src + prev, srcIndex - prev, options, edits);
+    if (destIndex < 0) {
+        errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+        return 0;
+    }
     return destIndex;
 }
 
+int32_t toUpper(int32_t caseLocale, uint32_t options,
+                UChar *dest, int32_t destCapacity,
+                const UChar *src, UCaseContext *csc, int32_t srcLength,
+                icu::Edits *edits, UErrorCode &errorCode) {
+    const int8_t *latinToUpper;
+    if (caseLocale == UCASE_LOC_TURKISH) {
+        latinToUpper = LatinCase::TO_UPPER_TR;
+    } else {
+        latinToUpper = LatinCase::TO_UPPER_NORMAL;
+    }
+    const UTrie2 *trie = ucase_getTrie();
+    int32_t destIndex = 0;
+    int32_t prev = 0;
+    int32_t srcIndex = 0;
+    for (;;) {
+        // fast path for simple cases
+        UChar lead;
+        while (srcIndex < srcLength) {
+            lead = src[srcIndex];
+            int32_t delta;
+            if (lead < LatinCase::LONG_S) {
+                int8_t d = latinToUpper[lead];
+                if (d == LatinCase::EXC) { break; }
+                ++srcIndex;
+                if (d == 0) { continue; }
+                delta = d;
+            } else if (lead >= 0xd800) {
+                break;  // surrogate or higher
+            } else {
+                uint16_t props = UTRIE2_GET16_FROM_U16_SINGLE_LEAD(trie, lead);
+                if (UCASE_HAS_EXCEPTION(props)) { break; }
+                ++srcIndex;
+                if (UCASE_GET_TYPE(props) != UCASE_LOWER || (delta = UCASE_GET_DELTA(props)) == 0) {
+                    continue;
+                }
+            }
+            lead += delta;
+            destIndex = appendUnchanged(dest, destIndex, destCapacity,
+                                        src + prev, srcIndex - 1 - prev, options, edits);
+            if (destIndex >= 0) {
+                destIndex = appendUChar(dest, destIndex, destCapacity, lead);
+                if (edits != nullptr) {
+                    edits->addReplace(1, 1);
+                }
+            }
+            if (destIndex < 0) {
+                errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+                return 0;
+            }
+            prev = srcIndex;
+        }
+        if (srcIndex >= srcLength) {
+            break;
+        }
+        // slow path
+        int32_t cpStart;
+        csc->cpStart = cpStart = srcIndex++;
+        UChar trail;
+        UChar32 c;
+        if (U16_IS_LEAD(lead) && srcIndex < srcLength && U16_IS_TRAIL(trail = src[srcIndex])) {
+            c = U16_GET_SUPPLEMENTARY(lead, trail);
+            ++srcIndex;
+        } else {
+            c = lead;
+        }
+        csc->cpLimit = srcIndex;
+        const UChar *s;
+        c = ucase_toFullUpper(c, utf16_caseContextIterator, csc, &s, caseLocale);
+        if (c >= 0) {
+            destIndex = appendUnchanged(dest, destIndex, destCapacity,
+                                        src + prev, cpStart - prev, options, edits);
+            if (destIndex >= 0) {
+                destIndex = appendResult(dest, destIndex, destCapacity, c, s,
+                                         srcIndex - cpStart, options, edits);
+            }
+            if (destIndex < 0) {
+                errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+                return 0;
+            }
+            prev = srcIndex;
+        }
+    }
+    destIndex = appendUnchanged(dest, destIndex, destCapacity,
+                                src + prev, srcIndex - prev, options, edits);
+    if (destIndex < 0) {
+        errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
+        return 0;
+    }
+    return destIndex;
+}
+
+}  // namespace
+
+U_NAMESPACE_END
+
+U_NAMESPACE_USE
+
 #if !UCONFIG_NO_BREAK_ITERATION
 
 U_CFUNC int32_t U_CALLCONV
@@ -344,11 +508,10 @@
                     if((options&U_TITLECASE_NO_LOWERCASE)==0) {
                         /* Normal operation: Lowercase the rest of the word. */
                         destIndex+=
-                            _caseMap(
-                                caseLocale, options, ucase_toFullLower,
+                            toLower(
+                                caseLocale, options,
                                 dest+destIndex, destCapacity-destIndex,
-                                src, &csc,
-                                titleLimit, index,
+                                src, &csc, titleLimit, index,
                                 edits, errorCode);
                         if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
                             errorCode=U_ZERO_ERROR;
@@ -1013,8 +1176,8 @@
     UCaseContext csc=UCASECONTEXT_INITIALIZER;
     csc.p=(void *)src;
     csc.limit=srcLength;
-    int32_t destIndex = _caseMap(
-        caseLocale, options, ucase_toFullLower,
+    int32_t destIndex = toLower(
+        caseLocale, options,
         dest, destCapacity,
         src, &csc, 0, srcLength,
         edits, errorCode);
@@ -1035,10 +1198,10 @@
         UCaseContext csc=UCASECONTEXT_INITIALIZER;
         csc.p=(void *)src;
         csc.limit=srcLength;
-        destIndex = _caseMap(
-            caseLocale, options, ucase_toFullUpper,
+        destIndex = toUpper(
+            caseLocale, options,
             dest, destCapacity,
-            src, &csc, 0, srcLength,
+            src, &csc, srcLength,
             edits, errorCode);
     }
     return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode);
@@ -1050,23 +1213,11 @@
                       const UChar *src, int32_t srcLength,
                       icu::Edits *edits,
                       UErrorCode &errorCode) {
-    /* case mapping loop */
-    int32_t srcIndex = 0;
-    int32_t destIndex = 0;
-    while (srcIndex < srcLength) {
-        int32_t cpStart = srcIndex;
-        UChar32 c;
-        U16_NEXT(src, srcIndex, srcLength, c);
-        const UChar *s;
-        c = ucase_toFullFolding(c, &s, options);
-        destIndex = appendResult(dest, destIndex, destCapacity, c, s,
-                                 srcIndex - cpStart, options, edits);
-        if (destIndex < 0) {
-            errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
-            return 0;
-        }
-    }
-
+    int32_t destIndex = toLower(
+        -1, options,
+        dest, destCapacity,
+        src, nullptr, 0, srcLength,
+        edits, errorCode);
     return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode);
 }
 
diff --git a/icu4c/source/common/utf_impl.cpp b/icu4c/source/common/utf_impl.cpp
index f78c566..9dd241a 100644
--- a/icu4c/source/common/utf_impl.cpp
+++ b/icu4c/source/common/utf_impl.cpp
@@ -238,33 +238,45 @@
     int32_t i=*pi;
     if(U8_IS_TRAIL(c) && i>start) {
         uint8_t b1=s[--i];
-        if(0xc2<=b1 && b1<0xe0) {
-            *pi=i;
-            return ((b1-0xc0)<<6)|(c&0x3f);
+        if(U8_IS_LEAD(b1)) {
+            if(b1<0xe0) {
+                *pi=i;
+                return ((b1-0xc0)<<6)|(c&0x3f);
+            } else if(b1<0xf0 ? U8_IS_VALID_LEAD3_AND_T1(b1, c) : U8_IS_VALID_LEAD4_AND_T1(b1, c)) {
+                // Truncated 3- or 4-byte sequence.
+                *pi=i;
+                return errorValue(1, strict);
+            }
         } else if(U8_IS_TRAIL(b1) && i>start) {
             // Extract the value bits from the last trail byte.
             c&=0x3f;
             uint8_t b2=s[--i];
-            if(0xe0<=b2 && b2<0xf0) {
-                b2&=0xf;
-                if(strict!=-2) {
-                    if(U8_IS_VALID_LEAD3_AND_T1(b2, b1)) {
-                        *pi=i;
-                        c=(b2<<12)|((b1&0x3f)<<6)|c;
-                        if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) {
-                            return c;
-                        } else {
-                            // strict: forbid non-characters like U+fffe
-                            return errorValue(2, strict);
+            if(0xe0<=b2 && b2<=0xf4) {
+                if(b2<0xf0) {
+                    b2&=0xf;
+                    if(strict!=-2) {
+                        if(U8_IS_VALID_LEAD3_AND_T1(b2, b1)) {
+                            *pi=i;
+                            c=(b2<<12)|((b1&0x3f)<<6)|c;
+                            if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) {
+                                return c;
+                            } else {
+                                // strict: forbid non-characters like U+fffe
+                                return errorValue(2, strict);
+                            }
+                        }
+                    } else {
+                        // strict=-2 -> lenient: allow surrogates
+                        b1-=0x80;
+                        if((b2>0 || b1>=0x20)) {
+                            *pi=i;
+                            return (b2<<12)|(b1<<6)|c;
                         }
                     }
-                } else {
-                    // strict=-2 -> lenient: allow surrogates
-                    b1-=0x80;
-                    if((b2>0 || b1>=0x20)) {
-                        *pi=i;
-                        return (b2<<12)|(b1<<6)|c;
-                    }
+                } else if(U8_IS_VALID_LEAD4_AND_T1(b2, b1)) {
+                    // Truncated 4-byte sequence.
+                    *pi=i;
+                    return errorValue(2, strict);
                 }
             } else if(U8_IS_TRAIL(b2) && i>start) {
                 uint8_t b3=s[--i];
@@ -281,16 +293,7 @@
                         }
                     }
                 }
-            } else if(0xf0<=b2 && b2<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b2, b1)) {
-                // Truncated 4-byte sequence.
-                *pi=i;
-                return errorValue(2, strict);
             }
-        } else if((0xe0<=b1 && b1<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b1, c)) ||
-                (0xf0<=b1 && b1<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b1, c))) {
-            // Truncated 3- or 4-byte sequence.
-            *pi=i;
-            return errorValue(1, strict);
         }
     }
     return errorValue(0, strict);
@@ -303,29 +306,23 @@
     uint8_t c=s[i];
     if(U8_IS_TRAIL(c) && i>start) {
         uint8_t b1=s[--i];
-        if(0xc2<=b1 && b1<0xe0) {
-            return i;
+        if(U8_IS_LEAD(b1)) {
+            if(b1<0xe0 ||
+                    (b1<0xf0 ? U8_IS_VALID_LEAD3_AND_T1(b1, c) : U8_IS_VALID_LEAD4_AND_T1(b1, c))) {
+                return i;
+            }
         } else if(U8_IS_TRAIL(b1) && i>start) {
             uint8_t b2=s[--i];
-            if(0xe0<=b2 && b2<0xf0) {
-                if(U8_IS_VALID_LEAD3_AND_T1(b2, b1)) {
+            if(0xe0<=b2 && b2<=0xf4) {
+                if(b2<0xf0 ? U8_IS_VALID_LEAD3_AND_T1(b2, b1) : U8_IS_VALID_LEAD4_AND_T1(b2, b1)) {
                     return i;
                 }
             } else if(U8_IS_TRAIL(b2) && i>start) {
                 uint8_t b3=s[--i];
-                if(0xf0<=b3 && b3<=0xf4) {
-                    if(U8_IS_VALID_LEAD4_AND_T1(b3, b2)) {
-                        return i;
-                    }
+                if(0xf0<=b3 && b3<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b3, b2)) {
+                    return i;
                 }
-            } else if(0xf0<=b2 && b2<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b2, b1)) {
-                // Truncated 4-byte sequence.
-                return i;
             }
-        } else if((0xe0<=b1 && b1<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b1, c)) ||
-                (0xf0<=b1 && b1<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b1, c))) {
-            // Truncated 3- or 4-byte sequence.
-            return i;
         }
     }
     return orig_i;
diff --git a/icu4c/source/common/utrie.h b/icu4c/source/common/utrie.h
index 9c5382c..641027a 100644
--- a/icu4c/source/common/utrie.h
+++ b/icu4c/source/common/utrie.h
@@ -556,7 +556,7 @@
      * Index values at build-time are 32 bits wide for easier processing.
      * Bit 31 is set if the data block is used by multiple index values (from utrie_setRange()).
      */
-    int32_t index[UTRIE_MAX_INDEX_LENGTH];
+    int32_t index[UTRIE_MAX_INDEX_LENGTH+UTRIE_SURROGATE_BLOCK_COUNT];
     uint32_t *data;
 
     uint32_t leadUnitValue;
diff --git a/icu4c/source/common/uts46.cpp b/icu4c/source/common/uts46.cpp
index 9b8d3de..5a23572 100644
--- a/icu4c/source/common/uts46.cpp
+++ b/icu4c/source/common/uts46.cpp
@@ -1126,7 +1126,6 @@
 
 UBool
 UTS46::isLabelOkContextJ(const UChar *label, int32_t labelLength) const {
-    const UBiDiProps *bdp=ubidi_getSingleton();
     // [IDNA2008-Tables]
     // 200C..200D  ; CONTEXTJ    # ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
     for(int32_t i=0; i<labelLength; ++i) {
@@ -1148,7 +1147,7 @@
             }
             // check precontext (Joining_Type:{L,D})(Joining_Type:T)*
             for(;;) {
-                UJoiningType type=ubidi_getJoiningType(bdp, c);
+                UJoiningType type=ubidi_getJoiningType(c);
                 if(type==U_JT_TRANSPARENT) {
                     if(j==0) {
                         return FALSE;
@@ -1166,7 +1165,7 @@
                     return FALSE;
                 }
                 U16_NEXT_UNSAFE(label, j, c);
-                UJoiningType type=ubidi_getJoiningType(bdp, c);
+                UJoiningType type=ubidi_getJoiningType(c);
                 if(type==U_JT_TRANSPARENT) {
                     // just skip this character
                 } else if(type==U_JT_RIGHT_JOINING || type==U_JT_DUAL_JOINING) {
diff --git a/icu4c/source/common/utypes.cpp b/icu4c/source/common/utypes.cpp
index 8f5791b..5d6a050 100644
--- a/icu4c/source/common/utypes.cpp
+++ b/icu4c/source/common/utypes.cpp
@@ -125,7 +125,8 @@
     "U_UNDEFINED_KEYWORD",
     "U_DEFAULT_KEYWORD_MISSING",
     "U_DECIMAL_NUMBER_SYNTAX_ERROR",
-    "U_FORMAT_INEXACT_ERROR"
+    "U_FORMAT_INEXACT_ERROR",
+    "U_NUMBER_ARG_OUTOFBOUNDS_ERROR"
 };
 
 static const char * const
diff --git a/icu4c/source/config.guess b/icu4c/source/config.guess
index 9afd676..31e01ef 100644
--- a/icu4c/source/config.guess
+++ b/icu4c/source/config.guess
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2017 Free Software Foundation, Inc.
 
-timestamp='2013-11-29'
+timestamp='2017-11-07'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -24,12 +24,12 @@
 # program.  This Exception is an additional permission under section 7
 # of the GNU General Public License, version 3 ("GPLv3").
 #
-# Originally written by Per Bothner.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 #
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+# Please send patches to <config-patches@gnu.org>.
 
 
 me=`echo "$0" | sed -e 's,.*/,,'`
@@ -39,7 +39,7 @@
 
 Output the configuration name of the system \`$me' is run on.
 
-Operation modes:
+Options:
   -h, --help         print this help, then exit
   -t, --time-stamp   print date of last modification, then exit
   -v, --version      print version number, then exit
@@ -50,7 +50,7 @@
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2017 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -149,7 +149,7 @@
 	LIBC=gnu
 	#endif
 	EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
 	;;
 esac
 
@@ -168,19 +168,29 @@
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
 	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
+	# to ELF recently (or will in the future) and ABI.
 	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		os=netbsdelf
+		;;
 	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
@@ -197,6 +207,13 @@
 		os=netbsd
 		;;
 	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		;;
+	esac
 	# The OS release
 	# Debian GNU/NetBSD machines have a different userland, and
 	# thus, need a distinct triplet. However, they do not need
@@ -207,13 +224,13 @@
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
 	exit ;;
     *:Bitrig:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -223,6 +240,13 @@
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
 	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+	exit ;;
+    *:MidnightBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-midnightbsd${UNAME_RELEASE}
+	exit ;;
     *:ekkoBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 	exit ;;
@@ -235,6 +259,12 @@
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
+    *:Redox:*:*)
+	echo ${UNAME_MACHINE}-unknown-redox
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
@@ -251,55 +281,46 @@
 	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
 	case "$ALPHA_CPU_TYPE" in
 	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
+		UNAME_MACHINE=alphaev5 ;;
 	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
+		UNAME_MACHINE=alphaev56 ;;
 	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
+		UNAME_MACHINE=alphapca56 ;;
 	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
+		UNAME_MACHINE=alphapca57 ;;
 	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
+		UNAME_MACHINE=alphaev6 ;;
 	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
+		UNAME_MACHINE=alphaev67 ;;
 	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
+		UNAME_MACHINE=alphaev69 ;;
 	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
+		UNAME_MACHINE=alphaev7 ;;
 	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
+		UNAME_MACHINE=alphaev79 ;;
 	esac
 	# A Pn.n version is a patched version.
 	# A Vn.n version is a released version.
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
 	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
 	exitcode=$?
 	trap '' 0
 	exit $exitcode ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
     Amiga*:UNIX_System_V:4.0:*)
 	echo m68k-unknown-sysv4
 	exit ;;
@@ -359,16 +380,16 @@
 	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	eval $set_cc_for_build
-	SUN_ARCH="i386"
+	SUN_ARCH=i386
 	# If there is a compiler, see if it is configured for 64-bit objects.
 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
 	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		grep IS_64BIT_ARCH >/dev/null
 	    then
-		SUN_ARCH="x86_64"
+		SUN_ARCH=x86_64
 	    fi
 	fi
 	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
@@ -393,7 +414,7 @@
 	exit ;;
     sun*:*:4.2BSD:*)
 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
 	case "`/bin/arch`" in
 	    sun3)
 		echo m68k-sun-sunos${UNAME_RELEASE}
@@ -461,13 +482,13 @@
 #endif
 	#if defined (host_mips) && defined (MIPSEB)
 	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
 	#endif
 	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
 	#endif
 	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	  printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
 	#endif
 	#endif
 	  exit (-1);
@@ -579,8 +600,9 @@
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
@@ -589,7 +611,7 @@
     *:AIX:*:*)
 	echo rs6000-ibm-aix
 	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
 	echo romp-ibm-bsd4.4
 	exit ;;
     ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
@@ -610,20 +632,20 @@
     9000/[34678]??:HP-UX:*:*)
 	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
 	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/31?)            HP_ARCH=m68000 ;;
+	    9000/[34]??)         HP_ARCH=m68k ;;
 	    9000/[678][0-9][0-9])
 		if [ -x /usr/bin/getconf ]; then
 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
 		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
 		    case "${sc_cpu_version}" in
-		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
 		      532)                      # CPU_PA_RISC2_0
 			case "${sc_kernel_bits}" in
-			  32) HP_ARCH="hppa2.0n" ;;
-			  64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
 			esac ;;
 		    esac
 		fi
@@ -662,11 +684,11 @@
 		    exit (0);
 		}
 EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 		    test -z "$HP_ARCH" && HP_ARCH=hppa
 		fi ;;
 	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
+	if [ ${HP_ARCH} = hppa2.0w ]
 	then
 	    eval $set_cc_for_build
 
@@ -679,12 +701,12 @@
 	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
 	    # => hppa64-hp-hpux11.23
 
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
 		grep -q __LP64__
 	    then
-		HP_ARCH="hppa2.0w"
+		HP_ARCH=hppa2.0w
 	    else
-		HP_ARCH="hppa64"
+		HP_ARCH=hppa64
 	    fi
 	fi
 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
@@ -724,7 +746,7 @@
 		{ echo "$SYSTEM_NAME"; exit; }
 	echo unknown-hitachi-hiuxwe2
 	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
 	echo hppa1.1-hp-bsd
 	exit ;;
     9000/8??:4.3bsd:*:*)
@@ -733,7 +755,7 @@
     *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
 	echo hppa1.0-hp-mpeix
 	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
 	echo hppa1.1-hp-osf
 	exit ;;
     hp8??:OSF1:*:*)
@@ -789,14 +811,14 @@
 	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
 	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
 	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     5000:UNIX_System_V:4.*:*)
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
 	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
@@ -812,10 +834,11 @@
 	UNAME_PROCESSOR=`/usr/bin/uname -p`
 	case ${UNAME_PROCESSOR} in
 	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+		UNAME_PROCESSOR=x86_64 ;;
+	    i386)
+		UNAME_PROCESSOR=i586 ;;
 	esac
+	echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 	exit ;;
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
@@ -826,13 +849,9 @@
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
-    i*:MSYS*:*)
+    *:MSYS*:*)
 	echo ${UNAME_MACHINE}-pc-msys
 	exit ;;
-    i*:windows32*:*)
-	# uname -m includes "-pc" on this system.
-	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
     i*:PW*:*)
 	echo ${UNAME_MACHINE}-pc-pw32
 	exit ;;
@@ -848,27 +867,12 @@
 		echo ia64-unknown-interix${UNAME_RELEASE}
 		exit ;;
 	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    8664:Windows_NT:*)
-	echo x86_64-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
     i*:UWIN*:*)
 	echo ${UNAME_MACHINE}-pc-uwin
 	exit ;;
     amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
 	echo x86_64-unknown-cygwin
 	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
     prep*:SunOS:5.*:*)
 	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
@@ -878,7 +882,7 @@
 	exit ;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
 	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
@@ -901,7 +905,7 @@
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
 	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     arc:Linux:*:* | arceb:Linux:*:*)
@@ -932,6 +936,9 @@
     crisv32:Linux:*:*)
 	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     frv:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
@@ -944,6 +951,9 @@
     ia64:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
+    k1om:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     m32r*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
@@ -969,10 +979,13 @@
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
 	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
-    or1k:Linux:*:*)
+    mips64el:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
-    or32:Linux:*:*)
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     padre:Linux:*:*)
@@ -1001,6 +1014,9 @@
     ppcle:Linux:*:*)
 	echo powerpcle-unknown-linux-${LIBC}
 	exit ;;
+    riscv32:Linux:*:* | riscv64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
 	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 	exit ;;
@@ -1020,7 +1036,7 @@
 	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
@@ -1059,7 +1075,7 @@
     i*86:*DOS:*:*)
 	echo ${UNAME_MACHINE}-pc-msdosdjgpp
 	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+    i*86:*:4.*:*)
 	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
 	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
 		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
@@ -1099,7 +1115,7 @@
 	# uname -m prints for DJGPP always 'pc', but it prints nothing about
 	# the processor, so we play safe by assuming i586.
 	# Note: whatever this is, it MUST be the same as what config.sub
-	# prints for the "djgpp" host, or else GDB configury will decide that
+	# prints for the "djgpp" host, or else GDB configure will decide that
 	# this is a cross-build.
 	echo i586-pc-msdosdjgpp
 	exit ;;
@@ -1248,6 +1264,9 @@
     SX-8R:SUPER-UX:*:*)
 	echo sx8r-nec-superux${UNAME_RELEASE}
 	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux${UNAME_RELEASE}
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 	exit ;;
@@ -1261,16 +1280,23 @@
 	    UNAME_PROCESSOR=powerpc
 	fi
 	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
-	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		    grep IS_64BIT_ARCH >/dev/null
+		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		       grep IS_64BIT_ARCH >/dev/null
 		then
 		    case $UNAME_PROCESSOR in
 			i386) UNAME_PROCESSOR=x86_64 ;;
 			powerpc) UNAME_PROCESSOR=powerpc64 ;;
 		    esac
 		fi
+		# On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+		if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		       grep IS_PPC >/dev/null
+		then
+		    UNAME_PROCESSOR=powerpc
+		fi
 	    fi
 	elif test "$UNAME_PROCESSOR" = i386 ; then
 	    # Avoid executing cc on OS X 10.9, as it ships with a stub
@@ -1285,7 +1311,7 @@
 	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
+	if test "$UNAME_PROCESSOR" = x86; then
 		UNAME_PROCESSOR=i386
 		UNAME_MACHINE=pc
 	fi
@@ -1294,15 +1320,18 @@
     *:QNX:*:4*)
 	echo i386-pc-qnx
 	exit ;;
-    NEO-?:NONSTOP_KERNEL:*:*)
+    NEO-*:NONSTOP_KERNEL:*:*)
 	echo neo-tandem-nsk${UNAME_RELEASE}
 	exit ;;
     NSE-*:NONSTOP_KERNEL:*:*)
 	echo nse-tandem-nsk${UNAME_RELEASE}
 	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
+    NSR-*:NONSTOP_KERNEL:*:*)
 	echo nsr-tandem-nsk${UNAME_RELEASE}
 	exit ;;
+    NSX-*:NONSTOP_KERNEL:*:*)
+	echo nsx-tandem-nsk${UNAME_RELEASE}
+	exit ;;
     *:NonStop-UX:*:*)
 	echo mips-compaq-nonstopux
 	exit ;;
@@ -1316,7 +1345,7 @@
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
 	# operating systems.
-	if test "$cputype" = "386"; then
+	if test "$cputype" = 386; then
 	    UNAME_MACHINE=i386
 	else
 	    UNAME_MACHINE="$cputype"
@@ -1358,7 +1387,7 @@
 	echo i386-pc-xenix
 	exit ;;
     i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
 	exit ;;
     i*86:rdos:*:*)
 	echo ${UNAME_MACHINE}-pc-rdos
@@ -1369,171 +1398,37 @@
     x86_64:VMkernel:*:*)
 	echo ${UNAME_MACHINE}-unknown-esx
 	exit ;;
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
+	exit ;;
 esac
 
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-	"4"
-#else
-	""
-#endif
-	); exit (0);
-#endif
-#endif
+echo "$0: unable to guess system type" >&2
 
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}" in
+    mips:Linux | mips64:Linux)
+	# If we got here on MIPS GNU/Linux, output extra information.
+	cat >&2 <<EOF
 
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
 EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
+	;;
+esac
 
 cat >&2 <<EOF
-$0: unable to guess system type
 
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
 
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
 
 config.guess timestamp = $timestamp
 
@@ -1561,7 +1456,7 @@
 exit 1
 
 # Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'write-file-functions 'time-stamp)
 # time-stamp-start: "timestamp='"
 # time-stamp-format: "%:y-%02m-%02d"
 # time-stamp-end: "'"
diff --git a/icu4c/source/config.sub b/icu4c/source/config.sub
index 61cb4bc..fb57947 100644
--- a/icu4c/source/config.sub
+++ b/icu4c/source/config.sub
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2017 Free Software Foundation, Inc.
 
-timestamp='2013-10-01'
+timestamp='2017-11-04'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -25,7 +25,7 @@
 # of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+# Please send patches to <config-patches@gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -33,7 +33,7 @@
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -53,12 +53,11 @@
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 
 Canonicalize a configuration name.
 
-Operation modes:
+Options:
   -h, --help         print this help, then exit
   -t, --time-stamp   print date of last modification, then exit
   -v, --version      print version number, then exit
@@ -68,7 +67,7 @@
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2017 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -117,8 +116,8 @@
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
   linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+  kopensolaris*-gnu* | cloudabi*-eabi* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
@@ -230,9 +229,6 @@
 	-ptx*)
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
 		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
 	-psos*)
 		os=-psos
 		;;
@@ -255,15 +251,16 @@
 	| arc | arceb \
 	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
 	| avr | avr32 \
+	| ba \
 	| be32 | be64 \
 	| bfin \
 	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
-	| fido | fr30 | frv \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| hexagon \
-	| i370 | i860 | i960 | ia64 \
+	| i370 | i860 | i960 | ia16 | ia64 \
 	| ip2k | iq2000 \
 	| k1om \
 	| le32 | le64 \
@@ -283,8 +280,10 @@
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
 	| mipsr5900 | mipsr5900el \
@@ -296,14 +295,15 @@
 	| nds32 | nds32le | nds32be \
 	| nios | nios2 | nios2eb | nios2el \
 	| ns16k | ns32k \
-	| open8 \
-	| or1k | or32 \
+	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pru \
 	| pyramid \
+	| riscv32 | riscv64 \
 	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -311,7 +311,8 @@
 	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 	| ubicom32 \
 	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
-	| we32k \
+	| visium \
+	| wasm32 \
 	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
 		basic_machine=$basic_machine-unknown
@@ -325,6 +326,9 @@
 	c6x)
 		basic_machine=tic6x-unknown
 		;;
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
 	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
@@ -370,17 +374,18 @@
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
 	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| hexagon-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
+	| i*86-* | i860-* | i960-* | ia16-* | ia64-* \
 	| ip2k-* | iq2000-* \
 	| k1om-* \
 	| le32-* | le64-* \
@@ -402,8 +407,10 @@
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 	| mipsr5900-* | mipsr5900el-* \
@@ -415,16 +422,19 @@
 	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
 	| open8-* \
+	| or1k*-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pru-* \
 	| pyramid-* \
+	| riscv32-* | riscv64-* \
 	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
 	| tahoe-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tile*-* \
@@ -432,6 +442,8 @@
 	| ubicom32-* \
 	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
 	| vax-* \
+	| visium-* \
+	| wasm32-* \
 	| we32k-* \
 	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
@@ -508,6 +520,9 @@
 		basic_machine=i386-pc
 		os=-aros
 		;;
+	asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -624,10 +639,18 @@
 		basic_machine=rs6000-bull
 		os=-bosx
 		;;
-	dpx2* | dpx2*-bull)
+	dpx2*)
 		basic_machine=m68k-bull
 		os=-sysv3
 		;;
+	e500v[12])
+		basic_machine=powerpc-unknown
+		os=$os"spe"
+		;;
+	e500v[12]-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=$os"spe"
+		;;
 	ebmon29k)
 		basic_machine=a29k-amd
 		os=-ebmon
@@ -769,6 +792,9 @@
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
 	m68knommu)
 		basic_machine=m68k-unknown
 		os=-linux
@@ -824,6 +850,10 @@
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -871,7 +901,7 @@
 		basic_machine=v70-nec
 		os=-sysv
 		;;
-	next | m*-next )
+	next | m*-next)
 		basic_machine=m68k-next
 		case $os in
 		    -nextstep* )
@@ -916,6 +946,9 @@
 	nsr-tandem)
 		basic_machine=nsr-tandem
 		;;
+	nsx-tandem)
+		basic_machine=nsx-tandem
+		;;
 	op50n-* | op60c-*)
 		basic_machine=hppa1.1-oki
 		os=-proelf
@@ -1000,7 +1033,7 @@
 	ppc-* | ppcbe-*)
 		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
+	ppcle | powerpclittle)
 		basic_machine=powerpcle-unknown
 		;;
 	ppcle-* | powerpclittle-*)
@@ -1010,7 +1043,7 @@
 		;;
 	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+	ppc64le | powerpc64little)
 		basic_machine=powerpc64le-unknown
 		;;
 	ppc64le-* | powerpc64little-*)
@@ -1211,6 +1244,9 @@
 		basic_machine=a29k-wrs
 		os=-vxworks
 		;;
+	wasm32)
+		basic_machine=wasm32-unknown
+		;;
 	w65*)
 		basic_machine=w65-wdc
 		os=-none
@@ -1219,6 +1255,9 @@
 		basic_machine=hppa1.1-winbond
 		os=-proelf
 		;;
+	x64)
+		basic_machine=x86_64-pc
+		;;
 	xbox)
 		basic_machine=i686-pc
 		os=-mingw32
@@ -1326,8 +1365,8 @@
 if [ x"$os" != x"" ]
 then
 case $os in
-	# First match some system type aliases
-	# that might get confused with valid system types.
+	# First match some system type aliases that might get confused
+	# with valid system types.
 	# -solaris* is a basic system type, with this one exception.
 	-auroraux)
 		os=-auroraux
@@ -1347,36 +1386,37 @@
 	-gnu/linux*)
 		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
 		;;
-	# First accept the basic system types.
+	# Now accept the basic system types.
 	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
+	# Each alternative MUST end in a * to match a version number.
 	# -sysv* is not here because it comes later, after sysvr4.
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
 	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -bitrig* | -openbsd* | -solidbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
 	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+	      | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1451,7 +1491,7 @@
 	-nova*)
 		os=-rtmk-nova
 		;;
-	-ns2 )
+	-ns2)
 		os=-nextstep2
 		;;
 	-nsk*)
@@ -1508,6 +1548,8 @@
 		;;
 	-nacl*)
 		;;
+	-ios)
+		;;
 	-none)
 		;;
 	*)
@@ -1594,9 +1636,6 @@
 	mips*-*)
 		os=-elf
 		;;
-	or1k-*)
-		os=-elf
-		;;
 	or32-*)
 		os=-coff
 		;;
@@ -1606,6 +1645,9 @@
 	sparc-* | *-sun)
 		os=-sunos4.1.1
 		;;
+	pru-*)
+		os=-elf
+		;;
 	*-be)
 		os=-beos
 		;;
@@ -1651,7 +1693,7 @@
 	m88k-omron*)
 		os=-luna
 		;;
-	*-next )
+	*-next)
 		os=-nextstep
 		;;
 	*-sequent)
@@ -1786,7 +1828,7 @@
 exit
 
 # Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'write-file-functions 'time-stamp)
 # time-stamp-start: "timestamp='"
 # time-stamp-format: "%:y-%02m-%02d"
 # time-stamp-end: "'"
diff --git a/icu4c/source/config/dist.mk b/icu4c/source/config/dist.mk
index ccc5837..3e6e42e 100644
--- a/icu4c/source/config/dist.mk
+++ b/icu4c/source/config/dist.mk
@@ -19,7 +19,7 @@
 DISTY_TMP=dist/tmp
 DISTY_ICU=$(DISTY_TMP)/icu
 DISTY_DATA=$(DISTY_ICU)/source/data
-DISTY_RMV=brkitr coll curr lang locales mappings rbnf region translit xml zone misc unit
+DISTY_RMV=brkitr coll curr lang locales mappings rbnf region translit xml zone misc/*.txt misc/*.mk unit
 DISTY_RMDIR=$(DISTY_RMV:%=$(DISTY_DATA)/%)
 DISTY_IN=$(DISTY_DATA)/in
 DOCZIP=icu-docs.zip
@@ -49,7 +49,7 @@
 
 $(DISTY_DOC_ZIP):  $(DOCZIP) $(DISTY_FILE_DIR)
 	cp $(DOCZIP) $(DISTY_DOC_ZIP)
-	ln -sf $(DISTY_DOC_ZIP) $(DISTY_FILE_DIR)/icu4c-docs.zip
+	ln -sf $(shell basename $(DISTY_DOC_ZIP)) $(DISTY_FILE_DIR)/icu4c-docs.zip
 
 $(DISTY_DAT): 
 	echo Missing $@
@@ -74,14 +74,14 @@
 	$(MKINSTALLDIRS) $(DISTY_IN)
 	echo DISTY_DAT=$(DISTY_DAT)
 	cp $(DISTY_DAT) $(DISTY_IN)
-	( cd $(DISTY_TMP)/icu ; python as_is/bomlist.py > as_is/bomlist.txt || rm -f as_is/bomlist.txt )
-	( cd $(DISTY_TMP) ; zip -rlq $(DISTY_FILE_ZIP) icu )
 	$(RMV) $(DISTY_RMDIR)
 	( cd $(DISTY_TMP)/icu ; python as_is/bomlist.py > as_is/bomlist.txt || rm -f as_is/bomlist.txt )
 	( cd $(DISTY_TMP) ; tar cfpz $(DISTY_FILE_TGZ) icu )
-	ln -sf $(DISTY_FILE_ZIP) $(DISTY_FILE_DIR)/icu4c-src.zip
-	ln -sf $(DISTY_FILE_TGZ) $(DISTY_FILE_DIR)/icu4c-src.tgz
-	ln -sf $(DISTY_DATA_ZIP) $(DISTY_FILE_DIR)/icu4c-data.zip
+	( cd $(DISTY_TMP) ; zip -rlq $(DISTY_FILE_ZIP) icu )
+	$(RMV) $(DISTY_TMP)
+	ln -sf $(shell basename $(DISTY_FILE_ZIP)) $(DISTY_FILE_DIR)/icu4c-src.zip
+	ln -sf $(shell basename $(DISTY_FILE_TGZ)) $(DISTY_FILE_DIR)/icu4c-src.tgz
+	ln -sf $(shell basename $(DISTY_DATA_ZIP)) $(DISTY_FILE_DIR)/icu4c-data.zip
 	ls -l $(DISTY_FILE_TGZ) $(DISTY_FILE_ZIP) $(DISTY_DATA_ZIP)
 
 
diff --git a/icu4c/source/configure b/icu4c/source/configure
index 36c06f9..56f87c5 100755
--- a/icu4c/source/configure
+++ b/icu4c/source/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for ICU 60.1.
+# Generated by GNU Autoconf 2.69 for ICU 61.1.
 #
 # Report bugs to <http://icu-project.org/bugs>.
 #
@@ -582,8 +582,8 @@
 # Identity of this package.
 PACKAGE_NAME='ICU'
 PACKAGE_TARNAME='International Components for Unicode'
-PACKAGE_VERSION='60.1'
-PACKAGE_STRING='ICU 60.1'
+PACKAGE_VERSION='61.1'
+PACKAGE_STRING='ICU 61.1'
 PACKAGE_BUGREPORT='http://icu-project.org/bugs'
 PACKAGE_URL='http://icu-project.org'
 
@@ -1368,7 +1368,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures ICU 60.1 to adapt to many kinds of systems.
+\`configure' configures ICU 61.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1435,7 +1435,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of ICU 60.1:";;
+     short | recursive ) echo "Configuration of ICU 61.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1571,7 +1571,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-ICU configure 60.1
+ICU configure 61.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2263,7 +2263,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by ICU $as_me 60.1, which was
+It was created by ICU $as_me 61.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -8409,7 +8409,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by ICU $as_me 60.1, which was
+This file was extended by ICU $as_me 61.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8463,7 +8463,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-ICU config.status 60.1
+ICU config.status 61.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/icu4c/source/data/Makefile.in b/icu4c/source/data/Makefile.in
index dc336d1..c38b0d4 100644
--- a/icu4c/source/data/Makefile.in
+++ b/icu4c/source/data/Makefile.in
@@ -595,7 +595,7 @@
 # RES FILES
 
 ### curr res
-$(CURRBLDDIR)/%.res: $(CURRSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES)
+$(CURRBLDDIR)/%.res: $(CURRSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(CURRSRCDIR) -d $(CURRBLDDIR) $(<F)
 
 # copy the curr/pool.res file from the source folder to the build output folder
@@ -603,7 +603,7 @@
 $(CURRBLDDIR)/pool.res: $(CURRSRCDIR)/pool.res
 	$(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(CURRSRCDIR)/pool.res $(CURRBLDDIR)/pool.res
 
-$(CURRBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(CURR_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
+$(CURRBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(CURR_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(CURR_TREE) -d $(CURRBLDDIR) $(INDEX_NAME).txt
 
 $(CURR_INDEX_FILE): $(SRCLISTDEPS)
@@ -619,7 +619,7 @@
 	echo "}" >> $@;
 
 ### lang res
-$(LANGBLDDIR)/%.res: $(LANGSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES)
+$(LANGBLDDIR)/%.res: $(LANGSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(LANGSRCDIR) -d $(LANGBLDDIR) $(<F)
 
 # copy the lang/pool.res file from the source folder to the build output folder
@@ -627,7 +627,7 @@
 $(LANGBLDDIR)/pool.res: $(LANGSRCDIR)/pool.res
 	$(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(LANGSRCDIR)/pool.res $(LANGBLDDIR)/pool.res
 
-$(LANGBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(LANG_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
+$(LANGBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(LANG_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(LANG_TREE) -d $(LANGBLDDIR) $(INDEX_NAME).txt
 
 $(LANG_INDEX_FILE): $(SRCLISTDEPS)
@@ -643,7 +643,7 @@
 	echo "}" >> $@;
 
 ### region res
-$(REGIONBLDDIR)/%.res: $(REGIONSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES)
+$(REGIONBLDDIR)/%.res: $(REGIONSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(REGIONSRCDIR) -d $(REGIONBLDDIR) $(<F)
 
 # copy the region/pool.res file from the source folder to the build output folder
@@ -651,7 +651,7 @@
 $(REGIONBLDDIR)/pool.res: $(REGIONSRCDIR)/pool.res
 	$(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(REGIONSRCDIR)/pool.res $(REGIONBLDDIR)/pool.res
 
-$(REGIONBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(REGION_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
+$(REGIONBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(REGION_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(REGION_TREE) -d $(REGIONBLDDIR) $(INDEX_NAME).txt
 
 $(REGION_INDEX_FILE): $(SRCLISTDEPS)
@@ -667,7 +667,7 @@
 	echo "}" >> $@;
 
 ### zone res
-$(ZONEBLDDIR)/%.res: $(ZONESRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES)
+$(ZONEBLDDIR)/%.res: $(ZONESRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(ZONESRCDIR) -d $(ZONEBLDDIR) $(<F)
 
 # copy the zone/pool.res file from the source folder to the build output folder
@@ -675,7 +675,7 @@
 $(ZONEBLDDIR)/pool.res: $(ZONESRCDIR)/pool.res
 	$(INVOKE) $(TOOLBINDIR)/icupkg -t$(ICUDATA_CHAR) $(ZONESRCDIR)/pool.res $(ZONEBLDDIR)/pool.res
 
-$(ZONEBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(ZONE_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
+$(ZONEBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(ZONE_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(ZONE_TREE) -d $(ZONEBLDDIR) $(INDEX_NAME).txt
 
 $(ZONE_INDEX_FILE): $(SRCLISTDEPS)
@@ -716,11 +716,11 @@
 
 ### collation res
 # BEGIN android-changed.
-$(COLBLDDIR)/%.res: $(COLSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES)
+$(COLBLDDIR)/%.res: $(COLSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(COLSRCDIR) -d $(COLBLDDIR) --omitCollationRules $(<F)
 #END android-changed
 
-$(COLBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(COLLATION_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
+$(COLBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(COLLATION_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(COLLATION_TREE) -d $(COLBLDDIR) $(INDEX_NAME).txt
 
 $(COLLATION_INDEX_FILE): $(SRCLISTDEPS)
@@ -736,10 +736,10 @@
 	echo "}" >> $@;
 
 ### brk res
-$(BRKBLDDIR)/%.res: $(BRKSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(BRK_FILES) $(DICT_FILES) $(DAT_FILES)
+$(BRKBLDDIR)/%.res: $(BRKSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(BRK_FILES) $(DICT_FILES) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(BRKSRCDIR) -d $(BRKBLDDIR) $(<F)
 
-$(BRKBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(BREAK_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
+$(BRKBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(BREAK_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(BREAK_TREE) -d $(BRKBLDDIR) $(INDEX_NAME).txt
 
 $(BRK_RES_INDEX_FILE): $(SRCLISTDEPS)
@@ -755,10 +755,10 @@
 	echo "}" >> $@;
 
 ### RBNF res
-$(RBNFBLDDIR)/%.res: $(RBNFSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES)
+$(RBNFBLDDIR)/%.res: $(RBNFSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(RBNFSRCDIR) -d $(RBNFBLDDIR) $(<F)
 
-$(RBNFBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(RBNF_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
+$(RBNFBLDDIR)/$(INDEX_NAME).res: $(OUTTMPDIR)/$(RBNF_TREE)/$(INDEX_NAME).txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(OUTTMPDIR)/$(RBNF_TREE) -d $(RBNFBLDDIR) $(INDEX_NAME).txt
 
 $(RBNF_INDEX_FILE): $(SRCLISTDEPS)
@@ -774,13 +774,13 @@
 	echo "}" >> $@;
 
 ### TRANSLIT res
-$(TRANSLITBLDDIR)/%.res: $(TRANSLITSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES)
+$(TRANSLITBLDDIR)/%.res: $(TRANSLITSRCDIR)/%.txt  $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -s $(TRANSLITSRCDIR) -d $(TRANSLITBLDDIR) $(<F)
 
 ### normal (locale) res
 all-RES:  $(RES_FILES)
 
-$(BUILDDIR)/%.res: $(LOCSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES)
+$(BUILDDIR)/%.res: $(LOCSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) $(DAT_FILES) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb --usePoolBundle $(GENRBOPTS) -i $(BUILDDIR) -s $(LOCSRCDIR) -d $(BUILDDIR) $(<F)
 
 # copy the locales/pool.res file from the source folder to the build output folder
@@ -800,7 +800,7 @@
 
 # Override the normal genrb for zoneinfo to always pull from
 # icu/source/tools/tzcode/zoneinfo64.txt
-$(BUILDDIR)/zoneinfo64.res: $(ZONEINFO) $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
+$(BUILDDIR)/zoneinfo64.res: $(ZONEINFO) $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
 	@echo Note: $(MISCSRCDIR)/zoneinfo.txt is IGNORED because $(TZDATA) is present.
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -q -i $(BUILDDIR) -d $(BUILDDIR) $(ZONEINFO)
 
@@ -813,7 +813,7 @@
 endif
 
 # zoneinfo has some issues. Ignore some warnings with -q
-$(BUILDDIR)/%.res: $(MISCSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
+$(BUILDDIR)/%.res: $(MISCSRCDIR)/%.txt $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -q -i $(BUILDDIR) -s $(MISCSRCDIR) -d $(BUILDDIR) $(<F)
 
 
@@ -834,7 +834,7 @@
 clean-resindex:
 	-$(RMV) $(BUILDDIR)/$(INDEX_NAME).txt $(PKGDATA_LIST)
 
-$(BUILDDIR)/$(INDEX_NAME).res: $(INDEX_FILE) $(TOOLBINDIR)/genrb$(TOOLEXEEXT)
+$(BUILDDIR)/$(INDEX_NAME).res: $(INDEX_FILE) $(TOOLBINDIR)/genrb$(TOOLEXEEXT) | $(BUILDDIR)/cnvalias.icu
 	$(INVOKE) $(TOOLBINDIR)/genrb $(GENRBOPTS) -i $(BUILDDIR) -d $(BUILDDIR) $(INDEX_FILE)
 
 # The core Unicode properties files (pnames.icu, uprops.icu, ucase.icu, ubidi.icu)
diff --git a/icu4c/source/data/brkitr/brkfiles.mk b/icu4c/source/data/brkitr/brkfiles.mk
index 8f5c1db..c493729 100644
--- a/icu4c/source/data/brkitr/brkfiles.mk
+++ b/icu4c/source/data/brkitr/brkfiles.mk
@@ -1,6 +1,6 @@
 # © 2016 and later: Unicode, Inc. and others.
 # License & terms of use: http://www.unicode.org/copyright.html#License
-BRK_RES_CLDR_VERSION = 32.0.1
+BRK_RES_CLDR_VERSION = 33
 # A list of txt's to build
 # Note:
 #
diff --git a/icu4c/source/data/cldr-icu-readme.txt b/icu4c/source/data/cldr-icu-readme.txt
index 2e17b65..2f5ea6e 100644
--- a/icu4c/source/data/cldr-icu-readme.txt
+++ b/icu4c/source/data/cldr-icu-readme.txt
@@ -42,6 +42,18 @@
 #
 #----
 #
+# IP address whitelisting
+#
+# Parts of the build process (notably building the new ICU data filescin step 4)
+# require http: access to files in the CLDR repository; for example, processing
+# the files in icu4c/source/data/xml/ may require access to
+# http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd
+#
+# The IP address of the system requesting such access be whitelisted with Unicode,
+# otherwise there may be timeout failures; contact Rick McGowan.
+#
+#----
+#
 # There are several environment variables that need to be defined.
 #
 # a) Java- and ant-related variables
@@ -78,7 +90,7 @@
 # files are used in addition to the CLDR files as inputs to the CLDR data build
 # process for ICU):
 #
-#    icu/trunk/source/data/icu-config.xml - Update <locales> to add or remove
+#    icu4c/source/data/icu-config.xml - Update <locales> to add or remove
 #                CLDR locales for inclusion in ICU. Update <paths> to prefer
 #                alt forms for certain paths, or to exclude certain paths; note
 #                that <paths> items can only have draft or alt attributes.
@@ -89,11 +101,11 @@
 #                should also be included in <locales>, per PMC policy decision
 #                2012-05-02 (see http://bugs.icu-project.org/trac/ticket/9298).
 #
-#    icu/trunk/source/data/build.xml - If you are adding or removing break
+#    icu4c/source/data/build.xml - If you are adding or removing break
 #                iterators, you need to update  <fileset id="brkitr" ...> under
 #                <target name="clean" ...> to clean the correct set of files.
 #
-#    icu/trunk/source/data/xml/      - If you are adding a new locale, break
+#    icu4c/source/data/xml/      - If you are adding a new locale, break
 #                iterator, collation tailoring, or rule-based number formatter,
 #                you may need to add a corresponding xml file in (respectively)
 #                the main/, brkitr/, collation/, or rbnf/ subdirectory here.
@@ -158,6 +170,11 @@
 # necessary CLDR tools including LDML2ICUConverter, ConvertTransforms, etc.
 # This process will take several minutes.
 # Keep a log so you can investigate anything that looks suspicious.
+#
+# If you see timeout errors when building the rbnf data, for example, then the
+# system you are building on likely does not have its IP address whitelisted with
+# Unicode for access to the CLDR repository, see note on "IP address whitelisting"
+# near the top of this file.
 
 cd $ICU4C_DIR/source/data
 ant clean
diff --git a/icu4c/source/data/coll/af.txt b/icu4c/source/data/coll/af.txt
index 4176f09..312cb6c 100644
--- a/icu4c/source/data/coll/af.txt
+++ b/icu4c/source/data/coll/af.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"&N<<<ʼn"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/am.txt b/icu4c/source/data/coll/am.txt
index aad76c0..b063f2c 100644
--- a/icu4c/source/data/coll/am.txt
+++ b/icu4c/source/data/coll/am.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[reorder Ethi]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ar.txt b/icu4c/source/data/coll/ar.txt
index 23dac0b..33f00ee 100644
--- a/icu4c/source/data/coll/ar.txt
+++ b/icu4c/source/data/coll/ar.txt
@@ -9,7 +9,7 @@
                 "&ت<<ة<<<ﺔ<<<ﺓ"
                 "&ي<<ى<<<ﯨ<<<ﯩ<<<ﻰ<<<ﻯ<<<ﲐ<<<ﱝ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -397,7 +397,7 @@
                 "‎&ۓ‎=ﮰ‎=ﮱ"
                 "‎&ۀ‎=ﮤ‎=ﮥ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/as.txt b/icu4c/source/data/coll/as.txt
index b3ac592..f76a8a5 100644
--- a/icu4c/source/data/coll/as.txt
+++ b/icu4c/source/data/coll/as.txt
@@ -11,7 +11,7 @@
                 "&[before 1]ত<ৎ=ত্\u200D"
                 "&হ<ক্ষ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/az.txt b/icu4c/source/data/coll/az.txt
index 22a6a2b..bbd1e46 100644
--- a/icu4c/source/data/coll/az.txt
+++ b/icu4c/source/data/coll/az.txt
@@ -9,7 +9,7 @@
                 "[import az-u-co-standard]"
                 "[reorder others]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -26,7 +26,7 @@
                 "&H<x<<<X"
                 "&Z<w<<<W"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/be.txt b/icu4c/source/data/coll/be.txt
index 7185c9b..7187b94 100644
--- a/icu4c/source/data/coll/be.txt
+++ b/icu4c/source/data/coll/be.txt
@@ -9,7 +9,7 @@
                 "&Е<ё<<<Ё"
                 "&у<ў<<<Ў"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/bg.txt b/icu4c/source/data/coll/bg.txt
index d1866ad..245e04c 100644
--- a/icu4c/source/data/coll/bg.txt
+++ b/icu4c/source/data/coll/bg.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[reorder Cyrl]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/bn.txt b/icu4c/source/data/coll/bn.txt
index 074474f..1f54d07 100644
--- a/icu4c/source/data/coll/bn.txt
+++ b/icu4c/source/data/coll/bn.txt
@@ -9,7 +9,7 @@
                 "[reorder Beng Deva Guru Gujr Orya Taml Telu Knda Mlym Sinh]"
                 "&ঔ<ং<ঃ<ঁ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         traditional{
             Sequence{
@@ -629,7 +629,7 @@
                 "&যৌ<<<য়ৌ"
                 "&য্<<<য়্"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/bs.txt b/icu4c/source/data/coll/bs.txt
index df16b59..5999d2e 100644
--- a/icu4c/source/data/coll/bs.txt
+++ b/icu4c/source/data/coll/bs.txt
@@ -5,11 +5,11 @@
     collations{
         search{
             Sequence{"[import hr-u-co-search]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{"[import hr]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/bs_Cyrl.txt b/icu4c/source/data/coll/bs_Cyrl.txt
index e9af0f2..efc1b85 100644
--- a/icu4c/source/data/coll/bs_Cyrl.txt
+++ b/icu4c/source/data/coll/bs_Cyrl.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[import sr]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ca.txt b/icu4c/source/data/coll/ca.txt
index e06a6e5..7e20e86 100644
--- a/icu4c/source/data/coll/ca.txt
+++ b/icu4c/source/data/coll/ca.txt
@@ -8,7 +8,7 @@
                 "[import und-u-co-search]"
                 "&L<ŀ=l·<<<Ŀ=L·"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/chr.txt b/icu4c/source/data/coll/chr.txt
index 9eade6a..bc528d4 100644
--- a/icu4c/source/data/coll/chr.txt
+++ b/icu4c/source/data/coll/chr.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[reorder Cher]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/colfiles.mk b/icu4c/source/data/coll/colfiles.mk
index 07460a9..aaf2c99 100644
--- a/icu4c/source/data/coll/colfiles.mk
+++ b/icu4c/source/data/coll/colfiles.mk
@@ -1,6 +1,6 @@
 # © 2016 and later: Unicode, Inc. and others.
 # License & terms of use: http://www.unicode.org/copyright.html#License
-COLLATION_CLDR_VERSION = 32.0.1
+COLLATION_CLDR_VERSION = 33
 # A list of txt's to build
 # Note:
 #
diff --git a/icu4c/source/data/coll/cs.txt b/icu4c/source/data/coll/cs.txt
index 221676b..fc6d882 100644
--- a/icu4c/source/data/coll/cs.txt
+++ b/icu4c/source/data/coll/cs.txt
@@ -11,7 +11,7 @@
                 "&S<š<<<Š"
                 "&Z<ž<<<Ž"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/cy.txt b/icu4c/source/data/coll/cy.txt
index bea7bd3..6262215 100644
--- a/icu4c/source/data/coll/cy.txt
+++ b/icu4c/source/data/coll/cy.txt
@@ -14,7 +14,7 @@
                 "&R<rh<<<Rh<<<RH"
                 "&T<th<<<Th<<<TH"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/da.txt b/icu4c/source/data/coll/da.txt
index e8ef23b..1e88e93 100644
--- a/icu4c/source/data/coll/da.txt
+++ b/icu4c/source/data/coll/da.txt
@@ -9,7 +9,7 @@
                 "[import da-u-co-standard]"
                 "[caseFirst off]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -21,7 +21,7 @@
                 "&[before 1]ǀ<æ<<<Æ<<ä<<<Ä<ø<<<Ø<<ö<<<Ö<<ő<<<Ő<å<<<Å<<<aa<<<Aa<<<AA"
                 "&oe<<œ<<<Œ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/de.txt b/icu4c/source/data/coll/de.txt
index 0ce990d..2fdd86a 100644
--- a/icu4c/source/data/coll/de.txt
+++ b/icu4c/source/data/coll/de.txt
@@ -9,14 +9,14 @@
                 "&OE<<ö<<<Ö"
                 "&UE<<ü<<<Ü"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         search{
             Sequence{
                 "[import und-u-co-search]"
                 "[import de-u-co-phonebk]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/de_AT.txt b/icu4c/source/data/coll/de_AT.txt
index a4e2ee7..cb5e899 100644
--- a/icu4c/source/data/coll/de_AT.txt
+++ b/icu4c/source/data/coll/de_AT.txt
@@ -10,7 +10,7 @@
                 "&u<ü<<<Ü"
                 "&ss<ß<<<ẞ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/dsb.txt b/icu4c/source/data/coll/dsb.txt
index b43b2bc..d955648 100644
--- a/icu4c/source/data/coll/dsb.txt
+++ b/icu4c/source/data/coll/dsb.txt
@@ -14,7 +14,7 @@
                 "&S<š<<<Š<ś<<<Ś"
                 "&Z<ž<<<Ž<ź<<<Ź"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ee.txt b/icu4c/source/data/coll/ee.txt
index 27a3f50..4c4537e 100644
--- a/icu4c/source/data/coll/ee.txt
+++ b/icu4c/source/data/coll/ee.txt
@@ -17,7 +17,7 @@
                 "&T<ts<<<Ts<<<TS"
                 "&V<ʋ<<<Ʋ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/el.txt b/icu4c/source/data/coll/el.txt
index 372fe4b..524d0cb 100644
--- a/icu4c/source/data/coll/el.txt
+++ b/icu4c/source/data/coll/el.txt
@@ -8,7 +8,7 @@
                 "[normalization on]"
                 "[reorder Grek]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/en_US_POSIX.txt b/icu4c/source/data/coll/en_US_POSIX.txt
index b9f397d..3a10bd0 100644
--- a/icu4c/source/data/coll/en_US_POSIX.txt
+++ b/icu4c/source/data/coll/en_US_POSIX.txt
@@ -8,7 +8,7 @@
                 "&A<*'\u0020'-'/'<*0-'@'<*ABCDEFGHIJKLMNOPQRSTUVWXYZ<*'['-'`'<*abcdefghijklmnopqrstuvwxyz"
                 "<*'{'-'\u007F'"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/eo.txt b/icu4c/source/data/coll/eo.txt
index d50f673..d2a8c01 100644
--- a/icu4c/source/data/coll/eo.txt
+++ b/icu4c/source/data/coll/eo.txt
@@ -12,7 +12,7 @@
                 "&S<ŝ<<<Ŝ"
                 "&U<ŭ<<<Ŭ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/es.txt b/icu4c/source/data/coll/es.txt
index 21640a8..3b23c69 100644
--- a/icu4c/source/data/coll/es.txt
+++ b/icu4c/source/data/coll/es.txt
@@ -8,11 +8,11 @@
                 "[import und-u-co-search]"
                 "&N<ñ<<<Ñ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{"&N<ñ<<<Ñ"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
         traditional{
             Sequence{
@@ -20,7 +20,7 @@
                 "&C<ch<<<Ch<<<CH"
                 "&l<ll<<<Ll<<<LL"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/et.txt b/icu4c/source/data/coll/et.txt
index 141eeb7..77c7e8c 100644
--- a/icu4c/source/data/coll/et.txt
+++ b/icu4c/source/data/coll/et.txt
@@ -8,7 +8,7 @@
                 "&[before 1]T<š<<<Š<z<<<Z<ž<<<Ž"
                 "&[before 1]X<õ<<<Õ<ä<<<Ä<ö<<<Ö<ü<<<Ü"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/fa.txt b/icu4c/source/data/coll/fa.txt
index 1d88d7c..027eb12 100644
--- a/icu4c/source/data/coll/fa.txt
+++ b/icu4c/source/data/coll/fa.txt
@@ -16,7 +16,7 @@
                 "&ۏ<ه<<ە<<ہ<<ة<<ۃ<<ۀ<<ھ"
                 "&ی<<*ىےيېۑۍێ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/fa_AF.txt b/icu4c/source/data/coll/fa_AF.txt
index 4005211..f165c70 100644
--- a/icu4c/source/data/coll/fa_AF.txt
+++ b/icu4c/source/data/coll/fa_AF.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[import ps]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/fi.txt b/icu4c/source/data/coll/fi.txt
index 3ab79b3..2c8101c 100644
--- a/icu4c/source/data/coll/fi.txt
+++ b/icu4c/source/data/coll/fi.txt
@@ -8,7 +8,7 @@
                 "[import und-u-co-search]"
                 "[import fi-u-co-trad]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -20,7 +20,7 @@
                 "&Z\u0335<<ʒ<<<Ʒ"
                 "&[before 1]ǀ<å<<<Å<ä<<<Ä<<æ<<<Æ<ö<<<Ö<<ø<<<Ø"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         traditional{
             Sequence{
@@ -31,7 +31,7 @@
                 "&Y<<ü<<<Ü<<ű<<<Ű"
                 "&[before 1]ǀ<å<<<Å<ä<<<Ä<<æ<<<Æ<ö<<<Ö<<ø<<<Ø<<ő<<<Ő<<õ<<<Õ<<œ<<<Œ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/fil.txt b/icu4c/source/data/coll/fil.txt
index fa96d7b..703f286 100644
--- a/icu4c/source/data/coll/fil.txt
+++ b/icu4c/source/data/coll/fil.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"&N<ñ<<<Ñ<ng<<<Ng<<<NG"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/fo.txt b/icu4c/source/data/coll/fo.txt
index e3e296b..2859417 100644
--- a/icu4c/source/data/coll/fo.txt
+++ b/icu4c/source/data/coll/fo.txt
@@ -8,7 +8,7 @@
                 "[import und-u-co-search]"
                 "[import fo-u-co-standard]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -18,7 +18,7 @@
                 "&Y<<ü<<<Ü<<ű<<<Ű"
                 "&[before 1]ǀ<æ<<<Æ<<ä<<<Ä<<ę<<<Ę<ø<<<Ø<<ö<<<Ö<<ő<<<Ő<<œ<<<Œ<å<<<Å<<<aa<<<Aa<<<AA"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/fr_CA.txt b/icu4c/source/data/coll/fr_CA.txt
index bee3133..89e2ea9 100644
--- a/icu4c/source/data/coll/fr_CA.txt
+++ b/icu4c/source/data/coll/fr_CA.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[backwards 2]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/gl.txt b/icu4c/source/data/coll/gl.txt
index 87b09a9..34822b1 100644
--- a/icu4c/source/data/coll/gl.txt
+++ b/icu4c/source/data/coll/gl.txt
@@ -5,11 +5,11 @@
     collations{
         search{
             Sequence{"[import es-u-co-search]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{"[import es]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/gu.txt b/icu4c/source/data/coll/gu.txt
index 4857fc8..fba805e 100644
--- a/icu4c/source/data/coll/gu.txt
+++ b/icu4c/source/data/coll/gu.txt
@@ -9,7 +9,7 @@
                 "[reorder Gujr Deva Beng Guru Orya Taml Telu Knda Mlym Sinh]"
                 "&ૐ<ં<<ઁ<ઃ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ha.txt b/icu4c/source/data/coll/ha.txt
index 3920a52..ab60d6d 100644
--- a/icu4c/source/data/coll/ha.txt
+++ b/icu4c/source/data/coll/ha.txt
@@ -12,7 +12,7 @@
                 "&T<ts<<<Ts<<<TS"
                 "&Y<ƴ<<<ʼy<<<''y<<<Ƴ<<<ʼY<<<''Y"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/haw.txt b/icu4c/source/data/coll/haw.txt
index edd2051..9f6dc94 100644
--- a/icu4c/source/data/coll/haw.txt
+++ b/icu4c/source/data/coll/haw.txt
@@ -8,7 +8,7 @@
                 "&a<e<<<E<i<<<I<o<<<O<u<<<U"
                 "&w<ʻ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/he.txt b/icu4c/source/data/coll/he.txt
index e9652d6..3327ae5 100644
--- a/icu4c/source/data/coll/he.txt
+++ b/icu4c/source/data/coll/he.txt
@@ -11,7 +11,7 @@
                 "‎&״"
                 "<<'\u0022'"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -20,7 +20,7 @@
                 "&[before 2]''<<׳"
                 "&[before 2]'\u0022'<<״"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/hi.txt b/icu4c/source/data/coll/hi.txt
index ab0792b..f91852f 100644
--- a/icu4c/source/data/coll/hi.txt
+++ b/icu4c/source/data/coll/hi.txt
@@ -9,7 +9,7 @@
                 "[reorder Deva Beng Guru Gujr Orya Taml Telu Knda Mlym Sinh]"
                 "&ॐ<ं<<ँ<ः"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/hr.txt b/icu4c/source/data/coll/hr.txt
index 3efb7ad..fd16ca7 100644
--- a/icu4c/source/data/coll/hr.txt
+++ b/icu4c/source/data/coll/hr.txt
@@ -9,7 +9,7 @@
                 "[import hr-u-co-standard]"
                 "[reorder others]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -21,7 +21,7 @@
                 "&S<š<<<Š"
                 "&Z<ž<<<Ž"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/hsb.txt b/icu4c/source/data/coll/hsb.txt
index 1049aa6..ac04d68 100644
--- a/icu4c/source/data/coll/hsb.txt
+++ b/icu4c/source/data/coll/hsb.txt
@@ -13,7 +13,7 @@
                 "&S<š<<<Š"
                 "&Z<ž<<<Ž<ź<<<Ź"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/hu.txt b/icu4c/source/data/coll/hu.txt
index 651f886..d654b08 100644
--- a/icu4c/source/data/coll/hu.txt
+++ b/icu4c/source/data/coll/hu.txt
@@ -44,7 +44,7 @@
                 "&Zs<<<Zzs/zs"
                 "&ZS<<<ZZS/ZS"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/hy.txt b/icu4c/source/data/coll/hy.txt
index 5b03f93..8eaf042 100644
--- a/icu4c/source/data/coll/hy.txt
+++ b/icu4c/source/data/coll/hy.txt
@@ -8,7 +8,7 @@
                 "[reorder Armn]"
                 "&ք<և<<<Եւ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ig.txt b/icu4c/source/data/coll/ig.txt
index a3b05d3..48c19b4 100644
--- a/icu4c/source/data/coll/ig.txt
+++ b/icu4c/source/data/coll/ig.txt
@@ -15,7 +15,7 @@
                 "&S<sh<<<Sh<<<SH"
                 "&U<ụ<<<Ụ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/is.txt b/icu4c/source/data/coll/is.txt
index 10061d2..a651885 100644
--- a/icu4c/source/data/coll/is.txt
+++ b/icu4c/source/data/coll/is.txt
@@ -8,7 +8,7 @@
                 "[import und-u-co-search]"
                 "[import is-u-co-standard]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -21,7 +21,7 @@
                 "&[before 1]z<ý<<<Ý"
                 "&[before 1]ǀ<æ<<<Æ<<ä<<<Ä<ö<<<Ö<<ø<<<Ø<å<<<Å"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ja.txt b/icu4c/source/data/coll/ja.txt
index 0205c91..a1dc845 100644
--- a/icu4c/source/data/coll/ja.txt
+++ b/icu4c/source/data/coll/ja.txt
@@ -412,21 +412,21 @@
                 "&「=「"
                 "&」=」"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
                 "[import ja-u-co-private-kana]"
                 "&[last regular]<*亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         unihan{
             Sequence{
                 "[import und-u-co-private-unihan]"
                 "[import ja-u-co-private-kana]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ka.txt b/icu4c/source/data/coll/ka.txt
index 839816c..59b30c8 100644
--- a/icu4c/source/data/coll/ka.txt
+++ b/icu4c/source/data/coll/ka.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[reorder Geor]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/kk.txt b/icu4c/source/data/coll/kk.txt
index 4817fa5..219b0d8 100644
--- a/icu4c/source/data/coll/kk.txt
+++ b/icu4c/source/data/coll/kk.txt
@@ -10,7 +10,7 @@
                 "&Ұ<ү<<<Ү"
                 "&[before 1]ь<і<<<І"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/kl.txt b/icu4c/source/data/coll/kl.txt
index f9e1564..2c351f0 100644
--- a/icu4c/source/data/coll/kl.txt
+++ b/icu4c/source/data/coll/kl.txt
@@ -8,7 +8,7 @@
                 "[import und-u-co-search]"
                 "[import kl-u-co-standard]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -19,7 +19,7 @@
                 "&Y<<ü<<<Ü<<ű<<<Ű"
                 "&[before 1]ǀ<æ<<<Æ<<ä<<<Ä<<ę<<<Ę<ø<<<Ø<<ö<<<Ö<<ő<<<Ő<<œ<<<Œ<å<<<Å"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/km.txt b/icu4c/source/data/coll/km.txt
index 2d03d23..cc17886 100644
--- a/icu4c/source/data/coll/km.txt
+++ b/icu4c/source/data/coll/km.txt
@@ -66,7 +66,7 @@
                 "&ឱ<<<ឲ"
                 "&ៅ<ុំ<ំ<ាំ<ះ<ិះ<ុះ<េះ<ោះ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/kn.txt b/icu4c/source/data/coll/kn.txt
index 52d2087..6db8710 100644
--- a/icu4c/source/data/coll/kn.txt
+++ b/icu4c/source/data/coll/kn.txt
@@ -9,7 +9,7 @@
                 "[reorder Knda Deva Beng Guru Gujr Orya Taml Telu Mlym Sinh]"
                 "&ಔ<ಂ<ಃ<ೱ<ೲ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         traditional{
             Sequence{
@@ -651,7 +651,7 @@
                 "&ಫೋ<<<ಫ಼ೋ"
                 "&ಫೌ<<<ಫ಼ೌ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ko.txt b/icu4c/source/data/coll/ko.txt
index 0282b7e..d55ef80 100644
--- a/icu4c/source/data/coll/ko.txt
+++ b/icu4c/source/data/coll/ko.txt
@@ -283,7 +283,7 @@
                 "&ᅩᅣᅵ"
                 "=ᆧ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         searchjl{
             Sequence{
@@ -378,7 +378,7 @@
                 "&\u1109\u1109=\u110A<<<\u3146"
                 "&\u110C\u110C=\u110D<<<\u3149"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -862,14 +862,14 @@
                 "&희<<*僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲咥唏嘻悕戲暿欷燹爔豨餼"
                 "&힐<<*詰犵纈襭頡黠"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         unihan{
             Sequence{
                 "[import und-u-co-private-unihan]"
                 "[reorder Hang Hani]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/kok.txt b/icu4c/source/data/coll/kok.txt
index 360130f..5cc829b 100644
--- a/icu4c/source/data/coll/kok.txt
+++ b/icu4c/source/data/coll/kok.txt
@@ -11,7 +11,7 @@
                 "&ह<ळ"
                 "<क्ष"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ky.txt b/icu4c/source/data/coll/ky.txt
index 3177251..2ffe87a 100644
--- a/icu4c/source/data/coll/ky.txt
+++ b/icu4c/source/data/coll/ky.txt
@@ -8,7 +8,7 @@
                 "[reorder Cyrl]"
                 "&е<ё<<<Ё"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/lkt.txt b/icu4c/source/data/coll/lkt.txt
index f582309..23953c8 100644
--- a/icu4c/source/data/coll/lkt.txt
+++ b/icu4c/source/data/coll/lkt.txt
@@ -11,7 +11,7 @@
                 "&S<š<<<Š"
                 "&Z<ž<<<Ž"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ln.txt b/icu4c/source/data/coll/ln.txt
index ede6dc6..73938e8 100644
--- a/icu4c/source/data/coll/ln.txt
+++ b/icu4c/source/data/coll/ln.txt
@@ -16,14 +16,14 @@
                 "&S<sh<<<sH<<<Sh<<<SH"
                 "&T<ts<<<tS<<<Ts<<<TS"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
                 "&E<ɛ<<<Ɛ"
                 "&O<<ɔ<<<Ɔ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/lo.txt b/icu4c/source/data/coll/lo.txt
index a23433b..1795c5b 100644
--- a/icu4c/source/data/coll/lo.txt
+++ b/icu4c/source/data/coll/lo.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[reorder Laoo]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/lt.txt b/icu4c/source/data/coll/lt.txt
index 4aa2f54..a842ec5 100644
--- a/icu4c/source/data/coll/lt.txt
+++ b/icu4c/source/data/coll/lt.txt
@@ -16,7 +16,7 @@
                 "&U<<ų<<<Ų<<ū<<<Ū"
                 "&Z<ž<<<Ž"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/lv.txt b/icu4c/source/data/coll/lv.txt
index 62179d4..94c37aa 100644
--- a/icu4c/source/data/coll/lv.txt
+++ b/icu4c/source/data/coll/lv.txt
@@ -15,7 +15,7 @@
                 "&[before 1]T<š<<<Š"
                 "&[before 1]Ʒ<ž<<<Ž"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/mk.txt b/icu4c/source/data/coll/mk.txt
index a8ac0d1..b3010d5 100644
--- a/icu4c/source/data/coll/mk.txt
+++ b/icu4c/source/data/coll/mk.txt
@@ -10,7 +10,7 @@
                 "&ԃ<ѓ<<<Ѓ"
                 "&ћ<ќ<<<Ќ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ml.txt b/icu4c/source/data/coll/ml.txt
index 5d6df85..1e6ed85 100644
--- a/icu4c/source/data/coll/ml.txt
+++ b/icu4c/source/data/coll/ml.txt
@@ -17,7 +17,7 @@
                 "&മ്<<ം"
                 "&ന്<<<ൻ്"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/mn.txt b/icu4c/source/data/coll/mn.txt
index fb51f7d..9eb37e0 100644
--- a/icu4c/source/data/coll/mn.txt
+++ b/icu4c/source/data/coll/mn.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[reorder Cyrl Mong]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/mr.txt b/icu4c/source/data/coll/mr.txt
index 314b61b..dd8f468 100644
--- a/icu4c/source/data/coll/mr.txt
+++ b/icu4c/source/data/coll/mr.txt
@@ -12,7 +12,7 @@
                 "<क्ष"
                 "<ज्ञ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/mt.txt b/icu4c/source/data/coll/mt.txt
index b202d3f..eb162b0 100644
--- a/icu4c/source/data/coll/mt.txt
+++ b/icu4c/source/data/coll/mt.txt
@@ -12,7 +12,7 @@
                 "&[before 1]i<ħ<<<Ħ"
                 "&[before 1]z<ż<<<Ż"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/my.txt b/icu4c/source/data/coll/my.txt
index ceedb37..9cec53a 100644
--- a/icu4c/source/data/coll/my.txt
+++ b/icu4c/source/data/coll/my.txt
@@ -373,7 +373,7 @@
                 "&ထမင်း=ထ္မင်း"
                 "&လက်ဘက်=လ္ဘက်"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/nb.txt b/icu4c/source/data/coll/nb.txt
index ba4de2a..4921a43 100644
--- a/icu4c/source/data/coll/nb.txt
+++ b/icu4c/source/data/coll/nb.txt
@@ -8,7 +8,7 @@
                 "[import und-u-co-search]"
                 "[import nb-u-co-standard]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -18,7 +18,7 @@
                 "&Y<<ü<<<Ü<<ű<<<Ű"
                 "&[before 1]ǀ<æ<<<Æ<<ä<<<Ä<<ę<<<Ę<ø<<<Ø<<ö<<<Ö<<ő<<<Ő<<œ<<<Œ<å<<<Å<<aa<<<Aa<<<AA"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ne.txt b/icu4c/source/data/coll/ne.txt
index 1a8a849..80834b9 100644
--- a/icu4c/source/data/coll/ne.txt
+++ b/icu4c/source/data/coll/ne.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[reorder Deva]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/nn.txt b/icu4c/source/data/coll/nn.txt
index 0cdc13b..d71dc5f 100644
--- a/icu4c/source/data/coll/nn.txt
+++ b/icu4c/source/data/coll/nn.txt
@@ -5,11 +5,11 @@
     collations{
         search{
             Sequence{"[import nb-u-co-search]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{"[import nb-u-co-standard]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/om.txt b/icu4c/source/data/coll/om.txt
index ac7bf96..350d14a 100644
--- a/icu4c/source/data/coll/om.txt
+++ b/icu4c/source/data/coll/om.txt
@@ -8,7 +8,7 @@
                 "&Z<ch<<<Ch<<<CH<dh<<<Dh<<<DH<kh<<<Kh<<<KH<ny<<<Ny<<<NY<ph<<<Ph<<<PH<"
                 "sh<<<Sh"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/or.txt b/icu4c/source/data/coll/or.txt
index 0b84a50..e57d533 100644
--- a/icu4c/source/data/coll/or.txt
+++ b/icu4c/source/data/coll/or.txt
@@ -11,7 +11,7 @@
                 "&ହ<କ୍ଷ"
                 "&ଯ<<ୟ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/pa.txt b/icu4c/source/data/coll/pa.txt
index e023bde..2b9d41c 100644
--- a/icu4c/source/data/coll/pa.txt
+++ b/icu4c/source/data/coll/pa.txt
@@ -10,7 +10,7 @@
                 "&ੱ<<ੰ<<ਂ<<ਁ<<਼"
                 "&ੜ<੍"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/pl.txt b/icu4c/source/data/coll/pl.txt
index 8f97f24..f1d7b22 100644
--- a/icu4c/source/data/coll/pl.txt
+++ b/icu4c/source/data/coll/pl.txt
@@ -14,7 +14,7 @@
                 "&S<ś<<<Ś"
                 "&Z<ź<<<Ź<ż<<<Ż"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ps.txt b/icu4c/source/data/coll/ps.txt
index 7c4bd96..ba4769a 100644
--- a/icu4c/source/data/coll/ps.txt
+++ b/icu4c/source/data/coll/ps.txt
@@ -24,7 +24,7 @@
                 "&ی<<*ىےيېۍ<<یٔ<<<ىٔ<<<ئ"
                 "&\u00A0<<\u200C<<\u200D"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ro.txt b/icu4c/source/data/coll/ro.txt
index c125208..d7f94a9 100644
--- a/icu4c/source/data/coll/ro.txt
+++ b/icu4c/source/data/coll/ro.txt
@@ -10,7 +10,7 @@
                 "&S<ş=ș<<<Ş=Ș"
                 "&T<ţ=ț<<<Ţ=Ț"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/root.txt b/icu4c/source/data/coll/root.txt
index 6a929f6..f4011d5 100644
--- a/icu4c/source/data/coll/root.txt
+++ b/icu4c/source/data/coll/root.txt
@@ -316,7 +316,7 @@
                 "< 🏴󠁧󠁢󠁳󠁣󠁴󠁿"
                 "< 🏴󠁧󠁢󠁷󠁬󠁳󠁿"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         eor{
             Sequence{
@@ -856,7 +856,7 @@
                 "&ք"
                 "<և"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         private-unihan{
             Sequence{
@@ -1099,7 +1099,7 @@
                 "&龟=\uFDD0龟"
                 "&龠=\uFDD0龠"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         search{
             Sequence{
@@ -1218,11 +1218,11 @@
                 "&ᅳᅵ"
                 "=ᅴ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{""}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
     depends:process(dependency){"ucadata.icu"}
diff --git a/icu4c/source/data/coll/ru.txt b/icu4c/source/data/coll/ru.txt
index 9ec92e0..e636fda 100644
--- a/icu4c/source/data/coll/ru.txt
+++ b/icu4c/source/data/coll/ru.txt
@@ -5,7 +5,7 @@
     collations{
         standard{
             Sequence{"[reorder Cyrl]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/se.txt b/icu4c/source/data/coll/se.txt
index 7fcc5c4..f6b77dd 100644
--- a/icu4c/source/data/coll/se.txt
+++ b/icu4c/source/data/coll/se.txt
@@ -8,7 +8,7 @@
                 "[import und-u-co-search]"
                 "[import se-u-co-standard]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -53,7 +53,7 @@
                 "<<<Ô<<ǫ"
                 "<<<Ǫ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/si.txt b/icu4c/source/data/coll/si.txt
index 8142921..639852a 100644
--- a/icu4c/source/data/coll/si.txt
+++ b/icu4c/source/data/coll/si.txt
@@ -10,7 +10,7 @@
                 "&ඖ<ං<ඃ"
                 "&ජ්ඤ<<ඥ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -19,7 +19,7 @@
                 "&ඖ<ං<ඃ"
                 "&ඥ<ඤ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/sk.txt b/icu4c/source/data/coll/sk.txt
index e35de57..c112419 100644
--- a/icu4c/source/data/coll/sk.txt
+++ b/icu4c/source/data/coll/sk.txt
@@ -21,7 +21,7 @@
                 "&Y<ý<<<Ý"
                 "&Z<ž<<<Ž"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -33,7 +33,7 @@
                 "&S<š<<<Š"
                 "&Z<ž<<<Ž"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/sl.txt b/icu4c/source/data/coll/sl.txt
index 5169078..9d39edd 100644
--- a/icu4c/source/data/coll/sl.txt
+++ b/icu4c/source/data/coll/sl.txt
@@ -10,7 +10,7 @@
                 "&S<š<<<Š"
                 "&Z<ž<<<Ž"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/smn.txt b/icu4c/source/data/coll/smn.txt
index 9f15b49..bbff672 100644
--- a/icu4c/source/data/coll/smn.txt
+++ b/icu4c/source/data/coll/smn.txt
@@ -8,7 +8,7 @@
                 "[import und-u-co-search]"
                 "[import smn-u-co-standard]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -19,7 +19,7 @@
                 "&S<š<<<Š"
                 "&Z<ž<<<Ž<æ<<<Æ<ø<<<Ø<å<<<Å<ã<<<Ã<ä<<<Ä<á<<<Á<ö<<<Ö"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/sq.txt b/icu4c/source/data/coll/sq.txt
index ee3e58d..aa42edd 100644
--- a/icu4c/source/data/coll/sq.txt
+++ b/icu4c/source/data/coll/sq.txt
@@ -17,7 +17,7 @@
                 "&[before 1]Y<xh<<<Xh<<<XH"
                 "&[before 1]Ʒ<zh<<<Zh<<<ZH"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/sr.txt b/icu4c/source/data/coll/sr.txt
index 063f225..584c9ca 100644
--- a/icu4c/source/data/coll/sr.txt
+++ b/icu4c/source/data/coll/sr.txt
@@ -8,7 +8,7 @@
                 "[reorder Cyrl]"
                 "[suppressContractions [Ии]]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/sr_Latn.txt b/icu4c/source/data/coll/sr_Latn.txt
index 012f935..ebb25c9 100644
--- a/icu4c/source/data/coll/sr_Latn.txt
+++ b/icu4c/source/data/coll/sr_Latn.txt
@@ -5,11 +5,11 @@
     collations{
         search{
             Sequence{"[import hr-u-co-search]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{"[import hr]"}
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/sv.txt b/icu4c/source/data/coll/sv.txt
index 6ced68b..08a8ca0 100644
--- a/icu4c/source/data/coll/sv.txt
+++ b/icu4c/source/data/coll/sv.txt
@@ -12,14 +12,14 @@
                 "&Y<<ü<<<Ü<<ű<<<Ű"
                 "&[before 1]ǀ<å<<<Å<ä<<<Ä<<æ<<<Æ<<ę<<<Ę<ö<<<Ö<<ø<<<Ø<<ő<<<Ő<<œ<<<Œ<<ô<<<Ô"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         search{
             Sequence{
                 "[import und-u-co-search]"
                 "[import sv-u-co-standard]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -30,7 +30,7 @@
                 "&Y<<ü<<<Ü<<ű<<<Ű"
                 "&[before 1]ǀ<å<<<Å<ä<<<Ä<<æ<<<Æ<<ę<<<Ę<ö<<<Ö<<ø<<<Ø<<ő<<<Ő<<œ<<<Œ<<ô<<<Ô"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ta.txt b/icu4c/source/data/coll/ta.txt
index 8d29b6e..32f812d 100644
--- a/icu4c/source/data/coll/ta.txt
+++ b/icu4c/source/data/coll/ta.txt
@@ -34,7 +34,7 @@
                 "&[before 1]ஹ<ஹ்"
                 "&[before 1]க்ஷ<க்ஷ்"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/te.txt b/icu4c/source/data/coll/te.txt
index f558d64..ab25578 100644
--- a/icu4c/source/data/coll/te.txt
+++ b/icu4c/source/data/coll/te.txt
@@ -9,7 +9,7 @@
                 "[reorder Telu Deva Beng Guru Gujr Orya Taml Knda Mlym Sinh]"
                 "&ఔ<ఁ<ం<ః"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/th.txt b/icu4c/source/data/coll/th.txt
index 19bae5e..491dfad 100644
--- a/icu4c/source/data/coll/th.txt
+++ b/icu4c/source/data/coll/th.txt
@@ -17,7 +17,7 @@
                 "&ๅํ<<<ํๅ"
                 "&ไ<ฺ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/to.txt b/icu4c/source/data/coll/to.txt
index fda641f..df8735a 100644
--- a/icu4c/source/data/coll/to.txt
+++ b/icu4c/source/data/coll/to.txt
@@ -13,7 +13,7 @@
                 "&o<<ó<<<Ó<<ō<<<Ō"
                 "&u<<ú<<<Ú<<ū<<<Ū"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/tr.txt b/icu4c/source/data/coll/tr.txt
index 9843a03..8f25722 100644
--- a/icu4c/source/data/coll/tr.txt
+++ b/icu4c/source/data/coll/tr.txt
@@ -8,7 +8,7 @@
                 "[import und-u-co-search]"
                 "[import tr-u-co-standard]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -20,7 +20,7 @@
                 "&S<ş<<<Ş"
                 "&U<ü<<<Ü"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ug.txt b/icu4c/source/data/coll/ug.txt
index 9f630d8..c3f97f6 100644
--- a/icu4c/source/data/coll/ug.txt
+++ b/icu4c/source/data/coll/ug.txt
@@ -10,7 +10,7 @@
                 "&ك<گ<ڭ<ل"
                 "&ھ<و<ۇ<ۆ<ۈ<ۋ<ې<ى<ي"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/uk.txt b/icu4c/source/data/coll/uk.txt
index 2d56b44..6311294 100644
--- a/icu4c/source/data/coll/uk.txt
+++ b/icu4c/source/data/coll/uk.txt
@@ -9,7 +9,7 @@
                 "&Г<ґ<<<Ґ"
                 "&ꙇ<ї<<<\uA676<<<Ї"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/ur.txt b/icu4c/source/data/coll/ur.txt
index 15e7ef6..248b7f0 100644
--- a/icu4c/source/data/coll/ur.txt
+++ b/icu4c/source/data/coll/ur.txt
@@ -12,7 +12,7 @@
                 "<<\u0651<<\u0658<<\u0653"
                 "&[last tertiary ignorable]<<<\u0610<<<\u0611<<<\u0613<<<\u0612<<<\u0614"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/uz.txt b/icu4c/source/data/coll/uz.txt
index af3812e..16d66cf 100644
--- a/icu4c/source/data/coll/uz.txt
+++ b/icu4c/source/data/coll/uz.txt
@@ -10,7 +10,7 @@
                 "<sh<<<Sh<<<SH"
                 "<ch<<<Ch<<<CH"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/vi.txt b/icu4c/source/data/coll/vi.txt
index f86d5a0..5785891 100644
--- a/icu4c/source/data/coll/vi.txt
+++ b/icu4c/source/data/coll/vi.txt
@@ -13,7 +13,7 @@
                 "&o<ô<<<Ô<ơ<<<Ơ"
                 "&u<ư<<<Ư"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         traditional{
             Sequence{
@@ -32,7 +32,7 @@
                 "&T<th<<<Th<<<TH<tr<<<Tr<<<TR"
                 "&u<ư<<<Ư"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/wo.txt b/icu4c/source/data/coll/wo.txt
index a595c38..8159cef 100644
--- a/icu4c/source/data/coll/wo.txt
+++ b/icu4c/source/data/coll/wo.txt
@@ -11,7 +11,7 @@
                 "&N<ñ<<<Ñ<ŋ<<<Ŋ"
                 "&O<ó<<<Ó"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/yi.txt b/icu4c/source/data/coll/yi.txt
index fb384c5..b7bbd3f 100644
--- a/icu4c/source/data/coll/yi.txt
+++ b/icu4c/source/data/coll/yi.txt
@@ -11,7 +11,7 @@
                 "‎&״"
                 "<<'\u0022'"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         standard{
             Sequence{
@@ -28,7 +28,7 @@
                 "&ש<שׂ"
                 "&[before 1]ת<תּ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/yo.txt b/icu4c/source/data/coll/yo.txt
index 738deb9..8b5e41b 100644
--- a/icu4c/source/data/coll/yo.txt
+++ b/icu4c/source/data/coll/yo.txt
@@ -11,7 +11,7 @@
                 "&O<ọ<<<Ọ"
                 "&S<ṣ<<<Ṣ"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/coll/zh.txt b/icu4c/source/data/coll/zh.txt
index 47dc21c..0057ca6 100644
--- a/icu4c/source/data/coll/zh.txt
+++ b/icu4c/source/data/coll/zh.txt
@@ -9,7 +9,7 @@
                 "[reorder Latn Hani Bopo]"
                 "&[last regular]<*兙兛兞兝兡兣嗧瓩糎一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲乂乜凵匚厂万丌乇亍囗屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛毻毼毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         default{"pinyin"}
         gb2312han{
@@ -18,7 +18,7 @@
                 "[reorder Latn Hani]"
                 "&[last regular]<*啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         pinyin{
             Sequence{
@@ -1888,7 +1888,7 @@
                 "&弞<沈阳/阳"
                 "&銺<藏文/文"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         private-pinyin{
             Sequence{
@@ -1902,7 +1902,7 @@
                 "&[before 2]u<<ū<<<Ū<<ú<<<Ú<<ǔ<<<Ǔ<<ù<<<Ù"
                 "&U<<ǖ<<<Ǖ<<ǘ<<<Ǘ<<ǚ<<<Ǚ<<ǜ<<<Ǜ<<ü<<<Ü"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         stroke{
             Sequence{
@@ -2603,7 +2603,7 @@
                 "&龟<<<⻳"
                 "&龠<<<⿕"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         unihan{
             Sequence{
@@ -2611,7 +2611,7 @@
                 "[import zh-u-co-private-pinyin]"
                 "[reorder Hani Bopo]"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
         zhuyin{
             Sequence{
@@ -4637,7 +4637,7 @@
                 "&龟<<<⻳"
                 "&龠<<<⿕"
             }
-            Version{"32.0.1"}
+            Version{"33"}
         }
     }
 }
diff --git a/icu4c/source/data/curr/af.txt b/icu4c/source/data/curr/af.txt
index 1d8a8d4..0738885 100644
--- a/icu4c/source/data/curr/af.txt
+++ b/icu4c/source/data/curr/af.txt
@@ -392,6 +392,10 @@
         }
         MRO{
             "MRO",
+            "Mauritaniese ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritaniese ouguiya",
         }
         MUR{
@@ -548,6 +552,10 @@
         }
         STD{
             "STD",
+            "São Tomé en Príncipe dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "São Tomé en Príncipe dobra",
         }
         SYP{
@@ -755,7 +763,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1146,6 +1154,10 @@
             other{"Macaose pataca"}
         }
         MRO{
+            one{"Mauritaniese ouguiya (1973–2017)"}
+            other{"Mauritaniese ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"Mauritaniese ouguiya"}
             other{"Mauritaniese ouguiya"}
         }
@@ -1294,6 +1306,10 @@
             other{"Suid-Soedanese pond"}
         }
         STD{
+            one{"São Tomé en Príncipe dobra (1977–2017)"}
+            other{"São Tomé en Príncipe dobra (1977–2017)"}
+        }
+        STN{
             one{"São Tomé en Príncipe dobra"}
             other{"São Tomé en Príncipe dobra"}
         }
@@ -1414,5 +1430,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/af_NA.txt b/icu4c/source/data/curr/af_NA.txt
index 699e036..e1d03b7 100644
--- a/icu4c/source/data/curr/af_NA.txt
+++ b/icu4c/source/data/curr/af_NA.txt
@@ -7,5 +7,5 @@
             "Namibiese dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/agq.txt b/icu4c/source/data/curr/agq.txt
index 861f662..83a5a3f 100644
--- a/icu4c/source/data/curr/agq.txt
+++ b/icu4c/source/data/curr/agq.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ùgueya è Mùlètenyìa (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ùgueya è Mùlètenyìa",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dɔbàlà è Sàwu Tɔ̀me à Pèlènsipè (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dɔbàlà è Sàwu Tɔ̀me à Pèlènsipè",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dɔlà è Zìmbagbɛ̀",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ak.txt b/icu4c/source/data/curr/ak.txt
index 516cc15..64f03bd 100644
--- a/icu4c/source/data/curr/ak.txt
+++ b/icu4c/source/data/curr/ak.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Mɔretenia Ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mɔretenia Ouguiya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Sao Tome ne Principe Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Sao Tome ne Principe Dobra",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Zimbabwe Dɔla",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/am.txt b/icu4c/source/data/curr/am.txt
index cf95c81..023a6b7 100644
--- a/icu4c/source/data/curr/am.txt
+++ b/icu4c/source/data/curr/am.txt
@@ -384,6 +384,10 @@
         }
         MRO{
             "MRO",
+            "የሞሪቴኒያ ኦውጉያ (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "የሞሪቴኒያ ኦውጉያ",
         }
         MUR{
@@ -536,6 +540,10 @@
         }
         STD{
             "STD",
+            "የሳኦ ቶሜ እና ፕሪንሲፔ ዶብራ (1977–2017)",
+        }
+        STN{
+            "STN",
             "የሳኦ ቶሜ እና ፕሪንሲፔ ዶብራ",
         }
         SYP{
@@ -739,7 +747,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1133,6 +1141,10 @@
             other{"የማካኔዝ ፓታካ"}
         }
         MRO{
+            one{"የሞሪቴኒያ ኦውጉያ (1973–2017)"}
+            other{"የሞሪቴኒያ ኦውጉያ (1973–2017)"}
+        }
+        MRU{
             one{"የሞሪቴኒያ ኦውጉያ"}
             other{"የሞሪቴኒያ ኦውጉያ"}
         }
@@ -1281,6 +1293,10 @@
             other{"የደቡብ ሱዳን ፓውንድ"}
         }
         STD{
+            one{"የሳኦ ቶሜ እና ፕሪንሲፔ ዶብራ (1977–2017)"}
+            other{"የሳኦ ቶሜ እና ፕሪንሲፔ ዶብራ (1977–2017)"}
+        }
+        STN{
             one{"የሳኦ ቶሜ እና ፕሪንሲፔ ዶብራ"}
             other{"የሳኦ ቶሜ እና ፕሪንሲፔ ዶብራ"}
         }
@@ -1405,5 +1421,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ar.txt b/icu4c/source/data/curr/ar.txt
index 09531a3..e408ef2 100644
--- a/icu4c/source/data/curr/ar.txt
+++ b/icu4c/source/data/curr/ar.txt
@@ -568,6 +568,10 @@
         }
         MRO{
             "أ.م.‏",
+            "أوقية موريتانية - 1973-2017",
+        }
+        MRU{
+            "MRU",
             "أوقية موريتانية",
         }
         MTL{
@@ -780,6 +784,10 @@
         }
         STD{
             "STD",
+            "دوبرا ساو تومي وبرينسيبي - 1977-2017",
+        }
+        STN{
+            "STN",
             "دوبرا ساو تومي وبرينسيبي",
         }
         SUR{
@@ -1107,7 +1115,7 @@
         SHP{"£"}
         SRD{"SR$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1873,6 +1881,14 @@
             zero{"باتاكا ماكاوي"}
         }
         MRO{
+            few{"أوقية موريتانية - 1973-2017"}
+            many{"أوقية موريتانية - 1973-2017"}
+            one{"أوقية موريتانية - 1973-2017"}
+            other{"أوقية موريتانية - 1973-2017"}
+            two{"أوقية موريتانية - 1973-2017"}
+            zero{"أوقية موريتانية - 1973-2017"}
+        }
+        MRU{
             few{"أوقية موريتانية"}
             many{"أوقية موريتانية"}
             one{"أوقية موريتانية"}
@@ -2169,6 +2185,14 @@
             zero{"جنيه جنوب السودان"}
         }
         STD{
+            few{"دوبرا ساو تومي وبرينسيبي - 1977-2017"}
+            many{"دوبرا ساو تومي وبرينسيبي - 1977-2017"}
+            one{"دوبرا ساو تومي وبرينسيبي - 1977-2017"}
+            other{"دوبرا ساو تومي وبرينسيبي - 1977-2017"}
+            two{"دوبرا ساو تومي وبرينسيبي - 1977-2017"}
+            zero{"دوبرا ساو تومي وبرينسيبي - 1977-2017"}
+        }
+        STN{
             few{"دوبرا ساو تومي وبرينسيبي"}
             many{"دوبرا ساو تومي وبرينسيبي"}
             one{"دوبرا ساو تومي وبرينسيبي"}
@@ -2417,5 +2441,5 @@
         two{"{0} {1}"}
         zero{"{0} {1}"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/ar_AE.txt b/icu4c/source/data/curr/ar_AE.txt
index 3bfec55..c6669cd 100644
--- a/icu4c/source/data/curr/ar_AE.txt
+++ b/icu4c/source/data/curr/ar_AE.txt
@@ -4,5 +4,5 @@
     Currencies%narrow{
         BND{"$"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/curr/ar_DJ.txt b/icu4c/source/data/curr/ar_DJ.txt
index bfc38d3..a35472f 100644
--- a/icu4c/source/data/curr/ar_DJ.txt
+++ b/icu4c/source/data/curr/ar_DJ.txt
@@ -7,5 +7,5 @@
             "فرنك جيبوتي",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/curr/ar_ER.txt b/icu4c/source/data/curr/ar_ER.txt
index ebc2697..1ee4013 100644
--- a/icu4c/source/data/curr/ar_ER.txt
+++ b/icu4c/source/data/curr/ar_ER.txt
@@ -7,5 +7,5 @@
             "ناكفا أريتري",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/curr/ar_KM.txt b/icu4c/source/data/curr/ar_KM.txt
index 55cdbac..150c5df 100644
--- a/icu4c/source/data/curr/ar_KM.txt
+++ b/icu4c/source/data/curr/ar_KM.txt
@@ -7,5 +7,5 @@
             "فرنك جزر القمر",
         }
     }
-    Version{"2.1.35.71"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/curr/ar_LB.txt b/icu4c/source/data/curr/ar_LB.txt
index d6b7c46..f4402a6 100644
--- a/icu4c/source/data/curr/ar_LB.txt
+++ b/icu4c/source/data/curr/ar_LB.txt
@@ -7,5 +7,5 @@
             "جنيه سوداني",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/curr/ar_SO.txt b/icu4c/source/data/curr/ar_SO.txt
index 6d4334f..d6ea272 100644
--- a/icu4c/source/data/curr/ar_SO.txt
+++ b/icu4c/source/data/curr/ar_SO.txt
@@ -7,5 +7,5 @@
             "شلن صومالي",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/curr/ar_SS.txt b/icu4c/source/data/curr/ar_SS.txt
index 5c5350e..966534f 100644
--- a/icu4c/source/data/curr/ar_SS.txt
+++ b/icu4c/source/data/curr/ar_SS.txt
@@ -11,5 +11,5 @@
             "جنيه جنوب السودان",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/curr/asa.txt b/icu4c/source/data/curr/asa.txt
index 0c4291f..4154334 100644
--- a/icu4c/source/data/curr/asa.txt
+++ b/icu4c/source/data/curr/asa.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ugwiya ya Moritania",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "dobra ya Thao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra ya Thao Tome na Principe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "dola ya Dhimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ast.txt b/icu4c/source/data/curr/ast.txt
index 6f4626c..c91cddc 100644
--- a/icu4c/source/data/curr/ast.txt
+++ b/icu4c/source/data/curr/ast.txt
@@ -680,6 +680,10 @@
         }
         MRO{
             "MRO",
+            "ouguiya mauritanu (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ouguiya mauritanu",
         }
         MTL{
@@ -912,6 +916,10 @@
         }
         STD{
             "STD",
+            "dobra de Santu Tomé y Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra de Santu Tomé y Príncipe",
         }
         SUR{
@@ -1278,7 +1286,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1976,6 +1984,10 @@
             other{"pataques de Macáu"}
         }
         MRO{
+            one{"ouguiya mauritanu (1973–2017)"}
+            other{"ouguiyas mauritanos (1973–2017)"}
+        }
+        MRU{
             one{"ouguiya mauritanu"}
             other{"ouguiyas mauritanos"}
         }
@@ -2208,6 +2220,10 @@
             other{"llibres sursudaneses"}
         }
         STD{
+            one{"dobra de Santu Tomé y Príncipe (1977–2017)"}
+            other{"dobras de Santu Tomé y Príncipe (1977–2017)"}
+        }
+        STN{
             one{"dobra de Santu Tomé y Príncipe"}
             other{"dobras de Santu Tomé y Príncipe"}
         }
@@ -2496,5 +2512,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/az.txt b/icu4c/source/data/curr/az.txt
index e9170c0..c5a4e73 100644
--- a/icu4c/source/data/curr/az.txt
+++ b/icu4c/source/data/curr/az.txt
@@ -228,7 +228,7 @@
         }
         CNH{
             "CNH",
-            "CNH",
+            "Çin Yuanı (ofşor)",
         }
         CNY{
             "CN¥",
@@ -620,6 +620,10 @@
         }
         MRO{
             "MRO",
+            "Mavritaniya Ugiyası (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mavritaniya Ugiyası",
         }
         MTP{
@@ -828,6 +832,10 @@
         }
         STD{
             "STD",
+            "San Tom və Prinsip Dobrası (1977–2017)",
+        }
+        STN{
+            "STN",
             "San Tom və Prinsip Dobrası",
         }
         SUR{
@@ -1147,7 +1155,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"S£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1393,8 +1401,8 @@
             other{"Çili pesosu"}
         }
         CNH{
-            one{"CNH"}
-            other{"CNH"}
+            one{"Çin yuanı (ofşor)"}
+            other{"Çin yuanı (ofşor)"}
         }
         CNY{
             one{"Çin yuanı"}
@@ -1785,6 +1793,10 @@
             other{"Makao patakası"}
         }
         MRO{
+            one{"Mavritaniya ugiyası (1973–2017)"}
+            other{"Mavritaniya ugiyası (1973–2017)"}
+        }
+        MRU{
             one{"Mavritaniya ugiyası"}
             other{"Mavritaniya ugiyası"}
         }
@@ -1993,6 +2005,10 @@
             other{"Cənubi Sudan funtu"}
         }
         STD{
+            one{"San Tom və Prinsip dobrası (1977–2017)"}
+            other{"San Tom və Prinsip dobrası (1977–2017)"}
+        }
+        STN{
             one{"San Tom və Prinsip dobrası"}
             other{"San Tom və Prinsip dobrası"}
         }
@@ -2237,5 +2253,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/az_Cyrl.txt b/icu4c/source/data/curr/az_Cyrl.txt
index abe383d..d39219b 100644
--- a/icu4c/source/data/curr/az_Cyrl.txt
+++ b/icu4c/source/data/curr/az_Cyrl.txt
@@ -11,5 +11,5 @@
     Currencies%variant{
         AZN{"ман."}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/az_Latn.txt b/icu4c/source/data/curr/az_Latn.txt
index 9df6ff3..47ecb5c 100644
--- a/icu4c/source/data/curr/az_Latn.txt
+++ b/icu4c/source/data/curr/az_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/bas.txt b/icu4c/source/data/curr/bas.txt
index 907ac63..fff86f5 100644
--- a/icu4c/source/data/curr/bas.txt
+++ b/icu4c/source/data/curr/bas.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ùgwiya mòrìtanìa (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ùgwiya mòrìtanìa",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobrà sàotòme (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobrà sàotòme",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Dɔ̀lâr sìmbàbwê",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/be.txt b/icu4c/source/data/curr/be.txt
index 981648b..eea4db7 100644
--- a/icu4c/source/data/curr/be.txt
+++ b/icu4c/source/data/curr/be.txt
@@ -368,6 +368,10 @@
         }
         MRO{
             "MRO",
+            "маўрытанская ўгія (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "маўрытанская ўгія",
         }
         MUR{
@@ -516,6 +520,10 @@
         }
         STD{
             "STD",
+            "добра Сан-Тамэ і Прынсіпі (1977–2017)",
+        }
+        STN{
+            "STN",
             "добра Сан-Тамэ і Прынсіпі",
         }
         SYP{
@@ -711,7 +719,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1279,6 +1287,12 @@
             other{"патакі Макаа"}
         }
         MRO{
+            few{"маўрытанскія ўгіі (1973–2017)"}
+            many{"маўрытанскіх угій (1973–2017)"}
+            one{"маўрытанская ўгія (1973–2017)"}
+            other{"маўрытанскай ўгіі (1973–2017)"}
+        }
+        MRU{
             few{"маўрытанскія ўгіі"}
             many{"маўрытанскіх угій"}
             one{"маўрытанская ўгія"}
@@ -1501,6 +1515,12 @@
             other{"паўднёвасуданскага фунта"}
         }
         STD{
+            few{"добры Сан-Тамэ і Прынсіпі (1977–2017)"}
+            many{"добраў Сан-Тамэ і Прынсіпі (1977–2017)"}
+            one{"добра Сан-Тамэ і Прынсіпі (1977–2017)"}
+            other{"добры Сан-Тамэ і Прынсіпі (1977–2017)"}
+        }
+        STN{
             few{"добры Сан-Тамэ і Прынсіпі"}
             many{"добраў Сан-Тамэ і Прынсіпі"}
             one{"добра Сан-Тамэ і Прынсіпі"}
@@ -1681,5 +1701,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/bem.txt b/icu4c/source/data/curr/bem.txt
index baab364..0d4315c 100644
--- a/icu4c/source/data/curr/bem.txt
+++ b/icu4c/source/data/curr/bem.txt
@@ -7,5 +7,5 @@
             "ZMW",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/bez.txt b/icu4c/source/data/curr/bez.txt
index 9671319..a0c1939 100644
--- a/icu4c/source/data/curr/bez.txt
+++ b/icu4c/source/data/curr/bez.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Lupila lwa Humolitania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Lupila lwa Humolitania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Lupila lwa Husaotome na Huprinisipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Lupila lwa Husaotome na Huprinisipe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Lupila lwa Huzimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/bg.txt b/icu4c/source/data/curr/bg.txt
index e6b9f52..b47fabf 100644
--- a/icu4c/source/data/curr/bg.txt
+++ b/icu4c/source/data/curr/bg.txt
@@ -600,6 +600,10 @@
         }
         MRO{
             "MRO",
+            "Мавританска угия (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Мавританска угия",
         }
         MTL{
@@ -820,6 +824,10 @@
         }
         STD{
             "STD",
+            "Добра на Сао Томе и Принсипи (1977–2017)",
+        }
+        STN{
+            "STN",
             "Добра на Сао Томе и Принсипи",
         }
         SUR{
@@ -1154,7 +1162,7 @@
         SHP{"£"}
         SRD{"SRD"}
         SSP{"SSP"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1696,6 +1704,10 @@
             other{"патаки на Макао"}
         }
         MRO{
+            one{"мавританска угия (1973–2017)"}
+            other{"мавритански угии (1973–2017)"}
+        }
+        MRU{
             one{"мавританска угия"}
             other{"мавритански угии"}
         }
@@ -1904,6 +1916,10 @@
             other{"южносудански лири"}
         }
         STD{
+            one{"добра на Сао Томе и Принсипи (1977–2017)"}
+            other{"добра на Сао Томе и Принсипи (1977–2017)"}
+        }
+        STN{
             one{"добра на Сао Томе и Принсипи"}
             other{"добра на Сао Томе и Принсипи"}
         }
@@ -2104,5 +2120,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.59"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/bm.txt b/icu4c/source/data/curr/bm.txt
index be5ea2b..097a33a 100644
--- a/icu4c/source/data/curr/bm.txt
+++ b/icu4c/source/data/curr/bm.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "mɔritani Uguwiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mɔritani Uguwiya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "sawotome Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "sawotome Dobra",
         }
         SZL{
@@ -227,5 +235,5 @@
             "zimbabuwe Dolar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/bn.txt b/icu4c/source/data/curr/bn.txt
index 3c1d5e8..dd401c8 100644
--- a/icu4c/source/data/curr/bn.txt
+++ b/icu4c/source/data/curr/bn.txt
@@ -616,6 +616,10 @@
         }
         MRO{
             "MRO",
+            "মৌরিতানিয়ান ওউগুইয়া (১৯৭৩–২০১৭)",
+        }
+        MRU{
+            "MRU",
             "মৌরিতানিয়ান ওউগুইয়া",
         }
         MTL{
@@ -844,6 +848,10 @@
         }
         STD{
             "STD",
+            "সাও টোমে এবং প্রিন্সিপে ডোবরা (১৯৭৭–২০১৭)",
+        }
+        STN{
+            "STN",
             "সাও টোমে এবং প্রিন্সিপে ডোবরা",
         }
         SUR{
@@ -1167,7 +1175,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1561,6 +1569,10 @@
             other{"ম্যাক্যাও পাটাকা"}
         }
         MRO{
+            one{"মৌরিতানিয়ান ওউগুইয়া (১৯৭৩–২০১৭)"}
+            other{"মৌরিতানিয়ান ওউগুইয়া (১৯৭৩–২০১৭)"}
+        }
+        MRU{
             one{"মৌরিতানিয়ান ওউগুইয়া"}
             other{"মৌরিতানিয়ান ওউগুইয়া"}
         }
@@ -1713,6 +1725,10 @@
             other{"দক্ষিণ সুদানি পাউন্ড"}
         }
         STD{
+            one{"সাও টোমে এবং প্রিন্সিপে ডোবরা (১৯৭৭–২০১৭)"}
+            other{"সাও টোমে এবং প্রিন্সিপে ডোবরা (১৯৭৭–২০১৭)"}
+        }
+        STN{
             one{"সাও টোমে এবং প্রিন্সিপে ডোবরা"}
             other{"সাও টোমে এবং প্রিন্সিপে ডোবরা"}
         }
@@ -1829,5 +1845,5 @@
             other{"জাম্বিয়ান কওয়াচা"}
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/bo.txt b/icu4c/source/data/curr/bo.txt
index daea23d..c5c63f5 100644
--- a/icu4c/source/data/curr/bo.txt
+++ b/icu4c/source/data/curr/bo.txt
@@ -19,5 +19,5 @@
             "མ་རྟོགས་པའི་ནུས་མེད་དངུལ་ལོར",
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/bo_IN.txt b/icu4c/source/data/curr/bo_IN.txt
index 480cf0d..8a5f346 100644
--- a/icu4c/source/data/curr/bo_IN.txt
+++ b/icu4c/source/data/curr/bo_IN.txt
@@ -7,5 +7,5 @@
             "ཡུ་ཨན་",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/br.txt b/icu4c/source/data/curr/br.txt
index d581f42..103f7ea 100644
--- a/icu4c/source/data/curr/br.txt
+++ b/icu4c/source/data/curr/br.txt
@@ -680,6 +680,10 @@
         }
         MRO{
             "MRO",
+            "ouguiya Maouritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ouguiya Maouritania",
         }
         MTL{
@@ -912,6 +916,10 @@
         }
         STD{
             "STD",
+            "dobra São Tomé ha Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra São Tomé ha Príncipe",
         }
         SUR{
@@ -1262,7 +1270,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"$ T"}
@@ -2314,6 +2322,13 @@
             two{"bataca Macau"}
         }
         MRO{
+            few{"ouguiya Maouritania (1973–2017)"}
+            many{"a ouguiyaoù Maouritania (1973–2017)"}
+            one{"ouguiya Maouritania (1973–2017)"}
+            other{"ouguiya Maouritania (1973–2017)"}
+            two{"ouguiya Maouritania (1973–2017)"}
+        }
+        MRU{
             few{"ouguiya Maouritania"}
             many{"a ouguiyaoù Maouritania"}
             one{"ouguiya Maouritania"}
@@ -2706,6 +2721,13 @@
             two{"lur Susoudan"}
         }
         STD{
+            few{"dobra São Tomé ha Príncipe (1977–2017)"}
+            many{"a zobraoù São Tomé ha Príncipe (1977–2017)"}
+            one{"dobra São Tomé ha Príncipe (1977–2017)"}
+            other{"dobra São Tomé ha Príncipe (1977–2017)"}
+            two{"zobra São Tomé ha Príncipe (1977–2017)"}
+        }
+        STN{
             few{"dobra São Tomé ha Príncipe"}
             many{"a zobraoù São Tomé ha Príncipe"}
             one{"dobra São Tomé ha Príncipe"}
@@ -3105,5 +3127,5 @@
         other{"{0} {1}"}
         two{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/brx.txt b/icu4c/source/data/curr/brx.txt
index 2546a83..b858280 100644
--- a/icu4c/source/data/curr/brx.txt
+++ b/icu4c/source/data/curr/brx.txt
@@ -608,6 +608,10 @@
         }
         MRO{
             "MRO",
+            "मौरिटानी ऊगुया (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "मौरिटानी ऊगुया",
         }
         MTL{
@@ -824,6 +828,10 @@
         }
         STD{
             "STD",
+            "साँव तोमे एवं प्रीन्सीपे का डोब्रा (1977–2017)",
+        }
+        STN{
+            "STN",
             "साँव तोमे एवं प्रीन्सीपे का डोब्रा",
         }
         SUR{
@@ -1075,5 +1083,5 @@
             "ज़ीम्बाबवेई डॉलर",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/bs.txt b/icu4c/source/data/curr/bs.txt
index 7ba00c2..84a25fd 100644
--- a/icu4c/source/data/curr/bs.txt
+++ b/icu4c/source/data/curr/bs.txt
@@ -648,6 +648,10 @@
         }
         MRO{
             "MRO",
+            "Mauritanijska ugvija (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritanijska ugvija",
         }
         MTL{
@@ -876,6 +880,10 @@
         }
         STD{
             "STD",
+            "Dobra Sao Toma i Principa (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra Sao Toma i Principa",
         }
         SUR{
@@ -1227,7 +1235,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -2053,6 +2061,11 @@
             other{"makaonskih pataka"}
         }
         MRO{
+            few{"mauritanijske ugvije (1973–2017)"}
+            one{"mauritanijska ugvija (1973–2017)"}
+            other{"mauritanijskih ugvija (1973–2017)"}
+        }
+        MRU{
             few{"mauritanijske ugvije"}
             one{"mauritanijska ugvija"}
             other{"mauritanijskih ugvija"}
@@ -2338,6 +2351,11 @@
             other{"južnosudanskih funti"}
         }
         STD{
+            few{"dobre Sao Toma i Principa (1977–2017)"}
+            one{"dobra Sao Toma i Principa (1977–2017)"}
+            other{"dobri Sao Toma i Principa (1977–2017)"}
+        }
+        STN{
             few{"dobre Sao Toma i Principa"}
             one{"dobra Sao Toma i Principa"}
             other{"dobri Sao Toma i Principa"}
@@ -2683,5 +2701,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/bs_Cyrl.txt b/icu4c/source/data/curr/bs_Cyrl.txt
index fed69b3..96df21a 100644
--- a/icu4c/source/data/curr/bs_Cyrl.txt
+++ b/icu4c/source/data/curr/bs_Cyrl.txt
@@ -621,6 +621,10 @@
         }
         MRO{
             "MRO",
+            "Мауританијска угвија (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Мауританијска угвија",
         }
         MTL{
@@ -845,6 +849,10 @@
         }
         STD{
             "STD",
+            "Сао Томе и Принципе добра (1977–2017)",
+        }
+        STN{
+            "STN",
             "Сао Томе и Принципе добра",
         }
         SUR{
@@ -1884,6 +1892,11 @@
             other{"маканешких патака"}
         }
         MRO{
+            few{"мауританијске угвиље (1973–2017)"}
+            one{"мауританијска угвиља (1973–2017)"}
+            other{"мауританијске угвиље (1973–2017)"}
+        }
+        MRU{
             few{"мауританијске угвиље"}
             one{"мауританијска угвиља"}
             other{"мауританијске угвиље"}
@@ -2164,6 +2177,11 @@
             other{"суринамских гилдера"}
         }
         STD{
+            few{"сао томе и принципе добра (1977–2017)"}
+            one{"сао томе и принципе добар (1977–2017)"}
+            other{"сао томе и принципе добри (1977–2017)"}
+        }
+        STN{
             few{"сао томе и принципе добра"}
             one{"сао томе и принципе добар"}
             other{"сао томе и принципе добри"}
@@ -2494,5 +2512,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/bs_Latn.txt b/icu4c/source/data/curr/bs_Latn.txt
index 5e72765..0ac3778 100644
--- a/icu4c/source/data/curr/bs_Latn.txt
+++ b/icu4c/source/data/curr/bs_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/ca.txt b/icu4c/source/data/curr/ca.txt
index 88a5586..19c9287 100644
--- a/icu4c/source/data/curr/ca.txt
+++ b/icu4c/source/data/curr/ca.txt
@@ -685,6 +685,10 @@
         }
         MRO{
             "MRO",
+            "ouguiya maurità (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ouguiya maurità",
         }
         MTL{
@@ -913,6 +917,10 @@
         }
         STD{
             "STD",
+            "dobra de São Tomé i Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra de São Tomé i Príncipe",
         }
         SUR{
@@ -1268,7 +1276,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1970,6 +1978,10 @@
             other{"pataques de Macau"}
         }
         MRO{
+            one{"ouguiya maurità (1973–2017)"}
+            other{"ouguiyas mauritans (1973–2017)"}
+        }
+        MRU{
             one{"ouguiya maurità"}
             other{"ouguiyas mauritans"}
         }
@@ -2198,6 +2210,10 @@
             other{"lliures del Sudan del Sud"}
         }
         STD{
+            one{"dobra de São Tomé i Príncipe (1977–2017)"}
+            other{"dobras de São Tomé i Príncipe (1977–2017)"}
+        }
+        STN{
             one{"dobra de São Tomé i Príncipe"}
             other{"dobras de São Tomé i Príncipe"}
         }
@@ -2478,5 +2494,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/ca_FR.txt b/icu4c/source/data/curr/ca_FR.txt
index 6282ace..fbf4e0f 100644
--- a/icu4c/source/data/curr/ca_FR.txt
+++ b/icu4c/source/data/curr/ca_FR.txt
@@ -7,5 +7,5 @@
             "franc francès",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/ccp.txt b/icu4c/source/data/curr/ccp.txt
index 1048ecf..3afd2a8 100644
--- a/icu4c/source/data/curr/ccp.txt
+++ b/icu4c/source/data/curr/ccp.txt
@@ -604,6 +604,10 @@
         }
         MRO{
             "MRO",
+            "𑄟𑄯𑄢𑄨𑄖𑄚𑄨𑄠𑄚𑄴 𑄃𑄮𑄃𑄪𑄉𑄭𑄪𑄠 (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "𑄟𑄯𑄢𑄨𑄖𑄚𑄨𑄠𑄚𑄴 𑄃𑄮𑄃𑄪𑄉𑄭𑄪𑄠",
         }
         MTL{
@@ -832,6 +836,10 @@
         }
         STD{
             "STD",
+            "𑄥𑄃𑄮 𑄑𑄮𑄟𑄬 𑄃𑄳𑄃 𑄛𑄳𑄢𑄨𑄚𑄴𑄥𑄨𑄛𑄬 𑄓𑄮𑄛𑄴𑄢 (1977–2017)",
+        }
+        STN{
+            "STN",
             "𑄥𑄃𑄮 𑄑𑄮𑄟𑄬 𑄃𑄳𑄃 𑄛𑄳𑄢𑄨𑄚𑄴𑄥𑄨𑄛𑄬 𑄓𑄮𑄛𑄴𑄢",
         }
         SUR{
@@ -1146,7 +1154,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1536,6 +1544,10 @@
             other{"𑄟𑄳𑄠𑄇𑄳𑄠𑄃𑄮 𑄛𑄑𑄇"}
         }
         MRO{
+            one{"𑄟𑄯𑄢𑄨𑄖𑄚𑄨𑄠𑄚𑄴 𑄃𑄮𑄃𑄪𑄉𑄭𑄪𑄠 (1973–2017)"}
+            other{"𑄟𑄯𑄢𑄨𑄖𑄚𑄨𑄠𑄚𑄴 𑄃𑄮𑄃𑄪𑄉𑄭𑄪𑄠 (1973–2017)"}
+        }
+        MRU{
             one{"𑄟𑄯𑄢𑄨𑄖𑄚𑄨𑄠𑄚𑄴 𑄃𑄮𑄃𑄪𑄉𑄭𑄪𑄠"}
             other{"𑄟𑄯𑄢𑄨𑄖𑄚𑄨𑄠𑄚𑄴 𑄃𑄮𑄃𑄪𑄉𑄭𑄪𑄠"}
         }
@@ -1688,6 +1700,10 @@
             other{"𑄘𑄧𑄉𑄨𑄚𑄴 𑄥𑄪𑄘𑄚𑄨 𑄛𑄃𑄪𑄚𑄳𑄓𑄴"}
         }
         STD{
+            one{"𑄥𑄃𑄮 𑄑𑄮𑄟𑄬 𑄃𑄳𑄃 𑄛𑄳𑄢𑄨𑄚𑄴𑄥𑄨𑄛𑄬 𑄓𑄮𑄛𑄴𑄢 (1977–2017)"}
+            other{"𑄥𑄃𑄮 𑄑𑄮𑄟𑄬 𑄃𑄳𑄃 𑄛𑄳𑄢𑄨𑄚𑄴𑄥𑄨𑄛𑄬 𑄓𑄮𑄛𑄴𑄢 (1977–2017)"}
+        }
+        STN{
             one{"𑄥𑄃𑄮 𑄑𑄮𑄟𑄬 𑄃𑄳𑄃 𑄛𑄳𑄢𑄨𑄚𑄴𑄥𑄨𑄛𑄬 𑄓𑄮𑄛𑄴𑄢"}
             other{"𑄥𑄃𑄮 𑄑𑄮𑄟𑄬 𑄃𑄳𑄃 𑄛𑄳𑄢𑄨𑄚𑄴𑄥𑄨𑄛𑄬 𑄓𑄮𑄛𑄴𑄢"}
         }
@@ -1808,5 +1824,5 @@
             other{"𑄎𑄟𑄴𑄝𑄨𑄠𑄚𑄴 𑄇𑄧𑄤𑄌"}
         }
     }
-    Version{"2.1.37.51"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ce.txt b/icu4c/source/data/curr/ce.txt
index 01bd46b..c0cf5ac 100644
--- a/icu4c/source/data/curr/ce.txt
+++ b/icu4c/source/data/curr/ce.txt
@@ -364,6 +364,10 @@
         }
         MRO{
             "MRO",
+            "Мавританин уги (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Мавританин уги",
         }
         MUR{
@@ -512,6 +516,10 @@
         }
         STD{
             "STD",
+            "Сан-Томен а, Принсипин а добра (1977–2017)",
+        }
+        STN{
+            "STN",
             "Сан-Томен а, Принсипин а добра",
         }
         SYP{
@@ -705,7 +713,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1087,6 +1095,10 @@
             other{"Макаон патакаш"}
         }
         MRO{
+            one{"Мавританин уги (1973–2017)"}
+            other{"Мавританин угиш (1973–2017)"}
+        }
+        MRU{
             one{"Мавританин уги"}
             other{"Мавританин угиш"}
         }
@@ -1235,6 +1247,10 @@
             other{"Къилба Суданан фунташ"}
         }
         STD{
+            one{"Сан-Томен а, Принсипин а добра (1977–2017)"}
+            other{"Сан-Томен а, Принсипин а добраш (1977–2017)"}
+        }
+        STN{
             one{"Сан-Томен а, Принсипин а добра"}
             other{"Сан-Томен а, Принсипин а добраш"}
         }
@@ -1355,5 +1371,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/cgg.txt b/icu4c/source/data/curr/cgg.txt
index c51b170..ecc0415 100644
--- a/icu4c/source/data/curr/cgg.txt
+++ b/icu4c/source/data/curr/cgg.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ougwiya ya Mouriteeniya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ougwiya ya Mouriteeniya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Purinsipo (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Purinsipo",
         }
         TND{
@@ -223,5 +231,5 @@
             "Doora ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/chr.txt b/icu4c/source/data/curr/chr.txt
index 3481406..4ec7b04 100644
--- a/icu4c/source/data/curr/chr.txt
+++ b/icu4c/source/data/curr/chr.txt
@@ -122,6 +122,10 @@
             "CLP",
             "ᏥᎵ ᎠᏕᎳ",
         }
+        CNH{
+            "CNH",
+            "ᏣᏂᏏ ᎠᏕᎳ (ᏓᎹᏳᏟᏗ)",
+        }
         CNY{
             "CN¥",
             "ᏓᎶᏂᎨ ᎠᏕᎳ",
@@ -148,7 +152,7 @@
         }
         CZK{
             "CZK",
-            "ᏤᎩ ᏍᎦᏚᎩ ᎠᏕᎳ",
+            "ᏤᎩ ᎠᏕᎳ",
         }
         DJF{
             "DJF",
@@ -364,6 +368,10 @@
         }
         MRO{
             "MRO",
+            "ᎼᎵᏏᎥᏍ ᎠᏕᎳ (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ᎼᎵᏏᎥᏍ ᎠᏕᎳ",
         }
         MUR{
@@ -512,6 +520,10 @@
         }
         STD{
             "STD",
+            "ᏌᎣᏙᎺ ᎠᎴ ᏈᏂᏏᏇ ᎠᏕᎳ (1977–2017)",
+        }
+        STN{
+            "STN",
             "ᏌᎣᏙᎺ ᎠᎴ ᏈᏂᏏᏇ ᎠᏕᎳ",
         }
         SYP{
@@ -707,7 +719,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -847,6 +859,10 @@
             one{"ᏥᎵ ᎠᏕᎳ"}
             other{"ᏥᎵ ᎠᏕᎳ"}
         }
+        CNH{
+            one{"ᏣᏂᏏ ᎠᏕᎳ (ᏓᎹᏳᏟᏗ)"}
+            other{"ᏣᏂᏏ ᎠᏕᎳ (ᏓᎹᏳᏟᏗ)"}
+        }
         CNY{
             one{"ᏓᎶᏂᎨ ᎠᏕᎳ"}
             other{"ᏓᎶᏂᎨ ᎠᏕᎳ"}
@@ -872,8 +888,8 @@
             other{"ᎢᎬᎾᏕᎾ ᎢᏤᏳᏍᏗ ᎠᏕᎳ"}
         }
         CZK{
-            one{"ᏤᎩ ᏍᎦᏚᎩ ᎠᏕᎳ"}
-            other{"ᏤᎩ ᏍᎦᏚᎩ ᎠᏕᎳ"}
+            one{"ᏤᎩ ᎠᏕᎳ"}
+            other{"ᏤᎩ ᎠᏕᎳ"}
         }
         DJF{
             one{"ᏥᏊᏗ ᎠᏕᎳ"}
@@ -1088,6 +1104,10 @@
             other{"ᎹᎧᎣ ᎠᏕᎳ"}
         }
         MRO{
+            one{"ᎼᎵᏏᎥᏍ ᎠᏕᎳ (1973–2017)"}
+            other{"ᎼᎵᏏᎥᏍ ᎠᏕᎳ (1973–2017)"}
+        }
+        MRU{
             one{"ᎼᎵᏏᎥᏍ ᎠᏕᎳ"}
             other{"ᎼᎵᏏᎥᏍ ᎠᏕᎳ"}
         }
@@ -1236,6 +1256,10 @@
             other{"ᏧᎦᎾᏮ ᏑᏕᏂ ᎠᏕᎳ"}
         }
         STD{
+            one{"ᏌᎣᏙᎺ ᎠᎴ ᏈᏂᏏᏇ ᎠᏕᎳ (1977–2017)"}
+            other{"ᏌᎣᏙᎺ ᎠᎴ ᏈᏂᏏᏇ ᎠᏕᎳ (1977–2017)"}
+        }
+        STN{
             one{"ᏌᎣᏙᎺ ᎠᎴ ᏈᏂᏏᏇ ᎠᏕᎳ"}
             other{"ᏌᎣᏙᎺ ᎠᎴ ᏈᏂᏏᏇ ᎠᏕᎳ"}
         }
@@ -1356,5 +1380,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ckb.txt b/icu4c/source/data/curr/ckb.txt
index 25c860e..00e3965 100644
--- a/icu4c/source/data/curr/ckb.txt
+++ b/icu4c/source/data/curr/ckb.txt
@@ -7,5 +7,5 @@
             "IQD",
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.71"}
 }
diff --git a/icu4c/source/data/curr/cs.txt b/icu4c/source/data/curr/cs.txt
index 8b1e438..0255384 100644
--- a/icu4c/source/data/curr/cs.txt
+++ b/icu4c/source/data/curr/cs.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "mauritánská ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mauritánská ouguiya",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "svatotomášská dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "svatotomášská dobra",
         }
         SUR{
@@ -1283,7 +1291,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -2325,6 +2333,12 @@
             other{"macajských patac"}
         }
         MRO{
+            few{"mauritánské ouguiye (1973–2017)"}
+            many{"mauritánské ouguiye (1973–2017)"}
+            one{"mauritánská ouguiya (1973–2017)"}
+            other{"mauritánských ouguiyí (1973–2017)"}
+        }
+        MRU{
             few{"mauritánské ouguiye"}
             many{"mauritánské ouguiye"}
             one{"mauritánská ouguiya"}
@@ -2673,6 +2687,12 @@
             other{"jihosúdánských liber"}
         }
         STD{
+            few{"svatotomášské dobry (1977–2017)"}
+            many{"svatotomášské dobry (1977–2017)"}
+            one{"svatotomášská dobra (1977–2017)"}
+            other{"svatotomášských dober (1977–2017)"}
+        }
+        STN{
             few{"svatotomášské dobry"}
             many{"svatotomášské dobry"}
             one{"svatotomášská dobra"}
@@ -3093,5 +3113,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.11"}
+    Version{"2.1.39.15"}
 }
diff --git a/icu4c/source/data/curr/cy.txt b/icu4c/source/data/curr/cy.txt
index d3490a0..abc467a 100644
--- a/icu4c/source/data/curr/cy.txt
+++ b/icu4c/source/data/curr/cy.txt
@@ -644,6 +644,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya Mauritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya Mauritania",
         }
         MTL{
@@ -860,6 +864,10 @@
         }
         STD{
             "STD",
+            "Dobra São Tomé a Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra São Tomé a Príncipe",
         }
         SVC{
@@ -1183,7 +1191,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -2413,6 +2421,14 @@
             zero{"pataca Macau"}
         }
         MRO{
+            few{"ouguiya Mauritania (1973–2017)"}
+            many{"ouguiya Mauritania (1973–2017)"}
+            one{"ouguiya Mauritania (1973–2017)"}
+            other{"ouguiya Mauritania (1973–2017)"}
+            two{"ouguiya Mauritania (1973–2017)"}
+            zero{"ouguiya Mauritania (1973–2017)"}
+        }
+        MRU{
             few{"ouguiya Mauritania"}
             many{"ouguiya Mauritania"}
             one{"ouguiya Mauritania"}
@@ -2813,6 +2829,14 @@
             zero{"punt De Sudan"}
         }
         STD{
+            few{"dobra São Tomé a Príncipe (1977–2017)"}
+            many{"dobra São Tomé a Príncipe (1977–2017)"}
+            one{"dobra São Tomé a Príncipe (1977–2017)"}
+            other{"dobra São Tomé a Príncipe (1977–2017)"}
+            two{"dobra São Tomé a Príncipe (1977–2017)"}
+            zero{"dobra São Tomé a Príncipe (1977–2017)"}
+        }
+        STN{
             few{"dobra São Tomé a Príncipe"}
             many{"dobra São Tomé a Príncipe"}
             one{"dobra São Tomé a Príncipe"}
@@ -3237,5 +3261,5 @@
         two{"{0} {1}"}
         zero{"{0} {1}"}
     }
-    Version{"2.1.37.17"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/da.txt b/icu4c/source/data/curr/da.txt
index 5ef0dd8..fd9a9a2 100644
--- a/icu4c/source/data/curr/da.txt
+++ b/icu4c/source/data/curr/da.txt
@@ -604,6 +604,10 @@
         }
         MRO{
             "MRO",
+            "mauritansk ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mauritansk ouguiya",
         }
         MTL{
@@ -824,6 +828,10 @@
         }
         STD{
             "STD",
+            "dobra fra Sao Tome og Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra fra Sao Tome og Principe",
         }
         SUR{
@@ -1159,7 +1167,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1781,6 +1789,10 @@
             other{"macaoske pataca"}
         }
         MRO{
+            one{"mauritansk ouguiya (1973–2017)"}
+            other{"mauritanske ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"mauritansk ouguiya"}
             other{"mauritanske ouguiya"}
         }
@@ -2001,6 +2013,10 @@
             other{"sydsudanske pund"}
         }
         STD{
+            one{"dobra fra Sao Tome og Principe (1977–2017)"}
+            other{"dobra fra Sao Tome og Principe (1977–2017)"}
+        }
+        STN{
             one{"dobra fra Sao Tome og Principe"}
             other{"dobra fra Sao Tome og Principe"}
         }
@@ -2225,5 +2241,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/dav.txt b/icu4c/source/data/curr/dav.txt
index cd84b5c..2e481ea 100644
--- a/icu4c/source/data/curr/dav.txt
+++ b/icu4c/source/data/curr/dav.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/de.txt b/icu4c/source/data/curr/de.txt
index 0d08d7d..8ed874d 100644
--- a/icu4c/source/data/curr/de.txt
+++ b/icu4c/source/data/curr/de.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "Mauretanischer Ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauretanischer Ouguiya",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "São-toméischer Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "São-toméischer Dobra",
         }
         SUR{
@@ -1281,7 +1289,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"SYP"}
         THB{"฿"}
         TOP{"T$"}
@@ -1983,6 +1991,10 @@
             other{"Macao-Pataca"}
         }
         MRO{
+            one{"Mauretanischer Ouguiya (1973–2017)"}
+            other{"Mauretanische Ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"Mauretanischer Ouguiya"}
             other{"Mauretanische Ouguiya"}
         }
@@ -2215,6 +2227,10 @@
             other{"Südsudanesische Pfund"}
         }
         STD{
+            one{"São-toméischer Dobra (1977–2017)"}
+            other{"São-toméische Dobra (1977–2017)"}
+        }
+        STN{
             one{"São-toméischer Dobra"}
             other{"São-toméische Dobra"}
         }
@@ -2503,5 +2519,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.96"}
+    Version{"2.1.39.41"}
 }
diff --git a/icu4c/source/data/curr/de_CH.txt b/icu4c/source/data/curr/de_CH.txt
index 6cf7213..c6f877a 100644
--- a/icu4c/source/data/curr/de_CH.txt
+++ b/icu4c/source/data/curr/de_CH.txt
@@ -18,6 +18,10 @@
             "PEN",
             "Peruanischer Neuer Sol",
         }
+        STN{
+            "STN",
+            "São-toméischer Dobra (2018)",
+        }
     }
     Currencies%narrow{
         EUR{"EUR"}
@@ -34,6 +38,10 @@
         PEN{
             one{"Peruanischer Neuer Sol"}
         }
+        STN{
+            one{"São-toméischer Dobra (2018)"}
+            other{"São-toméischer Dobra (2018)"}
+        }
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
 }
diff --git a/icu4c/source/data/curr/de_LI.txt b/icu4c/source/data/curr/de_LI.txt
index c048254..4838fe4 100644
--- a/icu4c/source/data/curr/de_LI.txt
+++ b/icu4c/source/data/curr/de_LI.txt
@@ -7,5 +7,5 @@
             "Euro",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/de_LU.txt b/icu4c/source/data/curr/de_LU.txt
index a6fd633..46822ac 100644
--- a/icu4c/source/data/curr/de_LU.txt
+++ b/icu4c/source/data/curr/de_LU.txt
@@ -12,5 +12,5 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/dje.txt b/icu4c/source/data/curr/dje.txt
index edc1130..e201eee 100644
--- a/icu4c/source/data/curr/dje.txt
+++ b/icu4c/source/data/curr/dje.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Mooritaani Ugiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mooritaani Ugiya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Sao Tome nda Prinsipe Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Sao Tome nda Prinsipe Dobra",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Zimbabwe Dollar",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/dsb.txt b/icu4c/source/data/curr/dsb.txt
index b9be0a3..6d38de6 100644
--- a/icu4c/source/data/curr/dsb.txt
+++ b/icu4c/source/data/curr/dsb.txt
@@ -464,6 +464,10 @@
         }
         MRO{
             "MRO",
+            "mauretański ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mauretański ouguiya",
         }
         MUR{
@@ -620,6 +624,10 @@
         }
         STD{
             "STD",
+            "são-tomeska dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "são-tomeska dobra",
         }
         SVC{
@@ -1434,6 +1442,12 @@
             two{"macaoskej pataca"}
         }
         MRO{
+            few{"mauretańske ouguiya (1973–2017)"}
+            one{"mauretański ouguiya (1973–2017)"}
+            other{"mauretański ouguiya (1973–2017)"}
+            two{"mauretańskej ouguiya (1973–2017)"}
+        }
+        MRU{
             few{"mauretańske ouguiya"}
             one{"mauretański ouguiya"}
             other{"mauretański ouguiya"}
@@ -1668,6 +1682,12 @@
             two{"pódpołdnjowosudańskej punta"}
         }
         STD{
+            few{"são-tomeske dobry (1977–2017)"}
+            one{"são-tomeska dobra (1977–2017)"}
+            other{"são-tomeskich dobrow (1977–2017)"}
+            two{"são-tomeskej dobrje (1977–2017)"}
+        }
+        STN{
             few{"são-tomeske dobry"}
             one{"são-tomeska dobra"}
             other{"são-tomeskich dobrow"}
@@ -1854,5 +1874,5 @@
         other{"{0} {1}"}
         two{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/dua.txt b/icu4c/source/data/curr/dua.txt
index 9f33cd5..de51750 100644
--- a/icu4c/source/data/curr/dua.txt
+++ b/icu4c/source/data/curr/dua.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dua{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/dyo.txt b/icu4c/source/data/curr/dyo.txt
index 21dd7f0..bc0b139 100644
--- a/icu4c/source/data/curr/dyo.txt
+++ b/icu4c/source/data/curr/dyo.txt
@@ -104,6 +104,10 @@
         }
         MRO{
             "MRO",
+            "ugiiya yati Mooritanii (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ugiiya yati Mooritanii",
         }
         MWK{
@@ -119,5 +123,5 @@
             "seefa yati BCEAO",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/dz.txt b/icu4c/source/data/curr/dz.txt
index 423be1a..bd5bc89 100644
--- a/icu4c/source/data/curr/dz.txt
+++ b/icu4c/source/data/curr/dz.txt
@@ -303,5 +303,5 @@
             "སཱའུཐ་ ཨཕ་རི་ཀ་གི་དངུལ་ རཱནད",
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/ebu.txt b/icu4c/source/data/curr/ebu.txt
index 872ac41..8435860 100644
--- a/icu4c/source/data/curr/ebu.txt
+++ b/icu4c/source/data/curr/ebu.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ee.txt b/icu4c/source/data/curr/ee.txt
index 66b6aeb..1edb2ce 100644
--- a/icu4c/source/data/curr/ee.txt
+++ b/icu4c/source/data/curr/ee.txt
@@ -680,6 +680,10 @@
         }
         MRO{
             "MRO",
+            "mɔritaniaga ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mɔritaniaga ouguiya",
         }
         MTL{
@@ -876,6 +880,10 @@
         }
         STD{
             "STD",
+            "são tomé kple príncipega dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "são tomé kple príncipega dobra",
         }
         SUR{
@@ -1890,6 +1898,10 @@
             other{"makanesega pataca"}
         }
         MRO{
+            one{"mɔritaniaga ouguiya (1973–2017)"}
+            other{"mɔritaniaga ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"mɔritaniaga ouguiya"}
             other{"mɔritaniaga ouguiya"}
         }
@@ -2086,6 +2098,10 @@
             other{"surinamega guilder"}
         }
         STD{
+            one{"são tomé kple príncipega dobra (1977–2017)"}
+            other{"são tomé kple príncipega dobra (1977–2017)"}
+        }
+        STN{
             one{"são tomé kple príncipega dobra"}
             other{"são tomé kple príncipega dobra"}
         }
@@ -2366,5 +2382,5 @@
         one{"{1} {0}"}
         other{"{1} {0}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/el.txt b/icu4c/source/data/curr/el.txt
index 99052bc..89feb95 100644
--- a/icu4c/source/data/curr/el.txt
+++ b/icu4c/source/data/curr/el.txt
@@ -617,6 +617,10 @@
         }
         MRO{
             "MRO",
+            "Ουγκίγια Μαυριτανίας (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ουγκίγια Μαυριτανίας",
         }
         MTL{
@@ -841,6 +845,10 @@
         }
         STD{
             "STD",
+            "Ντόμπρα Σάο Τομέ και Πρίνσιπε (1977–2017)",
+        }
+        STN{
+            "STN",
             "Ντόμπρα Σάο Τομέ και Πρίνσιπε",
         }
         SUR{
@@ -1156,7 +1164,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1778,6 +1786,10 @@
             other{"πατάκα Μακάο"}
         }
         MRO{
+            one{"ουγκίγια Μαυριτανίας (1973–2017)"}
+            other{"ουγκίγια Μαυριτανίας (1973–2017)"}
+        }
+        MRU{
             one{"ουγκίγια Μαυριτανίας"}
             other{"ουγκίγια Μαυριτανίας"}
         }
@@ -2002,6 +2014,10 @@
             other{"λίρες Νότιου Σουδάν"}
         }
         STD{
+            one{"ντόμπρα Σάο Τομέ και Πρίνσιπε (1977–2017)"}
+            other{"ντόμπρα Σάο Τομέ και Πρίνσιπε (1977–2017)"}
+        }
+        STN{
             one{"ντόμπρα Σάο Τομέ και Πρίνσιπε"}
             other{"ντόμπρα Σάο Τομέ και Πρίνσιπε"}
         }
@@ -2242,5 +2258,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/en.txt b/icu4c/source/data/curr/en.txt
index 09469b5..a061991 100644
--- a/icu4c/source/data/curr/en.txt
+++ b/icu4c/source/data/curr/en.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "Mauritanian Ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritanian Ouguiya",
         }
         MTL{
@@ -916,11 +920,11 @@
         }
         STD{
             "STD",
-            "São Tomé & Príncipe Dobra",
+            "São Tomé & Príncipe Dobra (1977–2017)",
         }
         STN{
             "STN",
-            "São Tomé & Príncipe Dobra (2018)",
+            "São Tomé & Príncipe Dobra",
         }
         SUR{
             "SUR",
@@ -1885,6 +1889,10 @@
             other{"Macanese patacas"}
         }
         MRO{
+            one{"Mauritanian ouguiya (1973–2017)"}
+            other{"Mauritanian ouguiyas (1973–2017)"}
+        }
+        MRU{
             one{"Mauritanian ouguiya"}
             other{"Mauritanian ouguiyas"}
         }
@@ -2117,12 +2125,12 @@
             other{"South Sudanese pounds"}
         }
         STD{
-            one{"São Tomé & Príncipe dobra"}
-            other{"São Tomé & Príncipe dobras"}
+            one{"São Tomé & Príncipe dobra (1977–2017)"}
+            other{"São Tomé & Príncipe dobras (1977–2017)"}
         }
         STN{
-            one{"São Tomé & Príncipe dobra (2018)"}
-            other{"São Tomé & Príncipe dobras (2018)"}
+            one{"São Tomé & Príncipe dobra"}
+            other{"São Tomé & Príncipe dobras"}
         }
         SUR{
             one{"Soviet rouble"}
@@ -2409,5 +2417,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.44"}
+    Version{"2.1.39.27"}
 }
diff --git a/icu4c/source/data/curr/en_001.txt b/icu4c/source/data/curr/en_001.txt
index bce60d6..7d52f8b 100644
--- a/icu4c/source/data/curr/en_001.txt
+++ b/icu4c/source/data/curr/en_001.txt
@@ -69,5 +69,5 @@
             other{"Tajikistani roubles"}
         }
     }
-    Version{"2.1.35.71"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_150.txt b/icu4c/source/data/curr/en_150.txt
index c202dce..8cc0fc4 100644
--- a/icu4c/source/data/curr/en_150.txt
+++ b/icu4c/source/data/curr/en_150.txt
@@ -13,5 +13,5 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_AG.txt b/icu4c/source/data/curr/en_AG.txt
index bc2b096..897a730 100644
--- a/icu4c/source/data/curr/en_AG.txt
+++ b/icu4c/source/data/curr/en_AG.txt
@@ -8,5 +8,5 @@
             "East Caribbean Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_AI.txt b/icu4c/source/data/curr/en_AI.txt
index b746078..4c23172 100644
--- a/icu4c/source/data/curr/en_AI.txt
+++ b/icu4c/source/data/curr/en_AI.txt
@@ -8,5 +8,5 @@
             "East Caribbean Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_AT.txt b/icu4c/source/data/curr/en_AT.txt
index 0bca0cd..c955b37 100644
--- a/icu4c/source/data/curr/en_AT.txt
+++ b/icu4c/source/data/curr/en_AT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AT{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_AU.txt b/icu4c/source/data/curr/en_AU.txt
index 3d6a399..313aca0 100644
--- a/icu4c/source/data/curr/en_AU.txt
+++ b/icu4c/source/data/curr/en_AU.txt
@@ -208,5 +208,5 @@
             other{"Samoan talas"}
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/curr/en_BB.txt b/icu4c/source/data/curr/en_BB.txt
index d20afe5..f10b164 100644
--- a/icu4c/source/data/curr/en_BB.txt
+++ b/icu4c/source/data/curr/en_BB.txt
@@ -8,5 +8,5 @@
             "Barbadian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_BE.txt b/icu4c/source/data/curr/en_BE.txt
index 6c7e5ab..c0eab02 100644
--- a/icu4c/source/data/curr/en_BE.txt
+++ b/icu4c/source/data/curr/en_BE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BE{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_BI.txt b/icu4c/source/data/curr/en_BI.txt
index 9b5b6b2..006ba38 100644
--- a/icu4c/source/data/curr/en_BI.txt
+++ b/icu4c/source/data/curr/en_BI.txt
@@ -7,5 +7,5 @@
             "Burundian Franc",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_BM.txt b/icu4c/source/data/curr/en_BM.txt
index 3db9c65..352621f 100644
--- a/icu4c/source/data/curr/en_BM.txt
+++ b/icu4c/source/data/curr/en_BM.txt
@@ -8,5 +8,5 @@
             "Bermudan Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_BS.txt b/icu4c/source/data/curr/en_BS.txt
index 4455cfa..79d5c54 100644
--- a/icu4c/source/data/curr/en_BS.txt
+++ b/icu4c/source/data/curr/en_BS.txt
@@ -8,5 +8,5 @@
             "Bahamian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_BW.txt b/icu4c/source/data/curr/en_BW.txt
index 65ac0b5..15b5694 100644
--- a/icu4c/source/data/curr/en_BW.txt
+++ b/icu4c/source/data/curr/en_BW.txt
@@ -8,5 +8,5 @@
             "Botswanan Pula",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_BZ.txt b/icu4c/source/data/curr/en_BZ.txt
index 98d82d1..0a649b4 100644
--- a/icu4c/source/data/curr/en_BZ.txt
+++ b/icu4c/source/data/curr/en_BZ.txt
@@ -8,5 +8,5 @@
             "Belize Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_CA.txt b/icu4c/source/data/curr/en_CA.txt
index 3a592c0..a8396fc 100644
--- a/icu4c/source/data/curr/en_CA.txt
+++ b/icu4c/source/data/curr/en_CA.txt
@@ -14,5 +14,5 @@
             other{"Israeli new sheqels"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/curr/en_CC.txt b/icu4c/source/data/curr/en_CC.txt
index c3b4f4e..7011614 100644
--- a/icu4c/source/data/curr/en_CC.txt
+++ b/icu4c/source/data/curr/en_CC.txt
@@ -8,5 +8,5 @@
             "Australian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_CH.txt b/icu4c/source/data/curr/en_CH.txt
index 1bbe260..745eed0 100644
--- a/icu4c/source/data/curr/en_CH.txt
+++ b/icu4c/source/data/curr/en_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CH{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_CK.txt b/icu4c/source/data/curr/en_CK.txt
index 60b8362..229ae53 100644
--- a/icu4c/source/data/curr/en_CK.txt
+++ b/icu4c/source/data/curr/en_CK.txt
@@ -8,5 +8,5 @@
             "New Zealand Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_CM.txt b/icu4c/source/data/curr/en_CM.txt
index e3da63d..9cb94c0 100644
--- a/icu4c/source/data/curr/en_CM.txt
+++ b/icu4c/source/data/curr/en_CM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_CX.txt b/icu4c/source/data/curr/en_CX.txt
index f10d048..96da200 100644
--- a/icu4c/source/data/curr/en_CX.txt
+++ b/icu4c/source/data/curr/en_CX.txt
@@ -8,5 +8,5 @@
             "Australian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_CY.txt b/icu4c/source/data/curr/en_CY.txt
index 4fa4a14..6e80705 100644
--- a/icu4c/source/data/curr/en_CY.txt
+++ b/icu4c/source/data/curr/en_CY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_DE.txt b/icu4c/source/data/curr/en_DE.txt
index fd11453..9631682 100644
--- a/icu4c/source/data/curr/en_DE.txt
+++ b/icu4c/source/data/curr/en_DE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DE{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_DG.txt b/icu4c/source/data/curr/en_DG.txt
index bd59dcb..a185284 100644
--- a/icu4c/source/data/curr/en_DG.txt
+++ b/icu4c/source/data/curr/en_DG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_DK.txt b/icu4c/source/data/curr/en_DK.txt
index 349f733..64b4714 100644
--- a/icu4c/source/data/curr/en_DK.txt
+++ b/icu4c/source/data/curr/en_DK.txt
@@ -8,5 +8,5 @@
             "Danish Krone",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_DM.txt b/icu4c/source/data/curr/en_DM.txt
index 2193f74..f001b06 100644
--- a/icu4c/source/data/curr/en_DM.txt
+++ b/icu4c/source/data/curr/en_DM.txt
@@ -8,5 +8,5 @@
             "East Caribbean Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_ER.txt b/icu4c/source/data/curr/en_ER.txt
index 8fb925a..71042e7 100644
--- a/icu4c/source/data/curr/en_ER.txt
+++ b/icu4c/source/data/curr/en_ER.txt
@@ -8,5 +8,5 @@
             "Eritrean Nakfa",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_FI.txt b/icu4c/source/data/curr/en_FI.txt
index 0940644..8626b24 100644
--- a/icu4c/source/data/curr/en_FI.txt
+++ b/icu4c/source/data/curr/en_FI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FI{
     %%Parent{"en_150"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_FJ.txt b/icu4c/source/data/curr/en_FJ.txt
index 131f85f..52c57e9 100644
--- a/icu4c/source/data/curr/en_FJ.txt
+++ b/icu4c/source/data/curr/en_FJ.txt
@@ -8,5 +8,5 @@
             "Fijian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_FK.txt b/icu4c/source/data/curr/en_FK.txt
index 71e6114..758c423 100644
--- a/icu4c/source/data/curr/en_FK.txt
+++ b/icu4c/source/data/curr/en_FK.txt
@@ -12,5 +12,5 @@
             "British Pound",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_FM.txt b/icu4c/source/data/curr/en_FM.txt
index 9b1d31f..e4a293d 100644
--- a/icu4c/source/data/curr/en_FM.txt
+++ b/icu4c/source/data/curr/en_FM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_GB.txt b/icu4c/source/data/curr/en_GB.txt
index ce6779d..b535572 100644
--- a/icu4c/source/data/curr/en_GB.txt
+++ b/icu4c/source/data/curr/en_GB.txt
@@ -20,5 +20,5 @@
             other{"West African CFA francs"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/curr/en_GD.txt b/icu4c/source/data/curr/en_GD.txt
index 18b28a8..c9f0267 100644
--- a/icu4c/source/data/curr/en_GD.txt
+++ b/icu4c/source/data/curr/en_GD.txt
@@ -8,5 +8,5 @@
             "East Caribbean Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_GG.txt b/icu4c/source/data/curr/en_GG.txt
index f40bd83..ab002ad 100644
--- a/icu4c/source/data/curr/en_GG.txt
+++ b/icu4c/source/data/curr/en_GG.txt
@@ -14,5 +14,5 @@
             other{"UK pounds"}
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_GH.txt b/icu4c/source/data/curr/en_GH.txt
index a055858..ad1b0c1 100644
--- a/icu4c/source/data/curr/en_GH.txt
+++ b/icu4c/source/data/curr/en_GH.txt
@@ -8,5 +8,5 @@
             "Ghanaian Cedi",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_GI.txt b/icu4c/source/data/curr/en_GI.txt
index 7c8c639..c1e24ab 100644
--- a/icu4c/source/data/curr/en_GI.txt
+++ b/icu4c/source/data/curr/en_GI.txt
@@ -12,5 +12,5 @@
             "Gibraltar Pound",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_GM.txt b/icu4c/source/data/curr/en_GM.txt
index d569c22..4f398b4 100644
--- a/icu4c/source/data/curr/en_GM.txt
+++ b/icu4c/source/data/curr/en_GM.txt
@@ -8,5 +8,5 @@
             "Gambian Dalasi",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_GY.txt b/icu4c/source/data/curr/en_GY.txt
index c526385..a69180e 100644
--- a/icu4c/source/data/curr/en_GY.txt
+++ b/icu4c/source/data/curr/en_GY.txt
@@ -8,5 +8,5 @@
             "Guyanaese Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_HK.txt b/icu4c/source/data/curr/en_HK.txt
index d43b56c..78bb499 100644
--- a/icu4c/source/data/curr/en_HK.txt
+++ b/icu4c/source/data/curr/en_HK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_HK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_IE.txt b/icu4c/source/data/curr/en_IE.txt
index 94ab93c..7cb27d7 100644
--- a/icu4c/source/data/curr/en_IE.txt
+++ b/icu4c/source/data/curr/en_IE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_IL.txt b/icu4c/source/data/curr/en_IL.txt
index 55a5091..df09f53d 100644
--- a/icu4c/source/data/curr/en_IL.txt
+++ b/icu4c/source/data/curr/en_IL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_IM.txt b/icu4c/source/data/curr/en_IM.txt
index c7288b7..164fc11 100644
--- a/icu4c/source/data/curr/en_IM.txt
+++ b/icu4c/source/data/curr/en_IM.txt
@@ -14,5 +14,5 @@
             other{"UK pounds"}
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_IN.txt b/icu4c/source/data/curr/en_IN.txt
index a2978db..428b860 100644
--- a/icu4c/source/data/curr/en_IN.txt
+++ b/icu4c/source/data/curr/en_IN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IN{
     %%Parent{"en_001"}
-    Version{"2.1.37.11"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/curr/en_IO.txt b/icu4c/source/data/curr/en_IO.txt
index 3f89192..d87cdff 100644
--- a/icu4c/source/data/curr/en_IO.txt
+++ b/icu4c/source/data/curr/en_IO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_JE.txt b/icu4c/source/data/curr/en_JE.txt
index d48e4e8..4478e87 100644
--- a/icu4c/source/data/curr/en_JE.txt
+++ b/icu4c/source/data/curr/en_JE.txt
@@ -14,5 +14,5 @@
             other{"UK pounds"}
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_JM.txt b/icu4c/source/data/curr/en_JM.txt
index e413d90..f6081c7 100644
--- a/icu4c/source/data/curr/en_JM.txt
+++ b/icu4c/source/data/curr/en_JM.txt
@@ -8,5 +8,5 @@
             "Jamaican Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_KE.txt b/icu4c/source/data/curr/en_KE.txt
index 1db09aa..40b7b10 100644
--- a/icu4c/source/data/curr/en_KE.txt
+++ b/icu4c/source/data/curr/en_KE.txt
@@ -8,5 +8,5 @@
             "Kenyan Shilling",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_KI.txt b/icu4c/source/data/curr/en_KI.txt
index 16df121..9b662f5 100644
--- a/icu4c/source/data/curr/en_KI.txt
+++ b/icu4c/source/data/curr/en_KI.txt
@@ -8,5 +8,5 @@
             "Australian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_KN.txt b/icu4c/source/data/curr/en_KN.txt
index 330a081..3f33644 100644
--- a/icu4c/source/data/curr/en_KN.txt
+++ b/icu4c/source/data/curr/en_KN.txt
@@ -8,5 +8,5 @@
             "East Caribbean Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_KY.txt b/icu4c/source/data/curr/en_KY.txt
index 167bce9..fe0cc5b 100644
--- a/icu4c/source/data/curr/en_KY.txt
+++ b/icu4c/source/data/curr/en_KY.txt
@@ -8,5 +8,5 @@
             "Cayman Islands Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_LC.txt b/icu4c/source/data/curr/en_LC.txt
index 07bf683..72abaa6 100644
--- a/icu4c/source/data/curr/en_LC.txt
+++ b/icu4c/source/data/curr/en_LC.txt
@@ -8,5 +8,5 @@
             "East Caribbean Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_LR.txt b/icu4c/source/data/curr/en_LR.txt
index 4fbe01c..abe06fa 100644
--- a/icu4c/source/data/curr/en_LR.txt
+++ b/icu4c/source/data/curr/en_LR.txt
@@ -8,5 +8,5 @@
             "Liberian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_LS.txt b/icu4c/source/data/curr/en_LS.txt
index eca64e3..772e0b8 100644
--- a/icu4c/source/data/curr/en_LS.txt
+++ b/icu4c/source/data/curr/en_LS.txt
@@ -8,5 +8,5 @@
             "South African Rand",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_MG.txt b/icu4c/source/data/curr/en_MG.txt
index a2e42cc..e450d91 100644
--- a/icu4c/source/data/curr/en_MG.txt
+++ b/icu4c/source/data/curr/en_MG.txt
@@ -8,5 +8,5 @@
             "Malagasy Ariary",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_MO.txt b/icu4c/source/data/curr/en_MO.txt
index afc235d..2746117 100644
--- a/icu4c/source/data/curr/en_MO.txt
+++ b/icu4c/source/data/curr/en_MO.txt
@@ -8,5 +8,5 @@
             "Macanese Pataca",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_MS.txt b/icu4c/source/data/curr/en_MS.txt
index c38de2e..f972e86 100644
--- a/icu4c/source/data/curr/en_MS.txt
+++ b/icu4c/source/data/curr/en_MS.txt
@@ -8,5 +8,5 @@
             "East Caribbean Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_MT.txt b/icu4c/source/data/curr/en_MT.txt
index 0fa7c9c..88ff58d 100644
--- a/icu4c/source/data/curr/en_MT.txt
+++ b/icu4c/source/data/curr/en_MT.txt
@@ -8,5 +8,5 @@
             "British Pound",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_MU.txt b/icu4c/source/data/curr/en_MU.txt
index 1e54fb5..c86a3b1 100644
--- a/icu4c/source/data/curr/en_MU.txt
+++ b/icu4c/source/data/curr/en_MU.txt
@@ -8,5 +8,5 @@
             "Mauritian Rupee",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_MW.txt b/icu4c/source/data/curr/en_MW.txt
index 08a0217..2b27fe9 100644
--- a/icu4c/source/data/curr/en_MW.txt
+++ b/icu4c/source/data/curr/en_MW.txt
@@ -8,5 +8,5 @@
             "Malawian Kwacha",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_MY.txt b/icu4c/source/data/curr/en_MY.txt
index 1789055..78ee07d 100644
--- a/icu4c/source/data/curr/en_MY.txt
+++ b/icu4c/source/data/curr/en_MY.txt
@@ -8,5 +8,5 @@
             "Malaysian Ringgit",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_NA.txt b/icu4c/source/data/curr/en_NA.txt
index a70c6a0..edcd389 100644
--- a/icu4c/source/data/curr/en_NA.txt
+++ b/icu4c/source/data/curr/en_NA.txt
@@ -8,5 +8,5 @@
             "Namibian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_NF.txt b/icu4c/source/data/curr/en_NF.txt
index 39c4ab5..d6494c9 100644
--- a/icu4c/source/data/curr/en_NF.txt
+++ b/icu4c/source/data/curr/en_NF.txt
@@ -8,5 +8,5 @@
             "Australian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_NG.txt b/icu4c/source/data/curr/en_NG.txt
index 5bb4020..ff74842 100644
--- a/icu4c/source/data/curr/en_NG.txt
+++ b/icu4c/source/data/curr/en_NG.txt
@@ -8,5 +8,5 @@
             "Nigerian Naira",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_NL.txt b/icu4c/source/data/curr/en_NL.txt
index 4566eb3..d27f8a3 100644
--- a/icu4c/source/data/curr/en_NL.txt
+++ b/icu4c/source/data/curr/en_NL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NL{
     %%Parent{"en_150"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_NR.txt b/icu4c/source/data/curr/en_NR.txt
index c808cc7..623b88a 100644
--- a/icu4c/source/data/curr/en_NR.txt
+++ b/icu4c/source/data/curr/en_NR.txt
@@ -8,5 +8,5 @@
             "Australian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_NU.txt b/icu4c/source/data/curr/en_NU.txt
index 8a011bd..f772462 100644
--- a/icu4c/source/data/curr/en_NU.txt
+++ b/icu4c/source/data/curr/en_NU.txt
@@ -8,5 +8,5 @@
             "New Zealand Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_NZ.txt b/icu4c/source/data/curr/en_NZ.txt
index e1bd399..cc27eee 100644
--- a/icu4c/source/data/curr/en_NZ.txt
+++ b/icu4c/source/data/curr/en_NZ.txt
@@ -8,5 +8,5 @@
             "New Zealand Dollar",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/curr/en_PG.txt b/icu4c/source/data/curr/en_PG.txt
index 1a726d3..f05a1c6 100644
--- a/icu4c/source/data/curr/en_PG.txt
+++ b/icu4c/source/data/curr/en_PG.txt
@@ -8,5 +8,5 @@
             "Papua New Guinean Kina",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_PH.txt b/icu4c/source/data/curr/en_PH.txt
index abfd2f4..f443e7b 100644
--- a/icu4c/source/data/curr/en_PH.txt
+++ b/icu4c/source/data/curr/en_PH.txt
@@ -8,5 +8,5 @@
             "Philippine Piso",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_PK.txt b/icu4c/source/data/curr/en_PK.txt
index e0d4e37..9aec1b7 100644
--- a/icu4c/source/data/curr/en_PK.txt
+++ b/icu4c/source/data/curr/en_PK.txt
@@ -8,5 +8,5 @@
             "Pakistani Rupee",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_PN.txt b/icu4c/source/data/curr/en_PN.txt
index 701c432..23e474a 100644
--- a/icu4c/source/data/curr/en_PN.txt
+++ b/icu4c/source/data/curr/en_PN.txt
@@ -8,5 +8,5 @@
             "New Zealand Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_PW.txt b/icu4c/source/data/curr/en_PW.txt
index 43ec73a..14fe4d0 100644
--- a/icu4c/source/data/curr/en_PW.txt
+++ b/icu4c/source/data/curr/en_PW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_RW.txt b/icu4c/source/data/curr/en_RW.txt
index c9c46be..a40c792 100644
--- a/icu4c/source/data/curr/en_RW.txt
+++ b/icu4c/source/data/curr/en_RW.txt
@@ -8,5 +8,5 @@
             "Rwandan Franc",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SB.txt b/icu4c/source/data/curr/en_SB.txt
index 339a3a0..8ea3bb0 100644
--- a/icu4c/source/data/curr/en_SB.txt
+++ b/icu4c/source/data/curr/en_SB.txt
@@ -8,5 +8,5 @@
             "Solomon Islands Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SC.txt b/icu4c/source/data/curr/en_SC.txt
index 471e548..73011f4 100644
--- a/icu4c/source/data/curr/en_SC.txt
+++ b/icu4c/source/data/curr/en_SC.txt
@@ -8,5 +8,5 @@
             "Seychellois Rupee",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SD.txt b/icu4c/source/data/curr/en_SD.txt
index 8fef005..e3323d7 100644
--- a/icu4c/source/data/curr/en_SD.txt
+++ b/icu4c/source/data/curr/en_SD.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SE.txt b/icu4c/source/data/curr/en_SE.txt
index 87d1d30..dbcc0b8 100644
--- a/icu4c/source/data/curr/en_SE.txt
+++ b/icu4c/source/data/curr/en_SE.txt
@@ -8,5 +8,5 @@
             "Swedish Krona",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SG.txt b/icu4c/source/data/curr/en_SG.txt
index b538ecf..33340a3 100644
--- a/icu4c/source/data/curr/en_SG.txt
+++ b/icu4c/source/data/curr/en_SG.txt
@@ -8,5 +8,5 @@
             "Singapore Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SH.txt b/icu4c/source/data/curr/en_SH.txt
index 93eb640..af9f246 100644
--- a/icu4c/source/data/curr/en_SH.txt
+++ b/icu4c/source/data/curr/en_SH.txt
@@ -12,5 +12,5 @@
             "St. Helena Pound",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SI.txt b/icu4c/source/data/curr/en_SI.txt
index c6837fe..8dc7c6a 100644
--- a/icu4c/source/data/curr/en_SI.txt
+++ b/icu4c/source/data/curr/en_SI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SI{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SL.txt b/icu4c/source/data/curr/en_SL.txt
index fabad86..0f1ef09 100644
--- a/icu4c/source/data/curr/en_SL.txt
+++ b/icu4c/source/data/curr/en_SL.txt
@@ -8,5 +8,5 @@
             "Sierra Leonean Leone",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SS.txt b/icu4c/source/data/curr/en_SS.txt
index 6b71f14..374ca8a 100644
--- a/icu4c/source/data/curr/en_SS.txt
+++ b/icu4c/source/data/curr/en_SS.txt
@@ -12,5 +12,5 @@
             "South Sudanese Pound",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SX.txt b/icu4c/source/data/curr/en_SX.txt
index 7729c64..2de33c4 100644
--- a/icu4c/source/data/curr/en_SX.txt
+++ b/icu4c/source/data/curr/en_SX.txt
@@ -8,5 +8,5 @@
             "Netherlands Antillean Guilder",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_SZ.txt b/icu4c/source/data/curr/en_SZ.txt
index 1b5fdc6..f9ac0ac 100644
--- a/icu4c/source/data/curr/en_SZ.txt
+++ b/icu4c/source/data/curr/en_SZ.txt
@@ -8,5 +8,5 @@
             "Swazi Lilangeni",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_TC.txt b/icu4c/source/data/curr/en_TC.txt
index 31b22e7..6d30689 100644
--- a/icu4c/source/data/curr/en_TC.txt
+++ b/icu4c/source/data/curr/en_TC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_TK.txt b/icu4c/source/data/curr/en_TK.txt
index e09d517..8c3d033 100644
--- a/icu4c/source/data/curr/en_TK.txt
+++ b/icu4c/source/data/curr/en_TK.txt
@@ -8,5 +8,5 @@
             "New Zealand Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_TO.txt b/icu4c/source/data/curr/en_TO.txt
index 30c35ca..d36ffa4 100644
--- a/icu4c/source/data/curr/en_TO.txt
+++ b/icu4c/source/data/curr/en_TO.txt
@@ -8,5 +8,5 @@
             "Tongan Paʻanga",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_TT.txt b/icu4c/source/data/curr/en_TT.txt
index 3462379..0642354 100644
--- a/icu4c/source/data/curr/en_TT.txt
+++ b/icu4c/source/data/curr/en_TT.txt
@@ -8,5 +8,5 @@
             "Trinidad & Tobago Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_TV.txt b/icu4c/source/data/curr/en_TV.txt
index 74b1aeb..9d35ed0 100644
--- a/icu4c/source/data/curr/en_TV.txt
+++ b/icu4c/source/data/curr/en_TV.txt
@@ -8,5 +8,5 @@
             "Australian Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_TZ.txt b/icu4c/source/data/curr/en_TZ.txt
index 82fb476..491a162 100644
--- a/icu4c/source/data/curr/en_TZ.txt
+++ b/icu4c/source/data/curr/en_TZ.txt
@@ -8,5 +8,5 @@
             "Tanzanian Shilling",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_UG.txt b/icu4c/source/data/curr/en_UG.txt
index 31da4b9..f7fdf7c 100644
--- a/icu4c/source/data/curr/en_UG.txt
+++ b/icu4c/source/data/curr/en_UG.txt
@@ -8,5 +8,5 @@
             "Ugandan Shilling",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_VC.txt b/icu4c/source/data/curr/en_VC.txt
index 3808f9c..e42ae28 100644
--- a/icu4c/source/data/curr/en_VC.txt
+++ b/icu4c/source/data/curr/en_VC.txt
@@ -8,5 +8,5 @@
             "East Caribbean Dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_VG.txt b/icu4c/source/data/curr/en_VG.txt
index 995ae52..0e708c0 100644
--- a/icu4c/source/data/curr/en_VG.txt
+++ b/icu4c/source/data/curr/en_VG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_VU.txt b/icu4c/source/data/curr/en_VU.txt
index a0ebff4..5884f9c 100644
--- a/icu4c/source/data/curr/en_VU.txt
+++ b/icu4c/source/data/curr/en_VU.txt
@@ -8,5 +8,5 @@
             "Vanuatu Vatu",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_WS.txt b/icu4c/source/data/curr/en_WS.txt
index b94fded..6a947f2 100644
--- a/icu4c/source/data/curr/en_WS.txt
+++ b/icu4c/source/data/curr/en_WS.txt
@@ -8,5 +8,5 @@
             "Samoan Tala",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_ZA.txt b/icu4c/source/data/curr/en_ZA.txt
index 1acbdf3..8995456 100644
--- a/icu4c/source/data/curr/en_ZA.txt
+++ b/icu4c/source/data/curr/en_ZA.txt
@@ -8,5 +8,5 @@
             "South African Rand",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_ZM.txt b/icu4c/source/data/curr/en_ZM.txt
index d7c4d7e..8f5942a 100644
--- a/icu4c/source/data/curr/en_ZM.txt
+++ b/icu4c/source/data/curr/en_ZM.txt
@@ -8,5 +8,5 @@
             "Zambian Kwacha",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/en_ZW.txt b/icu4c/source/data/curr/en_ZW.txt
index 5fb189a..f20fa35 100644
--- a/icu4c/source/data/curr/en_ZW.txt
+++ b/icu4c/source/data/curr/en_ZW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/eo.txt b/icu4c/source/data/curr/eo.txt
index 81bca0f..a39005c 100644
--- a/icu4c/source/data/curr/eo.txt
+++ b/icu4c/source/data/curr/eo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 eo{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/es.txt b/icu4c/source/data/curr/es.txt
index d705e12..59629ee 100644
--- a/icu4c/source/data/curr/es.txt
+++ b/icu4c/source/data/curr/es.txt
@@ -616,6 +616,10 @@
         }
         MRO{
             "MRO",
+            "uguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "uguiya",
         }
         MTL{
@@ -844,6 +848,10 @@
         }
         STD{
             "STD",
+            "dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra",
         }
         SUR{
@@ -1187,7 +1195,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1769,6 +1777,10 @@
             other{"patacas de Macao"}
         }
         MRO{
+            one{"uguiya (1973–2017)"}
+            other{"uguiyas (1973–2017)"}
+        }
+        MRU{
             one{"uguiya"}
             other{"uguiyas"}
         }
@@ -1985,6 +1997,10 @@
             other{"libras sursudanesas"}
         }
         STD{
+            one{"dobra (1977–2017)"}
+            other{"dobras (1977–2017)"}
+        }
+        STN{
             one{"dobra"}
             other{"dobras"}
         }
@@ -2197,5 +2213,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/es_419.txt b/icu4c/source/data/curr/es_419.txt
index 75527f1..a1b99df 100644
--- a/icu4c/source/data/curr/es_419.txt
+++ b/icu4c/source/data/curr/es_419.txt
@@ -51,5 +51,5 @@
             other{"(moneda desconocida)"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_AR.txt b/icu4c/source/data/curr/es_AR.txt
index 3c6b199..af10ac6 100644
--- a/icu4c/source/data/curr/es_AR.txt
+++ b/icu4c/source/data/curr/es_AR.txt
@@ -15,5 +15,5 @@
     Currencies%variant{
         GEL{"GEL"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_BO.txt b/icu4c/source/data/curr/es_BO.txt
index e4d33b0..d9f52c2 100644
--- a/icu4c/source/data/curr/es_BO.txt
+++ b/icu4c/source/data/curr/es_BO.txt
@@ -8,5 +8,5 @@
             "boliviano",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_BR.txt b/icu4c/source/data/curr/es_BR.txt
index f318fad..f41a6e9 100644
--- a/icu4c/source/data/curr/es_BR.txt
+++ b/icu4c/source/data/curr/es_BR.txt
@@ -8,5 +8,5 @@
             "real brasileño",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_BZ.txt b/icu4c/source/data/curr/es_BZ.txt
index f3475ce..662bdc0 100644
--- a/icu4c/source/data/curr/es_BZ.txt
+++ b/icu4c/source/data/curr/es_BZ.txt
@@ -8,5 +8,5 @@
             "dólar beliceño",
         }
     }
-    Version{"2.1.32.37"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_CL.txt b/icu4c/source/data/curr/es_CL.txt
index 271ae50..5d8a618 100644
--- a/icu4c/source/data/curr/es_CL.txt
+++ b/icu4c/source/data/curr/es_CL.txt
@@ -12,5 +12,5 @@
             "dólar estadounidense",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_CO.txt b/icu4c/source/data/curr/es_CO.txt
index 00b6005..0006b23 100644
--- a/icu4c/source/data/curr/es_CO.txt
+++ b/icu4c/source/data/curr/es_CO.txt
@@ -12,5 +12,5 @@
             "dólar estadounidense",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_CR.txt b/icu4c/source/data/curr/es_CR.txt
index 3b8d00f..05719c6 100644
--- a/icu4c/source/data/curr/es_CR.txt
+++ b/icu4c/source/data/curr/es_CR.txt
@@ -8,5 +8,5 @@
             "colón costarricense",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_CU.txt b/icu4c/source/data/curr/es_CU.txt
index a4a9208..147c170 100644
--- a/icu4c/source/data/curr/es_CU.txt
+++ b/icu4c/source/data/curr/es_CU.txt
@@ -12,5 +12,5 @@
             "dólar estadounidense",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_DO.txt b/icu4c/source/data/curr/es_DO.txt
index 35df702..1f75e46 100644
--- a/icu4c/source/data/curr/es_DO.txt
+++ b/icu4c/source/data/curr/es_DO.txt
@@ -12,5 +12,5 @@
             "dólar estadounidense",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_EC.txt b/icu4c/source/data/curr/es_EC.txt
index 52f23cf..b254833 100644
--- a/icu4c/source/data/curr/es_EC.txt
+++ b/icu4c/source/data/curr/es_EC.txt
@@ -8,5 +8,5 @@
             "dólar estadounidense",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_GQ.txt b/icu4c/source/data/curr/es_GQ.txt
index aea376f..e071f25 100644
--- a/icu4c/source/data/curr/es_GQ.txt
+++ b/icu4c/source/data/curr/es_GQ.txt
@@ -7,5 +7,5 @@
             "franco CFA de África Central",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_GT.txt b/icu4c/source/data/curr/es_GT.txt
index 54ba052..e118ffe 100644
--- a/icu4c/source/data/curr/es_GT.txt
+++ b/icu4c/source/data/curr/es_GT.txt
@@ -18,5 +18,5 @@
         one{"{1} {0}"}
         other{"{1} {0}"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_HN.txt b/icu4c/source/data/curr/es_HN.txt
index c050414..7e1d5d0 100644
--- a/icu4c/source/data/curr/es_HN.txt
+++ b/icu4c/source/data/curr/es_HN.txt
@@ -8,5 +8,5 @@
             "lempira hondureño",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_MX.txt b/icu4c/source/data/curr/es_MX.txt
index b7d0d91..f7812b1 100644
--- a/icu4c/source/data/curr/es_MX.txt
+++ b/icu4c/source/data/curr/es_MX.txt
@@ -19,6 +19,10 @@
             "MYR",
             "ringit",
         }
+        STN{
+            "STN",
+            "dobra santotomense",
+        }
         THB{
             "THB",
             "baht tailandés",
@@ -55,6 +59,10 @@
             one{"ringit"}
             other{"ringits"}
         }
+        STN{
+            one{"dobra santotomense"}
+            other{"dobra santotomense"}
+        }
         THB{
             one{"baht tailandés"}
             other{"bats"}
@@ -71,5 +79,5 @@
             other{"kwachas zambianos"}
         }
     }
-    Version{"2.1.37.32"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/curr/es_NI.txt b/icu4c/source/data/curr/es_NI.txt
index 8ef6b38..4c3a9b0 100644
--- a/icu4c/source/data/curr/es_NI.txt
+++ b/icu4c/source/data/curr/es_NI.txt
@@ -8,5 +8,5 @@
             "córdoba nicaragüense",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_PA.txt b/icu4c/source/data/curr/es_PA.txt
index d50bcf9..2ac0b3c 100644
--- a/icu4c/source/data/curr/es_PA.txt
+++ b/icu4c/source/data/curr/es_PA.txt
@@ -8,5 +8,5 @@
             "balboa panameño",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_PE.txt b/icu4c/source/data/curr/es_PE.txt
index 0868623..fd4dab7 100644
--- a/icu4c/source/data/curr/es_PE.txt
+++ b/icu4c/source/data/curr/es_PE.txt
@@ -8,5 +8,5 @@
             "sol peruano",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_PH.txt b/icu4c/source/data/curr/es_PH.txt
index f07f81b..910dfbd 100644
--- a/icu4c/source/data/curr/es_PH.txt
+++ b/icu4c/source/data/curr/es_PH.txt
@@ -7,5 +7,5 @@
             "peso filipino",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_PR.txt b/icu4c/source/data/curr/es_PR.txt
index b602228..7b8c42e 100644
--- a/icu4c/source/data/curr/es_PR.txt
+++ b/icu4c/source/data/curr/es_PR.txt
@@ -8,5 +8,5 @@
             "dólar estadounidense",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_PY.txt b/icu4c/source/data/curr/es_PY.txt
index 8041892..c8b3011 100644
--- a/icu4c/source/data/curr/es_PY.txt
+++ b/icu4c/source/data/curr/es_PY.txt
@@ -8,5 +8,5 @@
             "guaraní paraguayo",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_SV.txt b/icu4c/source/data/curr/es_SV.txt
index dfd6299..49d0f51 100644
--- a/icu4c/source/data/curr/es_SV.txt
+++ b/icu4c/source/data/curr/es_SV.txt
@@ -8,5 +8,5 @@
             "dólar estadounidense",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_US.txt b/icu4c/source/data/curr/es_US.txt
index 8ef6c5d..9fa978a 100644
--- a/icu4c/source/data/curr/es_US.txt
+++ b/icu4c/source/data/curr/es_US.txt
@@ -11,6 +11,10 @@
             "MYR",
             "ringit",
         }
+        STN{
+            "STN",
+            "dobra santotomense",
+        }
         THB{
             "THB",
             "bat",
@@ -52,6 +56,10 @@
         RON{
             one{"leu rumano"}
         }
+        STN{
+            one{"dobra santotomense"}
+            other{"dobra santotomense"}
+        }
         THB{
             one{"bat"}
             other{"bats"}
@@ -69,5 +77,5 @@
             other{"francos CFA de África Occidental"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/curr/es_UY.txt b/icu4c/source/data/curr/es_UY.txt
index bae261d..7fd30c7 100644
--- a/icu4c/source/data/curr/es_UY.txt
+++ b/icu4c/source/data/curr/es_UY.txt
@@ -12,5 +12,5 @@
             "peso uruguayo",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/es_VE.txt b/icu4c/source/data/curr/es_VE.txt
index 3aa69e8..4885fdd 100644
--- a/icu4c/source/data/curr/es_VE.txt
+++ b/icu4c/source/data/curr/es_VE.txt
@@ -11,5 +11,5 @@
     Currencies%narrow{
         VEF{"Bs."}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/et.txt b/icu4c/source/data/curr/et.txt
index 817e8e4..ef26a6e 100644
--- a/icu4c/source/data/curr/et.txt
+++ b/icu4c/source/data/curr/et.txt
@@ -613,6 +613,10 @@
         }
         MRO{
             "MRO",
+            "Mauritaania ugia (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritaania ugia",
         }
         MTL{
@@ -841,6 +845,10 @@
         }
         STD{
             "STD",
+            "São Tomé ja Príncipe dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "São Tomé ja Príncipe dobra",
         }
         SUR{
@@ -1730,6 +1738,10 @@
             other{"Macau pataakat"}
         }
         MRO{
+            one{"Mauritaania ugia (1973–2017)"}
+            other{"Mauritaania ugiat (1973–2017)"}
+        }
+        MRU{
             one{"Mauritaania ugia"}
             other{"Mauritaania ugiat"}
         }
@@ -1950,6 +1962,10 @@
             other{"Lõuna-Sudaani naela"}
         }
         STD{
+            one{"São Tomé ja Príncipe dobra (1977–2017)"}
+            other{"São Tomé ja Príncipe dobrat (1977–2017)"}
+        }
+        STN{
             one{"São Tomé ja Príncipe dobra"}
             other{"São Tomé ja Príncipe dobrat"}
         }
@@ -2158,5 +2174,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/eu.txt b/icu4c/source/data/curr/eu.txt
index 5136302..a9336b9 100644
--- a/icu4c/source/data/curr/eu.txt
+++ b/icu4c/source/data/curr/eu.txt
@@ -389,6 +389,10 @@
         }
         MRO{
             "MRO",
+            "Mauritaniako ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritaniako ouguiya",
         }
         MUR{
@@ -537,6 +541,10 @@
         }
         STD{
             "STD",
+            "Sao Tomeko eta Principeko dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Sao Tomeko eta Principeko dobra",
         }
         SYP{
@@ -735,7 +743,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1128,6 +1136,10 @@
             other{"Macanako pataca"}
         }
         MRO{
+            one{"Mauritaniako ouguiya (1973–2017)"}
+            other{"Mauritaniako ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"Mauritaniako ouguiya"}
             other{"Mauritaniako ouguiya"}
         }
@@ -1276,6 +1288,10 @@
             other{"Hego Sudango libera"}
         }
         STD{
+            one{"Sao Tomeko eta Principeko dobra (1977–2017)"}
+            other{"Sao Tomeko eta Principeko dobra (1977–2017)"}
+        }
+        STN{
             one{"Sao Tomeko eta Principeko dobra"}
             other{"Sao Tomeko eta Principeko dobra"}
         }
@@ -1396,5 +1412,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ewo.txt b/icu4c/source/data/curr/ewo.txt
index eec721e..2322b87 100644
--- a/icu4c/source/data/curr/ewo.txt
+++ b/icu4c/source/data/curr/ewo.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugiya yá Moritaní (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugiya yá Moritaní",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dóbə́ra yá Saó Tomé ai Pəlinəsípe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dóbə́ra yá Saó Tomé ai Pəlinəsípe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Dolár yá Zimbabwé",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/fa.txt b/icu4c/source/data/curr/fa.txt
index e9e4d2e..630bc72 100644
--- a/icu4c/source/data/curr/fa.txt
+++ b/icu4c/source/data/curr/fa.txt
@@ -484,6 +484,10 @@
         }
         MRO{
             "MRO",
+            "اوگوئیای موریتانی (۱۹۷۳ تا ۲۰۱۷)",
+        }
+        MRU{
+            "MRU",
             "اوگوئیای موریتانی",
         }
         MTL{
@@ -672,6 +676,10 @@
         }
         STD{
             "STD",
+            "دوبرای سائوتومه و پرنسیپ (۱۹۷۷ تا ۲۰۱۷)",
+        }
+        STN{
+            "STN",
             "دوبرای سائوتومه و پرنسیپ",
         }
         SUR{
@@ -947,7 +955,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1362,6 +1370,10 @@
             other{"پاتاکای ماکائو"}
         }
         MRO{
+            one{"اوگوئیای موریتانی (۱۹۷۳ تا ۲۰۱۷)"}
+            other{"اوگوئیای موریتانی (۱۹۷۳ تا ۲۰۱۷)"}
+        }
+        MRU{
             one{"اوگوئیای موریتانی"}
             other{"اوگوئیای موریتانی"}
         }
@@ -1518,6 +1530,10 @@
             other{"پوند سودان جنوبی"}
         }
         STD{
+            one{"دوبرای سائوتومه و پرنسیپ (۱۹۷۷ تا ۲۰۱۷)"}
+            other{"دوبرای سائوتومه و پرنسیپ (۱۹۷۷ تا ۲۰۱۷)"}
+        }
+        STN{
             one{"دوبرای سائوتومه و پرنسیپ"}
             other{"دوبرای سائوتومه و پرنسیپ"}
         }
@@ -1646,5 +1662,5 @@
             other{"کواچای زامبیا"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/fa_AF.txt b/icu4c/source/data/curr/fa_AF.txt
index 6e1daec..be686f2 100644
--- a/icu4c/source/data/curr/fa_AF.txt
+++ b/icu4c/source/data/curr/fa_AF.txt
@@ -63,5 +63,5 @@
             "دالر امریکا",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/ff.txt b/icu4c/source/data/curr/ff.txt
index 025f555..318f2ff 100644
--- a/icu4c/source/data/curr/ff.txt
+++ b/icu4c/source/data/curr/ff.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugiyya Muritani (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugiyya Muritani",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dobra Sawo Tome e Prensipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra Sawo Tome e Prensipe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dolaar Simbaabuwe",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ff_GN.txt b/icu4c/source/data/curr/ff_GN.txt
index 2b8f3fb..76b9072 100644
--- a/icu4c/source/data/curr/ff_GN.txt
+++ b/icu4c/source/data/curr/ff_GN.txt
@@ -7,5 +7,5 @@
             "GNF",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/ff_MR.txt b/icu4c/source/data/curr/ff_MR.txt
index e027342..0ac1538 100644
--- a/icu4c/source/data/curr/ff_MR.txt
+++ b/icu4c/source/data/curr/ff_MR.txt
@@ -2,10 +2,10 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ff_MR{
     Currencies{
-        MRO{
+        MRU{
             "UM",
             "Ugiyya Muritani",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/fi.txt b/icu4c/source/data/curr/fi.txt
index 2fd0e62..99ef6cb 100644
--- a/icu4c/source/data/curr/fi.txt
+++ b/icu4c/source/data/curr/fi.txt
@@ -360,7 +360,7 @@
         }
         ESA{
             "ESA",
-            "Espanjan peseta (A–tili)",
+            "Espanjan peseta (A-tili)",
         }
         ESB{
             "ESB",
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "Mauritanian ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritanian ouguiya",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "São Tomén ja Príncipen dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "São Tomén ja Príncipen dobra",
         }
         SUR{
@@ -1283,7 +1291,7 @@
         SHP{"SHP"}
         SRD{"SRD"}
         SSP{"SSP"}
-        STD{"STD"}
+        STN{"STD"}
         SYP{"SYP"}
         THB{"THB"}
         TOP{"TOP"}
@@ -1660,8 +1668,8 @@
             other{"Eritrean nakfaa"}
         }
         ESA{
-            one{"Espanjan peseta (A–tili)"}
-            other{"Espanjan pesetaa (A–tili)"}
+            one{"Espanjan peseta (A-tili)"}
+            other{"Espanjan pesetaa (A-tili)"}
         }
         ESB{
             one{"Espanjan peseta (vaihdettava tili)"}
@@ -1984,6 +1992,10 @@
             other{"Macaon patacaa"}
         }
         MRO{
+            one{"Mauritanian ouguiya (1973–2017)"}
+            other{"Mauritanian ouguiyaa (1973–2017)"}
+        }
+        MRU{
             one{"Mauritanian ouguiya"}
             other{"Mauritanian ouguiyaa"}
         }
@@ -2216,6 +2228,10 @@
             other{"Etelä-Sudanin puntaa"}
         }
         STD{
+            one{"São Tomén ja Príncipen dobra (1977–2017)"}
+            other{"São Tomén ja Príncipen dobraa (1977–2017)"}
+        }
+        STN{
             one{"São Tomén ja Príncipen dobra"}
             other{"São Tomén ja Príncipen dobraa"}
         }
@@ -2504,5 +2520,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.67"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/fil.txt b/icu4c/source/data/curr/fil.txt
index edf87ba..9d47f03 100644
--- a/icu4c/source/data/curr/fil.txt
+++ b/icu4c/source/data/curr/fil.txt
@@ -392,6 +392,10 @@
         }
         MRO{
             "MRO",
+            "Mauritanian Ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritanian Ouguiya",
         }
         MUR{
@@ -548,6 +552,10 @@
         }
         STD{
             "STD",
+            "São Tomé & Príncipe Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "São Tomé & Príncipe Dobra",
         }
         SYP{
@@ -751,7 +759,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1145,6 +1153,10 @@
             other{"Macanese patacas"}
         }
         MRO{
+            one{"Mauritanian ouguiya (1973–2017)"}
+            other{"Mauritanian ouguiyas (1973–2017)"}
+        }
+        MRU{
             one{"Mauritanian ouguiya"}
             other{"Mauritanian ouguiyas"}
         }
@@ -1293,6 +1305,10 @@
             other{"pounds ng Timog Sudan"}
         }
         STD{
+            one{"São Tomé & Príncipe dobra (1977–2017)"}
+            other{"São Tomé & Príncipe dobras (1977–2017)"}
+        }
+        STN{
             one{"São Tomé & Príncipe dobra"}
             other{"São Tomé & Príncipe dobras"}
         }
@@ -1413,5 +1429,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/fo.txt b/icu4c/source/data/curr/fo.txt
index c99784a..339022e 100644
--- a/icu4c/source/data/curr/fo.txt
+++ b/icu4c/source/data/curr/fo.txt
@@ -122,6 +122,10 @@
             "CLP",
             "Kili peso",
         }
+        CNH{
+            "CNH",
+            "kinesiskur yuan (úr landi)",
+        }
         CNY{
             "CN¥",
             "kinesiskur yuan",
@@ -248,7 +252,7 @@
         }
         ILS{
             "₪",
-            "Ísrael new sheqel",
+            "Ísrael new shekel",
         }
         INR{
             "₹",
@@ -364,6 +368,10 @@
         }
         MRO{
             "MRO",
+            "Móritania ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Móritania ouguiya",
         }
         MUR{
@@ -512,6 +520,10 @@
         }
         STD{
             "STD",
+            "Sao Tome & Prinsipi dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Sao Tome & Prinsipi dobra",
         }
         SYP{
@@ -723,7 +735,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -863,6 +875,10 @@
             one{"Kili peso"}
             other{"Kili peso"}
         }
+        CNH{
+            one{"kinesiskur yuan (úr landi)"}
+            other{"kinesiskur yuan (úr landi)"}
+        }
         CNY{
             one{"kinesiskur yuan"}
             other{"kinesiskir yuan"}
@@ -988,8 +1004,8 @@
             other{"Indonesia rupiah"}
         }
         ILS{
-            one{"Ísrael new sheqel"}
-            other{"Ísrael new sheqel"}
+            one{"Ísrael new shekel"}
+            other{"Ísrael new shekel"}
         }
         INR{
             one{"indiskur rupi"}
@@ -1104,6 +1120,10 @@
             other{"Makao pataca"}
         }
         MRO{
+            one{"Móritania ouguiya (1973–2017)"}
+            other{"Móritania ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"Móritania ouguiya"}
             other{"Móritania ouguiya"}
         }
@@ -1252,6 +1272,10 @@
             other{"Suðursudan pund"}
         }
         STD{
+            one{"Sao Tome & Prinsipi dobra (1977–2017)"}
+            other{"Sao Tome & Prinsipi dobra (1977–2017)"}
+        }
+        STN{
             one{"Sao Tome & Prinsipi dobra"}
             other{"Sao Tome & Prinsipi dobra"}
         }
@@ -1388,5 +1412,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/fo_DK.txt b/icu4c/source/data/curr/fo_DK.txt
index ad08d5d..73a2467 100644
--- a/icu4c/source/data/curr/fo_DK.txt
+++ b/icu4c/source/data/curr/fo_DK.txt
@@ -7,5 +7,5 @@
             "donsk króna",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr.txt b/icu4c/source/data/curr/fr.txt
index c71151b..4e18a29 100644
--- a/icu4c/source/data/curr/fr.txt
+++ b/icu4c/source/data/curr/fr.txt
@@ -620,6 +620,10 @@
         }
         MRO{
             "MRO",
+            "ouguiya mauritanien (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ouguiya mauritanien",
         }
         MTL{
@@ -848,6 +852,10 @@
         }
         STD{
             "STD",
+            "dobra santoméen (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra santoméen",
         }
         SUR{
@@ -1195,7 +1203,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1833,6 +1841,10 @@
             other{"patacas macanaises"}
         }
         MRO{
+            one{"ouguiya mauritanien (1973–2017)"}
+            other{"ouguiyas mauritaniens (1973–2017)"}
+        }
+        MRU{
             one{"ouguiya mauritanien"}
             other{"ouguiyas mauritaniens"}
         }
@@ -2061,6 +2073,10 @@
             other{"livres sud-soudanaises"}
         }
         STD{
+            one{"dobra santoméen (1977–2017)"}
+            other{"dobras santoméens (1977–2017)"}
+        }
+        STN{
             one{"dobra santoméen"}
             other{"dobras santoméens"}
         }
@@ -2329,5 +2345,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/fr_BI.txt b/icu4c/source/data/curr/fr_BI.txt
index 32e9392..eb0d250 100644
--- a/icu4c/source/data/curr/fr_BI.txt
+++ b/icu4c/source/data/curr/fr_BI.txt
@@ -7,5 +7,5 @@
             "franc burundais",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_CA.txt b/icu4c/source/data/curr/fr_CA.txt
index 7fb247f..212fada 100644
--- a/icu4c/source/data/curr/fr_CA.txt
+++ b/icu4c/source/data/curr/fr_CA.txt
@@ -199,5 +199,5 @@
             other{"rials yéménites"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/curr/fr_CD.txt b/icu4c/source/data/curr/fr_CD.txt
index 6171a2e..0ef5e9f 100644
--- a/icu4c/source/data/curr/fr_CD.txt
+++ b/icu4c/source/data/curr/fr_CD.txt
@@ -7,5 +7,5 @@
             "franc congolais",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_DJ.txt b/icu4c/source/data/curr/fr_DJ.txt
index b4c512b..eef08ae 100644
--- a/icu4c/source/data/curr/fr_DJ.txt
+++ b/icu4c/source/data/curr/fr_DJ.txt
@@ -7,5 +7,5 @@
             "franc djiboutien",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_DZ.txt b/icu4c/source/data/curr/fr_DZ.txt
index b92baca..5a4b804 100644
--- a/icu4c/source/data/curr/fr_DZ.txt
+++ b/icu4c/source/data/curr/fr_DZ.txt
@@ -7,5 +7,5 @@
             "dinar algérien",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_GN.txt b/icu4c/source/data/curr/fr_GN.txt
index 9050130..09a9fa2 100644
--- a/icu4c/source/data/curr/fr_GN.txt
+++ b/icu4c/source/data/curr/fr_GN.txt
@@ -7,5 +7,5 @@
             "franc guinéen",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_HT.txt b/icu4c/source/data/curr/fr_HT.txt
index eb9ed30..46fd512 100644
--- a/icu4c/source/data/curr/fr_HT.txt
+++ b/icu4c/source/data/curr/fr_HT.txt
@@ -7,5 +7,5 @@
             "gourde haïtienne",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_KM.txt b/icu4c/source/data/curr/fr_KM.txt
index fc63603..b47547f 100644
--- a/icu4c/source/data/curr/fr_KM.txt
+++ b/icu4c/source/data/curr/fr_KM.txt
@@ -7,5 +7,5 @@
             "franc comorien",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_LU.txt b/icu4c/source/data/curr/fr_LU.txt
index e73b3ca..7e392cf 100644
--- a/icu4c/source/data/curr/fr_LU.txt
+++ b/icu4c/source/data/curr/fr_LU.txt
@@ -11,5 +11,5 @@
             "franc luxembourgeois",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_MG.txt b/icu4c/source/data/curr/fr_MG.txt
index 1e2add4..21fd996 100644
--- a/icu4c/source/data/curr/fr_MG.txt
+++ b/icu4c/source/data/curr/fr_MG.txt
@@ -7,5 +7,5 @@
             "ariary malgache",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_MR.txt b/icu4c/source/data/curr/fr_MR.txt
index 2e4483a..6ea8722 100644
--- a/icu4c/source/data/curr/fr_MR.txt
+++ b/icu4c/source/data/curr/fr_MR.txt
@@ -2,10 +2,10 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_MR{
     Currencies{
-        MRO{
+        MRU{
             "UM",
             "ouguiya mauritanien",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/fr_MU.txt b/icu4c/source/data/curr/fr_MU.txt
index 5db2eb0..48da1ae 100644
--- a/icu4c/source/data/curr/fr_MU.txt
+++ b/icu4c/source/data/curr/fr_MU.txt
@@ -7,5 +7,5 @@
             "roupie mauricienne",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_RW.txt b/icu4c/source/data/curr/fr_RW.txt
index 8cb5e29..4fee550 100644
--- a/icu4c/source/data/curr/fr_RW.txt
+++ b/icu4c/source/data/curr/fr_RW.txt
@@ -7,5 +7,5 @@
             "franc rwandais",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_SC.txt b/icu4c/source/data/curr/fr_SC.txt
index af931a8..52daec2 100644
--- a/icu4c/source/data/curr/fr_SC.txt
+++ b/icu4c/source/data/curr/fr_SC.txt
@@ -7,5 +7,5 @@
             "roupie des Seychelles",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_SY.txt b/icu4c/source/data/curr/fr_SY.txt
index 7b3e1dc..1a14163 100644
--- a/icu4c/source/data/curr/fr_SY.txt
+++ b/icu4c/source/data/curr/fr_SY.txt
@@ -7,5 +7,5 @@
             "livre syrienne",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_TN.txt b/icu4c/source/data/curr/fr_TN.txt
index 501b31d..edf93af 100644
--- a/icu4c/source/data/curr/fr_TN.txt
+++ b/icu4c/source/data/curr/fr_TN.txt
@@ -7,5 +7,5 @@
             "dinar tunisien",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fr_VU.txt b/icu4c/source/data/curr/fr_VU.txt
index f4db728..e2728f8 100644
--- a/icu4c/source/data/curr/fr_VU.txt
+++ b/icu4c/source/data/curr/fr_VU.txt
@@ -7,5 +7,5 @@
             "vatu vanuatuan",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/fur.txt b/icu4c/source/data/curr/fur.txt
index 608d43c..f05ff21 100644
--- a/icu4c/source/data/curr/fur.txt
+++ b/icu4c/source/data/curr/fur.txt
@@ -377,5 +377,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/fy.txt b/icu4c/source/data/curr/fy.txt
index 7e4a65c..a178d7d 100644
--- a/icu4c/source/data/curr/fy.txt
+++ b/icu4c/source/data/curr/fy.txt
@@ -664,6 +664,10 @@
         }
         MRO{
             "MRO",
+            "Mauritaanske ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritaanske ouguiya",
         }
         MTL{
@@ -892,6 +896,10 @@
         }
         STD{
             "STD",
+            "Santomese dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Santomese dobra",
         }
         SUR{
@@ -1837,6 +1845,10 @@
             other{"Macause pataca"}
         }
         MRO{
+            one{"Mauritaanske ouguiya (1973–2017)"}
+            other{"Mauritaanske ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"Mauritaanske ouguiya"}
             other{"Mauritaanske ouguiya"}
         }
@@ -2065,6 +2077,10 @@
             other{"Sûd-Soedaneeske pûn"}
         }
         STD{
+            one{"Santomese dobra (1977–2017)"}
+            other{"Santomese dobra (1977–2017)"}
+        }
+        STN{
             one{"Santomese dobra"}
             other{"Santomese dobra"}
         }
@@ -2353,5 +2369,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ga.txt b/icu4c/source/data/curr/ga.txt
index 0ddae4e..7c58697 100644
--- a/icu4c/source/data/curr/ga.txt
+++ b/icu4c/source/data/curr/ga.txt
@@ -648,6 +648,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya na Máratáine (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya na Máratáine",
         }
         MTL{
@@ -876,6 +880,10 @@
         }
         STD{
             "STD",
+            "Dobra São Tomé agus Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra São Tomé agus Príncipe",
         }
         SUR{
@@ -1223,7 +1231,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -2308,6 +2316,13 @@
             two{"phataca Mhacao"}
         }
         MRO{
+            few{"ouguiya na Máratáine (1973–2017)"}
+            many{"n-ouguiya na Máratáine (1973–2017)"}
+            one{"ouguiya na Máratáine (1973–2017)"}
+            other{"ouguiya na Máratáine (1973–2017)"}
+            two{"ouguiya na Máratáine (1973–2017)"}
+        }
+        MRU{
             few{"ouguiya na Máratáine"}
             many{"n-ouguiya na Máratáine"}
             one{"ouguiya na Máratáine"}
@@ -2707,6 +2722,13 @@
             two{"phunt na Súdáine Theas"}
         }
         STD{
+            few{"dhobra São Tomé agus Príncipe (1977–2017)"}
+            many{"ndobra São Tomé agus Príncipe (1977–2017)"}
+            one{"dobra São Tomé agus Príncipe (1977–2017)"}
+            other{"dobra São Tomé agus Príncipe (1977–2017)"}
+            two{"dhobra São Tomé agus Príncipe (1977–2017)"}
+        }
+        STN{
             few{"dhobra São Tomé agus Príncipe"}
             many{"ndobra São Tomé agus Príncipe"}
             one{"dobra São Tomé agus Príncipe"}
@@ -3155,5 +3177,5 @@
         other{"{0} {1}"}
         two{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/gd.txt b/icu4c/source/data/curr/gd.txt
index c6ef492..2ad9711 100644
--- a/icu4c/source/data/curr/gd.txt
+++ b/icu4c/source/data/curr/gd.txt
@@ -680,6 +680,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya Moratàineach (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya Moratàineach",
         }
         MTL{
@@ -912,6 +916,10 @@
         }
         STD{
             "STD",
+            "Dobra São Tomé agus Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra São Tomé agus Príncipe",
         }
         SUR{
@@ -1279,7 +1287,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -2314,6 +2322,12 @@
             two{"phataca Macàthuach"}
         }
         MRO{
+            few{"ouguiya Moratàineach (1973–2017)"}
+            one{"ouguiya Moratàineach (1973–2017)"}
+            other{"ouguiya Moratàineach (1973–2017)"}
+            two{"ouguiya Moratàineach (1973–2017)"}
+        }
+        MRU{
             few{"ouguiya Moratàineach"}
             one{"ouguiya Moratàineach"}
             other{"ouguiya Moratàineach"}
@@ -2662,6 +2676,12 @@
             two{"phunnd Sudàin a Deas"}
         }
         STD{
+            few{"dobra São Tomé agus Príncipe (1977–2017)"}
+            one{"dobra São Tomé agus Príncipe (1977–2017)"}
+            other{"dobra São Tomé agus Príncipe (1977–2017)"}
+            two{"dhobra São Tomé agus Príncipe (1977–2017)"}
+        }
+        STN{
             few{"dobra São Tomé agus Príncipe"}
             one{"dobra São Tomé agus Príncipe"}
             other{"dobra São Tomé agus Príncipe"}
@@ -3094,5 +3114,5 @@
         other{"{0} {1}"}
         two{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/gl.txt b/icu4c/source/data/curr/gl.txt
index 3acaf99..2f6a715 100644
--- a/icu4c/source/data/curr/gl.txt
+++ b/icu4c/source/data/curr/gl.txt
@@ -501,6 +501,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya mauritano (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya mauritano",
         }
         MUR{
@@ -681,6 +685,10 @@
         }
         STD{
             "STD",
+            "Dobra de São Tomé e Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra de São Tomé e Príncipe",
         }
         SUR{
@@ -916,7 +924,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1378,6 +1386,10 @@
             other{"patacas de Macau"}
         }
         MRO{
+            one{"ouguiya mauritano (1973–2017)"}
+            other{"ouguiyas mauritanos (1973–2017)"}
+        }
+        MRU{
             one{"ouguiya mauritano"}
             other{"ouguiyas mauritanos"}
         }
@@ -1534,6 +1546,10 @@
             other{"libras sursudanesa"}
         }
         STD{
+            one{"dobra de São Tomé e Príncipe (1977–2017)"}
+            other{"dobras de São Tomé e Príncipe (1977–2017)"}
+        }
+        STN{
             one{"dobra de São Tomé e Príncipe"}
             other{"dobras de São Tomé e Príncipe"}
         }
@@ -1666,5 +1682,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/gsw.txt b/icu4c/source/data/curr/gsw.txt
index c1a834c..917d88e 100644
--- a/icu4c/source/data/curr/gsw.txt
+++ b/icu4c/source/data/curr/gsw.txt
@@ -608,6 +608,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya",
         }
         MTL{
@@ -836,6 +840,10 @@
         }
         STD{
             "STD",
+            "Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra",
         }
         SUR{
@@ -1661,6 +1669,10 @@
             other{"Pataca"}
         }
         MRO{
+            one{"Ouguiya (1973–2017)"}
+            other{"Ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"Ouguiya"}
             other{"Ouguiya"}
         }
@@ -1889,6 +1901,10 @@
             other{"Süüdsudaneesischi Pfund"}
         }
         STD{
+            one{"Dobra (1977–2017)"}
+            other{"Dobra (1977–2017)"}
+        }
+        STN{
             one{"Dobra"}
             other{"Dobra"}
         }
@@ -2137,5 +2153,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/gu.txt b/icu4c/source/data/curr/gu.txt
index ed9999b..fa67819 100644
--- a/icu4c/source/data/curr/gu.txt
+++ b/icu4c/source/data/curr/gu.txt
@@ -380,6 +380,10 @@
         }
         MRO{
             "MRO",
+            "મોરીશેનિયન ઓગુયા (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "મોરીશેનિયન ઓગુયા",
         }
         MUR{
@@ -528,6 +532,10 @@
         }
         STD{
             "STD",
+            "સાઓ ટૉમ એન્ડ પ્રિંસાઇપ ડોબ્રા (1977–2017)",
+        }
+        STN{
+            "STN",
             "સાઓ ટૉમ એન્ડ પ્રિંસાઇપ ડોબ્રા",
         }
         SYP{
@@ -727,7 +735,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1121,6 +1129,10 @@
             other{"માકાનિઝ પતાકા"}
         }
         MRO{
+            one{"મોરીશેનિયન ઓગુયા (1973–2017)"}
+            other{"મોરીશેનિયન ઓગુયા (1973–2017)"}
+        }
+        MRU{
             one{"મોરીશેનિયન ઓગુયા"}
             other{"મોરીશેનિયન ઓગુયા"}
         }
@@ -1269,6 +1281,10 @@
             other{"દક્ષિણ સુદાનિઝ પાઉન્ડ"}
         }
         STD{
+            one{"સાઓ ટૉમ એન્ડ પ્રિંસાઇપ ડોબ્રા (1977–2017)"}
+            other{"સાઓ ટૉમ એન્ડ પ્રિંસાઇપ ડોબ્રા (1977–2017)"}
+        }
+        STN{
             one{"સાઓ ટૉમ એન્ડ પ્રિંસાઇપ ડોબ્રા"}
             other{"સાઓ ટૉમ એન્ડ પ્રિંસાઇપ ડોબ્રા"}
         }
@@ -1389,5 +1405,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/guz.txt b/icu4c/source/data/curr/guz.txt
index 75d27f7..3ddd697 100644
--- a/icu4c/source/data/curr/guz.txt
+++ b/icu4c/source/data/curr/guz.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/gv.txt b/icu4c/source/data/curr/gv.txt
index bad1078..4529a09 100644
--- a/icu4c/source/data/curr/gv.txt
+++ b/icu4c/source/data/curr/gv.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gv{
-    Version{"2.1.34.91"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/ha.txt b/icu4c/source/data/curr/ha.txt
index efe642a..99b7fff 100644
--- a/icu4c/source/data/curr/ha.txt
+++ b/icu4c/source/data/curr/ha.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Kuɗin Moritaniya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Kuɗin Moritaniya",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Kuɗin Sawo Tome da Paransip (1977–2017)",
+        }
+        STN{
+            "STN",
             "Kuɗin Sawo Tome da Paransip",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dalar zimbabuwe",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ha_GH.txt b/icu4c/source/data/curr/ha_GH.txt
index cb0c7ec..64d04e7 100644
--- a/icu4c/source/data/curr/ha_GH.txt
+++ b/icu4c/source/data/curr/ha_GH.txt
@@ -7,5 +7,5 @@
             "GHS",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/haw.txt b/icu4c/source/data/curr/haw.txt
index 2b6cf82..e7e8d14 100644
--- a/icu4c/source/data/curr/haw.txt
+++ b/icu4c/source/data/curr/haw.txt
@@ -11,5 +11,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/he.txt b/icu4c/source/data/curr/he.txt
index 9416272..b960e66 100644
--- a/icu4c/source/data/curr/he.txt
+++ b/icu4c/source/data/curr/he.txt
@@ -500,6 +500,10 @@
         }
         MRO{
             "MRO",
+            "אואוגויה מאוריטני (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "אואוגויה מאוריטני",
         }
         MTL{
@@ -700,6 +704,10 @@
         }
         STD{
             "STD",
+            "דוברה של סן טומה ופרינסיפה (1977–2017)",
+        }
+        STN{
+            "STN",
             "דוברה של סן טומה ופרינסיפה",
         }
         SUR{
@@ -979,7 +987,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1554,6 +1562,12 @@
             two{"פטקה של מקאו"}
         }
         MRO{
+            many{"אואוגויה מאוריטני (1973–2017)"}
+            one{"אואוגויה מאוריטני (1973–2017)"}
+            other{"אואוגויה מאוריטני (1973–2017)"}
+            two{"אואוגויה מאוריטני (1973–2017)"}
+        }
+        MRU{
             many{"אואוגויה מאוריטני"}
             one{"אואוגויה מאוריטני"}
             other{"אואוגויה מאוריטני"}
@@ -1782,6 +1796,12 @@
             two{"לירה דרום-סודנית"}
         }
         STD{
+            many{"דוברה של סן טומה ופרינסיפה (1977–2017)"}
+            one{"דוברה של סן טומה ופרינסיפה (1977–2017)"}
+            other{"דוברה של סן טומה ופרינסיפה (1977–2017)"}
+            two{"דוברה של סן טומה ופרינסיפה (1977–2017)"}
+        }
+        STN{
             many{"דוברה של סן טומה ופרינסיפה"}
             one{"דוברה של סן טומה ופרינסיפה"}
             other{"דוברה של סן טומה ופרינסיפה"}
@@ -1968,5 +1988,5 @@
         other{"{0} {1}"}
         two{"{0} {1}"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/hi.txt b/icu4c/source/data/curr/hi.txt
index b7ec994..3442fe8 100644
--- a/icu4c/source/data/curr/hi.txt
+++ b/icu4c/source/data/curr/hi.txt
@@ -416,6 +416,10 @@
         }
         MRO{
             "MRO",
+            "मॉरीटेनियन ओगुइया (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "मॉरीटेनियन ओगुइया",
         }
         MUR{
@@ -588,6 +592,10 @@
         }
         STD{
             "STD",
+            "साओ तोम और प्रिंसिपे डोबरा (1977–2017)",
+        }
+        STN{
+            "STN",
             "साओ तोम और प्रिंसिपे डोबरा",
         }
         SUR{
@@ -811,7 +819,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1205,6 +1213,10 @@
             other{"मेकानीज़ पाटाका"}
         }
         MRO{
+            one{"मॉरीटेनियन ओगुइया (1973–2017)"}
+            other{"मॉरीटेनियन ओगुइया (1973–2017)"}
+        }
+        MRU{
             one{"मॉरीटेनियन ओगुइया"}
             other{"मॉरीटेनियन ओगुइया"}
         }
@@ -1353,6 +1365,10 @@
             other{"दक्षिण सूडानी पाउंड"}
         }
         STD{
+            one{"साओ तोम और प्रिंसिपे डोबरा (1977–2017)"}
+            other{"साओ तोम और प्रिंसिपे डोबरा (1977–2017)"}
+        }
+        STN{
             one{"साओ तोम और प्रिंसिपे डोबरा"}
             other{"साओ तोम और प्रिंसिपे डोबरा"}
         }
@@ -1473,5 +1489,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/hr.txt b/icu4c/source/data/curr/hr.txt
index 9b322cb..ed5d605 100644
--- a/icu4c/source/data/curr/hr.txt
+++ b/icu4c/source/data/curr/hr.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "mauritanijska ouguja (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mauritanijska ouguja",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "dobra Svetog Tome i Principa (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra Svetog Tome i Principa",
         }
         SUR{
@@ -1281,7 +1289,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -2143,6 +2151,11 @@
             other{"makaoških pataka"}
         }
         MRO{
+            few{"mauritanijske ouguje (1973–2017)"}
+            one{"mauritanijska ouguja (1973–2017)"}
+            other{"mauritanijskih ouguja (1973–2017)"}
+        }
+        MRU{
             few{"mauritanijske ouguje"}
             one{"mauritanijska ouguja"}
             other{"mauritanijskih ouguja"}
@@ -2433,6 +2446,11 @@
             other{"južnosudanskih funti"}
         }
         STD{
+            few{"dobre Svetog Tome i Principa (1977–2017)"}
+            one{"dobra Svetog Tome i Principa (1977–2017)"}
+            other{"dobri Svetog Tome i Principa (1977–2017)"}
+        }
+        STN{
             few{"dobre Svetog Tome i Principa"}
             one{"dobra Svetog Tome i Principa"}
             other{"dobri Svetog Tome i Principa"}
@@ -2793,5 +2811,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/hr_BA.txt b/icu4c/source/data/curr/hr_BA.txt
index 6453bec..74ae655 100644
--- a/icu4c/source/data/curr/hr_BA.txt
+++ b/icu4c/source/data/curr/hr_BA.txt
@@ -7,5 +7,5 @@
             "konvertibilna marka",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/hsb.txt b/icu4c/source/data/curr/hsb.txt
index 02be03f..e318053 100644
--- a/icu4c/source/data/curr/hsb.txt
+++ b/icu4c/source/data/curr/hsb.txt
@@ -464,6 +464,10 @@
         }
         MRO{
             "MRO",
+            "mawretanska ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mawretanska ouguiya",
         }
         MUR{
@@ -620,6 +624,10 @@
         }
         STD{
             "STD",
+            "são tomeski dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "são tomeski dobra",
         }
         SVC{
@@ -1434,6 +1442,12 @@
             two{"macaoskej patace"}
         }
         MRO{
+            few{"mawretanske ouguije (1973–2017)"}
+            one{"mawretanska ouguiya (1973–2017)"}
+            other{"mawretanskich ouguijow (1973–2017)"}
+            two{"mawretanskej ouguiji (1973–2017)"}
+        }
+        MRU{
             few{"mawretanske ouguije"}
             one{"mawretanska ouguiya"}
             other{"mawretanskich ouguijow"}
@@ -1668,6 +1682,12 @@
             two{"južnosudanskej puntaj"}
         }
         STD{
+            few{"são tomeske dobry (1977–2017)"}
+            one{"são tomeski dobra (1977–2017)"}
+            other{"são tomeskich dobrow (1977–2017)"}
+            two{"são tomeskej dobraj (1977–2017)"}
+        }
+        STN{
             few{"são tomeske dobry"}
             one{"são tomeski dobra"}
             other{"são tomeskich dobrow"}
@@ -1854,5 +1874,5 @@
         other{"{0} {1}"}
         two{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/hu.txt b/icu4c/source/data/curr/hu.txt
index 53b600a..5cba033 100644
--- a/icu4c/source/data/curr/hu.txt
+++ b/icu4c/source/data/curr/hu.txt
@@ -616,6 +616,10 @@
         }
         MRO{
             "MRO",
+            "mauritániai ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mauritániai ouguiya",
         }
         MTL{
@@ -844,6 +848,10 @@
         }
         STD{
             "STD",
+            "São Tomé és Príncipe-i dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "São Tomé és Príncipe-i dobra",
         }
         SUR{
@@ -1191,7 +1199,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1673,6 +1681,10 @@
             other{"makaói pataca"}
         }
         MRO{
+            one{"mauritániai ouguiya (1973–2017)"}
+            other{"mauritániai ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"mauritániai ouguiya"}
             other{"mauritániai ouguiya"}
         }
@@ -1841,6 +1853,10 @@
             other{"dél-szudáni font"}
         }
         STD{
+            one{"São Tomé és Príncipe-i dobra (1977–2017)"}
+            other{"São Tomé és Príncipe-i dobra (1977–2017)"}
+        }
+        STN{
             one{"São Tomé és Príncipe-i dobra"}
             other{"São Tomé és Príncipe-i dobra"}
         }
@@ -2021,5 +2037,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/hy.txt b/icu4c/source/data/curr/hy.txt
index 90c5f9b..7271242 100644
--- a/icu4c/source/data/curr/hy.txt
+++ b/icu4c/source/data/curr/hy.txt
@@ -376,6 +376,10 @@
         }
         MRO{
             "MRO",
+            "մավրիտանական ուգիյա (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "մավրիտանական ուգիյա",
         }
         MUR{
@@ -524,6 +528,10 @@
         }
         STD{
             "STD",
+            "Սան Տոմե և Փրինսիպիի դոբրա (1977–2017)",
+        }
+        STN{
+            "STN",
             "Սան Տոմե և Փրինսիպիի դոբրա",
         }
         SYP{
@@ -723,7 +731,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1117,6 +1125,10 @@
             other{"Մակաոյի պատակա"}
         }
         MRO{
+            one{"մավրիտանական ուգիյա (1973–2017)"}
+            other{"մավրիտանական ուգիյա (1973–2017)"}
+        }
+        MRU{
             one{"մավրիտանական ուգիյա"}
             other{"մավրիտանական ուգիյա"}
         }
@@ -1265,6 +1277,10 @@
             other{"հարավսուդանական ֆունտ"}
         }
         STD{
+            one{"Սան Տոմե և Փրինսիպիի դոբրա (1977–2017)"}
+            other{"Սան Տոմե և Փրինսիպիի դոբրա (1977–2017)"}
+        }
+        STN{
             one{"Սան Տոմե և Փրինսիպիի դոբրա"}
             other{"Սան Տոմե և Փրինսիպիի դոբրա"}
         }
@@ -1389,5 +1405,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/id.txt b/icu4c/source/data/curr/id.txt
index 7f89fe1..08e50dd 100644
--- a/icu4c/source/data/curr/id.txt
+++ b/icu4c/source/data/curr/id.txt
@@ -676,6 +676,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya Mauritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya Mauritania",
         }
         MTL{
@@ -908,6 +912,10 @@
         }
         STD{
             "STD",
+            "Dobra Sao Tome dan Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra Sao Tome dan Principe",
         }
         SUR{
@@ -1263,7 +1271,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1641,6 +1649,9 @@
             other{"Pataca Makau"}
         }
         MRO{
+            other{"Ouguiya Mauritania (1973–2017)"}
+        }
+        MRU{
             other{"Ouguiya Mauritania"}
         }
         MUR{
@@ -1782,6 +1793,9 @@
             other{"Pound Sudan Selatan"}
         }
         STD{
+            other{"Dobra Sao Tome dan Principe (1977–2017)"}
+        }
+        STN{
             other{"Dobra Sao Tome dan Principe"}
         }
         SYP{
@@ -1914,5 +1928,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/ig.txt b/icu4c/source/data/curr/ig.txt
index f1ef6ed..aa96076 100644
--- a/icu4c/source/data/curr/ig.txt
+++ b/icu4c/source/data/curr/ig.txt
@@ -14,5 +14,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/ii.txt b/icu4c/source/data/curr/ii.txt
index e2a376c..bd4aebc 100644
--- a/icu4c/source/data/curr/ii.txt
+++ b/icu4c/source/data/curr/ii.txt
@@ -14,5 +14,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/is.txt b/icu4c/source/data/curr/is.txt
index 0cb6a4c..4510efe 100644
--- a/icu4c/source/data/curr/is.txt
+++ b/icu4c/source/data/curr/is.txt
@@ -500,6 +500,10 @@
         }
         MRO{
             "MRO",
+            "márítönsk úgía (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "márítönsk úgía",
         }
         MTL{
@@ -708,6 +712,10 @@
         }
         STD{
             "STD",
+            "Saó Tóme og Prinsípe-dóbra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Saó Tóme og Prinsípe-dóbra",
         }
         SUR{
@@ -975,7 +983,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1373,6 +1381,10 @@
             other{"makaóskar patökur"}
         }
         MRO{
+            one{"máritönsk úgía (1973–2017)"}
+            other{"máritanskar úgíur (1973–2017)"}
+        }
+        MRU{
             one{"máritönsk úgía"}
             other{"máritanskar úgíur"}
         }
@@ -1525,6 +1537,10 @@
             other{"suðursúdönsk pund"}
         }
         STD{
+            one{"Saó Tóme og Prinsípe-dóbra (1977–2017)"}
+            other{"Saó Tóme og Prinsípe-dóbrur (1977–2017)"}
+        }
+        STN{
             one{"Saó Tóme og Prinsípe-dóbra"}
             other{"Saó Tóme og Prinsípe-dóbrur"}
         }
@@ -1653,5 +1669,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/it.txt b/icu4c/source/data/curr/it.txt
index d9b859a..54366d5 100644
--- a/icu4c/source/data/curr/it.txt
+++ b/icu4c/source/data/curr/it.txt
@@ -609,6 +609,10 @@
         }
         MRO{
             "MRO",
+            "ouguiya della Mauritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ouguiya della Mauritania",
         }
         MTL{
@@ -829,6 +833,10 @@
         }
         STD{
             "STD",
+            "dobra di Sao Tomé e Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra di Sao Tomé e Principe",
         }
         SUR{
@@ -1168,7 +1176,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1566,6 +1574,10 @@
             other{"patacas di Macao"}
         }
         MRO{
+            one{"ouguiya della Mauritania (1973–2017)"}
+            other{"ouguiya della Mauritania (1973–2017)"}
+        }
+        MRU{
             one{"ouguiya della Mauritania"}
             other{"ouguiya della Mauritania"}
         }
@@ -1722,6 +1734,10 @@
             other{"sterline sud-sudanesi"}
         }
         STD{
+            one{"dobra di Sao Tomé e Principe (1977–2017)"}
+            other{"dobra di Sao Tomé e Principe (1977–2017)"}
+        }
+        STN{
             one{"dobra di Sao Tomé e Principe"}
             other{"dobra di Sao Tomé e Principe"}
         }
@@ -1854,5 +1870,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.40"}
 }
diff --git a/icu4c/source/data/curr/ja.txt b/icu4c/source/data/curr/ja.txt
index ffd3395..b7c98e0 100644
--- a/icu4c/source/data/curr/ja.txt
+++ b/icu4c/source/data/curr/ja.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "モーリタニア ウギア (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "モーリタニア ウギア",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "サントメ・プリンシペ ドブラ (1977–2017)",
+        }
+        STN{
+            "STN",
             "サントメ・プリンシペ ドブラ",
         }
         SUR{
@@ -1280,7 +1288,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1812,6 +1820,9 @@
             other{"マカオ パタカ"}
         }
         MRO{
+            other{"モーリタニア ウギア (1973–2017)"}
+        }
+        MRU{
             other{"モーリタニア ウギア"}
         }
         MTL{
@@ -1986,6 +1997,9 @@
             other{"南スーダン ポンド"}
         }
         STD{
+            other{"サントメ・プリンシペ ドブラ (1977–2017)"}
+        }
+        STN{
             other{"サントメ・プリンシペ ドブラ"}
         }
         SUR{
@@ -2202,5 +2216,5 @@
     CurrencyUnitPatterns{
         other{"{0}{1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/jgo.txt b/icu4c/source/data/curr/jgo.txt
index 8c05f44..8f14496 100644
--- a/icu4c/source/data/curr/jgo.txt
+++ b/icu4c/source/data/curr/jgo.txt
@@ -23,5 +23,5 @@
             "ntɛ-ŋkáp yi pɛ́ ká kɛ́ jínɛ",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/jmc.txt b/icu4c/source/data/curr/jmc.txt
index 346c41a..a1f7820 100644
--- a/icu4c/source/data/curr/jmc.txt
+++ b/icu4c/source/data/curr/jmc.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ka.txt b/icu4c/source/data/curr/ka.txt
index 8b522ff..114a4ff 100644
--- a/icu4c/source/data/curr/ka.txt
+++ b/icu4c/source/data/curr/ka.txt
@@ -552,6 +552,10 @@
         }
         MRO{
             "MRO",
+            "მავრიტანული უგია (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "მავრიტანული უგია",
         }
         MTL{
@@ -768,6 +772,10 @@
         }
         STD{
             "STD",
+            "სან-ტომე და პრინსიპის დობრა (1977–2017)",
+        }
+        STN{
+            "STN",
             "სან-ტომე და პრინსიპის დობრა",
         }
         SUR{
@@ -1055,7 +1063,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1448,6 +1456,10 @@
             other{"მაკაუს პატაკა"}
         }
         MRO{
+            one{"მავრიტანული უგია (1973–2017)"}
+            other{"მავრიტანული უგია (1973–2017)"}
+        }
+        MRU{
             one{"მავრიტანული უგია"}
             other{"მავრიტანული უგია"}
         }
@@ -1600,6 +1612,10 @@
             other{"სამხრეთ სუდანური ფუნტი"}
         }
         STD{
+            one{"სან-ტომე და პრინსიპის დობრა (1977–2017)"}
+            other{"სან-ტომე და პრინსიპის დობრა (1977–2017)"}
+        }
+        STN{
             one{"სან-ტომე და პრინსიპის დობრა"}
             other{"სან-ტომე და პრინსიპის დობრა"}
         }
@@ -1724,5 +1740,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/kab.txt b/icu4c/source/data/curr/kab.txt
index c09495e..cd8d58d 100644
--- a/icu4c/source/data/curr/kab.txt
+++ b/icu4c/source/data/curr/kab.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Agiya Amuriṭani (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Agiya Amuriṭani",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Asw Ṭum d Udubra Amenzay (1977–2017)",
+        }
+        STN{
+            "STN",
             "Asw Ṭum d Udubra Amenzay",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Adular Azimbabwi",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/kam.txt b/icu4c/source/data/curr/kam.txt
index 8d22c4f..6680878 100644
--- a/icu4c/source/data/curr/kam.txt
+++ b/icu4c/source/data/curr/kam.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Ndola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/kde.txt b/icu4c/source/data/curr/kde.txt
index 985cc35..c77ed0a 100644
--- a/icu4c/source/data/curr/kde.txt
+++ b/icu4c/source/data/curr/kde.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/kea.txt b/icu4c/source/data/curr/kea.txt
index 910a549..db42d49 100644
--- a/icu4c/source/data/curr/kea.txt
+++ b/icu4c/source/data/curr/kea.txt
@@ -285,6 +285,10 @@
         }
         MRO{
             "MRO",
+            "Ougia (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ougia",
         }
         MUR{
@@ -413,6 +417,10 @@
         }
         STD{
             "STD",
+            "Dobra di Sãu Tume i Prínsipi (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra di Sãu Tume i Prínsipi",
         }
         SYP{
@@ -647,6 +655,9 @@
             other{"Ariari di Madagaskar"}
         }
         MRO{
+            other{"Ougia (1973–2017)"}
+        }
+        MRU{
             other{"Ougia"}
         }
         MUR{
@@ -698,6 +709,9 @@
             other{"Xelin somalianu"}
         }
         STD{
+            other{"Dobra di Sãu Tume i Prinsipi (1977–2017)"}
+        }
+        STN{
             other{"Dobra di Sãu Tume i Prinsipi"}
         }
         SZL{
@@ -743,5 +757,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/khq.txt b/icu4c/source/data/curr/khq.txt
index 4d5760c..6d78aef 100644
--- a/icu4c/source/data/curr/khq.txt
+++ b/icu4c/source/data/curr/khq.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Mooritaani Ugiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mooritaani Ugiya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Sao Tome nda Prinsipe Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Sao Tome nda Prinsipe Dobra",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Zimbabwe Dollar",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ki.txt b/icu4c/source/data/curr/ki.txt
index 72636a9..b357d2e 100644
--- a/icu4c/source/data/curr/ki.txt
+++ b/icu4c/source/data/curr/ki.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/kk.txt b/icu4c/source/data/curr/kk.txt
index e5dbd4f..65e840d 100644
--- a/icu4c/source/data/curr/kk.txt
+++ b/icu4c/source/data/curr/kk.txt
@@ -376,6 +376,10 @@
         }
         MRO{
             "MRO",
+            "Мавритания угиясы (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Мавритания угиясы",
         }
         MUR{
@@ -524,6 +528,10 @@
         }
         STD{
             "STD",
+            "Сант-Томе мен Принсипи добрасы (1977–2017)",
+        }
+        STN{
+            "STN",
             "Сант-Томе мен Принсипи добрасы",
         }
         SYP{
@@ -717,7 +725,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1111,6 +1119,10 @@
             other{"Макао патакасы"}
         }
         MRO{
+            one{"Мавритания угиясы (1973–2017)"}
+            other{"Мавритания угиясы (1973–2017)"}
+        }
+        MRU{
             one{"Мавритания угиясы"}
             other{"Мавритания угиясы"}
         }
@@ -1259,6 +1271,10 @@
             other{"Оңтүстік Судан фунты"}
         }
         STD{
+            one{"Сант-Томе мен Принсипи добрасы (1977–2017)"}
+            other{"Сант-Томе мен Принсипи добрасы (1977–2017)"}
+        }
+        STN{
             one{"Сант-Томе мен Принсипи добрасы"}
             other{"Сант-Томе мен Принсипи добрасы"}
         }
@@ -1379,5 +1395,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/kkj.txt b/icu4c/source/data/curr/kkj.txt
index 2832676..346517d 100644
--- a/icu4c/source/data/curr/kkj.txt
+++ b/icu4c/source/data/curr/kkj.txt
@@ -7,5 +7,5 @@
             "Franc CFA",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/kl.txt b/icu4c/source/data/curr/kl.txt
index 4be211e..b8a370a 100644
--- a/icu4c/source/data/curr/kl.txt
+++ b/icu4c/source/data/curr/kl.txt
@@ -17,5 +17,5 @@
             other{"euro"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/kln.txt b/icu4c/source/data/curr/kln.txt
index 3ccac1e..75158bd 100644
--- a/icu4c/source/data/curr/kln.txt
+++ b/icu4c/source/data/curr/kln.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Rabisiekab Mauritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Rabisiekab Mauritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Rabisiekab Sao Tome ak Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Rabisiekab Sao Tome ak Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dolaitab ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/km.txt b/icu4c/source/data/curr/km.txt
index 2cd2b71..ab40e23 100644
--- a/icu4c/source/data/curr/km.txt
+++ b/icu4c/source/data/curr/km.txt
@@ -376,6 +376,10 @@
         }
         MRO{
             "MRO",
+            "អ៊ូហ្គីយ៉ា​ម៉ូរីតានី (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "អ៊ូហ្គីយ៉ា​ម៉ូរីតានី",
         }
         MUR{
@@ -524,6 +528,10 @@
         }
         STD{
             "STD",
+            "ឌូប្រា​សៅតូម៉េ និងប្រាំងស៊ីប (1977–2017)",
+        }
+        STN{
+            "STN",
             "ឌូប្រា​សៅតូម៉េ និងប្រាំងស៊ីប",
         }
         SYP{
@@ -719,7 +727,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1020,6 +1028,9 @@
             other{"ប៉ាតាកា​ម៉ាកាវ"}
         }
         MRO{
+            other{"អ៊ូហ្គីយ៉ា​ម៉ូរីតានី (1973–2017)"}
+        }
+        MRU{
             other{"អ៊ូហ្គីយ៉ា​ម៉ូរីតានី"}
         }
         MUR{
@@ -1131,6 +1142,9 @@
             other{"ផោន​ស៊ូដង់​ខាង​ត្បូង"}
         }
         STD{
+            other{"ឌូប្រា​សៅតូម៉េ និងប្រាំងស៊ីប (1977–2017)"}
+        }
+        STN{
             other{"ឌូប្រា​សៅតូម៉េ និងប្រាំងស៊ីប"}
         }
         SYP{
@@ -1221,5 +1235,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/kn.txt b/icu4c/source/data/curr/kn.txt
index 1164a4c..d9afced 100644
--- a/icu4c/source/data/curr/kn.txt
+++ b/icu4c/source/data/curr/kn.txt
@@ -380,6 +380,10 @@
         }
         MRO{
             "MRO",
+            "ಮೌರೀಶಿಯನಿಯನ್ ಒಗಿಯ (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ಮೌರೀಶಿಯನಿಯನ್ ಒಗಿಯ",
         }
         MUR{
@@ -528,6 +532,10 @@
         }
         STD{
             "STD",
+            "ಸಾವೊ ಟೋಮ್ ಮತ್ತು ಪ್ರಿನ್ಸಿಪ್ ದೊಬ್ರಾ (1977–2017)",
+        }
+        STN{
+            "STN",
             "ಸಾವೊ ಟೋಮ್ ಮತ್ತು ಪ್ರಿನ್ಸಿಪ್ ದೊಬ್ರಾ",
         }
         SYP{
@@ -727,7 +735,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1121,6 +1129,10 @@
             other{"ಮಕ್ಯೂದ ಪಟಕಾಗಳು"}
         }
         MRO{
+            one{"ಮೌರೀಶಿಯನಿಯನ್ ಒಗಿಯ (1973–2017)"}
+            other{"ಮೌರೀಶಿಯನಿಯನ್ ಒಗಿಯಗಳು (1973–2017)"}
+        }
+        MRU{
             one{"ಮೌರೀಶಿಯನಿಯನ್ ಒಗಿಯ"}
             other{"ಮೌರೀಶಿಯನಿಯನ್ ಒಗಿಯಗಳು"}
         }
@@ -1269,6 +1281,10 @@
             other{"ದಕ್ಷಿಣ ಸೂಡಾನೀಸ್ ಪೌಂಡ್‍‍ಗಳು"}
         }
         STD{
+            one{"ಸಾವೊ ಟೋಮ್ ಮತ್ತು ಪ್ರಿನ್ಸಿಪ್ ದೊಬ್ರಾ (1977–2017)"}
+            other{"ಸಾವೊ ಟೋಮ್ ಮತ್ತು ಪ್ರಿನ್ಸಿಪ್ ದೊಬ್ರಾಗಳು (1977–2017)"}
+        }
+        STN{
             one{"ಸಾವೊ ಟೋಮ್ ಮತ್ತು ಪ್ರಿನ್ಸಿಪ್ ದೊಬ್ರಾ"}
             other{"ಸಾವೊ ಟೋಮ್ ಮತ್ತು ಪ್ರಿನ್ಸಿಪ್ ದೊಬ್ರಾಗಳು"}
         }
@@ -1389,5 +1405,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ko.txt b/icu4c/source/data/curr/ko.txt
index cce6173..79ef5ca 100644
--- a/icu4c/source/data/curr/ko.txt
+++ b/icu4c/source/data/curr/ko.txt
@@ -660,6 +660,10 @@
         }
         MRO{
             "MRO",
+            "모리타니 우기야 (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "모리타니 우기야",
         }
         MTL{
@@ -888,6 +892,10 @@
         }
         STD{
             "STD",
+            "상투메 프린시페 도브라 (1977–2017)",
+        }
+        STN{
+            "STN",
             "상투메 프린시페 도브라",
         }
         SUR{
@@ -1239,7 +1247,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1540,6 +1548,9 @@
             other{"마카오 파타카"}
         }
         MRO{
+            other{"모리타니 우기야 (1973–2017)"}
+        }
+        MRU{
             other{"모리타니 우기야"}
         }
         MUR{
@@ -1651,6 +1662,9 @@
             other{"남수단 파운드"}
         }
         STD{
+            other{"상투메 프린시페 도브라 (1977–2017)"}
+        }
+        STN{
             other{"상투메 프린시페 도브라"}
         }
         SYP{
@@ -1741,5 +1755,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/kok.txt b/icu4c/source/data/curr/kok.txt
index 3fcab02..4ab8f76 100644
--- a/icu4c/source/data/curr/kok.txt
+++ b/icu4c/source/data/curr/kok.txt
@@ -81,5 +81,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/ks.txt b/icu4c/source/data/curr/ks.txt
index 2100415..2a56850 100644
--- a/icu4c/source/data/curr/ks.txt
+++ b/icu4c/source/data/curr/ks.txt
@@ -552,6 +552,10 @@
         }
         MRO{
             "MRO",
+            "مورِٹینِیَن عوگیوٗیا (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "مورِٹینِیَن عوگیوٗیا",
         }
         MTL{
@@ -1011,5 +1015,5 @@
             "زِمبابِیُک ڈالَر",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ksb.txt b/icu4c/source/data/curr/ksb.txt
index 9e8bb2a..ff91623 100644
--- a/icu4c/source/data/curr/ksb.txt
+++ b/icu4c/source/data/curr/ksb.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "ugwiya ya Molitania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ugwiya ya Molitania",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "dobla ya Sao Tome na Plincipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobla ya Sao Tome na Plincipe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ksf.txt b/icu4c/source/data/curr/ksf.txt
index 3fba475..a55791c 100644
--- a/icu4c/source/data/curr/ksf.txt
+++ b/icu4c/source/data/curr/ksf.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "mɔni mǝ á mwaritaní (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mɔni mǝ á mwaritaní",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "mɔni mǝ á saotomɛ́ ri priŋsib (1977–2017)",
+        }
+        STN{
+            "STN",
             "mɔni mǝ á saotomɛ́ ri priŋsib",
         }
         SZL{
@@ -223,5 +231,5 @@
             "mɔni mǝ á zimbabwɛ́",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ksh.txt b/icu4c/source/data/curr/ksh.txt
index 867848e..b7d4227 100644
--- a/icu4c/source/data/curr/ksh.txt
+++ b/icu4c/source/data/curr/ksh.txt
@@ -384,6 +384,10 @@
         }
         MRO{
             "MRO",
+            "mauretanesche Ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mauretanesche Ouguiya",
         }
         MUR{
@@ -544,6 +548,10 @@
         }
         STD{
             "STD",
+            "Dobra vun São Tomé un Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra vun São Tomé un Príncipe",
         }
         SVC{
@@ -855,6 +863,11 @@
             zero{"södsudaneesesche Pongk"}
         }
         STD{
+            one{"Dobra vun São Tomé un Príncipe (1977–2017)"}
+            other{"Dobra vun São Tomé un Príncipe (1977–2017)"}
+            zero{"Dobra vun São Tomé un Príncipe (1977–2017)"}
+        }
+        STN{
             one{"Dobra vun São Tomé un Príncipe"}
             other{"Dobra vun São Tomé un Príncipe"}
             zero{"Dobra vun São Tomé un Príncipe"}
@@ -895,5 +908,5 @@
         other{"{0} {1}"}
         zero{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/kw.txt b/icu4c/source/data/curr/kw.txt
index 13f10c3..20e641f 100644
--- a/icu4c/source/data/curr/kw.txt
+++ b/icu4c/source/data/curr/kw.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kw{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/ky.txt b/icu4c/source/data/curr/ky.txt
index cba11e8..b4b4687 100644
--- a/icu4c/source/data/curr/ky.txt
+++ b/icu4c/source/data/curr/ky.txt
@@ -376,6 +376,10 @@
         }
         MRO{
             "MRO",
+            "Мавритания угиясы (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Мавритания угиясы",
         }
         MUR{
@@ -524,6 +528,10 @@
         }
         STD{
             "STD",
+            "Сао Томе жана Принсипе добрасы (1977–2017)",
+        }
+        STN{
+            "STN",
             "Сао Томе жана Принсипе добрасы",
         }
         SYP{
@@ -719,7 +727,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1113,6 +1121,10 @@
             other{"Макау патакасы"}
         }
         MRO{
+            one{"Мавритания угиясы (1973–2017)"}
+            other{"Мавритания угиясы (1973–2017)"}
+        }
+        MRU{
             one{"Мавритания угиясы"}
             other{"Мавритания угиясы"}
         }
@@ -1261,6 +1273,10 @@
             other{"Түштүк Судан фунту"}
         }
         STD{
+            one{"Сао Томе жана Принсипе добрасы (1977–2017)"}
+            other{"Сао Томе жана Принсипе добрасы (1977–2017)"}
+        }
+        STN{
             one{"Сао Томе жана Принсипе добрасы"}
             other{"Сао Томе жана Принсипе добрасы"}
         }
@@ -1381,5 +1397,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/lag.txt b/icu4c/source/data/curr/lag.txt
index 8fb8cef..18a9ab6 100644
--- a/icu4c/source/data/curr/lag.txt
+++ b/icu4c/source/data/curr/lag.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ungwíiya ya Moritánia (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ungwíiya ya Moritánia",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dóbura ya SaoTóome na Pirínsipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dóbura ya SaoTóome na Pirínsipe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dóola ya Simbáabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/lb.txt b/icu4c/source/data/curr/lb.txt
index b78f8fd..3f2a250 100644
--- a/icu4c/source/data/curr/lb.txt
+++ b/icu4c/source/data/curr/lb.txt
@@ -612,6 +612,10 @@
         }
         MRO{
             "MRO",
+            "Mauretaneschen Ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauretaneschen Ouguiya",
         }
         MTL{
@@ -840,6 +844,10 @@
         }
         STD{
             "STD",
+            "São-toméeschen Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "São-toméeschen Dobra",
         }
         SUR{
@@ -1729,6 +1737,10 @@
             other{"Macau-Pataca"}
         }
         MRO{
+            one{"Mauretaneschen Ouguiya (1973–2017)"}
+            other{"Mauretanesch Ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"Mauretaneschen Ouguiya"}
             other{"Mauretanesch Ouguiya"}
         }
@@ -1957,6 +1969,10 @@
             other{"Südsudanesesch Pond"}
         }
         STD{
+            one{"São-toméeschen Dobra (1977–2017)"}
+            other{"São-toméesch Dobra (1977–2017)"}
+        }
+        STN{
             one{"São-toméeschen Dobra"}
             other{"São-toméesch Dobra"}
         }
@@ -2225,5 +2241,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/lg.txt b/icu4c/source/data/curr/lg.txt
index cf46d47..e23603f 100644
--- a/icu4c/source/data/curr/lg.txt
+++ b/icu4c/source/data/curr/lg.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Wugwiya ey’eMawritenya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Wugwiya ey’eMawritenya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobura ey’eSantome ne Purincipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobura ey’eSantome ne Purincipe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Doola ey’eZimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/lkt.txt b/icu4c/source/data/curr/lkt.txt
index 173ed3d..6c9955a 100644
--- a/icu4c/source/data/curr/lkt.txt
+++ b/icu4c/source/data/curr/lkt.txt
@@ -7,5 +7,5 @@
             "USD",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/ln.txt b/icu4c/source/data/curr/ln.txt
index 0eb4a33..7aa2524 100644
--- a/icu4c/source/data/curr/ln.txt
+++ b/icu4c/source/data/curr/ln.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritani (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritani",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tomé mpé Presipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tomé mpé Presipe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Dolarɛ ya Zimbabwɛ",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ln_AO.txt b/icu4c/source/data/curr/ln_AO.txt
index 58a949a..c909b5f 100644
--- a/icu4c/source/data/curr/ln_AO.txt
+++ b/icu4c/source/data/curr/ln_AO.txt
@@ -7,5 +7,5 @@
             "Kwanza ya Angóla",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/lo.txt b/icu4c/source/data/curr/lo.txt
index 7884259..437aada 100644
--- a/icu4c/source/data/curr/lo.txt
+++ b/icu4c/source/data/curr/lo.txt
@@ -668,6 +668,10 @@
         }
         MRO{
             "MRO",
+            "ມົວ​ຣິ​ທາ​ນຽນ ອູ​ກິວ​ຢາ (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ມົວ​ຣິ​ທາ​ນຽນ ອູ​ກິວ​ຢາ",
         }
         MTL{
@@ -896,6 +900,10 @@
         }
         STD{
             "STD",
+            "ເຊົາ ໂທ​ເມ ແອນ ພ​ຣິນ​ຊິ​ປີ ໂດບຣາ (1977–2017)",
+        }
+        STN{
+            "STN",
             "ເຊົາ ໂທ​ເມ ແອນ ພ​ຣິນ​ຊິ​ປີ ໂດບຣາ",
         }
         SUR{
@@ -1250,7 +1258,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1551,6 +1559,9 @@
             other{"ມາ​ເກົ້າ ປາ​​ຕາ​ກາ"}
         }
         MRO{
+            other{"ມົວ​ຣິ​ທາ​ນຽນ ອູ​ກິວ​ຢາ (1973–2017)"}
+        }
+        MRU{
             other{"ມົວ​ຣິ​ທາ​ນຽນ ອູ​ກິວ​ຢາ"}
         }
         MUR{
@@ -1662,6 +1673,9 @@
             other{"ເຊົາ​ທ໌ ຊູ​ດານ​ນີ​ສ ພາວດ໌"}
         }
         STD{
+            other{"ເຊົາ ໂທ​ເມ ແອນ ພ​ຣິນ​ຊິ​ປີ ໂດບຣາ (1977–2017)"}
+        }
+        STN{
             other{"ເຊົາ ໂທ​ເມ ແອນ ພ​ຣິນ​ຊິ​ປີ ໂດບຣາ"}
         }
         SYP{
@@ -1752,5 +1766,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/lrc.txt b/icu4c/source/data/curr/lrc.txt
index 13e0092..5567ac0 100644
--- a/icu4c/source/data/curr/lrc.txt
+++ b/icu4c/source/data/curr/lrc.txt
@@ -82,5 +82,5 @@
             other{"پیل نادیار"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/lt.txt b/icu4c/source/data/curr/lt.txt
index b3d9bd2..0c5c652 100644
--- a/icu4c/source/data/curr/lt.txt
+++ b/icu4c/source/data/curr/lt.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "Mauritanijos ugija (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritanijos ugija",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "San Tomės ir Principės dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "San Tomės ir Principės dobra",
         }
         SUR{
@@ -1279,7 +1287,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -2322,6 +2330,12 @@
             other{"Makao patakų"}
         }
         MRO{
+            few{"Mauritanijos ugijos (1973–2017)"}
+            many{"Mauritanijos ugijos (1973–2017)"}
+            one{"Mauritanijos ugija (1973–2017)"}
+            other{"Mauritanijos ugijų (1973–2017)"}
+        }
+        MRU{
             few{"Mauritanijos ugijos"}
             many{"Mauritanijos ugijos"}
             one{"Mauritanijos ugija"}
@@ -2670,6 +2684,12 @@
             other{"Pietų Sudano svarų"}
         }
         STD{
+            few{"San Tomės ir Principės dobros (1977–2017)"}
+            many{"San Tomės ir Principės dobros (1977–2017)"}
+            one{"San Tomės ir Principės dobra (1977–2017)"}
+            other{"Sao Tomės ir Principės dobrų (1977–2017)"}
+        }
+        STN{
             few{"San Tomės ir Principės dobros"}
             many{"San Tomės ir Principės dobros"}
             one{"San Tomės ir Principės dobra"}
@@ -3096,5 +3116,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/lu.txt b/icu4c/source/data/curr/lu.txt
index 44ec6be..7d0ae96 100644
--- a/icu4c/source/data/curr/lu.txt
+++ b/icu4c/source/data/curr/lu.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya wa Moritani (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya wa Moritani",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra wa Sao Tome ne Presipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra wa Sao Tome ne Presipe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Ndola wa Zimbabwe",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/luo.txt b/icu4c/source/data/curr/luo.txt
index dd1cbad..18f65d1 100644
--- a/icu4c/source/data/curr/luo.txt
+++ b/icu4c/source/data/curr/luo.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/luy.txt b/icu4c/source/data/curr/luy.txt
index 7cbd17c..a81f465 100644
--- a/icu4c/source/data/curr/luy.txt
+++ b/icu4c/source/data/curr/luy.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/lv.txt b/icu4c/source/data/curr/lv.txt
index 2f147c3..85743df 100644
--- a/icu4c/source/data/curr/lv.txt
+++ b/icu4c/source/data/curr/lv.txt
@@ -444,6 +444,10 @@
         }
         MRO{
             "MRO",
+            "Mauritānijas ugija (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritānijas ugija",
         }
         MTL{
@@ -632,6 +636,10 @@
         }
         STD{
             "STD",
+            "Santome un Prinsipi dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Santome un Prinsipi dobra",
         }
         SVC{
@@ -907,7 +915,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1404,6 +1412,11 @@
             zero{"Makao patakas"}
         }
         MRO{
+            one{"Mauritānijas ugija (1973–2017)"}
+            other{"Mauritānijas ugijas (1973–2017)"}
+            zero{"Mauritānijas ugijas (1973–2017)"}
+        }
+        MRU{
             one{"Mauritānijas ugija"}
             other{"Mauritānijas ugijas"}
             zero{"Mauritānijas ugijas"}
@@ -1599,6 +1612,11 @@
             zero{"Dienvidsudānas mārciņas"}
         }
         STD{
+            one{"Santome un Prinsipi dobra (1977–2017)"}
+            other{"Santome un Prinsipi dobras (1977–2017)"}
+            zero{"Santome un Prinsipi dobras (1977–2017)"}
+        }
+        STN{
             one{"Santome un Prinsipi dobra"}
             other{"Santome un Prinsipi dobras"}
             zero{"Santome un Prinsipi dobras"}
@@ -1794,5 +1812,5 @@
         other{"{0} {1}"}
         zero{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/mas.txt b/icu4c/source/data/curr/mas.txt
index f90a860..460c795 100644
--- a/icu4c/source/data/curr/mas.txt
+++ b/icu4c/source/data/curr/mas.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Iropiyianí e Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Iropiyianí e Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Iropiyianí e Saotome (1977–2017)",
+        }
+        STN{
+            "STN",
             "Iropiyianí e Saotome",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Iropiyianí e Simbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/mas_TZ.txt b/icu4c/source/data/curr/mas_TZ.txt
index f90a8cd..82527f1 100644
--- a/icu4c/source/data/curr/mas_TZ.txt
+++ b/icu4c/source/data/curr/mas_TZ.txt
@@ -7,5 +7,5 @@
             "Iropiyianí e Tanzania",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/mer.txt b/icu4c/source/data/curr/mer.txt
index 167e17a..27dfe15 100644
--- a/icu4c/source/data/curr/mer.txt
+++ b/icu4c/source/data/curr/mer.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Mauritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Mauritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/mfe.txt b/icu4c/source/data/curr/mfe.txt
index b9b16fe..6b7829d 100644
--- a/icu4c/source/data/curr/mfe.txt
+++ b/icu4c/source/data/curr/mfe.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "ouguiya moritanien (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ouguiya moritanien",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "dobra santomeen (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra santomeen",
         }
         SZL{
@@ -227,5 +235,5 @@
             "dolar zimbawe",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/mg.txt b/icu4c/source/data/curr/mg.txt
index 65672ab..c53eb21 100644
--- a/icu4c/source/data/curr/mg.txt
+++ b/icu4c/source/data/curr/mg.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya moritanianina (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya moritanianina",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra",
         }
         SZL{
@@ -231,5 +239,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/mgh.txt b/icu4c/source/data/curr/mgh.txt
index cf8363e..2da94ef 100644
--- a/icu4c/source/data/curr/mgh.txt
+++ b/icu4c/source/data/curr/mgh.txt
@@ -7,5 +7,5 @@
             "MZN",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/mgo.txt b/icu4c/source/data/curr/mgo.txt
index e187f4b..487f5a4 100644
--- a/icu4c/source/data/curr/mgo.txt
+++ b/icu4c/source/data/curr/mgo.txt
@@ -15,5 +15,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/mk.txt b/icu4c/source/data/curr/mk.txt
index ffa3514..eedf64f 100644
--- a/icu4c/source/data/curr/mk.txt
+++ b/icu4c/source/data/curr/mk.txt
@@ -500,6 +500,10 @@
         }
         MRO{
             "MRO",
+            "Мавританска угија (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Мавританска угија",
         }
         MTL{
@@ -716,6 +720,10 @@
         }
         STD{
             "STD",
+            "Добра на Саун Томе и Принсип (1977–2017)",
+        }
+        STN{
+            "STN",
             "Добра на Саун Томе и Принсип",
         }
         SUR{
@@ -987,7 +995,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1381,6 +1389,10 @@
             other{"Макао патаки"}
         }
         MRO{
+            one{"Мавританска угија (1973–2017)"}
+            other{"Мавритански угии (1973–2017)"}
+        }
+        MRU{
             one{"Мавританска угија"}
             other{"Мавритански угии"}
         }
@@ -1537,6 +1549,10 @@
             other{"Јужносудански фунти"}
         }
         STD{
+            one{"Добра на Саун Томе и Принсип (1977–2017)"}
+            other{"Добри на Саун Томе и Принсип (1977–2017)"}
+        }
+        STN{
             one{"Добра на Саун Томе и Принсип"}
             other{"Добри на Саун Томе и Принсип"}
         }
@@ -1665,5 +1681,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ml.txt b/icu4c/source/data/curr/ml.txt
index ae9dce1..e89da8d 100644
--- a/icu4c/source/data/curr/ml.txt
+++ b/icu4c/source/data/curr/ml.txt
@@ -616,6 +616,10 @@
         }
         MRO{
             "MRO",
+            "മൗറിറ്റേനിയൻ ഔഗിയ (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "മൗറിറ്റേനിയൻ ഔഗിയ",
         }
         MTL{
@@ -844,6 +848,10 @@
         }
         STD{
             "STD",
+            "സാവോ ടോമി ആൻഡ് പ്രിൻസിപെ ഡോബ്ര (1977–2017)",
+        }
+        STN{
+            "STN",
             "സാവോ ടോമി ആൻഡ് പ്രിൻസിപെ ഡോബ്ര",
         }
         SUR{
@@ -1183,7 +1191,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1805,6 +1813,10 @@
             other{"മകാനീസ് പതാക്ക"}
         }
         MRO{
+            one{"മൗറിറ്റേനിയൻ ഔഗിയ (1973–2017)"}
+            other{"മൗറിറ്റേനിയൻ ഔഗിയ (1973–2017)"}
+        }
+        MRU{
             one{"മൗറിറ്റേനിയൻ ഔഗിയ"}
             other{"മൗറിറ്റേനിയൻ ഔഗിയ"}
         }
@@ -1973,6 +1985,10 @@
             other{"ദക്ഷിണ സുഡാനീസ് പൗണ്ട്"}
         }
         STD{
+            one{"സാവോ ടോമി ആൻഡ് പ്രിൻസിപെ ഡോബ്ര (1977–2017)"}
+            other{"സാവോ ടോമി ആൻഡ് പ്രിൻസിപെ ഡോബ്ര (1977–2017)"}
+        }
+        STN{
             one{"സാവോ ടോമി ആൻഡ് പ്രിൻസിപെ ഡോബ്ര"}
             other{"സാവോ ടോമി ആൻഡ് പ്രിൻസിപെ ഡോബ്ര"}
         }
@@ -2221,5 +2237,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/mn.txt b/icu4c/source/data/curr/mn.txt
index 1c22ebb..1ada61f 100644
--- a/icu4c/source/data/curr/mn.txt
+++ b/icu4c/source/data/curr/mn.txt
@@ -152,7 +152,7 @@
         }
         CZK{
             "CZK",
-            "чехийн коруна",
+            "Чех крон",
         }
         DJF{
             "DJF",
@@ -376,6 +376,10 @@
         }
         MRO{
             "MRO",
+            "мавритан угия (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "мавритан угия",
         }
         MUR{
@@ -524,6 +528,10 @@
         }
         STD{
             "STD",
+            "сан-томе ба принсипи добра (1977–2017)",
+        }
+        STN{
+            "STN",
             "сан-томе ба принсипи добра",
         }
         SYP{
@@ -723,7 +731,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -893,8 +901,8 @@
             other{"кабо-верде эскудо"}
         }
         CZK{
-            one{"чехийн коруна"}
-            other{"чехийн коруна"}
+            one{"Чех крон"}
+            other{"Чех крон"}
         }
         DJF{
             one{"жибоути франк"}
@@ -1117,6 +1125,10 @@
             other{"макаогийн патака"}
         }
         MRO{
+            one{"мавритан угия (1973–2017)"}
+            other{"мавритан угия (1973–2017)"}
+        }
+        MRU{
             one{"мавритан угия"}
             other{"мавритан угия"}
         }
@@ -1129,7 +1141,7 @@
             other{"мальдив руфия"}
         }
         MWK{
-            one{"малави квача"}
+            one{"Малавигийн квача"}
             other{"малави квача"}
         }
         MXN{
@@ -1265,8 +1277,12 @@
             other{"өмнөд судан паунд"}
         }
         STD{
-            one{"сан-томе ба принсипи добра"}
-            other{"сан-томе ба принсипи добра"}
+            one{"Сан-Томе Принсипигийн мөнгөн тэмдэгт добра (1977–2017)"}
+            other{"Сан-Томе Принсипигийн мөнгөн тэмдэгт добра (1977–2017)"}
+        }
+        STN{
+            one{"Сан-Томе Принсипигийн мөнгөн тэмдэгт добра"}
+            other{"Сан-Томе Принсипигийн мөнгөн тэмдэгт добра"}
         }
         SYP{
             one{"сири паунд"}
@@ -1389,5 +1405,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/mr.txt b/icu4c/source/data/curr/mr.txt
index 673cb25..40762fb 100644
--- a/icu4c/source/data/curr/mr.txt
+++ b/icu4c/source/data/curr/mr.txt
@@ -380,6 +380,10 @@
         }
         MRO{
             "MRO",
+            "मॉरिटानियन ओगिया (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "मॉरिटानियन ओगिया",
         }
         MUR{
@@ -528,6 +532,10 @@
         }
         STD{
             "STD",
+            "साओ टोम आणि प्रिन्सिपे डोबरा (1977–2017)",
+        }
+        STN{
+            "STN",
             "साओ टोम आणि प्रिन्सिपे डोबरा",
         }
         SYP{
@@ -727,7 +735,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1121,6 +1129,10 @@
             other{"मॅकॅनीज् पटाकाज"}
         }
         MRO{
+            one{"मॉरिटानियन ओगिया (1973–2017)"}
+            other{"मॉरिटानियन ओगियाज (1973–2017)"}
+        }
+        MRU{
             one{"मॉरिटानियन ओगिया"}
             other{"मॉरिटानियन ओगियाज"}
         }
@@ -1269,6 +1281,10 @@
             other{"दक्षिण सुदानी पाउंड्स"}
         }
         STD{
+            one{"साओ टोम आणि प्रिन्सिपे डोबरा (1977–2017)"}
+            other{"साओ टोम आणि प्रिन्सिपे डोबराज (1977–2017)"}
+        }
+        STN{
             one{"साओ टोम आणि प्रिन्सिपे डोबरा"}
             other{"साओ टोम आणि प्रिन्सिपे डोबराज"}
         }
@@ -1385,5 +1401,5 @@
             other{"झांबियन क्वाचास"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ms.txt b/icu4c/source/data/curr/ms.txt
index d9e44fe..0758339 100644
--- a/icu4c/source/data/curr/ms.txt
+++ b/icu4c/source/data/curr/ms.txt
@@ -380,6 +380,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya Mauritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya Mauritania",
         }
         MUR{
@@ -528,6 +532,10 @@
         }
         STD{
             "STD",
+            "Dobra Sao Tome dan Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra Sao Tome dan Principe",
         }
         SYP{
@@ -727,7 +735,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1027,6 +1035,9 @@
             other{"Pataca Macau"}
         }
         MRO{
+            other{"Ouguiya Mauritania (1973–2017)"}
+        }
+        MRU{
             other{"Ouguiya Mauritania"}
         }
         MUR{
@@ -1138,6 +1149,9 @@
             other{"Paun Sudan selatan"}
         }
         STD{
+            other{"Dobra Sao Tome dan Principe (1977–2017)"}
+        }
+        STN{
             other{"Dobra Sao Tome dan Principe"}
         }
         SYP{
@@ -1228,5 +1242,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/ms_BN.txt b/icu4c/source/data/curr/ms_BN.txt
index 4e17c3e..708c946 100644
--- a/icu4c/source/data/curr/ms_BN.txt
+++ b/icu4c/source/data/curr/ms_BN.txt
@@ -7,5 +7,5 @@
             "Dolar Brunei",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/ms_SG.txt b/icu4c/source/data/curr/ms_SG.txt
index 02c121e..d5d6901 100644
--- a/icu4c/source/data/curr/ms_SG.txt
+++ b/icu4c/source/data/curr/ms_SG.txt
@@ -7,5 +7,5 @@
             "Dolar Singapura",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/mt.txt b/icu4c/source/data/curr/mt.txt
index 2d0a075..8dc56f4 100644
--- a/icu4c/source/data/curr/mt.txt
+++ b/icu4c/source/data/curr/mt.txt
@@ -342,6 +342,10 @@
             "MRO",
             "MRO",
         }
+        MRU{
+            "MRU",
+            "MRU",
+        }
         MTL{
             "MTL",
             "Lira Maltija",
@@ -490,6 +494,10 @@
             "STD",
             "STD",
         }
+        STN{
+            "STN",
+            "STN",
+        }
         SYP{
             "SYP",
             "SYP",
@@ -674,7 +682,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1202,6 +1210,12 @@
             one{"MRO"}
             other{"MRO"}
         }
+        MRU{
+            few{"MRU"}
+            many{"MRU"}
+            one{"MRU"}
+            other{"MRU"}
+        }
         MUR{
             few{"MUR"}
             many{"MUR"}
@@ -1412,6 +1426,12 @@
             one{"STD"}
             other{"STD"}
         }
+        STN{
+            few{"STN"}
+            many{"STN"}
+            one{"STN"}
+            other{"STN"}
+        }
         SYP{
             few{"SYP"}
             many{"SYP"}
@@ -1587,5 +1607,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/mua.txt b/icu4c/source/data/curr/mua.txt
index 4803ff2..a5c0559 100644
--- a/icu4c/source/data/curr/mua.txt
+++ b/icu4c/source/data/curr/mua.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Solai Mauritaniya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Solai Mauritaniya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Solai Sao Tome (1977–2017)",
+        }
+        STN{
+            "STN",
             "Solai Sao Tome",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Solai Zimbabwe",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/my.txt b/icu4c/source/data/curr/my.txt
index edfcca6..ee2c396 100644
--- a/icu4c/source/data/curr/my.txt
+++ b/icu4c/source/data/curr/my.txt
@@ -24,7 +24,7 @@
         }
         AOA{
             "AOA",
-            "အင်ဂိုလာ ကန်ဇာ",
+            "အန်ဂိုလာ ကွမ်ဇာ",
         }
         ARP{
             "ARP",
@@ -416,6 +416,10 @@
         }
         MRO{
             "MRO",
+            "မော်ရီတေးနီးယား အူဂီးယာ (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "မော်ရီတေးနီးယား အူဂီးယာ",
         }
         MUR{
@@ -572,6 +576,10 @@
         }
         STD{
             "STD",
+            "ဆောင်တူမေးနှင့် ပရင်စီပီ ဒိုဘရာ (1977–2017)",
+        }
+        STN{
+            "STN",
             "ဆောင်တူမေးနှင့် ပရင်စီပီ ဒိုဘရာ",
         }
         SUR{
@@ -811,7 +819,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -847,7 +855,7 @@
             other{"နယ်သာလန် အန်တီလန် ဂင်းဒါး"}
         }
         AOA{
-            other{"အင်ဂိုလာ ကန်ဇာ"}
+            other{"အန်ဂိုလာ ကွမ်ဇာ"}
         }
         ARS{
             other{"အာဂျင်တီးနား ပီဆို"}
@@ -1111,6 +1119,9 @@
             other{"မကာအို ပါတားကား"}
         }
         MRO{
+            other{"မော်ရီတေးနီးယား အူဂီးယာ (1973–2017)"}
+        }
+        MRU{
             other{"မော်ရီတေးနီးယား အူဂီးယာ"}
         }
         MUR{
@@ -1222,6 +1233,9 @@
             other{"တောင်ဆူဒန် ပေါင်"}
         }
         STD{
+            other{"ဆောင်တူမေးနှင့် ပရင်စီပီ ဒိုဘရာ (1977–2017)"}
+        }
+        STN{
             other{"ဆောင်တူမေးနှင့် ပရင်စီပီ ဒိုဘရာ"}
         }
         SYP{
@@ -1309,5 +1323,5 @@
             other{"ဇင်ဘာဘွေ ခွါးချာ"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/mzn.txt b/icu4c/source/data/curr/mzn.txt
index 22cb77b..e2d5586 100644
--- a/icu4c/source/data/curr/mzn.txt
+++ b/icu4c/source/data/curr/mzn.txt
@@ -356,6 +356,10 @@
         }
         MRO{
             "MRO",
+            "موریتانی ِاوگوئیا (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "موریتانی ِاوگوئیا",
         }
         MUR{
@@ -492,6 +496,10 @@
         }
         STD{
             "STD",
+            "سائوتومه و پرینسیپ ِدوبرا (1977–2017)",
+        }
+        STN{
+            "STN",
             "سائوتومه و پرینسیپ ِدوبرا",
         }
         SYP{
@@ -661,7 +669,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TRY{"₺"}
@@ -946,6 +954,9 @@
             other{"ماکائو ِپاتاجا"}
         }
         MRO{
+            other{"موریتانی ِاوگوئیا (1973–2017)"}
+        }
+        MRU{
             other{"موریتانی ِاوگوئیا"}
         }
         MUR{
@@ -1048,6 +1059,9 @@
             other{"جنوبی سودان ِپوند"}
         }
         STD{
+            other{"سائوتومه و پرینسیپ ِدوبرا (1977–2017)"}
+        }
+        STN{
             other{"سائوتومه و پرینسیپ ِدوبرا"}
         }
         SYP{
@@ -1120,5 +1134,5 @@
             other{"زامبیای ِکواچا"}
         }
     }
-    Version{"2.1.31.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/naq.txt b/icu4c/source/data/curr/naq.txt
index 0e5cfdc..cdf9af0 100644
--- a/icu4c/source/data/curr/naq.txt
+++ b/icu4c/source/data/curr/naq.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Mauritania Ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritania Ouguiya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Sao Tome and Principe Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Sao Tome and Principe Dobra",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Zimbabwe Dollari",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/nb.txt b/icu4c/source/data/curr/nb.txt
index 08be7a4..2ad3594 100644
--- a/icu4c/source/data/curr/nb.txt
+++ b/icu4c/source/data/curr/nb.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "mauritanske ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mauritanske ouguiya",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "saotomesiske dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "saotomesiske dobra",
         }
         SUR{
@@ -1281,7 +1289,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1975,6 +1983,10 @@
             other{"makaoiske pataca"}
         }
         MRO{
+            one{"mauritansk ouguiya (1973–2017)"}
+            other{"mauritanske ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"mauritansk ouguiya"}
             other{"mauritanske ouguiya"}
         }
@@ -2207,6 +2219,10 @@
             other{"sørsudanske pund"}
         }
         STD{
+            one{"saotomesisk dobra (1977–2017)"}
+            other{"saotomesiske dobra (1977–2017)"}
+        }
+        STN{
             one{"saotomesisk dobra"}
             other{"saotomesiske dobra"}
         }
@@ -2491,5 +2507,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/nd.txt b/icu4c/source/data/curr/nd.txt
index 53c3ad9..9030c98 100644
--- a/icu4c/source/data/curr/nd.txt
+++ b/icu4c/source/data/curr/nd.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya yase Moritaniya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya yase Moritaniya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra yase Sao Tome lo Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra yase Sao Tome lo Principe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Dola yase Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/nds.txt b/icu4c/source/data/curr/nds.txt
index d293203..0f3ddc3 100644
--- a/icu4c/source/data/curr/nds.txt
+++ b/icu4c/source/data/curr/nds.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nds{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/ne.txt b/icu4c/source/data/curr/ne.txt
index 8ddb19e..df52221 100644
--- a/icu4c/source/data/curr/ne.txt
+++ b/icu4c/source/data/curr/ne.txt
@@ -380,6 +380,10 @@
         }
         MRO{
             "MRO",
+            "माउरिटानियानली औगुइया (१९७३–२०१७)",
+        }
+        MRU{
+            "MRU",
             "माउरिटानियानली औगुइया",
         }
         MUR{
@@ -528,6 +532,10 @@
         }
         STD{
             "STD",
+            "साओ टोम र प्रिन्सिप डोब्रा (१९७७–२०१७)",
+        }
+        STN{
+            "STN",
             "साओ टोम र प्रिन्सिप डोब्रा",
         }
         SYP{
@@ -727,7 +735,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1122,6 +1130,10 @@
             other{"माकानिज पटाका"}
         }
         MRO{
+            one{"माउरिटानियाली औगुइया (१९७३–२०१७)"}
+            other{"माउरिटानियानली औगुइया (१९७३–२०१७)"}
+        }
+        MRU{
             one{"माउरिटानियाली औगुइया"}
             other{"माउरिटानियानली औगुइया"}
         }
@@ -1270,6 +1282,10 @@
             other{"दक्षिण सुडानी पाउन्ड"}
         }
         STD{
+            one{"साओ टोम र प्रिन्सिप डोब्रा (१९७७–२०१७)"}
+            other{"साओ टोम र प्रिन्सिप डोब्रा (१९७७–२०१७)"}
+        }
+        STN{
             one{"साओ टोम र प्रिन्सिप डोब्रा"}
             other{"साओ टोम र प्रिन्सिप डोब्रा"}
         }
@@ -1390,5 +1406,5 @@
             other{"जाम्बियाली क्वाचा"}
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/nl.txt b/icu4c/source/data/curr/nl.txt
index 6509d50..e76c87b 100644
--- a/icu4c/source/data/curr/nl.txt
+++ b/icu4c/source/data/curr/nl.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "Mauritaanse ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritaanse ouguiya",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "Santomese dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Santomese dobra",
         }
         SUR{
@@ -1281,7 +1289,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1983,6 +1991,10 @@
             other{"Macause pataca"}
         }
         MRO{
+            one{"Mauritaanse ouguiya (1973–2017)"}
+            other{"Mauritaanse ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"Mauritaanse ouguiya"}
             other{"Mauritaanse ouguiya"}
         }
@@ -2215,6 +2227,10 @@
             other{"Zuid-Soedanees pond"}
         }
         STD{
+            one{"Santomese dobra (1977–2017)"}
+            other{"Santomese dobra (1977–2017)"}
+        }
+        STN{
             one{"Santomese dobra"}
             other{"Santomese dobra"}
         }
@@ -2503,5 +2519,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/nl_AW.txt b/icu4c/source/data/curr/nl_AW.txt
index 5ddcdd4..fdf6737 100644
--- a/icu4c/source/data/curr/nl_AW.txt
+++ b/icu4c/source/data/curr/nl_AW.txt
@@ -7,5 +7,5 @@
             "Arubaanse gulden",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/nl_BQ.txt b/icu4c/source/data/curr/nl_BQ.txt
index 6ed596e..51060a5 100644
--- a/icu4c/source/data/curr/nl_BQ.txt
+++ b/icu4c/source/data/curr/nl_BQ.txt
@@ -7,5 +7,5 @@
             "Amerikaanse dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/nl_CW.txt b/icu4c/source/data/curr/nl_CW.txt
index e2ee405..4219a79 100644
--- a/icu4c/source/data/curr/nl_CW.txt
+++ b/icu4c/source/data/curr/nl_CW.txt
@@ -7,5 +7,5 @@
             "Nederlands-Antilliaanse gulden",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/nl_SR.txt b/icu4c/source/data/curr/nl_SR.txt
index 26b4621..dcfd549 100644
--- a/icu4c/source/data/curr/nl_SR.txt
+++ b/icu4c/source/data/curr/nl_SR.txt
@@ -7,5 +7,5 @@
             "Surinaamse dollar",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/nl_SX.txt b/icu4c/source/data/curr/nl_SX.txt
index 2443514..e5d8e39 100644
--- a/icu4c/source/data/curr/nl_SX.txt
+++ b/icu4c/source/data/curr/nl_SX.txt
@@ -7,5 +7,5 @@
             "Nederlands-Antilliaanse gulden",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/nmg.txt b/icu4c/source/data/curr/nmg.txt
index 25aa400..031277f 100644
--- a/icu4c/source/data/curr/nmg.txt
+++ b/icu4c/source/data/curr/nmg.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Mɔn Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mɔn Moritania",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Mɔn Sao tomé na prinship (1977–2017)",
+        }
+        STN{
+            "STN",
             "Mɔn Sao tomé na prinship",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Dɔ́llɔ Zimbabwǝ (1980–2008)",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/nn.txt b/icu4c/source/data/curr/nn.txt
index 63f9cb5..aaa60a5 100644
--- a/icu4c/source/data/curr/nn.txt
+++ b/icu4c/source/data/curr/nn.txt
@@ -612,6 +612,10 @@
         }
         MRO{
             "MRO",
+            "mauritanske ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mauritanske ouguiya",
         }
         MTL{
@@ -840,6 +844,10 @@
         }
         STD{
             "STD",
+            "saotomesiske dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "saotomesiske dobra",
         }
         SUR{
@@ -872,7 +880,7 @@
         }
         TMM{
             "TMM",
-            "turkmenske manat (1993–2009)",
+            "turkmensk manat (1993–2009)",
         }
         TMT{
             "TMT",
@@ -1179,7 +1187,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1716,6 +1724,10 @@
             other{"makaoiske pataca"}
         }
         MRO{
+            one{"mauritansk ouguiya (1973–2017)"}
+            other{"mauritanske ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"mauritansk ouguiya"}
             other{"mauritanske ouguiya"}
         }
@@ -1944,6 +1956,10 @@
             other{"sørsudanske pund"}
         }
         STD{
+            one{"saotomesisk dobra (1977–2017)"}
+            other{"saotomesiske dobra (1977–2017)"}
+        }
+        STN{
             one{"saotomesisk dobra"}
             other{"saotomesiske dobra"}
         }
@@ -2188,5 +2204,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/nnh.txt b/icu4c/source/data/curr/nnh.txt
index 6417fcc..7982ad2 100644
--- a/icu4c/source/data/curr/nnh.txt
+++ b/icu4c/source/data/curr/nnh.txt
@@ -7,5 +7,5 @@
             "feláŋ CFA",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/nus.txt b/icu4c/source/data/curr/nus.txt
index 53b82f7..7c713a0 100644
--- a/icu4c/source/data/curr/nus.txt
+++ b/icu4c/source/data/curr/nus.txt
@@ -11,5 +11,5 @@
             "SSP",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/nyn.txt b/icu4c/source/data/curr/nyn.txt
index 3c86577..d882391 100644
--- a/icu4c/source/data/curr/nyn.txt
+++ b/icu4c/source/data/curr/nyn.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ougwiya ya Mouriteeniya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ougwiya ya Mouriteeniya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Purinsipo (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Purinsipo",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Doora ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/om.txt b/icu4c/source/data/curr/om.txt
index 40c7f83..6839d97 100644
--- a/icu4c/source/data/curr/om.txt
+++ b/icu4c/source/data/curr/om.txt
@@ -43,5 +43,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/om_KE.txt b/icu4c/source/data/curr/om_KE.txt
index b39e771..bfebd98 100644
--- a/icu4c/source/data/curr/om_KE.txt
+++ b/icu4c/source/data/curr/om_KE.txt
@@ -7,5 +7,5 @@
             "KES",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/os.txt b/icu4c/source/data/curr/os.txt
index 7b3acff..9ff5fe5 100644
--- a/icu4c/source/data/curr/os.txt
+++ b/icu4c/source/data/curr/os.txt
@@ -65,5 +65,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/os_RU.txt b/icu4c/source/data/curr/os_RU.txt
index c90d4a8..7fa4f47 100644
--- a/icu4c/source/data/curr/os_RU.txt
+++ b/icu4c/source/data/curr/os_RU.txt
@@ -11,5 +11,5 @@
             "Сом",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/pa.txt b/icu4c/source/data/curr/pa.txt
index 5d54ab3..9af6d8e 100644
--- a/icu4c/source/data/curr/pa.txt
+++ b/icu4c/source/data/curr/pa.txt
@@ -440,6 +440,10 @@
         }
         MRO{
             "MRO",
+            "ਮੋਰਿਟਾਨੀਆਈ ਊਗੀਆ (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ਮੋਰਿਟਾਨੀਆਈ ਊਗੀਆ",
         }
         MUR{
@@ -588,6 +592,10 @@
         }
         STD{
             "STD",
+            "ਸਾਉ ਟੋਮੀ ਐਂਡ ਪ੍ਰਿੰਸਪੀ ਡੋਬਰਾ (1977–2017)",
+        }
+        STN{
+            "STN",
             "ਸਾਉ ਟੋਮੀ ਐਂਡ ਪ੍ਰਿੰਸਪੀ ਡੋਬਰਾ",
         }
         SUR{
@@ -832,7 +840,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1290,6 +1298,10 @@
             other{"ਮੇਕਾਨੀ ਪਟਾਕਾ"}
         }
         MRO{
+            one{"ਮੋਰਿਟਾਨੀਆਈ ਊਗੀਆ (1973–2017)"}
+            other{"ਮੋਰਿਟਾਨੀਆਈ ਊਗੀਆ (1973–2017)"}
+        }
+        MRU{
             one{"ਮੋਰਿਟਾਨੀਆਈ ਊਗੀਆ"}
             other{"ਮੋਰਿਟਾਨੀਆਈ ਊਗੀਆ"}
         }
@@ -1438,6 +1450,10 @@
             other{"ਦੱਖਣੀ ਸੂਡਾਨੀ ਪੌਂਡ"}
         }
         STD{
+            one{"ਸਾਉ ਟੋਮੀ ਐਂਡ ਪ੍ਰਿੰਸਪੀ ਡੋਬਰਾ (1977–2017)"}
+            other{"ਸਾਉ ਟੋਮੀ ਐਂਡ ਪ੍ਰਿੰਸਪੀ ਡੋਬਰਾ (1977–2017)"}
+        }
+        STN{
             one{"ਸਾਉ ਟੋਮੀ ਐਂਡ ਪ੍ਰਿੰਸਪੀ ਡੋਬਰਾ"}
             other{"ਸਾਉ ਟੋਮੀ ਐਂਡ ਪ੍ਰਿੰਸਪੀ ਡੋਬਰਾ"}
         }
@@ -1590,5 +1606,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/pa_Arab.txt b/icu4c/source/data/curr/pa_Arab.txt
index 570f6e3..9e69793 100644
--- a/icu4c/source/data/curr/pa_Arab.txt
+++ b/icu4c/source/data/curr/pa_Arab.txt
@@ -16,5 +16,5 @@
             "روپئیہ",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/pa_Guru.txt b/icu4c/source/data/curr/pa_Guru.txt
index a731d5e..e558d24 100644
--- a/icu4c/source/data/curr/pa_Guru.txt
+++ b/icu4c/source/data/curr/pa_Guru.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa_Guru{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/pl.txt b/icu4c/source/data/curr/pl.txt
index 211ae3b..dec1b84 100644
--- a/icu4c/source/data/curr/pl.txt
+++ b/icu4c/source/data/curr/pl.txt
@@ -596,6 +596,10 @@
         }
         MRO{
             "MRO",
+            "ouguiya mauretańska (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ouguiya mauretańska",
         }
         MTL{
@@ -820,6 +824,10 @@
         }
         STD{
             "STD",
+            "dobra Wysp Świętego Tomasza i Książęcej (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra Wysp Świętego Tomasza i Książęcej",
         }
         SUR{
@@ -1139,7 +1147,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1815,6 +1823,12 @@
             other{"pataca Makau"}
         }
         MRO{
+            few{"ouguiya mauretańskie (1973–2017)"}
+            many{"ouguiya mauretańskich (1973–2017)"}
+            one{"ouguiya mauretańska (1973–2017)"}
+            other{"ouguiya mauretańskiej (1973–2017)"}
+        }
+        MRU{
             few{"ouguiya mauretańskie"}
             many{"ouguiya mauretańskich"}
             one{"ouguiya mauretańska"}
@@ -2085,6 +2099,12 @@
             other{"funta południowosudańskiego"}
         }
         STD{
+            few{"dobry Wysp Świętego Tomasza i Książęcej (1977–2017)"}
+            many{"dobr Wysp Świętego Tomasza i Książęcej (1977–2017)"}
+            one{"dobra Wysp Świętego Tomasza i Książęcej (1977–2017)"}
+            other{"dobry Wysp Świętego Tomasza i Książęcej (1977–2017)"}
+        }
+        STN{
             few{"dobry Wysp Świętego Tomasza i Książęcej"}
             many{"dobr Wysp Świętego Tomasza i Książęcej"}
             one{"dobra Wysp Świętego Tomasza i Książęcej"}
@@ -2301,5 +2321,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.15"}
 }
diff --git a/icu4c/source/data/curr/pool.res b/icu4c/source/data/curr/pool.res
index c4171a8..3001bd9 100644
--- a/icu4c/source/data/curr/pool.res
+++ b/icu4c/source/data/curr/pool.res
Binary files differ
diff --git a/icu4c/source/data/curr/ps.txt b/icu4c/source/data/curr/ps.txt
index 9f40998..f342a87 100644
--- a/icu4c/source/data/curr/ps.txt
+++ b/icu4c/source/data/curr/ps.txt
@@ -370,6 +370,10 @@
             "MRO",
             "MRO",
         }
+        MRU{
+            "MRU",
+            "MRU",
+        }
         MUR{
             "MUR",
             "MUR",
@@ -518,6 +522,10 @@
             "STD",
             "STD",
         }
+        STN{
+            "STN",
+            "STN",
+        }
         SYP{
             "SYP",
             "SYP",
@@ -711,7 +719,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1099,6 +1107,10 @@
             one{"MRO"}
             other{"MRO"}
         }
+        MRU{
+            one{"MRU"}
+            other{"MRU"}
+        }
         MUR{
             one{"MUR"}
             other{"MUR"}
@@ -1247,6 +1259,10 @@
             one{"STD"}
             other{"STD"}
         }
+        STN{
+            one{"STN"}
+            other{"STN"}
+        }
         SYP{
             one{"SYP"}
             other{"SYP"}
@@ -1360,5 +1376,5 @@
             other{"ZMW"}
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/pt.txt b/icu4c/source/data/curr/pt.txt
index 1472832..007184c 100644
--- a/icu4c/source/data/curr/pt.txt
+++ b/icu4c/source/data/curr/pt.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya mauritana (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya mauritana",
         }
         MTL{
@@ -912,6 +916,10 @@
         }
         STD{
             "STD",
+            "Dobra de São Tomé e Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra de São Tomé e Príncipe",
         }
         SUR{
@@ -1267,7 +1275,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1969,6 +1977,10 @@
             other{"Patacas macaenses"}
         }
         MRO{
+            one{"Ouguiya mauritana (1973–2017)"}
+            other{"Ouguiyas mauritanas (1973–2017)"}
+        }
+        MRU{
             one{"Ouguiya mauritana"}
             other{"Ouguiyas mauritanas"}
         }
@@ -2197,6 +2209,10 @@
             other{"Libras sul-sudanesas"}
         }
         STD{
+            one{"Dobra de São Tomé e Príncipe (1977–2017)"}
+            other{"Dobras de São Tomé e Príncipe (1977–2017)"}
+        }
+        STN{
             one{"Dobra de São Tomé e Príncipe"}
             other{"Dobras de São Tomé e Príncipe"}
         }
@@ -2477,5 +2493,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/pt_AO.txt b/icu4c/source/data/curr/pt_AO.txt
index e24ea13..8fc6163 100644
--- a/icu4c/source/data/curr/pt_AO.txt
+++ b/icu4c/source/data/curr/pt_AO.txt
@@ -8,5 +8,5 @@
             "Kwanza angolano",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/pt_CH.txt b/icu4c/source/data/curr/pt_CH.txt
index 90d6a1e..acd87d8 100644
--- a/icu4c/source/data/curr/pt_CH.txt
+++ b/icu4c/source/data/curr/pt_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CH{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/pt_CV.txt b/icu4c/source/data/curr/pt_CV.txt
index d32a9cd..686b662 100644
--- a/icu4c/source/data/curr/pt_CV.txt
+++ b/icu4c/source/data/curr/pt_CV.txt
@@ -17,5 +17,5 @@
             "Escudo português",
         }
     }
-    Version{"2.1.35.71"}
+    Version{"2.1.39.12"}
 }
diff --git a/icu4c/source/data/curr/pt_GQ.txt b/icu4c/source/data/curr/pt_GQ.txt
index 793e060..8a8947f 100644
--- a/icu4c/source/data/curr/pt_GQ.txt
+++ b/icu4c/source/data/curr/pt_GQ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GQ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/pt_GW.txt b/icu4c/source/data/curr/pt_GW.txt
index e137e51..f131573 100644
--- a/icu4c/source/data/curr/pt_GW.txt
+++ b/icu4c/source/data/curr/pt_GW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GW{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/pt_LU.txt b/icu4c/source/data/curr/pt_LU.txt
index 0000ae6..e14278a 100644
--- a/icu4c/source/data/curr/pt_LU.txt
+++ b/icu4c/source/data/curr/pt_LU.txt
@@ -8,5 +8,5 @@
             "Franco luxemburguês",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/pt_MO.txt b/icu4c/source/data/curr/pt_MO.txt
index 34abbb2..1cbed29 100644
--- a/icu4c/source/data/curr/pt_MO.txt
+++ b/icu4c/source/data/curr/pt_MO.txt
@@ -8,5 +8,5 @@
             "Pataca de Macau",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/pt_MZ.txt b/icu4c/source/data/curr/pt_MZ.txt
index 5695fc4..5f4783b 100644
--- a/icu4c/source/data/curr/pt_MZ.txt
+++ b/icu4c/source/data/curr/pt_MZ.txt
@@ -8,5 +8,5 @@
             "Metical de Moçambique",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/pt_PT.txt b/icu4c/source/data/curr/pt_PT.txt
index b3db958..6af8665 100644
--- a/icu4c/source/data/curr/pt_PT.txt
+++ b/icu4c/source/data/curr/pt_PT.txt
@@ -288,6 +288,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya da Mauritânia (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya da Mauritânia",
         }
         MVR{
@@ -403,6 +407,10 @@
             "SRD",
             "dólar do Suriname",
         }
+        STN{
+            "STN",
+            "São Tomé & Príncipe Dobra (2018)",
+        }
         SZL{
             "SZL",
             "Lilangeni da Suazilândia",
@@ -746,6 +754,10 @@
             other{"Patacas de Macau"}
         }
         MRO{
+            one{"Ouguiya da Mauritânia (1973–2017)"}
+            other{"Ouguiyas da Mauritânia (1973–2017)"}
+        }
+        MRU{
             one{"Ouguiya da Mauritânia"}
             other{"Ouguiyas da Mauritânia"}
         }
@@ -849,6 +861,10 @@
             one{"dólar do Suriname"}
             other{"dólares do Suriname"}
         }
+        STN{
+            one{"São Tomé & Príncipe dobra (2018)"}
+            other{"São Tomé & Príncipe dobras (2018)"}
+        }
         SZL{
             one{"Lilangeni da Suazilândia"}
             other{"Lilangenis da Suazilândia"}
@@ -922,5 +938,5 @@
             other{"Kwachas zambianos (1968–2012)"}
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/pt_ST.txt b/icu4c/source/data/curr/pt_ST.txt
index 7a19ac0..2b13aea 100644
--- a/icu4c/source/data/curr/pt_ST.txt
+++ b/icu4c/source/data/curr/pt_ST.txt
@@ -3,10 +3,10 @@
 pt_ST{
     %%Parent{"pt_PT"}
     Currencies{
-        STD{
+        STN{
             "Db",
-            "Dobra de São Tomé e Príncipe",
+            "São Tomé & Príncipe Dobra (2018)",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/pt_TL.txt b/icu4c/source/data/curr/pt_TL.txt
index 786b602..0f0ddb9 100644
--- a/icu4c/source/data/curr/pt_TL.txt
+++ b/icu4c/source/data/curr/pt_TL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_TL{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/qu.txt b/icu4c/source/data/curr/qu.txt
index 401145c..92d9b20 100644
--- a/icu4c/source/data/curr/qu.txt
+++ b/icu4c/source/data/curr/qu.txt
@@ -10,5 +10,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/curr/qu_BO.txt b/icu4c/source/data/curr/qu_BO.txt
index e08fb04..b81ef65 100644
--- a/icu4c/source/data/curr/qu_BO.txt
+++ b/icu4c/source/data/curr/qu_BO.txt
@@ -11,5 +11,5 @@
             "PEN",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/qu_EC.txt b/icu4c/source/data/curr/qu_EC.txt
index e38e5e8..af12188 100644
--- a/icu4c/source/data/curr/qu_EC.txt
+++ b/icu4c/source/data/curr/qu_EC.txt
@@ -11,5 +11,5 @@
             "USD",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/resfiles.mk b/icu4c/source/data/curr/resfiles.mk
index f846261..b185e05 100644
--- a/icu4c/source/data/curr/resfiles.mk
+++ b/icu4c/source/data/curr/resfiles.mk
@@ -1,6 +1,6 @@
 # © 2016 and later: Unicode, Inc. and others.
 # License & terms of use: http://www.unicode.org/copyright.html#License
-CURR_CLDR_VERSION = 32.0.1
+CURR_CLDR_VERSION = 33
 # A list of txt's to build
 # Note:
 #
diff --git a/icu4c/source/data/curr/rm.txt b/icu4c/source/data/curr/rm.txt
index 5c1ef3c..d93763a 100644
--- a/icu4c/source/data/curr/rm.txt
+++ b/icu4c/source/data/curr/rm.txt
@@ -672,6 +672,10 @@
         }
         MRO{
             "MRO",
+            "ouguiya da la Mauretania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ouguiya da la Mauretania",
         }
         MTL{
@@ -900,6 +904,10 @@
         }
         STD{
             "STD",
+            "dobra da São Tomé e Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra da São Tomé e Principe",
         }
         SUR{
@@ -1265,5 +1273,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/rn.txt b/icu4c/source/data/curr/rn.txt
index dd32e58..4d9e699 100644
--- a/icu4c/source/data/curr/rn.txt
+++ b/icu4c/source/data/curr/rn.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ryo muri Moritaniya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ryo muri Moritaniya",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Idobura ryo muri Sawotome na Perensipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Idobura ryo muri Sawotome na Perensipe",
         }
         SZL{
@@ -215,5 +223,5 @@
             "Idolari ryo muri Zimbabwe",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ro.txt b/icu4c/source/data/curr/ro.txt
index 0475e7c..2778142 100644
--- a/icu4c/source/data/curr/ro.txt
+++ b/icu4c/source/data/curr/ro.txt
@@ -532,6 +532,10 @@
         }
         MRO{
             "MRO",
+            "ouguiya mauritană (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ouguiya mauritană",
         }
         MTL{
@@ -744,6 +748,10 @@
         }
         STD{
             "STD",
+            "dobra Sao Tome și Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "dobra Sao Tome și Principe",
         }
         SUR{
@@ -1075,7 +1083,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1707,6 +1715,11 @@
             other{"pataca din Macao"}
         }
         MRO{
+            few{"ouguiya mauritane (1973–2017)"}
+            one{"ouguiya mauritană (1973–2017)"}
+            other{"ouguiya mauritane (1973–2017)"}
+        }
+        MRU{
             few{"ouguiya mauritane"}
             one{"ouguiya mauritană"}
             other{"ouguiya mauritane"}
@@ -1952,6 +1965,11 @@
             other{"lire din Sudanul de Sud"}
         }
         STD{
+            few{"dobre Sao Tome și Principe (1977–2017)"}
+            one{"dobra Sao Tome și Principe (1977–2017)"}
+            other{"dobre Sao Tome și Principe (1977–2017)"}
+        }
+        STN{
             few{"dobre Sao Tome și Principe"}
             one{"dobra Sao Tome și Principe"}
             other{"dobre Sao Tome și Principe"}
@@ -2197,5 +2215,5 @@
         one{"{0} {1}"}
         other{"{0} de {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/ro_MD.txt b/icu4c/source/data/curr/ro_MD.txt
index f0030b5..b3f99a3 100644
--- a/icu4c/source/data/curr/ro_MD.txt
+++ b/icu4c/source/data/curr/ro_MD.txt
@@ -7,5 +7,5 @@
             "leu moldovenesc",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/rof.txt b/icu4c/source/data/curr/rof.txt
index c8f10b7..30d6821 100644
--- a/icu4c/source/data/curr/rof.txt
+++ b/icu4c/source/data/curr/rof.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "heleri sa Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "heleri sa Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "heleri sa Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "heleri sa Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "heleri sa Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/root.txt b/icu4c/source/data/curr/root.txt
index a9d2cdd..1c6a5e7 100644
--- a/icu4c/source/data/curr/root.txt
+++ b/icu4c/source/data/curr/root.txt
@@ -170,7 +170,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -192,7 +192,7 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.27"}
     currencySpacing{
         afterCurrency{
             currencyMatch{"[:^S:]"}
diff --git a/icu4c/source/data/curr/ru.txt b/icu4c/source/data/curr/ru.txt
index 4d1e905..8d4ae28 100644
--- a/icu4c/source/data/curr/ru.txt
+++ b/icu4c/source/data/curr/ru.txt
@@ -616,6 +616,10 @@
         }
         MRO{
             "MRO",
+            "мавританская угия (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "мавританская угия",
         }
         MTL{
@@ -844,6 +848,10 @@
         }
         STD{
             "STD",
+            "добра Сан-Томе и Принсипи (1977–2017)",
+        }
+        STN{
+            "STN",
             "добра Сан-Томе и Принсипи",
         }
         SUR{
@@ -1187,7 +1195,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1785,6 +1793,12 @@
             other{"патаки Макао"}
         }
         MRO{
+            few{"мавританские угии (1973–2017)"}
+            many{"мавританских угий (1973–2017)"}
+            one{"мавританская угия (1973–2017)"}
+            other{"мавританской угии (1973–2017)"}
+        }
+        MRU{
             few{"мавританские угии"}
             many{"мавританских угий"}
             one{"мавританская угия"}
@@ -2013,6 +2027,12 @@
             other{"южносуданского фунта"}
         }
         STD{
+            few{"добры Сан-Томе и Принсипи (1977–2017)"}
+            many{"добр Сан-Томе и Принсипи (1977–2017)"}
+            one{"добра Сан-Томе и Принсипи (1977–2017)"}
+            other{"добры Сан-Томе и Принсипи (1977–2017)"}
+        }
+        STN{
             few{"добры Сан-Томе и Принсипи"}
             many{"добр Сан-Томе и Принсипи"}
             one{"добра Сан-Томе и Принсипи"}
@@ -2205,5 +2225,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.58"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/ru_BY.txt b/icu4c/source/data/curr/ru_BY.txt
index 5e66fd6..dadea27 100644
--- a/icu4c/source/data/curr/ru_BY.txt
+++ b/icu4c/source/data/curr/ru_BY.txt
@@ -14,5 +14,5 @@
     Currencies%narrow{
         BYN{"Br"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/ru_KG.txt b/icu4c/source/data/curr/ru_KG.txt
index 930122a..3be535d 100644
--- a/icu4c/source/data/curr/ru_KG.txt
+++ b/icu4c/source/data/curr/ru_KG.txt
@@ -7,5 +7,5 @@
             "киргизский сом",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/ru_KZ.txt b/icu4c/source/data/curr/ru_KZ.txt
index 65a4083..c88b16e 100644
--- a/icu4c/source/data/curr/ru_KZ.txt
+++ b/icu4c/source/data/curr/ru_KZ.txt
@@ -7,5 +7,5 @@
             "казахский тенге",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/ru_MD.txt b/icu4c/source/data/curr/ru_MD.txt
index ae7ad6b..a2c2a0a 100644
--- a/icu4c/source/data/curr/ru_MD.txt
+++ b/icu4c/source/data/curr/ru_MD.txt
@@ -7,5 +7,5 @@
             "молдавский лей",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/rw.txt b/icu4c/source/data/curr/rw.txt
index 8b17fd6..0c63526 100644
--- a/icu4c/source/data/curr/rw.txt
+++ b/icu4c/source/data/curr/rw.txt
@@ -10,5 +10,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/curr/rwk.txt b/icu4c/source/data/curr/rwk.txt
index 88e1be6..edf9c87 100644
--- a/icu4c/source/data/curr/rwk.txt
+++ b/icu4c/source/data/curr/rwk.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/sah.txt b/icu4c/source/data/curr/sah.txt
index 46ae7fb..39a9553 100644
--- a/icu4c/source/data/curr/sah.txt
+++ b/icu4c/source/data/curr/sah.txt
@@ -25,5 +25,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/saq.txt b/icu4c/source/data/curr/saq.txt
index 4f934ab..f249e7d 100644
--- a/icu4c/source/data/curr/saq.txt
+++ b/icu4c/source/data/curr/saq.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Njilingi eel Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Njilingi eel Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Njilingi eel Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Njilingi eel Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Dola eel Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/sbp.txt b/icu4c/source/data/curr/sbp.txt
index 2b92110..6e53c3d 100644
--- a/icu4c/source/data/curr/sbp.txt
+++ b/icu4c/source/data/curr/sbp.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ihela ya Molitaniya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ihela ya Molitaniya",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Ihela ya Sao Tome ni Pilinsipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Ihela ya Sao Tome ni Pilinsipe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Ihela ya Simbabwe",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/se.txt b/icu4c/source/data/curr/se.txt
index 09478cf..23746b1 100644
--- a/icu4c/source/data/curr/se.txt
+++ b/icu4c/source/data/curr/se.txt
@@ -73,5 +73,5 @@
         other{"{0} {1}"}
         two{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/se_SE.txt b/icu4c/source/data/curr/se_SE.txt
index 0631b57..e72b8e3 100644
--- a/icu4c/source/data/curr/se_SE.txt
+++ b/icu4c/source/data/curr/se_SE.txt
@@ -11,5 +11,5 @@
             "ruoŧŧa kruvdno",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/seh.txt b/icu4c/source/data/curr/seh.txt
index 75ad4f7..af5e3d1 100644
--- a/icu4c/source/data/curr/seh.txt
+++ b/icu4c/source/data/curr/seh.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya da Mauritânia (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya da Mauritânia",
         }
         MUR{
@@ -184,6 +188,10 @@
         }
         STD{
             "STD",
+            "Dobra de São Tomé e Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra de São Tomé e Príncipe",
         }
         SZL{
@@ -231,5 +239,5 @@
             "Dólar do Zimbábue",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ses.txt b/icu4c/source/data/curr/ses.txt
index c1416d5..a9b17f2 100644
--- a/icu4c/source/data/curr/ses.txt
+++ b/icu4c/source/data/curr/ses.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Mooritaani Ugiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mooritaani Ugiya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Sao Tome nda Prinsipe Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Sao Tome nda Prinsipe Dobra",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Zimbabwe Dollar",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/sg.txt b/icu4c/source/data/curr/sg.txt
index 770b0ad..e72a49e 100644
--- a/icu4c/source/data/curr/sg.txt
+++ b/icu4c/source/data/curr/sg.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "ugîya tî Moritanïi (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ugîya tî Moritanïi",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "dôbra tî Sâô Tomë na Prinsîpe (1977–2017)",
+        }
+        STN{
+            "STN",
             "dôbra tî Sâô Tomë na Prinsîpe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "dolära tî Zimbäbwe",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/shi.txt b/icu4c/source/data/curr/shi.txt
index 5283972..c1d829e 100644
--- a/icu4c/source/data/curr/shi.txt
+++ b/icu4c/source/data/curr/shi.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "ⵓⵇⵉⵢⵢⴰ ⵏ ⵎⵓⵕⵉⵟⴰⵏⵢⴰ (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ⵓⵇⵉⵢⵢⴰ ⵏ ⵎⵓⵕⵉⵟⴰⵏⵢⴰ",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "ⴰⴷⵓⴱⵔⴰ ⵏ ⵙⴰⵏⵟⵓⵎⵉ (1977–2017)",
+        }
+        STN{
+            "STN",
             "ⴰⴷⵓⴱⵔⴰ ⵏ ⵙⴰⵏⵟⵓⵎⵉ",
         }
         SZL{
@@ -227,5 +235,5 @@
             "ⴰⴷⵓⵍⴰⵔ ⵏ ⵣⵉⵎⴱⴰⴱⵡⵉ",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/shi_Latn.txt b/icu4c/source/data/curr/shi_Latn.txt
index af6eb2a..cf41074 100644
--- a/icu4c/source/data/curr/shi_Latn.txt
+++ b/icu4c/source/data/curr/shi_Latn.txt
@@ -125,6 +125,10 @@
         }
         MRO{
             "MRO",
+            "uqiyya n muṛiṭanya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "uqiyya n muṛiṭanya",
         }
         MUR{
@@ -181,6 +185,10 @@
         }
         STD{
             "STD",
+            "adubra n sanṭumi (1977–2017)",
+        }
+        STN{
+            "STN",
             "adubra n sanṭumi",
         }
         SZL{
@@ -228,5 +236,5 @@
             "adular n zimbabwi",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/shi_Tfng.txt b/icu4c/source/data/curr/shi_Tfng.txt
index ba03fa3..aaf5c7b 100644
--- a/icu4c/source/data/curr/shi_Tfng.txt
+++ b/icu4c/source/data/curr/shi_Tfng.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi_Tfng{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/si.txt b/icu4c/source/data/curr/si.txt
index 3ba92f1..4f77cfb 100644
--- a/icu4c/source/data/curr/si.txt
+++ b/icu4c/source/data/curr/si.txt
@@ -376,6 +376,10 @@
         }
         MRO{
             "MRO",
+            "මුරුසි ඔයිගුයියා (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "මුරුසි ඔයිගුයියා",
         }
         MUR{
@@ -524,6 +528,10 @@
         }
         STD{
             "STD",
+            "සාඕ තෝම් සහ ප්‍රින්සිප් දොබ්‍රා (1977–2017)",
+        }
+        STN{
+            "STN",
             "සාඕ තෝම් සහ ප්‍රින්සිප් දොබ්‍රා",
         }
         SYP{
@@ -722,7 +730,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1113,6 +1121,10 @@
             other{"මැකනීස් පටකා"}
         }
         MRO{
+            one{"මුරුසි ඔයිගුයියා (1973–2017)"}
+            other{"මුරුසි ඔයිගුයියා (1973–2017)"}
+        }
+        MRU{
             one{"මුරුසි ඔයිගුයියා"}
             other{"මුරුසි ඔයිගුයියා"}
         }
@@ -1261,6 +1273,10 @@
             other{"දකුණු සුඩාන පවුම්"}
         }
         STD{
+            one{"සාඕ තෝම් සහ ප්‍රින්සිප් දොබ්‍රා (1977–2017)"}
+            other{"සාඕ තෝම් සහ ප්‍රින්සිප් දොබ්‍රා (1977–2017)"}
+        }
+        STN{
             one{"සාඕ තෝම් සහ ප්‍රින්සිප් දොබ්‍රා"}
             other{"සාඕ තෝම් සහ ප්‍රින්සිප් දොබ්‍රා"}
         }
@@ -1381,5 +1397,5 @@
         one{"{1}{0}"}
         other{"{1}{0}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/sk.txt b/icu4c/source/data/curr/sk.txt
index da8e744..1fbe5b5 100644
--- a/icu4c/source/data/curr/sk.txt
+++ b/icu4c/source/data/curr/sk.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "mauritánska ukija (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mauritánska ukija",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "svätotomášska dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "svätotomášska dobra",
         }
         SUR{
@@ -1283,7 +1291,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -2326,6 +2334,12 @@
             other{"macajských patác"}
         }
         MRO{
+            few{"mauritánske ukije (1973–2017)"}
+            many{"mauritánskej ukije (1973–2017)"}
+            one{"mauritánska ukija (1973–2017)"}
+            other{"mauritánskych ukijí (1973–2017)"}
+        }
+        MRU{
             few{"mauritánske ukije"}
             many{"mauritánskej ukije"}
             one{"mauritánska ukija"}
@@ -2674,6 +2688,12 @@
             other{"juhosudánskych libier"}
         }
         STD{
+            few{"svätotomášske dobry (1977–2017)"}
+            many{"svätotomášskej dobry (1977–2017)"}
+            one{"svätotomášska dobra (1977–2017)"}
+            other{"svätotomášskych dobier (1977–2017)"}
+        }
+        STN{
             few{"svätotomášske dobry"}
             many{"svätotomášskej dobry"}
             one{"svätotomášska dobra"}
@@ -3106,5 +3126,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/sl.txt b/icu4c/source/data/curr/sl.txt
index bcc0061..5e42c05 100644
--- a/icu4c/source/data/curr/sl.txt
+++ b/icu4c/source/data/curr/sl.txt
@@ -616,6 +616,10 @@
         }
         MRO{
             "MRO",
+            "mavretanska uguija (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mavretanska uguija",
         }
         MTL{
@@ -844,6 +848,10 @@
         }
         STD{
             "STD",
+            "saotomejska dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "saotomejska dobra",
         }
         SUR{
@@ -1179,7 +1187,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1759,6 +1767,12 @@
             two{"makavski pataki"}
         }
         MRO{
+            few{"mavretanske uguije (1973–2017)"}
+            one{"mavretanska uguija (1973–2017)"}
+            other{"mavretanskih uguij (1973–2017)"}
+            two{"mavretanski uguiji (1973–2017)"}
+        }
+        MRU{
             few{"mavretanske uguije"}
             one{"mavretanska uguija"}
             other{"mavretanskih uguij"}
@@ -1987,6 +2001,12 @@
             two{"južnosudanska funta"}
         }
         STD{
+            few{"saotomejske dobre (1977–2017)"}
+            one{"saotomejska dobra (1977–2017)"}
+            other{"saotomejskih dober (1977–2017)"}
+            two{"saotomejski dobri (1977–2017)"}
+        }
+        STN{
             few{"saotomejske dobre"}
             one{"saotomejska dobra"}
             other{"saotomejskih dober"}
@@ -2167,5 +2187,5 @@
         other{"{0} {1}"}
         two{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/smn.txt b/icu4c/source/data/curr/smn.txt
index 4332148..2d16a76 100644
--- a/icu4c/source/data/curr/smn.txt
+++ b/icu4c/source/data/curr/smn.txt
@@ -40,5 +40,5 @@
         other{"{0} {1}"}
         two{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/sn.txt b/icu4c/source/data/curr/sn.txt
index a5a8fac..5285cd0 100644
--- a/icu4c/source/data/curr/sn.txt
+++ b/icu4c/source/data/curr/sn.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ye Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ye Moritania",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra re Sao Tome ne Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra re Sao Tome ne Principe",
         }
         SZL{
@@ -231,5 +239,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/so.txt b/icu4c/source/data/curr/so.txt
index 35ad886..bd2cc20 100644
--- a/icu4c/source/data/curr/so.txt
+++ b/icu4c/source/data/curr/so.txt
@@ -35,5 +35,5 @@
             "Lacag aan la qoon ama aan saxnayn",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/so_DJ.txt b/icu4c/source/data/curr/so_DJ.txt
index d9f0f0a..dad16b0 100644
--- a/icu4c/source/data/curr/so_DJ.txt
+++ b/icu4c/source/data/curr/so_DJ.txt
@@ -7,5 +7,5 @@
             "Faran Jabbuuti",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/so_ET.txt b/icu4c/source/data/curr/so_ET.txt
index ebddc85..bc45962 100644
--- a/icu4c/source/data/curr/so_ET.txt
+++ b/icu4c/source/data/curr/so_ET.txt
@@ -7,5 +7,5 @@
             "Birta Itoobbiya",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/so_KE.txt b/icu4c/source/data/curr/so_KE.txt
index eabfba9..9ad5d5f 100644
--- a/icu4c/source/data/curr/so_KE.txt
+++ b/icu4c/source/data/curr/so_KE.txt
@@ -7,5 +7,5 @@
             "KES",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/sq.txt b/icu4c/source/data/curr/sq.txt
index c01f301..eb19b2b 100644
--- a/icu4c/source/data/curr/sq.txt
+++ b/icu4c/source/data/curr/sq.txt
@@ -40,7 +40,7 @@
         }
         AZN{
             "AZN",
-            "Manata e Azerbajxhanit",
+            "Manata azerbajxhanase",
         }
         BAM{
             "BAM",
@@ -124,7 +124,7 @@
         }
         CNH{
             "CNH",
-            "Juani kinez (tregu i jashtëm)",
+            "Juani kinez (për treg të jashtëm)",
         }
         CNY{
             "CN¥",
@@ -152,7 +152,7 @@
         }
         CZK{
             "CZK",
-            "Koruna e Republikës Çeke",
+            "Koruna e Çekisë",
         }
         DJF{
             "DJF",
@@ -172,7 +172,7 @@
         }
         EGP{
             "EGP",
-            "Stërlina egjiptiane",
+            "Sterlina egjiptiane",
         }
         ERN{
             "ERN",
@@ -376,6 +376,10 @@
         }
         MRO{
             "MRO",
+            "Ugija mauritane (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugija mauritane",
         }
         MUR{
@@ -492,7 +496,7 @@
         }
         SDG{
             "SDG",
-            "Stërlina sudaneze",
+            "Sterlina sudaneze",
         }
         SEK{
             "SEK",
@@ -504,7 +508,7 @@
         }
         SHP{
             "SHP",
-            "Stërlina e Ishullit të Shën-Helenës",
+            "Sterlina e Ishullit të Shën-Helenës",
         }
         SLL{
             "SLL",
@@ -520,10 +524,14 @@
         }
         SSP{
             "SSP",
-            "Stërlina e Sudanit të Jugut",
+            "Sterlina sudanezo-jugore",
         }
         STD{
             "STD",
+            "Dobra e Sao-Tomes dhe Prinsipes (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra e Sao-Tomes dhe Prinsipes",
         }
         SYP{
@@ -681,8 +689,8 @@
             other{"florinë aruban"}
         }
         AZN{
-            one{"manatë azere"}
-            other{"manata azere"}
+            one{"manatë azerbajxhanase"}
+            other{"manata azerbajxhanase"}
         }
         BAM{
             one{"markë e Bosnjë-Hercegovinës [e shkëmbyeshme]"}
@@ -765,8 +773,8 @@
             other{"peso kiliane"}
         }
         CNH{
-            one{"juan kinez (tregu i jashtëm)"}
-            other{"juanë kinez (tregu i jashtëm)"}
+            one{"juan kinez (për treg të jashtëm)"}
+            other{"juanë kinez (për treg të jashtëm)"}
         }
         CNY{
             one{"juan kinez"}
@@ -813,8 +821,8 @@
             other{"dinarë algjerian"}
         }
         EGP{
-            one{"stërlinë egjiptiane"}
-            other{"stërlina egjiptiane"}
+            one{"sterlinë egjiptiane"}
+            other{"sterlina egjiptiane"}
         }
         ERN{
             one{"nakfë eritreje"}
@@ -1017,6 +1025,10 @@
             other{"pataka të Makaos"}
         }
         MRO{
+            one{"ugijë mauritane (1973–2017)"}
+            other{"ugija mauritane (1973–2017)"}
+        }
+        MRU{
             one{"ugijë mauritane"}
             other{"ugija mauritane"}
         }
@@ -1133,8 +1145,8 @@
             other{"rupi të Ishujve Sishelë"}
         }
         SDG{
-            one{"stërlinë sudaneze"}
-            other{"stërlina sudaneze"}
+            one{"sterlinë sudaneze"}
+            other{"sterlina sudaneze"}
         }
         SEK{
             one{"koronë suedeze"}
@@ -1145,8 +1157,8 @@
             other{"dollarë singapori"}
         }
         SHP{
-            one{"stërlinë e Ishullit të Shën-Helenës"}
-            other{"stërlina të Ishullit të Shën-Helenës"}
+            one{"sterlinë e Ishullit të Shën-Helenës"}
+            other{"sterlina e Ishullit të Shën-Helenës"}
         }
         SLL{
             one{"leon i Sierra-Leones"}
@@ -1161,10 +1173,14 @@
             other{"dollarë surinamez"}
         }
         SSP{
-            one{"stërlinë e Sudanit të Jugut"}
-            other{"stërlina të Sudanit të Jugut"}
+            one{"sterlinë sudanezo-jugore"}
+            other{"sterlina sudanezo-jugore"}
         }
         STD{
+            one{"dobër e Sao-Tomes dhe Prinsipes (1977–2017)"}
+            other{"dobra të Sao-Tomes dhe Prinsipes (1977–2017)"}
+        }
+        STN{
             one{"dobër e Sao-Tomes dhe Prinsipes"}
             other{"dobra të Sao-Tomes dhe Prinsipes"}
         }
@@ -1285,5 +1301,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/sq_MK.txt b/icu4c/source/data/curr/sq_MK.txt
index 2c296d8..4a64b2f 100644
--- a/icu4c/source/data/curr/sq_MK.txt
+++ b/icu4c/source/data/curr/sq_MK.txt
@@ -7,5 +7,5 @@
             "Denari maqedonas",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/sr.txt b/icu4c/source/data/curr/sr.txt
index e0b0b28..61f539e 100644
--- a/icu4c/source/data/curr/sr.txt
+++ b/icu4c/source/data/curr/sr.txt
@@ -624,6 +624,10 @@
         }
         MRO{
             "MRO",
+            "Мауританијска oгија (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Мауританијска oгија",
         }
         MTL{
@@ -764,11 +768,11 @@
         }
         ROL{
             "ROL",
-            "Румунски леј",
+            "Румунски леј (1952–2006)",
         }
         RON{
             "RON",
-            "Румунски леј (1952–2006)",
+            "Румунски леј",
         }
         RSD{
             "RSD",
@@ -852,6 +856,10 @@
         }
         STD{
             "STD",
+            "Саотомска добра (1977–2017)",
+        }
+        STN{
+            "STN",
             "Саотомска добра",
         }
         SUR{
@@ -1203,7 +1211,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -2000,6 +2008,11 @@
             other{"макаоских патака"}
         }
         MRO{
+            few{"мауританијскe oгијe (1973–2017)"}
+            one{"мауританијска oгија (1973–2017)"}
+            other{"мауританијских oгијa (1973–2017)"}
+        }
+        MRU{
             few{"мауританијскe oгијe"}
             one{"мауританијска oгија"}
             other{"мауританијских oгијa"}
@@ -2175,15 +2188,15 @@
             other{"родежанских долара"}
         }
         ROL{
-            few{"румунскa леја"}
-            one{"румунски леј"}
-            other{"румунских леја"}
-        }
-        RON{
             few{"румунскa леја (1952–2006)"}
             one{"румунски леј (1952–2006)"}
             other{"румунских леја (1952–2006)"}
         }
+        RON{
+            few{"румунскa леја"}
+            one{"румунски леј"}
+            other{"румунских леја"}
+        }
         RSD{
             few{"српска динара"}
             one{"српски динар"}
@@ -2285,6 +2298,11 @@
             other{"јужносуданских фунти"}
         }
         STD{
+            few{"саотомске добре (1977–2017)"}
+            one{"саотомска добра (1977–2017)"}
+            other{"саотомских добри (1977–2017)"}
+        }
+        STN{
             few{"саотомске добре"}
             one{"саотомска добра"}
             other{"саотомских добри"}
@@ -2630,5 +2648,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/sr_Cyrl.txt b/icu4c/source/data/curr/sr_Cyrl.txt
index cac24ec..1d0d0a9 100644
--- a/icu4c/source/data/curr/sr_Cyrl.txt
+++ b/icu4c/source/data/curr/sr_Cyrl.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Cyrl{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/sr_Latn.txt b/icu4c/source/data/curr/sr_Latn.txt
index 7cad92a..df50783 100644
--- a/icu4c/source/data/curr/sr_Latn.txt
+++ b/icu4c/source/data/curr/sr_Latn.txt
@@ -625,6 +625,10 @@
         }
         MRO{
             "MRO",
+            "Mauritanijska ogija (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mauritanijska ogija",
         }
         MTL{
@@ -765,11 +769,11 @@
         }
         ROL{
             "ROL",
-            "Rumunski lej",
+            "Rumunski lej (1952–2006)",
         }
         RON{
             "RON",
-            "Rumunski lej (1952–2006)",
+            "Rumunski lej",
         }
         RSD{
             "RSD",
@@ -853,6 +857,10 @@
         }
         STD{
             "STD",
+            "Saotomska dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Saotomska dobra",
         }
         SUR{
@@ -1204,7 +1212,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -2001,6 +2009,11 @@
             other{"makaoskih pataka"}
         }
         MRO{
+            few{"mauritanijske ogije (1973–2017)"}
+            one{"mauritanijska ogija (1973–2017)"}
+            other{"mauritanijskih ogija (1973–2017)"}
+        }
+        MRU{
             few{"mauritanijske ogije"}
             one{"mauritanijska ogija"}
             other{"mauritanijskih ogija"}
@@ -2176,15 +2189,15 @@
             other{"rodežanskih dolara"}
         }
         ROL{
-            few{"rumunska leja"}
-            one{"rumunski lej"}
-            other{"rumunskih leja"}
-        }
-        RON{
             few{"rumunska leja (1952–2006)"}
             one{"rumunski lej (1952–2006)"}
             other{"rumunskih leja (1952–2006)"}
         }
+        RON{
+            few{"rumunska leja"}
+            one{"rumunski lej"}
+            other{"rumunskih leja"}
+        }
         RSD{
             few{"srpska dinara"}
             one{"srpski dinar"}
@@ -2286,6 +2299,11 @@
             other{"južnosudanskih funti"}
         }
         STD{
+            few{"saotomske dobre (1977–2017)"}
+            one{"saotomska dobra (1977–2017)"}
+            other{"saotomskih dobri (1977–2017)"}
+        }
+        STN{
             few{"saotomske dobre"}
             one{"saotomska dobra"}
             other{"saotomskih dobri"}
@@ -2631,5 +2649,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
 }
diff --git a/icu4c/source/data/curr/supplementalData.txt b/icu4c/source/data/curr/supplementalData.txt
index d8c5476..6ea4fb0 100644
--- a/icu4c/source/data/curr/supplementalData.txt
+++ b/icu4c/source/data/curr/supplementalData.txt
@@ -2854,10 +2854,21 @@
         MR{
             {
                 from:intvector{
+                    352,
+                    -1358655488,
+                }
+                id{"MRU"}
+            }
+            {
+                from:intvector{
                     25,
                     -1509149696,
                 }
                 id{"MRO"}
+                to:intvector{
+                    356,
+                    1394842623,
+                }
             }
             {
                 from:intvector{
diff --git a/icu4c/source/data/curr/sv.txt b/icu4c/source/data/curr/sv.txt
index 77f6331..4922919 100644
--- a/icu4c/source/data/curr/sv.txt
+++ b/icu4c/source/data/curr/sv.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "mauretansk ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "mauretansk ouguiya",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "saotomeansk dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "saotomeansk dobra",
         }
         SUR{
@@ -1280,7 +1288,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1982,6 +1990,10 @@
             other{"makanesiska pataca"}
         }
         MRO{
+            one{"mauretansk ouguiya (1973–2017)"}
+            other{"mauretanska ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"mauretansk ouguiya"}
             other{"mauretanska ouguiya"}
         }
@@ -2214,6 +2226,10 @@
             other{"sydsudanesiska pund"}
         }
         STD{
+            one{"saotomeansk dobra (1977–2017)"}
+            other{"saotomeanska dobra (1977–2017)"}
+        }
+        STN{
             one{"saotomeansk dobra"}
             other{"saotomeanska dobra"}
         }
@@ -2502,5 +2518,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/sw.txt b/icu4c/source/data/curr/sw.txt
index 74a1758..79512f7 100644
--- a/icu4c/source/data/curr/sw.txt
+++ b/icu4c/source/data/curr/sw.txt
@@ -388,6 +388,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya ya Mauritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya ya Mauritania",
         }
         MUR{
@@ -544,6 +548,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SYP{
@@ -747,7 +755,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1141,6 +1149,10 @@
             other{"pataca za Macau"}
         }
         MRO{
+            one{"ouguiya ya Mauritania (1973–2017)"}
+            other{"ouguiya za Mauritania (1973–2017)"}
+        }
+        MRU{
             one{"ouguiya ya Mauritania"}
             other{"ouguiya za Mauritania"}
         }
@@ -1297,6 +1309,10 @@
             other{"pauni za Sudan Kusini"}
         }
         STD{
+            one{"dobra ya Sao Tome na Principe (1977–2017)"}
+            other{"dobra za Sao Tome na Principe (1977–2017)"}
+        }
+        STN{
             one{"dobra ya Sao Tome na Principe"}
             other{"dobra za Sao Tome na Principe"}
         }
@@ -1417,5 +1433,5 @@
         one{"{1} {0}"}
         other{"{1} {0}"}
     }
-    Version{"2.1.37.34"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/sw_CD.txt b/icu4c/source/data/curr/sw_CD.txt
index 1c07b44..a4dad88 100644
--- a/icu4c/source/data/curr/sw_CD.txt
+++ b/icu4c/source/data/curr/sw_CD.txt
@@ -24,6 +24,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         SCR{
@@ -39,5 +43,5 @@
             "Faranga CFA BCEAO",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/sw_UG.txt b/icu4c/source/data/curr/sw_UG.txt
index 72827e0..2eea333 100644
--- a/icu4c/source/data/curr/sw_UG.txt
+++ b/icu4c/source/data/curr/sw_UG.txt
@@ -7,5 +7,5 @@
             "Shilingi ya Uganda",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/ta.txt b/icu4c/source/data/curr/ta.txt
index e275682..84fb352 100644
--- a/icu4c/source/data/curr/ta.txt
+++ b/icu4c/source/data/curr/ta.txt
@@ -380,6 +380,10 @@
         }
         MRO{
             "MRO",
+            "மொரிஷானியன் ஒகுயா (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "மொரிஷானியன் ஒகுயா",
         }
         MUR{
@@ -528,6 +532,10 @@
         }
         STD{
             "STD",
+            "சாவ் டோமி மற்றும் பிரின்ஸ்பி டோப்ரா (1977–2017)",
+        }
+        STN{
+            "STN",
             "சாவ் டோமி மற்றும் பிரின்ஸ்பி டோப்ரா",
         }
         SYP{
@@ -727,7 +735,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1121,6 +1129,10 @@
             other{"மெகனீஸ் படாகாக்கள்"}
         }
         MRO{
+            one{"மொரிஷானியன் ஒகுயா (1973–2017)"}
+            other{"மொரிஷானியன் ஒகுயாக்கள் (1973–2017)"}
+        }
+        MRU{
             one{"மொரிஷானியன் ஒகுயா"}
             other{"மொரிஷானியன் ஒகுயாக்கள்"}
         }
@@ -1269,6 +1281,10 @@
             other{"தெற்கு சூடானீஸ் பவுண்டுகள்"}
         }
         STD{
+            one{"சாவ் டோமி மற்றும் பிரின்ஸ்பி டோப்ரா (1977–2017)"}
+            other{"சாவ் டோமி மற்றும் பிரின்ஸ்பி டோப்ராக்கள் (1977–2017)"}
+        }
+        STN{
             one{"சாவ் டோமி மற்றும் பிரின்ஸ்பி டோப்ரா"}
             other{"சாவ் டோமி மற்றும் பிரின்ஸ்பி டோப்ராக்கள்"}
         }
@@ -1389,5 +1405,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ta_LK.txt b/icu4c/source/data/curr/ta_LK.txt
index 312598f..ec8727d 100644
--- a/icu4c/source/data/curr/ta_LK.txt
+++ b/icu4c/source/data/curr/ta_LK.txt
@@ -7,5 +7,5 @@
             "இலங்கை ரூபாய்",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/ta_MY.txt b/icu4c/source/data/curr/ta_MY.txt
index aebb8b4..c22755e 100644
--- a/icu4c/source/data/curr/ta_MY.txt
+++ b/icu4c/source/data/curr/ta_MY.txt
@@ -11,5 +11,5 @@
             "சிங்கப்பூர் டாலர்",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/ta_SG.txt b/icu4c/source/data/curr/ta_SG.txt
index 392181c..34a4e85 100644
--- a/icu4c/source/data/curr/ta_SG.txt
+++ b/icu4c/source/data/curr/ta_SG.txt
@@ -15,5 +15,5 @@
             "அமெரிக்க டாலர்",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/te.txt b/icu4c/source/data/curr/te.txt
index 289463f..2452e33 100644
--- a/icu4c/source/data/curr/te.txt
+++ b/icu4c/source/data/curr/te.txt
@@ -380,6 +380,10 @@
         }
         MRO{
             "MRO",
+            "మౌరిటానియన్ ఒగ్యియా (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "మౌరిటానియన్ ఒగ్యియా",
         }
         MUR{
@@ -528,6 +532,10 @@
         }
         STD{
             "STD",
+            "సావో టోమ్ మరియు ప్రిన్సిపి డోబ్రా (1977–2017)",
+        }
+        STN{
+            "STN",
             "సావో టోమ్ మరియు ప్రిన్సిపి డోబ్రా",
         }
         SYP{
@@ -727,7 +735,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1121,6 +1129,10 @@
             other{"మకనీస్ పటాకాలు"}
         }
         MRO{
+            one{"మౌరిటానియన్ ఒగ్యియా (1973–2017)"}
+            other{"మౌరిటానియన్ ఒగ్యియాలు (1973–2017)"}
+        }
+        MRU{
             one{"మౌరిటానియన్ ఒగ్యియా"}
             other{"మౌరిటానియన్ ఒగ్యియాలు"}
         }
@@ -1269,6 +1281,10 @@
             other{"దక్షిణ సుడానీస్ పౌండ్‌లు"}
         }
         STD{
+            one{"సావో టోమ్ మరియు ప్రిన్సిపి డోబ్రా (1977–2017)"}
+            other{"సావో టోమ్ మరియు ప్రిన్సిపి డోబ్రాలు (1977–2017)"}
+        }
+        STN{
             one{"సావో టోమ్ మరియు ప్రిన్సిపి డోబ్రా"}
             other{"సావో టోమ్ మరియు ప్రిన్సిపి డోబ్రాలు"}
         }
@@ -1389,5 +1405,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/teo.txt b/icu4c/source/data/curr/teo.txt
index 625a78c..d9f86c8 100644
--- a/icu4c/source/data/curr/teo.txt
+++ b/icu4c/source/data/curr/teo.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ango’otol lok’ Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ango’otol lok’ Moritania",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Ango’otol lok’ Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Ango’otol lok’ Sao Tome na Principe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Edola lok’Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/teo_KE.txt b/icu4c/source/data/curr/teo_KE.txt
index 7fc3db6..bad4446 100644
--- a/icu4c/source/data/curr/teo_KE.txt
+++ b/icu4c/source/data/curr/teo_KE.txt
@@ -7,5 +7,5 @@
             "Ango’otol lok’ Kenya",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/tg.txt b/icu4c/source/data/curr/tg.txt
index 8292d57..5e4526b 100644
--- a/icu4c/source/data/curr/tg.txt
+++ b/icu4c/source/data/curr/tg.txt
@@ -88,5 +88,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
 }
diff --git a/icu4c/source/data/curr/th.txt b/icu4c/source/data/curr/th.txt
index 2d51ce0..3e51616 100644
--- a/icu4c/source/data/curr/th.txt
+++ b/icu4c/source/data/curr/th.txt
@@ -668,6 +668,10 @@
         }
         MRO{
             "MRO",
+            "อูกียามอริเตเนีย (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "อูกียามอริเตเนีย",
         }
         MTL{
@@ -896,6 +900,10 @@
         }
         STD{
             "STD",
+            "ดอบราเซาตูเมและปรินซิปี (1977–2017)",
+        }
+        STN{
+            "STN",
             "ดอบราเซาตูเมและปรินซิปี",
         }
         SUR{
@@ -1259,7 +1267,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1561,6 +1569,9 @@
             other{"ปาตากามาเก๊า"}
         }
         MRO{
+            other{"อูกียามอริเตเนีย (1973–2017)"}
+        }
+        MRU{
             other{"อูกียามอริเตเนีย"}
         }
         MUR{
@@ -1675,6 +1686,9 @@
             other{"ปอนด์ซูดานใต้"}
         }
         STD{
+            other{"ดอบราเซาตูเมและปรินซิปี (1977–2017)"}
+        }
+        STN{
             other{"ดอบราเซาตูเมและปรินซิปี"}
         }
         SYP{
@@ -1771,5 +1785,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.56"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/ti.txt b/icu4c/source/data/curr/ti.txt
index cc1038e..ba48c44 100644
--- a/icu4c/source/data/curr/ti.txt
+++ b/icu4c/source/data/curr/ti.txt
@@ -43,5 +43,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/curr/ti_ER.txt b/icu4c/source/data/curr/ti_ER.txt
index e091c98..a473ac1 100644
--- a/icu4c/source/data/curr/ti_ER.txt
+++ b/icu4c/source/data/curr/ti_ER.txt
@@ -7,5 +7,5 @@
             "ERN",
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/curr/to.txt b/icu4c/source/data/curr/to.txt
index 28513a0..27e698c 100644
--- a/icu4c/source/data/curr/to.txt
+++ b/icu4c/source/data/curr/to.txt
@@ -74,5 +74,5 @@
     CurrencyUnitPatterns{
         other{"{1} {0}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/tr.txt b/icu4c/source/data/curr/tr.txt
index b2760a5..315e119 100644
--- a/icu4c/source/data/curr/tr.txt
+++ b/icu4c/source/data/curr/tr.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "Moritanya Ouguiyası (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Moritanya Ouguiyası",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "São Tomé ve Príncipe Dobrası (1977–2017)",
+        }
+        STN{
+            "STN",
             "São Tomé ve Príncipe Dobrası",
         }
         SUR{
@@ -1286,7 +1294,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1940,6 +1948,10 @@
             other{"Makao patakası"}
         }
         MRO{
+            one{"Moritanya ouguiyası (1973–2017)"}
+            other{"Moritanya ouguiyası (1973–2017)"}
+        }
+        MRU{
             one{"Moritanya ouguiyası"}
             other{"Moritanya ouguiyası"}
         }
@@ -2152,6 +2164,10 @@
             other{"Güney Sudan lirası"}
         }
         STD{
+            one{"São Tomé ve Príncipe dobrası (1977–2017)"}
+            other{"São Tomé ve Príncipe dobrası (1977–2017)"}
+        }
+        STN{
             one{"São Tomé ve Príncipe dobrası"}
             other{"São Tomé ve Príncipe dobrası"}
         }
@@ -2376,5 +2392,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/tt.txt b/icu4c/source/data/curr/tt.txt
index 666b0dd..5f9f07e 100644
--- a/icu4c/source/data/curr/tt.txt
+++ b/icu4c/source/data/curr/tt.txt
@@ -81,5 +81,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/curr/twq.txt b/icu4c/source/data/curr/twq.txt
index 84bad72..d591061 100644
--- a/icu4c/source/data/curr/twq.txt
+++ b/icu4c/source/data/curr/twq.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Mooritaani Ugiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mooritaani Ugiya",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Sao Tome nda Prinsipe Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "Sao Tome nda Prinsipe Dobra",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Zimbabwe Dollar",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/tzm.txt b/icu4c/source/data/curr/tzm.txt
index 6a8e03a..2e53651 100644
--- a/icu4c/source/data/curr/tzm.txt
+++ b/icu4c/source/data/curr/tzm.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Uqiyya Umuritani (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Uqiyya Umuritani",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dubra Usawṭumi (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dubra Usawṭumi",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Ḍular Uzimbabwi",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ug.txt b/icu4c/source/data/curr/ug.txt
index cb80d93..c2cfa72 100644
--- a/icu4c/source/data/curr/ug.txt
+++ b/icu4c/source/data/curr/ug.txt
@@ -680,6 +680,10 @@
         }
         MRO{
             "MRO",
+            "ماۋرىتانىيە ئۇگىيەسى (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ماۋرىتانىيە ئۇگىيەسى",
         }
         MTL{
@@ -912,6 +916,10 @@
         }
         STD{
             "STD",
+            "سان-تومې ۋە پىرىنسىپى دوبراسى (1977–2017)",
+        }
+        STN{
+            "STN",
             "سان-تومې ۋە پىرىنسىپى دوبراسى",
         }
         SUR{
@@ -1873,6 +1881,10 @@
             other{"ئاۋمېن پاتاكاسى"}
         }
         MRO{
+            one{"ماۋرىتانىيە ئۇگىيەسى (1973–2017)"}
+            other{"ماۋرىتانىيە ئۇگىيەسى (1973–2017)"}
+        }
+        MRU{
             one{"ماۋرىتانىيە ئۇگىيەسى"}
             other{"ماۋرىتانىيە ئۇگىيەسى"}
         }
@@ -2105,6 +2117,10 @@
             other{"جەنۇبىي سۇدان فوندستېرلىڭى"}
         }
         STD{
+            one{"سان-تومې ۋە پىرىنسىپى دوبراسى (1977–2017)"}
+            other{"سان-تومې ۋە پىرىنسىپى دوبراسى (1977–2017)"}
+        }
+        STN{
             one{"سان-تومې ۋە پىرىنسىپى دوبراسى"}
             other{"سان-تومې ۋە پىرىنسىپى دوبراسى"}
         }
@@ -2393,5 +2409,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/uk.txt b/icu4c/source/data/curr/uk.txt
index 04401b4..866ca61 100644
--- a/icu4c/source/data/curr/uk.txt
+++ b/icu4c/source/data/curr/uk.txt
@@ -616,6 +616,10 @@
         }
         MRO{
             "MRO",
+            "мавританська угія (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "мавританська угія",
         }
         MTL{
@@ -844,6 +848,10 @@
         }
         STD{
             "STD",
+            "добра Сан-Томе і Прінсіпі (1977–2017)",
+        }
+        STN{
+            "STN",
             "добра Сан-Томе і Прінсіпі",
         }
         SUR{
@@ -1187,7 +1195,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1821,6 +1829,12 @@
             other{"патаки Макао"}
         }
         MRO{
+            few{"мавританські угії (1973–2017)"}
+            many{"мавританських угій (1973–2017)"}
+            one{"мавританська угія (1973–2017)"}
+            other{"мавританської угії (1973–2017)"}
+        }
+        MRU{
             few{"мавританські угії"}
             many{"мавританських угій"}
             one{"мавританська угія"}
@@ -2061,6 +2075,12 @@
             other{"південносуданського фунта"}
         }
         STD{
+            few{"добри Сан-Томе і Принсіпі (1977–2017)"}
+            many{"добр Сан-Томе і Принсіпі (1977–2017)"}
+            one{"добра Сан-Томе і Прінсіпі (1977–2017)"}
+            other{"добри Сан-Томе і Прінсіпі (1977–2017)"}
+        }
+        STN{
             few{"добри Сан-Томе і Принсіпі"}
             many{"добр Сан-Томе і Принсіпі"}
             one{"добра Сан-Томе і Прінсіпі"}
@@ -2283,5 +2303,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.12"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/ur.txt b/icu4c/source/data/curr/ur.txt
index c79cea5..3abcdf2 100644
--- a/icu4c/source/data/curr/ur.txt
+++ b/icu4c/source/data/curr/ur.txt
@@ -388,6 +388,10 @@
         }
         MRO{
             "MRO",
+            "موریطانیائی اوگوئیا (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "موریطانیائی اوگوئیا",
         }
         MUR{
@@ -544,6 +548,10 @@
         }
         STD{
             "STD",
+            "ساؤ ٹوم اور پرنسپے ڈوبرا (1977–2017)",
+        }
+        STN{
+            "STN",
             "ساؤ ٹوم اور پرنسپے ڈوبرا",
         }
         SYP{
@@ -747,7 +755,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1141,6 +1149,10 @@
             other{"میکانیز پٹاکا"}
         }
         MRO{
+            one{"موریطانیائی اوگوئیا (1973–2017)"}
+            other{"موریطانیائی اوگوئیا (1973–2017)"}
+        }
+        MRU{
             one{"موریطانیائی اوگوئیا"}
             other{"موریطانیائی اوگوئیا"}
         }
@@ -1289,6 +1301,10 @@
             other{"جنوبی سوڈانی پاؤنڈز"}
         }
         STD{
+            one{"ساؤ ٹوم اور پرنسپے ڈوبرا (1977–2017)"}
+            other{"ساؤ ٹوم اور پرنسپے ڈوبرا (1977–2017)"}
+        }
+        STN{
             one{"ساؤ ٹوم اور پرنسپے ڈوبرا"}
             other{"ساؤ ٹوم اور پرنسپے ڈوبرا"}
         }
@@ -1409,5 +1425,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.69"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/ur_IN.txt b/icu4c/source/data/curr/ur_IN.txt
index 76e8e07..4cb93f6 100644
--- a/icu4c/source/data/curr/ur_IN.txt
+++ b/icu4c/source/data/curr/ur_IN.txt
@@ -77,5 +77,5 @@
             other{"ساموآئی ٹالا"}
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/uz.txt b/icu4c/source/data/curr/uz.txt
index 0f1d779..9f858ab 100644
--- a/icu4c/source/data/curr/uz.txt
+++ b/icu4c/source/data/curr/uz.txt
@@ -376,6 +376,10 @@
         }
         MRO{
             "MRO",
+            "Mavritaniya uqiyasi (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mavritaniya uqiyasi",
         }
         MUR{
@@ -524,6 +528,10 @@
         }
         STD{
             "STD",
+            "San-Tome va Prinsipi dobrasi (1977–2017)",
+        }
+        STN{
+            "STN",
             "San-Tome va Prinsipi dobrasi",
         }
         SYP{
@@ -719,7 +727,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1113,6 +1121,10 @@
             other{"Makao patakasi"}
         }
         MRO{
+            one{"Mavritaniya uqiyasi (1973–2017)"}
+            other{"Mavritaniya uqiyasi (1973–2017)"}
+        }
+        MRU{
             one{"Mavritaniya uqiyasi"}
             other{"Mavritaniya uqiyasi"}
         }
@@ -1261,6 +1273,10 @@
             other{"Janubiy Sudan funti"}
         }
         STD{
+            one{"San-Tome va Prinsipi dobrasi (1977–2017)"}
+            other{"San-Tome va Prinsipi dobrasi (1977–2017)"}
+        }
+        STN{
             one{"San-Tome va Prinsipi dobrasi"}
             other{"San-Tome va Prinsipi dobrasi"}
         }
@@ -1381,5 +1397,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/uz_Arab.txt b/icu4c/source/data/curr/uz_Arab.txt
index 540caa1..f76774e 100644
--- a/icu4c/source/data/curr/uz_Arab.txt
+++ b/icu4c/source/data/curr/uz_Arab.txt
@@ -8,5 +8,5 @@
             "افغانی",
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/uz_Cyrl.txt b/icu4c/source/data/curr/uz_Cyrl.txt
index b1ff46f..26c64c5 100644
--- a/icu4c/source/data/curr/uz_Cyrl.txt
+++ b/icu4c/source/data/curr/uz_Cyrl.txt
@@ -414,5 +414,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/uz_Latn.txt b/icu4c/source/data/curr/uz_Latn.txt
index 36553da..66698d6 100644
--- a/icu4c/source/data/curr/uz_Latn.txt
+++ b/icu4c/source/data/curr/uz_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/vai.txt b/icu4c/source/data/curr/vai.txt
index 4d68e31..296c5f6 100644
--- a/icu4c/source/data/curr/vai.txt
+++ b/icu4c/source/data/curr/vai.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "ꗞꔸꕚꕇꕰ ꖳꕅꕩ (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ꗞꔸꕚꕇꕰ ꖳꕅꕩ",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "ꕢꕴ ꕿꔈ ꗪ ꕉ ꕗꕴ ꖁꖜꕟ (1977–2017)",
+        }
+        STN{
+            "STN",
             "ꕢꕴ ꕿꔈ ꗪ ꕉ ꕗꕴ ꖁꖜꕟ",
         }
         SZL{
@@ -220,5 +228,5 @@
             other{"ꔖꗼꔷ ꖩꔪ"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/vai_Latn.txt b/icu4c/source/data/curr/vai_Latn.txt
index 86c6178..8c68b3e 100644
--- a/icu4c/source/data/curr/vai_Latn.txt
+++ b/icu4c/source/data/curr/vai_Latn.txt
@@ -125,6 +125,10 @@
         }
         MRO{
             "MRO",
+            "Mɔretani Yugiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Mɔretani Yugiya",
         }
         MUR{
@@ -173,6 +177,10 @@
         }
         STD{
             "STD",
+            "Sawo Tombe ɓɛ a Gbawo Dobura (1977–2017)",
+        }
+        STN{
+            "STN",
             "Sawo Tombe ɓɛ a Gbawo Dobura",
         }
         SZL{
@@ -220,5 +228,5 @@
             "Zimbhabhuwe Dala",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/vai_Vaii.txt b/icu4c/source/data/curr/vai_Vaii.txt
index 487dfa9..6ef4517 100644
--- a/icu4c/source/data/curr/vai_Vaii.txt
+++ b/icu4c/source/data/curr/vai_Vaii.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai_Vaii{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/vi.txt b/icu4c/source/data/curr/vi.txt
index 7d8d62a..86a74ff 100644
--- a/icu4c/source/data/curr/vi.txt
+++ b/icu4c/source/data/curr/vi.txt
@@ -668,6 +668,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya Mauritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya Mauritania",
         }
         MTL{
@@ -896,6 +900,10 @@
         }
         STD{
             "STD",
+            "Dobra São Tomé và Príncipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra São Tomé và Príncipe",
         }
         SUR{
@@ -1251,7 +1259,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1552,6 +1560,9 @@
             other{"Pataca Ma Cao"}
         }
         MRO{
+            other{"Ouguiya Mauritania (1973–2017)"}
+        }
+        MRU{
             other{"Ouguiya Mauritania"}
         }
         MUR{
@@ -1663,6 +1674,9 @@
             other{"Bảng Nam Sudan"}
         }
         STD{
+            other{"Dobra São Tomé và Príncipe (1977–2017)"}
+        }
+        STN{
             other{"Dobra São Tomé và Príncipe"}
         }
         SYP{
@@ -1756,5 +1770,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/vun.txt b/icu4c/source/data/curr/vun.txt
index 7cc1d61..202f4f8 100644
--- a/icu4c/source/data/curr/vun.txt
+++ b/icu4c/source/data/curr/vun.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ugwiya ya Moritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ugwiya ya Moritania",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobra ya Sao Tome na Principe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobra ya Sao Tome na Principe",
         }
         SZL{
@@ -227,5 +235,5 @@
             "Dola ya Zimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/wae.txt b/icu4c/source/data/curr/wae.txt
index ac5f888..0313a76 100644
--- a/icu4c/source/data/curr/wae.txt
+++ b/icu4c/source/data/curr/wae.txt
@@ -81,5 +81,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/wo.txt b/icu4c/source/data/curr/wo.txt
index e8020b7..103b44e 100644
--- a/icu4c/source/data/curr/wo.txt
+++ b/icu4c/source/data/curr/wo.txt
@@ -88,5 +88,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
 }
diff --git a/icu4c/source/data/curr/xog.txt b/icu4c/source/data/curr/xog.txt
index cd2635d..3698319 100644
--- a/icu4c/source/data/curr/xog.txt
+++ b/icu4c/source/data/curr/xog.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Wugwiya ey’eMawritenya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Wugwiya ey’eMawritenya",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "Dobura ey’eSantome ne Purincipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobura ey’eSantome ne Purincipe",
         }
         SZL{
@@ -223,5 +231,5 @@
             "Doola ey’eZimbabwe",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/yav.txt b/icu4c/source/data/curr/yav.txt
index 454ff32..c53acd9 100644
--- a/icu4c/source/data/curr/yav.txt
+++ b/icu4c/source/data/curr/yav.txt
@@ -95,5 +95,5 @@
             "́faláŋɛ u kɔmɔ́ɔl",
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/yi.txt b/icu4c/source/data/curr/yi.txt
index 3d6e777..63cf801 100644
--- a/icu4c/source/data/curr/yi.txt
+++ b/icu4c/source/data/curr/yi.txt
@@ -105,5 +105,5 @@
             other{"אומבאַוואוסטע וואַלוטע"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/yo.txt b/icu4c/source/data/curr/yo.txt
index a0a3217..9e3995e 100644
--- a/icu4c/source/data/curr/yo.txt
+++ b/icu4c/source/data/curr/yo.txt
@@ -124,6 +124,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya ti Orílẹ́ède Maritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya ti Orílẹ́ède Maritania",
         }
         MUR{
@@ -180,6 +184,10 @@
         }
         STD{
             "STD",
+            "Dobira ti Orílẹ́ède Sao tome Ati Pirisipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobira ti Orílẹ́ède Sao tome Ati Pirisipe",
         }
         SZL{
@@ -230,5 +238,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/yo_BJ.txt b/icu4c/source/data/curr/yo_BJ.txt
index 70e9c87..f50111c 100644
--- a/icu4c/source/data/curr/yo_BJ.txt
+++ b/icu4c/source/data/curr/yo_BJ.txt
@@ -120,6 +120,10 @@
         }
         MRO{
             "MRO",
+            "Ouguiya ti Orílɛ́ède Maritania (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "Ouguiya ti Orílɛ́ède Maritania",
         }
         MUR{
@@ -172,6 +176,10 @@
         }
         STD{
             "STD",
+            "Dobira ti Orílɛ́ède Sao tome Ati Pirisipe (1977–2017)",
+        }
+        STN{
+            "STN",
             "Dobira ti Orílɛ́ède Sao tome Ati Pirisipe",
         }
         TND{
@@ -215,5 +223,5 @@
             "Dɔla ti Orílɛ́ède Siibabuwe",
         }
     }
-    Version{"2.1.37.9"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/yue.txt b/icu4c/source/data/curr/yue.txt
index ebc61af..b75ba0b 100644
--- a/icu4c/source/data/curr/yue.txt
+++ b/icu4c/source/data/curr/yue.txt
@@ -684,6 +684,10 @@
         }
         MRO{
             "MRO",
+            "茅利塔尼亞烏吉亞 (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "茅利塔尼亞烏吉亞",
         }
         MTL{
@@ -916,6 +920,10 @@
         }
         STD{
             "STD",
+            "聖多美島和普林西比島多布拉 (1977–2017)",
+        }
+        STN{
+            "STN",
             "聖多美島和普林西比島多布拉",
         }
         SUR{
@@ -1281,7 +1289,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1810,6 +1818,9 @@
             other{"澳門元"}
         }
         MRO{
+            other{"茅利塔尼亞烏吉亞 (1973–2017)"}
+        }
+        MRU{
             other{"茅利塔尼亞烏吉亞"}
         }
         MTL{
@@ -1984,6 +1995,9 @@
             other{"南蘇丹鎊"}
         }
         STD{
+            other{"聖多美島和普林西比島多布拉 (1977–2017)"}
+        }
+        STN{
             other{"聖多美島和普林西比島多布拉"}
         }
         SUR{
@@ -2200,5 +2214,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/yue_Hans.txt b/icu4c/source/data/curr/yue_Hans.txt
index 36b187e..806ef3d 100644
--- a/icu4c/source/data/curr/yue_Hans.txt
+++ b/icu4c/source/data/curr/yue_Hans.txt
@@ -685,6 +685,10 @@
         }
         MRO{
             "MRO",
+            "茅利塔尼亚乌吉亚 (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "茅利塔尼亚乌吉亚",
         }
         MTL{
@@ -917,6 +921,10 @@
         }
         STD{
             "STD",
+            "圣多美岛和普林西比岛多布拉 (1977–2017)",
+        }
+        STN{
+            "STN",
             "圣多美岛和普林西比岛多布拉",
         }
         SUR{
@@ -1282,7 +1290,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1811,6 +1819,9 @@
             other{"澳门元"}
         }
         MRO{
+            other{"茅利塔尼亚乌吉亚 (1973–2017)"}
+        }
+        MRU{
             other{"茅利塔尼亚乌吉亚"}
         }
         MTL{
@@ -1985,6 +1996,9 @@
             other{"南苏丹镑"}
         }
         STD{
+            other{"圣多美岛和普林西比岛多布拉 (1977–2017)"}
+        }
+        STN{
             other{"圣多美岛和普林西比岛多布拉"}
         }
         SUR{
@@ -2201,5 +2215,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/yue_Hant.txt b/icu4c/source/data/curr/yue_Hant.txt
index b8cde82..a263f97 100644
--- a/icu4c/source/data/curr/yue_Hant.txt
+++ b/icu4c/source/data/curr/yue_Hant.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue_Hant{
-    Version{"2.1.36.80"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/curr/zgh.txt b/icu4c/source/data/curr/zgh.txt
index eaf1fad..7c640e4 100644
--- a/icu4c/source/data/curr/zgh.txt
+++ b/icu4c/source/data/curr/zgh.txt
@@ -120,6 +120,10 @@
         }
         MRO{
             "MRO",
+            "ⵓⵇⵉⵢⵢⴰ ⵏ ⵎⵓⵕⵉⵟⴰⵏⵢⴰ (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "ⵓⵇⵉⵢⵢⴰ ⵏ ⵎⵓⵕⵉⵟⴰⵏⵢⴰ",
         }
         MUR{
@@ -176,6 +180,10 @@
         }
         STD{
             "STD",
+            "ⴰⴷⵓⴱⵔⴰ ⵏ ⵙⴰⵏⵟⵓⵎⵉ (1977–2017)",
+        }
+        STN{
+            "STN",
             "ⴰⴷⵓⴱⵔⴰ ⵏ ⵙⴰⵏⵟⵓⵎⵉ",
         }
         SZL{
@@ -234,5 +242,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/zh.txt b/icu4c/source/data/curr/zh.txt
index 2ad966e..87f8eaa 100644
--- a/icu4c/source/data/curr/zh.txt
+++ b/icu4c/source/data/curr/zh.txt
@@ -680,6 +680,10 @@
         }
         MRO{
             "MRO",
+            "毛里塔尼亚乌吉亚 (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "毛里塔尼亚乌吉亚",
         }
         MTL{
@@ -912,6 +916,10 @@
         }
         STD{
             "STD",
+            "圣多美和普林西比多布拉 (1977–2017)",
+        }
+        STN{
+            "STN",
             "圣多美和普林西比多布拉",
         }
         SUR{
@@ -1269,7 +1277,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1786,6 +1794,9 @@
             other{"澳门元"}
         }
         MRO{
+            other{"毛里塔尼亚乌吉亚 (1973–2017)"}
+        }
+        MRU{
             other{"毛里塔尼亚乌吉亚"}
         }
         MTL{
@@ -1960,6 +1971,9 @@
             other{"南苏丹镑"}
         }
         STD{
+            other{"圣多美和普林西比多布拉 (1977–2017)"}
+        }
+        STN{
             other{"圣多美和普林西比多布拉"}
         }
         SUR{
@@ -2125,5 +2139,5 @@
     CurrencyUnitPatterns{
         other{"{0}{1}"}
     }
-    Version{"2.1.37.42"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/zh_Hans.txt b/icu4c/source/data/curr/zh_Hans.txt
index e2e6871..a37beac 100644
--- a/icu4c/source/data/curr/zh_Hans.txt
+++ b/icu4c/source/data/curr/zh_Hans.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/zh_Hans_HK.txt b/icu4c/source/data/curr/zh_Hans_HK.txt
index da243b2..ba57dd0 100644
--- a/icu4c/source/data/curr/zh_Hans_HK.txt
+++ b/icu4c/source/data/curr/zh_Hans_HK.txt
@@ -26,5 +26,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/zh_Hans_MO.txt b/icu4c/source/data/curr/zh_Hans_MO.txt
index d9ec14b..94b89fa 100644
--- a/icu4c/source/data/curr/zh_Hans_MO.txt
+++ b/icu4c/source/data/curr/zh_Hans_MO.txt
@@ -26,5 +26,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/zh_Hans_SG.txt b/icu4c/source/data/curr/zh_Hans_SG.txt
index 77536a0..56082ca 100644
--- a/icu4c/source/data/curr/zh_Hans_SG.txt
+++ b/icu4c/source/data/curr/zh_Hans_SG.txt
@@ -26,5 +26,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/zh_Hant.txt b/icu4c/source/data/curr/zh_Hant.txt
index 6bc35ab..8c69f60 100644
--- a/icu4c/source/data/curr/zh_Hant.txt
+++ b/icu4c/source/data/curr/zh_Hant.txt
@@ -685,6 +685,10 @@
         }
         MRO{
             "MRO",
+            "茅利塔尼亞烏吉亞 (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "茅利塔尼亞烏吉亞",
         }
         MTL{
@@ -917,6 +921,10 @@
         }
         STD{
             "STD",
+            "聖多美島和普林西比島多布拉 (1977–2017)",
+        }
+        STN{
+            "STN",
             "聖多美島和普林西比島多布拉",
         }
         SUR{
@@ -1282,7 +1290,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1808,6 +1816,9 @@
             other{"澳門元"}
         }
         MRO{
+            other{"茅利塔尼亞烏吉亞 (1973–2017)"}
+        }
+        MRU{
             other{"茅利塔尼亞烏吉亞"}
         }
         MTL{
@@ -1982,6 +1993,9 @@
             other{"南蘇丹鎊"}
         }
         STD{
+            other{"聖多美島和普林西比島多布拉 (1977–2017)"}
+        }
+        STN{
             other{"聖多美島和普林西比島多布拉"}
         }
         SUR{
@@ -2198,5 +2212,5 @@
     CurrencyUnitPatterns{
         other{"{0} {1}"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/curr/zh_Hant_HK.txt b/icu4c/source/data/curr/zh_Hant_HK.txt
index 0e30a7c..9088a69 100644
--- a/icu4c/source/data/curr/zh_Hant_HK.txt
+++ b/icu4c/source/data/curr/zh_Hant_HK.txt
@@ -132,6 +132,10 @@
         }
         MRO{
             "MRO",
+            "毛里塔尼亞烏吉亞 (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "毛里塔尼亞烏吉亞",
         }
         MUR{
@@ -204,6 +208,10 @@
         }
         STD{
             "STD",
+            "聖多美和普林西比多布拉 (1977–2017)",
+        }
+        STN{
+            "STN",
             "聖多美和普林西比多布拉",
         }
         SYP{
@@ -354,6 +362,9 @@
             other{"摩爾多瓦列伊"}
         }
         MRO{
+            other{"毛里塔尼亞烏吉亞 (1973–2017)"}
+        }
+        MRU{
             other{"毛里塔尼亞烏吉亞"}
         }
         MUR{
@@ -408,6 +419,9 @@
             other{"蘇里南元"}
         }
         STD{
+            other{"聖多美和普林西比多布拉 (1977–2017)"}
+        }
+        STN{
             other{"聖多美和普林西比多布拉"}
         }
         SYP{
@@ -447,5 +461,5 @@
             other{"贊比亞克瓦查"}
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/curr/zh_Hant_MO.txt b/icu4c/source/data/curr/zh_Hant_MO.txt
index bb9d00f..c0e9b1b 100644
--- a/icu4c/source/data/curr/zh_Hant_MO.txt
+++ b/icu4c/source/data/curr/zh_Hant_MO.txt
@@ -8,5 +8,5 @@
             "澳門元",
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/curr/zu.txt b/icu4c/source/data/curr/zu.txt
index 121134b..1241b36 100644
--- a/icu4c/source/data/curr/zu.txt
+++ b/icu4c/source/data/curr/zu.txt
@@ -380,6 +380,10 @@
         }
         MRO{
             "MRO",
+            "i-Mauritanian Ouguiya (1973–2017)",
+        }
+        MRU{
+            "MRU",
             "i-Mauritanian Ouguiya",
         }
         MUR{
@@ -528,6 +532,10 @@
         }
         STD{
             "STD",
+            "i-São Tomé kanye ne-Príncipe Dobra (1977–2017)",
+        }
+        STN{
+            "STN",
             "i-São Tomé kanye ne-Príncipe Dobra",
         }
         SYP{
@@ -726,7 +734,7 @@
         SHP{"£"}
         SRD{"$"}
         SSP{"£"}
-        STD{"Db"}
+        STN{"Db"}
         SYP{"£"}
         THB{"฿"}
         TOP{"T$"}
@@ -1112,6 +1120,10 @@
             other{"i-Macanese Pataca"}
         }
         MRO{
+            one{"i-Mauritanian Ouguiya (1973–2017)"}
+            other{"i-Mauritanian Ouguiya (1973–2017)"}
+        }
+        MRU{
             one{"i-Mauritanian Ouguiya"}
             other{"i-Mauritanian Ouguiya"}
         }
@@ -1260,6 +1272,10 @@
             other{"i-South Sudanese Pound"}
         }
         STD{
+            one{"i-São Tomé kanye ne-Príncipe Dobra (1977–2017)"}
+            other{"i-São Tomé kanye ne-Príncipe Dobra (1977–2017)"}
+        }
+        STN{
             one{"i-São Tomé kanye ne-Príncipe Dobra"}
             other{"i-São Tomé kanye ne-Príncipe Dobra"}
         }
@@ -1380,5 +1396,5 @@
         one{"{0} {1}"}
         other{"{0} {1}"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/icu4j-readme.txt b/icu4c/source/data/icu4j-readme.txt
index dd766a4..bb432f1 100644
--- a/icu4c/source/data/icu4j-readme.txt
+++ b/icu4c/source/data/icu4j-readme.txt
@@ -19,10 +19,11 @@
 
 1. Download and build ICU4C. For more instructions on downloading and building
         ICU4C, see the ICU4C readme at:
-        http://source.icu-project.org/repos/icu/icu/trunk/readme.html#HowToBuild
-	(Windows: build as x86, Release otherwise you will have to set 'CFG' differently below.)
+        http://source.icu-project.org/repos/icu/trunk/icu4c/readme.html#HowToBuild
+        (Windows: build as 'x86, Release' otherwise you will have to set 'CFG' differently below.)
 
-	*NOTE* You should do a full rebuild after any data changes.
+    *NOTE* You should do a full rebuild after any data changes.
+    
 1a.  If you didn't download from Subversion, you will also need the "icu4c-*-data.zip" file.  Unpack this file and replace the icu/source/data directory's contents with the contents of the data directory from the zip file.  
 
 
diff --git a/icu4c/source/data/lang/af.txt b/icu4c/source/data/lang/af.txt
index 860396a..ccf5e35 100644
--- a/icu4c/source/data/lang/af.txt
+++ b/icu4c/source/data/lang/af.txt
@@ -420,6 +420,8 @@
         yue{"Kantonees"}
         zgh{"Standaard Marokkaanse Tamazight"}
         zh{"Sjinees"}
+        zh_Hans{"Chinees (Vereenvoudig)"}
+        zh_Hant{"Chinees (Tradisioneel)"}
         zu{"Zoeloe"}
         zun{"Zuni"}
         zxx{"Geen taalinhoud nie"}
@@ -624,7 +626,7 @@
             vaii{"Vai-syfers"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} – Alle"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/agq.txt b/icu4c/source/data/lang/agq.txt
index 2de791b..1d253f3 100644
--- a/icu4c/source/data/lang/agq.txt
+++ b/icu4c/source/data/lang/agq.txt
@@ -48,5 +48,5 @@
         zh{"Chàenê"}
         zu{"Zulù"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/ak.txt b/icu4c/source/data/lang/ak.txt
index 1318a72..e64c732 100644
--- a/icu4c/source/data/lang/ak.txt
+++ b/icu4c/source/data/lang/ak.txt
@@ -47,5 +47,5 @@
         zh{"Kyaena kasa"}
         zu{"Zulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/am.txt b/icu4c/source/data/lang/am.txt
index 3ce28d2..d47a985 100644
--- a/icu4c/source/data/lang/am.txt
+++ b/icu4c/source/data/lang/am.txt
@@ -688,7 +688,7 @@
             vaii{"የቫይ አሃዞች"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — ሁሉም"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ar.txt b/icu4c/source/data/lang/ar.txt
index 9cacedf..68c0cb3 100644
--- a/icu4c/source/data/lang/ar.txt
+++ b/icu4c/source/data/lang/ar.txt
@@ -852,7 +852,7 @@
         VALENCIA{"بلنسية"}
         WADEGILE{"المندرين باللاتينية - ويد–جيلز"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} - الكل"}
         category-list{"{0}: {1}"}
@@ -864,11 +864,11 @@
         other{"{0} - غير ذلك"}
         scripts{"أنظمة الكتابة - {0}"}
         strokes{
-            few{"{0} ضغطات"}
+            few{"{0} ضغطة"}
             many{"{0} ضغطة"}
-            one{"ضغطة ({0})"}
+            one{"{0} ضغطة"}
             other{"{0} ضغطة"}
-            two{"ضغطتان ({0})"}
+            two{"{0} ضغطة"}
             zero{"{0} ضغطة"}
         }
     }
diff --git a/icu4c/source/data/lang/ar_EG.txt b/icu4c/source/data/lang/ar_EG.txt
index f225848..087ea80 100644
--- a/icu4c/source/data/lang/ar_EG.txt
+++ b/icu4c/source/data/lang/ar_EG.txt
@@ -4,5 +4,5 @@
     Languages{
         da{"الدنماركية"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/lang/ar_LY.txt b/icu4c/source/data/lang/ar_LY.txt
index 0f86cc3..01ed1d5 100644
--- a/icu4c/source/data/lang/ar_LY.txt
+++ b/icu4c/source/data/lang/ar_LY.txt
@@ -12,5 +12,5 @@
         sw_CD{"السواحيلية الكونغولية"}
         ti{"التيغرينية"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/ar_SA.txt b/icu4c/source/data/lang/ar_SA.txt
index 25648d6..5c9f1e1 100644
--- a/icu4c/source/data/lang/ar_SA.txt
+++ b/icu4c/source/data/lang/ar_SA.txt
@@ -13,5 +13,5 @@
         te{"التيلوجو"}
         ti{"التيغرينية"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/lang/ar_XB.txt b/icu4c/source/data/lang/ar_XB.txt
index 67726d0..7fdc4df 100644
--- a/icu4c/source/data/lang/ar_XB.txt
+++ b/icu4c/source/data/lang/ar_XB.txt
@@ -548,6 +548,7 @@
         sog{"؜‮Sogdien‬؜"}
         sq{"؜‮Albanian‬؜"}
         sr{"؜‮Serbian‬؜"}
+        sr_ME{"؜‮Montenegrin‬؜"}
         srn{"؜‮Sranan‬؜ ؜‮Tongo‬؜"}
         srr{"؜‮Serer‬؜"}
         ss{"؜‮Swati‬؜"}
diff --git a/icu4c/source/data/lang/asa.txt b/icu4c/source/data/lang/asa.txt
index f11e423..e040a7a 100644
--- a/icu4c/source/data/lang/asa.txt
+++ b/icu4c/source/data/lang/asa.txt
@@ -48,5 +48,5 @@
         zh{"Kichina"}
         zu{"Kidhulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/ast.txt b/icu4c/source/data/lang/ast.txt
index d0a6e5b..d644484 100644
--- a/icu4c/source/data/lang/ast.txt
+++ b/icu4c/source/data/lang/ast.txt
@@ -1077,7 +1077,7 @@
         VALLADER{"VALLADER"}
         WADEGILE{"romanización de Wade-Giles"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — too"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/az.txt b/icu4c/source/data/lang/az.txt
index 097dce9..d309244 100644
--- a/icu4c/source/data/lang/az.txt
+++ b/icu4c/source/data/lang/az.txt
@@ -17,7 +17,7 @@
         ace{"akin"}
         ach{"akoli"}
         ada{"adanqme"}
-        ady{"aduge"}
+        ady{"adıgey"}
         ae{"avestan"}
         af{"afrikaans"}
         afh{"afrihili"}
@@ -87,7 +87,7 @@
         chp{"çipevyan"}
         chr{"çeroki"}
         chy{"çeyen"}
-        ckb{"soran"}
+        ckb{"Mərkəzi kürdcə"}
         co{"korsika"}
         cop{"kopt"}
         cr{"kri"}
@@ -662,7 +662,7 @@
         Zzzz{"tanınmayan yazı"}
     }
     Scripts%stand-alone{
-        Hans{"Sadələşdirilmiş Han"}
+        Hans{"Sadələşmiş Han"}
         Hant{"Ənənəvi Han"}
     }
     Types{
@@ -745,7 +745,7 @@
             tibt{"Tibet Rəqəmləri"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — Bütün"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/az_Cyrl.txt b/icu4c/source/data/lang/az_Cyrl.txt
index 8634269..89bcb02 100644
--- a/icu4c/source/data/lang/az_Cyrl.txt
+++ b/icu4c/source/data/lang/az_Cyrl.txt
@@ -399,7 +399,7 @@
     Scripts{
         Cyrl{"Кирил"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"Дил: {0}"}
         script{"Скрипт: {0}"}
diff --git a/icu4c/source/data/lang/az_Latn.txt b/icu4c/source/data/lang/az_Latn.txt
index 9df6ff3..47ecb5c 100644
--- a/icu4c/source/data/lang/az_Latn.txt
+++ b/icu4c/source/data/lang/az_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/bas.txt b/icu4c/source/data/lang/bas.txt
index 7dc1338..738d246 100644
--- a/icu4c/source/data/lang/bas.txt
+++ b/icu4c/source/data/lang/bas.txt
@@ -48,5 +48,5 @@
         zh{"Hɔp u kinà"}
         zu{"Hɔp u zulù"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/be.txt b/icu4c/source/data/lang/be.txt
index c6bf969..bc6a683 100644
--- a/icu4c/source/data/lang/be.txt
+++ b/icu4c/source/data/lang/be.txt
@@ -101,9 +101,6 @@
         en{"англійская"}
         eo{"эсперанта"}
         es{"іспанская"}
-        es_419{"лацінаамерыканская іспанская"}
-        es_ES{"еўрапейская іспанская"}
-        es_MX{"мексіканская іспанская"}
         et{"эстонская"}
         eu{"баскская"}
         ewo{"эвонда"}
@@ -115,8 +112,6 @@
         fo{"фарэрская"}
         fon{"фон"}
         fr{"французская"}
-        fr_CA{"канадская французская"}
-        fr_CH{"швейцарская французская"}
         fro{"старафранцузская"}
         fur{"фрыульская"}
         fy{"заходняя фрызская"}
@@ -312,7 +307,6 @@
         rm{"рэтараманская"}
         rn{"рундзі"}
         ro{"румынская"}
-        ro_MD{"малдаўская румынская"}
         rof{"ромба"}
         root{"корань"}
         ru{"руская"}
@@ -417,6 +411,8 @@
         zap{"сапатэк"}
         zgh{"стандартная мараканская тамазіхт"}
         zh{"кітайская"}
+        zh_Hans{"кітайская (спрошчаныя іерогліфы)"}
+        zh_Hant{"кітайская (традыцыйныя іерогліфы)"}
         zu{"зулу"}
         zun{"зуні"}
         zxx{"няма моўнага матэрыялу"}
@@ -554,7 +550,7 @@
             tibt{"тыбецкія лічбы"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — Усё"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/bem.txt b/icu4c/source/data/lang/bem.txt
index 342a4c2..3b119b7 100644
--- a/icu4c/source/data/lang/bem.txt
+++ b/icu4c/source/data/lang/bem.txt
@@ -48,5 +48,5 @@
         zh{"Ichi Chainisi"}
         zu{"Ichi Zulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/bez.txt b/icu4c/source/data/lang/bez.txt
index 284fecb..75d884b 100644
--- a/icu4c/source/data/lang/bez.txt
+++ b/icu4c/source/data/lang/bez.txt
@@ -48,5 +48,5 @@
         zh{"Hichina"}
         zu{"Hizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/bg.txt b/icu4c/source/data/lang/bg.txt
index 031abac..f8b876d 100644
--- a/icu4c/source/data/lang/bg.txt
+++ b/icu4c/source/data/lang/bg.txt
@@ -828,7 +828,7 @@
         VALENCIA{"Валенсиански"}
         WADEGILE{"Уейд-Джайлс романизация"}
     }
-    Version{"2.1.37.59"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} – всички"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/bm.txt b/icu4c/source/data/lang/bm.txt
index ff189a2..e8fb7ef 100644
--- a/icu4c/source/data/lang/bm.txt
+++ b/icu4c/source/data/lang/bm.txt
@@ -48,5 +48,5 @@
         zh{"siniwakan"}
         zu{"zulukan"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/bn.txt b/icu4c/source/data/lang/bn.txt
index 3129085..f97b688 100644
--- a/icu4c/source/data/lang/bn.txt
+++ b/icu4c/source/data/lang/bn.txt
@@ -872,7 +872,7 @@
             wara{"ওয়ারেং সিটি সংখ্যা"}
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — সমস্ত"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/bn_IN.txt b/icu4c/source/data/lang/bn_IN.txt
index 8156d3a..54e4f1d 100644
--- a/icu4c/source/data/lang/bn_IN.txt
+++ b/icu4c/source/data/lang/bn_IN.txt
@@ -4,5 +4,5 @@
     Languages{
         ksh{"কোলোনিয়ান"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/bo.txt b/icu4c/source/data/lang/bo.txt
index ebbf80b..70cbc26 100644
--- a/icu4c/source/data/lang/bo.txt
+++ b/icu4c/source/data/lang/bo.txt
@@ -21,5 +21,5 @@
         Tibt{"བོད་ཡིག་"}
         Zxxx{"སྙན་བརྒྱུད། ཡིག་རིགས་སུ་མ་བཀོད་པའི་ཟིན་ཐོ།"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/br.txt b/icu4c/source/data/lang/br.txt
index 5f49fbc..3a8b974 100644
--- a/icu4c/source/data/lang/br.txt
+++ b/icu4c/source/data/lang/br.txt
@@ -3,6 +3,7 @@
 br{
     Keys{
         calendar{"deiziadur"}
+        cf{"furmad moneiz"}
         collation{"doare rummañ"}
         currency{"moneiz"}
         hc{"kelcʼhiad eurioù"}
@@ -65,6 +66,7 @@
         bi{"bislama"}
         bik{"bikol"}
         bin{"bini"}
+        bla{"siksika"}
         bm{"bambara"}
         bn{"bengali"}
         bo{"tibetaneg"}
@@ -83,8 +85,10 @@
         cch{"atsam"}
         ce{"tchetcheneg"}
         ceb{"cebuano"}
+        cgg{"chigaeg"}
         ch{"chamorru"}
         chb{"chibcha"}
+        chk{"chuuk"}
         chm{"marieg"}
         cho{"choktaw"}
         chp{"chipewyan"}
@@ -95,6 +99,7 @@
         cop{"kopteg"}
         cr{"kri"}
         crh{"turkeg Krimea"}
+        crs{"kreoleg Sechelez"}
         cs{"tchekeg"}
         csb{"kachoubeg"}
         cu{"slavoneg iliz"}
@@ -103,18 +108,23 @@
         da{"daneg"}
         dak{"dakota"}
         dar{"dargwa"}
+        dav{"taita"}
         de{"alamaneg"}
         de_AT{"alamaneg Aostria"}
         de_CH{"alamaneg uhel Suis"}
         del{"delaware"}
         dgr{"dogrib"}
         din{"dinka"}
+        dje{"zarma"}
         doi{"dogri"}
         dsb{"izelsorabeg"}
+        dua{"douala"}
         dum{"nederlandeg krenn"}
         dv{"divehi"}
+        dyo{"diola"}
         dyu{"dyula"}
         dz{"dzongkha"}
+        dzg{"dazagaeg"}
         ebu{"embu"}
         ee{"ewe"}
         efi{"efik"}
@@ -139,6 +149,7 @@
         fa{"perseg"}
         fan{"fang"}
         fat{"fanti"}
+        ff{"fula"}
         fi{"finneg"}
         fil{"filipineg"}
         fit{"finneg traoñienn an Torne"}
@@ -175,7 +186,9 @@
         grc{"hencʼhresianeg"}
         gsw{"alamaneg Suis"}
         gu{"gujarati"}
+        guz{"gusiieg"}
         gv{"manaveg"}
+        gwi{"gwich’in"}
         ha{"haousa"}
         hai{"haida"}
         hak{"sinaeg Hakka"}
@@ -201,6 +214,7 @@
         ig{"igbo"}
         ii{"yieg Sichuan"}
         ik{"inupiaq"}
+        ilo{"ilokanoeg"}
         inh{"ingoucheg"}
         io{"ido"}
         is{"islandeg"}
@@ -208,6 +222,9 @@
         iu{"inuktitut"}
         ja{"japaneg"}
         jam{"kreoleg Jamaika"}
+        jbo{"lojban"}
+        jgo{"ngomba"}
+        jmc{"machame"}
         jpr{"yuzev-perseg"}
         jrb{"yuzev-arabeg"}
         jv{"javaneg"}
@@ -215,15 +232,23 @@
         kaa{"karakalpak"}
         kab{"kabileg"}
         kac{"kachin"}
+        kaj{"jju"}
         kam{"kamba"}
         kbd{"kabardeg"}
+        kcg{"tyap"}
+        kde{"makonde"}
         kea{"kabuverdianu"}
+        kfo{"koroeg"}
         kg{"kongo"}
         kha{"khasi"}
         kho{"khotaneg"}
+        khq{"koyra chiini"}
         ki{"kikuyu"}
         kj{"kwanyama"}
         kk{"kazak"}
+        kkj{"kakoeg"}
+        kl{"greunlandeg"}
+        kln{"kalendjineg"}
         km{"khmer"}
         kmb{"kimbundu"}
         kn{"kanareg"}
@@ -233,16 +258,22 @@
         kpe{"kpelle"}
         kr{"kanouri"}
         krc{"karatchay-balkar"}
+        kri{"krio"}
         krl{"karelieg"}
         kru{"kurukh"}
         ks{"kashmiri"}
+        ksb{"shambala"}
+        ksf{"bafiaeg"}
         ksh{"koluneg"}
         ku{"kurdeg"}
+        kum{"koumikeg"}
         kut{"kutenai"}
+        kv{"komieg"}
         kw{"kerneveureg"}
         ky{"kirgiz"}
         la{"latin"}
         lad{"ladino"}
+        lag{"langi"}
         lah{"lahnda"}
         lam{"lamba"}
         lb{"luksembourgeg"}
@@ -251,10 +282,13 @@
         lg{"ganda"}
         li{"limbourgeg"}
         lij{"ligurieg"}
+        lkt{"lakota"}
         ln{"lingala"}
         lo{"laoseg"}
         lol{"mongo"}
+        lou{"kreoleg Louiziana"}
         loz{"lozi"}
+        lrc{"loureg an Norzh"}
         lt{"lituaneg"}
         lu{"luba-katanga"}
         lua{"luba-lulua"}
@@ -265,35 +299,46 @@
         luy{"luyia"}
         lv{"latvieg"}
         lzh{"sinaeg lennegel"}
+        mad{"madoureg"}
         mag{"magahi"}
         mai{"maithili"}
+        mak{"makasar"}
         mas{"masai"}
         mdf{"moksha"}
         mdr{"mandar"}
         men{"mende"}
+        mer{"meru"}
         mfe{"moriseg"}
         mg{"malgacheg"}
         mga{"krenniwerzhoneg"}
+        mgh{"makhuwa-meetto"}
+        mgo{"metaʼ"}
         mh{"marshall"}
         mi{"maori"}
+        mic{"mikmakeg"}
+        min{"minangkabau"}
         mk{"makedoneg"}
         ml{"malayalam"}
         mn{"mongoleg"}
         mnc{"manchou"}
         mni{"manipuri"}
         moh{"mohawk"}
+        mos{"more"}
         mr{"marathi"}
         mrj{"marieg ar Cʼhornôg"}
         ms{"malayseg"}
         mt{"malteg"}
+        mua{"moundangeg"}
         mul{"yezhoù lies"}
         mus{"muskogi"}
         mwl{"mirandeg"}
         my{"birmaneg"}
         myv{"erza"}
+        mzn{"mazanderaneg"}
         na{"naurueg"}
         nan{"sinaeg Min Nan"}
         nap{"napolitaneg"}
+        naq{"nama"}
         nb{"norvegeg bokmål"}
         nd{"ndebele an Norzh"}
         nds{"alamaneg izel"}
@@ -306,13 +351,17 @@
         njo{"aoeg"}
         nl{"nederlandeg"}
         nl_BE{"flandrezeg"}
+        nmg{"ngoumbeg"}
         nn{"norvegeg nynorsk"}
+        nnh{"ngiemboon"}
         no{"norvegeg"}
         nog{"nogay"}
         non{"hennorseg"}
         nov{"novial"}
+        nqo{"nkoeg"}
         nr{"ndebele ar Su"}
         nso{"sotho an Norzh"}
+        nus{"nouereg"}
         nv{"navacʼho"}
         nwc{"newari klasel"}
         ny{"nyanja"}
@@ -321,6 +370,7 @@
         nyo{"nyoro"}
         oc{"okitaneg"}
         oj{"ojibwa"}
+        om{"oromoeg"}
         or{"oriya"}
         os{"oseteg"}
         osa{"osage"}
@@ -332,6 +382,7 @@
         pap{"papiamento"}
         pau{"palau"}
         pcd{"pikardeg"}
+        pcm{"pidjin Nigeria"}
         pdc{"alamaneg Pennsylvania"}
         peo{"henberseg"}
         phn{"fenikianeg"}
@@ -347,6 +398,7 @@
         pt_BR{"portugaleg Brazil"}
         pt_PT{"portugaleg Europa"}
         qu{"kechuaeg"}
+        quc{"kʼicheʼ"}
         qug{"kichuaeg Chimborazo"}
         raj{"rajasthani"}
         rap{"rapanui"}
@@ -358,6 +410,7 @@
         ro_MD{"moldoveg"}
         rof{"rombo"}
         rom{"romanieg"}
+        root{"gwrizienn"}
         ru{"rusianeg"}
         rup{"aroumaneg"}
         rw{"kinyarwanda"}
@@ -366,14 +419,19 @@
         sad{"sandawe"}
         sah{"yakouteg"}
         sam{"arameeg ar Samaritaned"}
+        saq{"samburu"}
         sas{"sasak"}
         sat{"santali"}
+        sba{"ngambayeg"}
+        sbp{"sangu"}
         sc{"sardeg"}
         scn{"sikilieg"}
         sco{"skoteg"}
         sd{"sindhi"}
         sdc{"sasareseg"}
         se{"sámi an Norzh"}
+        seh{"sena"}
+        ses{"koyraboro senni"}
         sg{"sango"}
         sga{"heniwerzhoneg"}
         sh{"serb-kroateg"}
@@ -395,10 +453,13 @@
         sog{"sogdieg"}
         sq{"albaneg"}
         sr{"serbeg"}
+        srn{"sranan tongo"}
         srr{"serer"}
         ss{"swati"}
+        ssy{"sahoeg"}
         st{"sotho ar Su"}
         su{"sundaneg"}
+        suk{"sukuma"}
         sux{"sumereg"}
         sv{"svedeg"}
         sw{"swahili"}
@@ -410,6 +471,8 @@
         ta{"tamileg"}
         tcy{"touloueg"}
         te{"telougou"}
+        tem{"temne"}
+        teo{"tesoeg"}
         ter{"tereno"}
         tet{"tetum"}
         tg{"tadjik"}
@@ -429,12 +492,14 @@
         tpi{"tok pisin"}
         tr{"turkeg"}
         tru{"turoyoeg"}
+        trv{"taroko"}
         ts{"tsonga"}
         tsi{"tsimshian"}
         tt{"tatar"}
         tum{"tumbuka"}
         tvl{"tuvalu"}
         tw{"twi"}
+        twq{"tasawakeg"}
         ty{"tahitianeg"}
         tyv{"touva"}
         tzm{"tamazigteg Kreizatlas"}
@@ -455,6 +520,7 @@
         vo{"volapük"}
         vot{"votyakeg"}
         vro{"voroeg"}
+        vun{"vunjo"}
         wa{"walloneg"}
         wae{"walser"}
         wal{"walamo"}
@@ -465,8 +531,11 @@
         xal{"kalmouk"}
         xh{"xhosa"}
         xmf{"megreleg"}
+        xog{"sogaeg"}
         yao{"yao"}
         yap{"yapeg"}
+        yav{"yangben"}
+        ybb{"yemba"}
         yi{"yiddish"}
         yo{"yorouba"}
         yue{"kantoneg"}
@@ -482,6 +551,7 @@
         zu{"zouloueg"}
         zun{"zuni"}
         zxx{"diyezh"}
+        zza{"zazakeg"}
     }
     Languages%short{
         az{"azeri"}
@@ -489,11 +559,13 @@
         en_US{"saozneg SU"}
     }
     Scripts{
+        Adlm{"adlam"}
         Arab{"arabek"}
         Armi{"arameek impalaerel"}
         Armn{"armenianek"}
         Avst{"avestek"}
         Bali{"balinek"}
+        Bamu{"bamounek"}
         Beng{"bengali"}
         Bopo{"bopomofo"}
         Brai{"Braille"}
@@ -510,6 +582,7 @@
         Grek{"gresianek"}
         Gujr{"gujarati"}
         Guru{"gurmukhi"}
+        Hanb{"han gant bopomofo"}
         Hang{"hangeul"}
         Hani{"han"}
         Hans{"eeunaet"}
@@ -517,7 +590,9 @@
         Hebr{"hebraek"}
         Hira{"hiragana"}
         Hluw{"hieroglifoù Anatolia"}
+        Hrkt{"silabennaouegoù japanek"}
         Ital{"henitalek"}
+        Jamo{"jamo"}
         Java{"javanek"}
         Jpan{"japanek"}
         Kana{"katakana"}
@@ -550,6 +625,7 @@
         Vaii{"vai"}
         Xpeo{"persek kozh"}
         Zmth{"notadur jedoniel"}
+        Zsye{"fromlunioù"}
         Zsym{"arouezioù"}
         Zxxx{"anskrivet"}
         Zyyy{"boutin"}
@@ -580,10 +656,14 @@
             persian{"deiziadur persek"}
             roc{"deiziadur Republik Sina"}
         }
+        cf{
+            standard{"furmad moneiz standart"}
+        }
         collation{
             big5han{"urzh rummañ sinaek hengounel - Big5"}
             dictionary{"urzh rummañ ar geriadur"}
             ducet{"urzh rummañ Unicode dre ziouer"}
+            emoji{"urzh rummañ ar fromlunioù"}
             eor{"reolennoù urzhiañ europat"}
             gb2312han{"urzh rummañ sinaek eeunaet - GB2312"}
             phonebook{"urzh rummañ al levr-pellgomz"}
@@ -617,6 +697,7 @@
             brah{"sifroù brahmi"}
             cakm{"sifroù chakma"}
             cham{"sifroù cham"}
+            cyrl{"niveroù kirillek"}
             deva{"sifroù devanagari"}
             ethi{"niveroù etiopiat"}
             fullwide{"sifroù led plaen"}
@@ -672,23 +753,36 @@
         1959ACAD{"belaruseg akademek"}
         1994{"reizhskrivadur resianek skoueriekaet"}
         1996{"reizhskrivadur alamanek 1996"}
+        ABL1943{"doare reizhskrivañ 1943"}
+        AKUAPEM{"akuapem"}
         ALALC97{"romanekadur ALA-LC 1997"}
         ALUKU{"rannyezh aloukou"}
+        AO1990{"emglev 1990 war ar reizhskrivadur portugalek"}
         AREVELA{"armenianeg ar Reter"}
         AREVMDA{"armenianeg ar Cʼhornôg"}
+        ASANTE{"achanti"}
         BAKU1926{"lizherenneg latin turkek unvan"}
+        BALANKA{"rannyezh aniiek Balanka"}
+        BARLA{"rannyezhoù Barlavento kreoleg ar Cʼhab-Glas"}
+        BASICENG{"saozneg diazez"}
         BAUDDHA{"sanskriteg hiron boudaat"}
         BISCAYAN{"rannyezh euskarek Bizkaia"}
         BISKE{"rannyezh San Giorgio/Bila"}
         BOHORIC{"lizherenneg Bohorič"}
         BOONT{"boontling"}
+        COLB1945{"emglev 1945 war reizhskrivadur portugaleg Brazil"}
+        CORNU{"saozneg Kerne-Veur"}
         DAJNKO{"lizherenneg Dajnko"}
+        EKAVSK{"serbeg gant distagadur ekavian"}
         EMODENG{"saozneg rakvodern"}
         FONIPA{"lizherenneg fonetek etrebroadel"}
+        FONNAPA{"FONNAPA"}
         FONUPA{"lizherenneg fonetek ouralek"}
         FONXSAMP{"treuzskrivadur X-SAMPA"}
         HEPBURN{"romanekadur Hepburn"}
         HOGNORSK{"uhelnorvegeg"}
+        HSISTEMO{"esperanteg sistem H"}
+        IJEKAVSK{"serbeg gant distagadur ijekavian"}
         ITIHASA{"sanskriteg itihâsa"}
         JAUER{"rannyezh romañchek Jauer"}
         JYUTPING{"romanekadur kantonek Jyutping"}
@@ -702,9 +796,14 @@
         MONOTON{"gresianeg untonel"}
         NDYUKA{"rannyezh Ndyuka"}
         NEDIS{"rannyezh Natisone"}
+        NEWFOUND{"saozneg an Douar-Nevez"}
         NJIVA{"rannyezh Gniva/Njiva"}
         NULIK{"volapük modern"}
         OSOJS{"rannyezh Oseacco/Osojane"}
+        OXENDICT{"skritur Oxford English Dictionary"}
+        PAHAWH2{"PAHAWH2"}
+        PAHAWH3{"PAHAWH3"}
+        PAHAWH4{"PAHAWH4"}
         PAMAKA{"rannyezh Pamaka"}
         PETR1708{"reizhskrivadur rusianek 1708 Pêr I"}
         PINYIN{"romanekadur pinyin"}
@@ -716,9 +815,12 @@
         ROZAJ{"resianeg"}
         RUMGR{"romañcheg Grischun"}
         SAAHO{"saho"}
-        SCOTLAND{"saozneg standart skos"}
-        SCOUSE{"scouse"}
+        SCOTLAND{"saozneg standart Skos"}
+        SCOUSE{"saozneg Liverpool (scouse)"}
+        SIMPLE{"SIMPLE"}
         SOLBA{"rannyezh Stolvizza/Solbica"}
+        SOTAV{"rannyezhoù Sotavento kreoleg ar Cʼhab-Glas"}
+        SPANGLIS{"SPANGLIS"}
         SURMIRAN{"rannyezh romañchek surmiran"}
         SURSILV{"rannyezh romañchek sursilvan"}
         SUTSILV{"rannyezh romañchek sutsilvan"}
@@ -731,8 +833,9 @@
         VALENCIA{"valensianeg"}
         VALLADER{"rannyezh romañchek Vallader"}
         WADEGILE{"romanekadur Wade-Giles"}
+        XSISTEMO{"esperanteg sistem X"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"{0}"}
         script{"{0}"}
diff --git a/icu4c/source/data/lang/brx.txt b/icu4c/source/data/lang/brx.txt
index 84d776d..20a9eb4 100644
--- a/icu4c/source/data/lang/brx.txt
+++ b/icu4c/source/data/lang/brx.txt
@@ -609,7 +609,7 @@
         SOLBA{"श्टोलविज़्ज़ा या सोलबीका डायलेक्ट"}
         TARASK{"तारास्कीएवीचा वर्तनी"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         script{"देवनागरी: {0}"}
         territory{"क्षेत्र:भारत {0}"}
diff --git a/icu4c/source/data/lang/bs.txt b/icu4c/source/data/lang/bs.txt
index 6b0e142..cc9a45a 100644
--- a/icu4c/source/data/lang/bs.txt
+++ b/icu4c/source/data/lang/bs.txt
@@ -796,7 +796,7 @@
         TARASK{"Taraskijevica ortografija"}
         VALENCIA{"Valencijski"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — sve"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/bs_Cyrl.txt b/icu4c/source/data/lang/bs_Cyrl.txt
index 156cce4..ef2c4ca 100644
--- a/icu4c/source/data/lang/bs_Cyrl.txt
+++ b/icu4c/source/data/lang/bs_Cyrl.txt
@@ -696,7 +696,7 @@
         TARASK{"Тараскијевичка ортографија"}
         VALENCIA{"Валенцијска"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — све"}
         strokes{
diff --git a/icu4c/source/data/lang/bs_Latn.txt b/icu4c/source/data/lang/bs_Latn.txt
index 5e72765..0ac3778 100644
--- a/icu4c/source/data/lang/bs_Latn.txt
+++ b/icu4c/source/data/lang/bs_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/ca.txt b/icu4c/source/data/lang/ca.txt
index efacae0..d7a06b7 100644
--- a/icu4c/source/data/lang/ca.txt
+++ b/icu4c/source/data/lang/ca.txt
@@ -49,6 +49,7 @@
         arn{"mapudungu"}
         aro{"araona"}
         arp{"arapaho"}
+        ars{"àrab najdi"}
         arw{"arauac"}
         arz{"àrab egipci"}
         as{"assamès"}
@@ -998,7 +999,7 @@
         VALLADER{"baix engiadinès"}
         WADEGILE{"romanització Wade-Giles"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — tot"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ccp.txt b/icu4c/source/data/lang/ccp.txt
index b5c8df7..3669d5d 100644
--- a/icu4c/source/data/lang/ccp.txt
+++ b/icu4c/source/data/lang/ccp.txt
@@ -833,7 +833,7 @@
             vaii{"𑄞𑄭 𑄚𑄘"}
         }
     }
-    Version{"2.1.37.51"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — 𑄗𑄪𑄟𑄴"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ce.txt b/icu4c/source/data/lang/ce.txt
index 9dced7b..4c91568 100644
--- a/icu4c/source/data/lang/ce.txt
+++ b/icu4c/source/data/lang/ce.txt
@@ -465,7 +465,7 @@
             persian{"гӀажарийн"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"Мотт: {0}"}
         script{"Скрипт: {0}"}
diff --git a/icu4c/source/data/lang/cgg.txt b/icu4c/source/data/lang/cgg.txt
index d0775f4..e01554d 100644
--- a/icu4c/source/data/lang/cgg.txt
+++ b/icu4c/source/data/lang/cgg.txt
@@ -48,5 +48,5 @@
         zh{"Oruchaina"}
         zu{"Oruzuru"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/chr.txt b/icu4c/source/data/lang/chr.txt
index 733166f..76725fe 100644
--- a/icu4c/source/data/lang/chr.txt
+++ b/icu4c/source/data/lang/chr.txt
@@ -538,7 +538,7 @@
             tibt{"ᏘᏇᏔᏂ ᏗᏎᏍᏗ"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — ᏂᎦᏓ"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ckb.txt b/icu4c/source/data/lang/ckb.txt
index 93a4811..ba82983 100644
--- a/icu4c/source/data/lang/ckb.txt
+++ b/icu4c/source/data/lang/ckb.txt
@@ -135,5 +135,5 @@
         Thaa{"تانە"}
         Thai{"تایلەندی"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.71"}
 }
diff --git a/icu4c/source/data/lang/cs.txt b/icu4c/source/data/lang/cs.txt
index 0a83845..1b92f4b 100644
--- a/icu4c/source/data/lang/cs.txt
+++ b/icu4c/source/data/lang/cs.txt
@@ -51,6 +51,7 @@
         aro{"araonština"}
         arp{"arapažština"}
         arq{"arabština (alžírská)"}
+        ars{"arabština (nadžd)"}
         arw{"arawacké jazyky"}
         ary{"arabština (marocká)"}
         arz{"arabština (egyptská)"}
@@ -960,7 +961,7 @@
         SCOTLAND{"angličtina (Skotsko)"}
         WADEGILE{"Wade-Giles"}
     }
-    Version{"2.1.37.11"}
+    Version{"2.1.39.15"}
     characterLabelPattern{
         all{"{0} – vše"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/cy.txt b/icu4c/source/data/lang/cy.txt
index ea605e4..68265df 100644
--- a/icu4c/source/data/lang/cy.txt
+++ b/icu4c/source/data/lang/cy.txt
@@ -732,7 +732,7 @@
         VAIDIKA{"VAIDIKA"}
         VALLADER{"VALLADER"}
     }
-    Version{"2.1.37.17"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — y cwbl"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/da.txt b/icu4c/source/data/lang/da.txt
index 7d80af3..aa7c509 100644
--- a/icu4c/source/data/lang/da.txt
+++ b/icu4c/source/data/lang/da.txt
@@ -46,6 +46,7 @@
         arc{"aramæisk"}
         arn{"mapudungun"}
         arp{"arapaho"}
+        ars{"najd-arabisk"}
         arw{"arawak"}
         as{"assamesisk"}
         asa{"asu"}
@@ -556,6 +557,7 @@
     Languages%short{
         az{"azeri"}
         en_GB{"engelsk (UK)"}
+        en_US{"en-US"}
     }
     Languages%variant{
         ps{"pushto"}
@@ -956,7 +958,7 @@
         VALLADER{"vallader"}
         WADEGILE{"Wade-Giles"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} – alle"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/dav.txt b/icu4c/source/data/lang/dav.txt
index 3c6991c..8f9d99b 100644
--- a/icu4c/source/data/lang/dav.txt
+++ b/icu4c/source/data/lang/dav.txt
@@ -48,5 +48,5 @@
         zh{"Kichina"}
         zu{"Kizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/de.txt b/icu4c/source/data/lang/de.txt
index 6feee00..8cee75f 100644
--- a/icu4c/source/data/lang/de.txt
+++ b/icu4c/source/data/lang/de.txt
@@ -51,6 +51,7 @@
         aro{"Araona"}
         arp{"Arapaho"}
         arq{"Algerisches Arabisch"}
+        ars{"Nadschd-Arabisch"}
         arw{"Arawak"}
         ary{"Marokkanisches Arabisch"}
         arz{"Ägyptisches Arabisch"}
@@ -1018,7 +1019,7 @@
         VALENCIA{"Valencianisch"}
         WADEGILE{"Wade-Giles"}
     }
-    Version{"2.1.37.96"}
+    Version{"2.1.39.41"}
     characterLabelPattern{
         all{"{0} — Alle"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/de_AT.txt b/icu4c/source/data/lang/de_AT.txt
index a1804e5..c7df4f7 100644
--- a/icu4c/source/data/lang/de_AT.txt
+++ b/icu4c/source/data/lang/de_AT.txt
@@ -16,5 +16,5 @@
         sh{"Serbokroatisch"}
         szl{"Schlesisch"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/de_CH.txt b/icu4c/source/data/lang/de_CH.txt
index 69cf564..6e0b141 100644
--- a/icu4c/source/data/lang/de_CH.txt
+++ b/icu4c/source/data/lang/de_CH.txt
@@ -34,5 +34,5 @@
             ussystem{"US Mass-System"}
         }
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
 }
diff --git a/icu4c/source/data/lang/de_LU.txt b/icu4c/source/data/lang/de_LU.txt
index ca86d1c..ae990fc 100644
--- a/icu4c/source/data/lang/de_LU.txt
+++ b/icu4c/source/data/lang/de_LU.txt
@@ -4,5 +4,5 @@
     Languages{
         be{"Belarussisch"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/dje.txt b/icu4c/source/data/lang/dje.txt
index 3abacfc..9f33bdd 100644
--- a/icu4c/source/data/lang/dje.txt
+++ b/icu4c/source/data/lang/dje.txt
@@ -48,5 +48,5 @@
         zh{"Sinuwa senni"}
         zu{"Zulu senni"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/dsb.txt b/icu4c/source/data/lang/dsb.txt
index 4fa37fa..c36653a 100644
--- a/icu4c/source/data/lang/dsb.txt
+++ b/icu4c/source/data/lang/dsb.txt
@@ -378,7 +378,7 @@
             tibt{"tibetske cyfry"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"Rěc: {0}"}
         script{"Pismo: {0}"}
diff --git a/icu4c/source/data/lang/dua.txt b/icu4c/source/data/lang/dua.txt
index 221bcd6..b5b3bab 100644
--- a/icu4c/source/data/lang/dua.txt
+++ b/icu4c/source/data/lang/dua.txt
@@ -4,5 +4,5 @@
     Languages{
         dua{"duálá"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/dyo.txt b/icu4c/source/data/lang/dyo.txt
index 8dcec1a..ae6809c 100644
--- a/icu4c/source/data/lang/dyo.txt
+++ b/icu4c/source/data/lang/dyo.txt
@@ -48,5 +48,5 @@
         zh{"sinua"}
         zu{"sulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/dz.txt b/icu4c/source/data/lang/dz.txt
index 35d27b3..8c205ad 100644
--- a/icu4c/source/data/lang/dz.txt
+++ b/icu4c/source/data/lang/dz.txt
@@ -234,7 +234,7 @@
             tibt{"ང་བཅས་ཀྱི་ཨང་ཡིག"}
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"ཁ་སྐད་: {0}"}
         script{"ཡིག་གཟུགས་: {0}"}
diff --git a/icu4c/source/data/lang/ebu.txt b/icu4c/source/data/lang/ebu.txt
index 6c7d5d2..d6a5e3b 100644
--- a/icu4c/source/data/lang/ebu.txt
+++ b/icu4c/source/data/lang/ebu.txt
@@ -48,5 +48,5 @@
         zh{"Kĩchina"}
         zu{"Kĩzulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/ee.txt b/icu4c/source/data/lang/ee.txt
index 1ed0e99..8405d97 100644
--- a/icu4c/source/data/lang/ee.txt
+++ b/icu4c/source/data/lang/ee.txt
@@ -299,7 +299,7 @@
             tibt{"tibet digitwo"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"gbegbɔgblɔ {0}"}
         script{"gbeŋɔŋlɔ {0}"}
diff --git a/icu4c/source/data/lang/el.txt b/icu4c/source/data/lang/el.txt
index c39a98c..be7986a 100644
--- a/icu4c/source/data/lang/el.txt
+++ b/icu4c/source/data/lang/el.txt
@@ -46,6 +46,7 @@
         arc{"Αραμαϊκά"}
         arn{"Αραουκανικά"}
         arp{"Αραπάχο"}
+        ars{"Αραβικά Νάτζντι"}
         arw{"Αραγουάκ"}
         as{"Ασαμικά"}
         asa{"Άσου"}
@@ -526,7 +527,7 @@
         was{"Γουασό"}
         wbp{"Γουαρλπίρι"}
         wo{"Γουόλοφ"}
-        wuu{"wuu"}
+        wuu{"Κινεζικά Γου"}
         xal{"Καλμίκ"}
         xh{"Κόσα"}
         xog{"Σόγκα"}
@@ -881,7 +882,7 @@
         VALENCIA{"Βαλενθιανά"}
         WADEGILE{"Εκλατινισμένα Γουάντ-Γκιλς"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — όλα"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/en.txt b/icu4c/source/data/lang/en.txt
index fd54a51..2c22ae1 100644
--- a/icu4c/source/data/lang/en.txt
+++ b/icu4c/source/data/lang/en.txt
@@ -548,6 +548,7 @@
         sog{"Sogdien"}
         sq{"Albanian"}
         sr{"Serbian"}
+        sr_ME{"Montenegrin"}
         srn{"Sranan Tongo"}
         srr{"Serer"}
         ss{"Swati"}
@@ -1226,7 +1227,7 @@
         VALENCIA{"Valencian"}
         WADEGILE{"Wade-Giles Romanization"}
     }
-    Version{"2.1.37.44"}
+    Version{"2.1.39.27"}
     characterLabelPattern{
         all{"{0} — all"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/en_001.txt b/icu4c/source/data/lang/en_001.txt
index 8d65d57..05e2dbf 100644
--- a/icu4c/source/data/lang/en_001.txt
+++ b/icu4c/source/data/lang/en_001.txt
@@ -10,5 +10,5 @@
             yes{"Sort Unicode Normalised"}
         }
     }
-    Version{"2.1.35.71"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_150.txt b/icu4c/source/data/lang/en_150.txt
index 564d55e..c7bcd83 100644
--- a/icu4c/source/data/lang/en_150.txt
+++ b/icu4c/source/data/lang/en_150.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_150{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_AG.txt b/icu4c/source/data/lang/en_AG.txt
index ed7f63d..dab34a4 100644
--- a/icu4c/source/data/lang/en_AG.txt
+++ b/icu4c/source/data/lang/en_AG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_AI.txt b/icu4c/source/data/lang/en_AI.txt
index a92294b..e77964d 100644
--- a/icu4c/source/data/lang/en_AI.txt
+++ b/icu4c/source/data/lang/en_AI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_AT.txt b/icu4c/source/data/lang/en_AT.txt
index 0bca0cd..c955b37 100644
--- a/icu4c/source/data/lang/en_AT.txt
+++ b/icu4c/source/data/lang/en_AT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AT{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_AU.txt b/icu4c/source/data/lang/en_AU.txt
index c5de2bf..191e393 100644
--- a/icu4c/source/data/lang/en_AU.txt
+++ b/icu4c/source/data/lang/en_AU.txt
@@ -18,5 +18,5 @@
             ethiopic{"Ethiopian Calendar"}
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/lang/en_BB.txt b/icu4c/source/data/lang/en_BB.txt
index 2c2c05e..a3a8e74 100644
--- a/icu4c/source/data/lang/en_BB.txt
+++ b/icu4c/source/data/lang/en_BB.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BB{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_BE.txt b/icu4c/source/data/lang/en_BE.txt
index 6c7e5ab..c0eab02 100644
--- a/icu4c/source/data/lang/en_BE.txt
+++ b/icu4c/source/data/lang/en_BE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BE{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_BM.txt b/icu4c/source/data/lang/en_BM.txt
index a07478e..dfb1e87 100644
--- a/icu4c/source/data/lang/en_BM.txt
+++ b/icu4c/source/data/lang/en_BM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_BS.txt b/icu4c/source/data/lang/en_BS.txt
index 3457002..2d87547 100644
--- a/icu4c/source/data/lang/en_BS.txt
+++ b/icu4c/source/data/lang/en_BS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_BW.txt b/icu4c/source/data/lang/en_BW.txt
index e9eeab0..63e350b 100644
--- a/icu4c/source/data/lang/en_BW.txt
+++ b/icu4c/source/data/lang/en_BW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_BZ.txt b/icu4c/source/data/lang/en_BZ.txt
index 8807b66..8a36306 100644
--- a/icu4c/source/data/lang/en_BZ.txt
+++ b/icu4c/source/data/lang/en_BZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_CA.txt b/icu4c/source/data/lang/en_CA.txt
index 7e4bd68..99abcbd 100644
--- a/icu4c/source/data/lang/en_CA.txt
+++ b/icu4c/source/data/lang/en_CA.txt
@@ -13,6 +13,13 @@
             dangi{"Korean Calendar"}
             ethiopic{"Ethiopian Calendar"}
         }
+        d0{
+            fwidth{"To Full Width"}
+            hwidth{"To Half Width"}
+            lower{"To Lower Case"}
+            title{"To Title Case"}
+            upper{"To Upper Case"}
+        }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/lang/en_CC.txt b/icu4c/source/data/lang/en_CC.txt
index 67fe580..e8c2d33 100644
--- a/icu4c/source/data/lang/en_CC.txt
+++ b/icu4c/source/data/lang/en_CC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_CH.txt b/icu4c/source/data/lang/en_CH.txt
index 1bbe260..745eed0 100644
--- a/icu4c/source/data/lang/en_CH.txt
+++ b/icu4c/source/data/lang/en_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CH{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_CK.txt b/icu4c/source/data/lang/en_CK.txt
index 8f3b9a4..a6909b9 100644
--- a/icu4c/source/data/lang/en_CK.txt
+++ b/icu4c/source/data/lang/en_CK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_CM.txt b/icu4c/source/data/lang/en_CM.txt
index e3da63d..9cb94c0 100644
--- a/icu4c/source/data/lang/en_CM.txt
+++ b/icu4c/source/data/lang/en_CM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_CX.txt b/icu4c/source/data/lang/en_CX.txt
index 4e3c98e..7166f9d 100644
--- a/icu4c/source/data/lang/en_CX.txt
+++ b/icu4c/source/data/lang/en_CX.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CX{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_CY.txt b/icu4c/source/data/lang/en_CY.txt
index 4fa4a14..6e80705 100644
--- a/icu4c/source/data/lang/en_CY.txt
+++ b/icu4c/source/data/lang/en_CY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_DE.txt b/icu4c/source/data/lang/en_DE.txt
index fd11453..9631682 100644
--- a/icu4c/source/data/lang/en_DE.txt
+++ b/icu4c/source/data/lang/en_DE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DE{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_DG.txt b/icu4c/source/data/lang/en_DG.txt
index bd59dcb..a185284 100644
--- a/icu4c/source/data/lang/en_DG.txt
+++ b/icu4c/source/data/lang/en_DG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_DK.txt b/icu4c/source/data/lang/en_DK.txt
index 9f596cd..342c391 100644
--- a/icu4c/source/data/lang/en_DK.txt
+++ b/icu4c/source/data/lang/en_DK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DK{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_DM.txt b/icu4c/source/data/lang/en_DM.txt
index 067f54d..ead644c 100644
--- a/icu4c/source/data/lang/en_DM.txt
+++ b/icu4c/source/data/lang/en_DM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_ER.txt b/icu4c/source/data/lang/en_ER.txt
index dac4b71..9809fe6 100644
--- a/icu4c/source/data/lang/en_ER.txt
+++ b/icu4c/source/data/lang/en_ER.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ER{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_FI.txt b/icu4c/source/data/lang/en_FI.txt
index 0940644..8626b24 100644
--- a/icu4c/source/data/lang/en_FI.txt
+++ b/icu4c/source/data/lang/en_FI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FI{
     %%Parent{"en_150"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_FJ.txt b/icu4c/source/data/lang/en_FJ.txt
index 17022d5..32898fb 100644
--- a/icu4c/source/data/lang/en_FJ.txt
+++ b/icu4c/source/data/lang/en_FJ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FJ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_FK.txt b/icu4c/source/data/lang/en_FK.txt
index edbb4d8..7551e65 100644
--- a/icu4c/source/data/lang/en_FK.txt
+++ b/icu4c/source/data/lang/en_FK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_FM.txt b/icu4c/source/data/lang/en_FM.txt
index 9b1d31f..e4a293d 100644
--- a/icu4c/source/data/lang/en_FM.txt
+++ b/icu4c/source/data/lang/en_FM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_GB.txt b/icu4c/source/data/lang/en_GB.txt
index 2c53941..51f63ec 100644
--- a/icu4c/source/data/lang/en_GB.txt
+++ b/icu4c/source/data/lang/en_GB.txt
@@ -19,7 +19,7 @@
             h24{"24-Hour System (1–24)"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     characterLabelPattern{
         all{"{0} – all"}
         compatibility{"{0} – compatibility"}
diff --git a/icu4c/source/data/lang/en_GD.txt b/icu4c/source/data/lang/en_GD.txt
index a006727..9ad43f3 100644
--- a/icu4c/source/data/lang/en_GD.txt
+++ b/icu4c/source/data/lang/en_GD.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_GG.txt b/icu4c/source/data/lang/en_GG.txt
index b91b6b8..6e3d4df 100644
--- a/icu4c/source/data/lang/en_GG.txt
+++ b/icu4c/source/data/lang/en_GG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_GH.txt b/icu4c/source/data/lang/en_GH.txt
index 50a4429..d244565 100644
--- a/icu4c/source/data/lang/en_GH.txt
+++ b/icu4c/source/data/lang/en_GH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_GI.txt b/icu4c/source/data/lang/en_GI.txt
index e19c4d8..fc5f7d7 100644
--- a/icu4c/source/data/lang/en_GI.txt
+++ b/icu4c/source/data/lang/en_GI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_GM.txt b/icu4c/source/data/lang/en_GM.txt
index 9448c85..807df46 100644
--- a/icu4c/source/data/lang/en_GM.txt
+++ b/icu4c/source/data/lang/en_GM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_GY.txt b/icu4c/source/data/lang/en_GY.txt
index 7c5333b..4971e6d 100644
--- a/icu4c/source/data/lang/en_GY.txt
+++ b/icu4c/source/data/lang/en_GY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_HK.txt b/icu4c/source/data/lang/en_HK.txt
index d43b56c..78bb499 100644
--- a/icu4c/source/data/lang/en_HK.txt
+++ b/icu4c/source/data/lang/en_HK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_HK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_IE.txt b/icu4c/source/data/lang/en_IE.txt
index 94ab93c..7cb27d7 100644
--- a/icu4c/source/data/lang/en_IE.txt
+++ b/icu4c/source/data/lang/en_IE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_IL.txt b/icu4c/source/data/lang/en_IL.txt
index 55a5091..df09f53d 100644
--- a/icu4c/source/data/lang/en_IL.txt
+++ b/icu4c/source/data/lang/en_IL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_IM.txt b/icu4c/source/data/lang/en_IM.txt
index 3ccab11..2af0241 100644
--- a/icu4c/source/data/lang/en_IM.txt
+++ b/icu4c/source/data/lang/en_IM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_IN.txt b/icu4c/source/data/lang/en_IN.txt
index 66e5552..58cab82 100644
--- a/icu4c/source/data/lang/en_IN.txt
+++ b/icu4c/source/data/lang/en_IN.txt
@@ -4,7 +4,6 @@
     %%Parent{"en_001"}
     Languages{
         bn{"Bengali"}
-        or{"Oriya"}
     }
     Scripts{
         Beng{"Bengali"}
@@ -16,5 +15,5 @@
             orya{"Oriya Digits"}
         }
     }
-    Version{"2.1.37.11"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/lang/en_IO.txt b/icu4c/source/data/lang/en_IO.txt
index 3f89192..d87cdff 100644
--- a/icu4c/source/data/lang/en_IO.txt
+++ b/icu4c/source/data/lang/en_IO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_JE.txt b/icu4c/source/data/lang/en_JE.txt
index 66de22d..2d50f0a 100644
--- a/icu4c/source/data/lang/en_JE.txt
+++ b/icu4c/source/data/lang/en_JE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_JE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_JM.txt b/icu4c/source/data/lang/en_JM.txt
index ad3c905..c7e0fef 100644
--- a/icu4c/source/data/lang/en_JM.txt
+++ b/icu4c/source/data/lang/en_JM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_JM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_KE.txt b/icu4c/source/data/lang/en_KE.txt
index 0af301a..4e7344a 100644
--- a/icu4c/source/data/lang/en_KE.txt
+++ b/icu4c/source/data/lang/en_KE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_KI.txt b/icu4c/source/data/lang/en_KI.txt
index f671853..74349d3 100644
--- a/icu4c/source/data/lang/en_KI.txt
+++ b/icu4c/source/data/lang/en_KI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_KN.txt b/icu4c/source/data/lang/en_KN.txt
index 573c389..3accb4c 100644
--- a/icu4c/source/data/lang/en_KN.txt
+++ b/icu4c/source/data/lang/en_KN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KN{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_KY.txt b/icu4c/source/data/lang/en_KY.txt
index 0d60082..dfde982 100644
--- a/icu4c/source/data/lang/en_KY.txt
+++ b/icu4c/source/data/lang/en_KY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_LC.txt b/icu4c/source/data/lang/en_LC.txt
index 7033a6a..9c2e8c4 100644
--- a/icu4c/source/data/lang/en_LC.txt
+++ b/icu4c/source/data/lang/en_LC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_LR.txt b/icu4c/source/data/lang/en_LR.txt
index 8d60973..3b6da71 100644
--- a/icu4c/source/data/lang/en_LR.txt
+++ b/icu4c/source/data/lang/en_LR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LR{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_LS.txt b/icu4c/source/data/lang/en_LS.txt
index 61d557f..644ca26 100644
--- a/icu4c/source/data/lang/en_LS.txt
+++ b/icu4c/source/data/lang/en_LS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_MG.txt b/icu4c/source/data/lang/en_MG.txt
index f5b2bfd..500786d 100644
--- a/icu4c/source/data/lang/en_MG.txt
+++ b/icu4c/source/data/lang/en_MG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_MO.txt b/icu4c/source/data/lang/en_MO.txt
index 7c06497..5b0cc9a 100644
--- a/icu4c/source/data/lang/en_MO.txt
+++ b/icu4c/source/data/lang/en_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_MS.txt b/icu4c/source/data/lang/en_MS.txt
index 28ef10d..31e4995 100644
--- a/icu4c/source/data/lang/en_MS.txt
+++ b/icu4c/source/data/lang/en_MS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_MT.txt b/icu4c/source/data/lang/en_MT.txt
index 0d4bc8b..5ae61e8 100644
--- a/icu4c/source/data/lang/en_MT.txt
+++ b/icu4c/source/data/lang/en_MT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MT{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_MU.txt b/icu4c/source/data/lang/en_MU.txt
index f36ff7e..70f4a69 100644
--- a/icu4c/source/data/lang/en_MU.txt
+++ b/icu4c/source/data/lang/en_MU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_MW.txt b/icu4c/source/data/lang/en_MW.txt
index 8f5bed0..f0fe526 100644
--- a/icu4c/source/data/lang/en_MW.txt
+++ b/icu4c/source/data/lang/en_MW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_MY.txt b/icu4c/source/data/lang/en_MY.txt
index fc723c2..4fa38e5 100644
--- a/icu4c/source/data/lang/en_MY.txt
+++ b/icu4c/source/data/lang/en_MY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_NA.txt b/icu4c/source/data/lang/en_NA.txt
index 17f6b27..a07f557 100644
--- a/icu4c/source/data/lang/en_NA.txt
+++ b/icu4c/source/data/lang/en_NA.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NA{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_NF.txt b/icu4c/source/data/lang/en_NF.txt
index 56b1a98..b1e3b07 100644
--- a/icu4c/source/data/lang/en_NF.txt
+++ b/icu4c/source/data/lang/en_NF.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NF{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_NG.txt b/icu4c/source/data/lang/en_NG.txt
index 8102534..b302284 100644
--- a/icu4c/source/data/lang/en_NG.txt
+++ b/icu4c/source/data/lang/en_NG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_NL.txt b/icu4c/source/data/lang/en_NL.txt
index 4566eb3..d27f8a3 100644
--- a/icu4c/source/data/lang/en_NL.txt
+++ b/icu4c/source/data/lang/en_NL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NL{
     %%Parent{"en_150"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_NR.txt b/icu4c/source/data/lang/en_NR.txt
index a66b87f..7e1b070 100644
--- a/icu4c/source/data/lang/en_NR.txt
+++ b/icu4c/source/data/lang/en_NR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NR{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_NU.txt b/icu4c/source/data/lang/en_NU.txt
index 86aa256..d79dc18 100644
--- a/icu4c/source/data/lang/en_NU.txt
+++ b/icu4c/source/data/lang/en_NU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_NZ.txt b/icu4c/source/data/lang/en_NZ.txt
index 7959967..130bbff 100644
--- a/icu4c/source/data/lang/en_NZ.txt
+++ b/icu4c/source/data/lang/en_NZ.txt
@@ -5,5 +5,5 @@
     Languages{
         mi{"Māori"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/lang/en_PG.txt b/icu4c/source/data/lang/en_PG.txt
index 6146600..b0aa15c 100644
--- a/icu4c/source/data/lang/en_PG.txt
+++ b/icu4c/source/data/lang/en_PG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_PH.txt b/icu4c/source/data/lang/en_PH.txt
index 04ac66a..94d6d4c 100644
--- a/icu4c/source/data/lang/en_PH.txt
+++ b/icu4c/source/data/lang/en_PH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_PK.txt b/icu4c/source/data/lang/en_PK.txt
index 3d5d2f6..ae335ca 100644
--- a/icu4c/source/data/lang/en_PK.txt
+++ b/icu4c/source/data/lang/en_PK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_PN.txt b/icu4c/source/data/lang/en_PN.txt
index 8b83a8d..907c98b 100644
--- a/icu4c/source/data/lang/en_PN.txt
+++ b/icu4c/source/data/lang/en_PN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PN{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_PW.txt b/icu4c/source/data/lang/en_PW.txt
index 43ec73a..14fe4d0 100644
--- a/icu4c/source/data/lang/en_PW.txt
+++ b/icu4c/source/data/lang/en_PW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_RW.txt b/icu4c/source/data/lang/en_RW.txt
index 1323a28..b5bd04c 100644
--- a/icu4c/source/data/lang/en_RW.txt
+++ b/icu4c/source/data/lang/en_RW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_RW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SB.txt b/icu4c/source/data/lang/en_SB.txt
index 08287c0..135fc64 100644
--- a/icu4c/source/data/lang/en_SB.txt
+++ b/icu4c/source/data/lang/en_SB.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SB{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SC.txt b/icu4c/source/data/lang/en_SC.txt
index 9c80308..9026bef 100644
--- a/icu4c/source/data/lang/en_SC.txt
+++ b/icu4c/source/data/lang/en_SC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SD.txt b/icu4c/source/data/lang/en_SD.txt
index 8fef005..e3323d7 100644
--- a/icu4c/source/data/lang/en_SD.txt
+++ b/icu4c/source/data/lang/en_SD.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SE.txt b/icu4c/source/data/lang/en_SE.txt
index 35978fe..fa6772c 100644
--- a/icu4c/source/data/lang/en_SE.txt
+++ b/icu4c/source/data/lang/en_SE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SE{
     %%Parent{"en_150"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SG.txt b/icu4c/source/data/lang/en_SG.txt
index 904e860..c0e7458 100644
--- a/icu4c/source/data/lang/en_SG.txt
+++ b/icu4c/source/data/lang/en_SG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SH.txt b/icu4c/source/data/lang/en_SH.txt
index dbaac39..46006e9 100644
--- a/icu4c/source/data/lang/en_SH.txt
+++ b/icu4c/source/data/lang/en_SH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SI.txt b/icu4c/source/data/lang/en_SI.txt
index c6837fe..8dc7c6a 100644
--- a/icu4c/source/data/lang/en_SI.txt
+++ b/icu4c/source/data/lang/en_SI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SI{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SL.txt b/icu4c/source/data/lang/en_SL.txt
index f3ff3f7..627e073 100644
--- a/icu4c/source/data/lang/en_SL.txt
+++ b/icu4c/source/data/lang/en_SL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SS.txt b/icu4c/source/data/lang/en_SS.txt
index 1b9c52e..fac8b78 100644
--- a/icu4c/source/data/lang/en_SS.txt
+++ b/icu4c/source/data/lang/en_SS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SX.txt b/icu4c/source/data/lang/en_SX.txt
index c619269..e6eb9bb 100644
--- a/icu4c/source/data/lang/en_SX.txt
+++ b/icu4c/source/data/lang/en_SX.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SX{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_SZ.txt b/icu4c/source/data/lang/en_SZ.txt
index 734e744..650774b 100644
--- a/icu4c/source/data/lang/en_SZ.txt
+++ b/icu4c/source/data/lang/en_SZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_TC.txt b/icu4c/source/data/lang/en_TC.txt
index 31b22e7..6d30689 100644
--- a/icu4c/source/data/lang/en_TC.txt
+++ b/icu4c/source/data/lang/en_TC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_TK.txt b/icu4c/source/data/lang/en_TK.txt
index 380b9d9..a102a8c 100644
--- a/icu4c/source/data/lang/en_TK.txt
+++ b/icu4c/source/data/lang/en_TK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_TO.txt b/icu4c/source/data/lang/en_TO.txt
index 426b5d6..3f82fa0 100644
--- a/icu4c/source/data/lang/en_TO.txt
+++ b/icu4c/source/data/lang/en_TO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_TT.txt b/icu4c/source/data/lang/en_TT.txt
index 4d6d39d..284f5f7 100644
--- a/icu4c/source/data/lang/en_TT.txt
+++ b/icu4c/source/data/lang/en_TT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TT{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_TV.txt b/icu4c/source/data/lang/en_TV.txt
index debe076..7ad38cb 100644
--- a/icu4c/source/data/lang/en_TV.txt
+++ b/icu4c/source/data/lang/en_TV.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TV{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_TZ.txt b/icu4c/source/data/lang/en_TZ.txt
index 25e40bf..ed8f720 100644
--- a/icu4c/source/data/lang/en_TZ.txt
+++ b/icu4c/source/data/lang/en_TZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_UG.txt b/icu4c/source/data/lang/en_UG.txt
index d28e107..6d41671 100644
--- a/icu4c/source/data/lang/en_UG.txt
+++ b/icu4c/source/data/lang/en_UG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_UG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_VC.txt b/icu4c/source/data/lang/en_VC.txt
index dc17ae0..7f5fda9 100644
--- a/icu4c/source/data/lang/en_VC.txt
+++ b/icu4c/source/data/lang/en_VC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_VG.txt b/icu4c/source/data/lang/en_VG.txt
index 995ae52..0e708c0 100644
--- a/icu4c/source/data/lang/en_VG.txt
+++ b/icu4c/source/data/lang/en_VG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_VU.txt b/icu4c/source/data/lang/en_VU.txt
index 433c4c9..5fe2f2a 100644
--- a/icu4c/source/data/lang/en_VU.txt
+++ b/icu4c/source/data/lang/en_VU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_WS.txt b/icu4c/source/data/lang/en_WS.txt
index 0697889..00ce51e 100644
--- a/icu4c/source/data/lang/en_WS.txt
+++ b/icu4c/source/data/lang/en_WS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_WS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_XA.txt b/icu4c/source/data/lang/en_XA.txt
index 25f0cb5..6bdae46 100644
--- a/icu4c/source/data/lang/en_XA.txt
+++ b/icu4c/source/data/lang/en_XA.txt
@@ -548,6 +548,7 @@
         sog{"[Šöĝðîéñ one]"}
         sq{"[Åļƀåñîåñ one]"}
         sr{"[Šéŕƀîåñ one]"}
+        sr_ME{"[Ṁöñţéñéĝŕîñ one two]"}
         srn{"[Šŕåñåñ Ţöñĝö one two]"}
         srr{"[Šéŕéŕ one]"}
         ss{"[Šŵåţî one]"}
diff --git a/icu4c/source/data/lang/en_ZA.txt b/icu4c/source/data/lang/en_ZA.txt
index 844f02c..41c2c2e 100644
--- a/icu4c/source/data/lang/en_ZA.txt
+++ b/icu4c/source/data/lang/en_ZA.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZA{
     %%Parent{"en_001"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_ZM.txt b/icu4c/source/data/lang/en_ZM.txt
index 3e9be74..b330b46 100644
--- a/icu4c/source/data/lang/en_ZM.txt
+++ b/icu4c/source/data/lang/en_ZM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/en_ZW.txt b/icu4c/source/data/lang/en_ZW.txt
index 5fb189a..f20fa35 100644
--- a/icu4c/source/data/lang/en_ZW.txt
+++ b/icu4c/source/data/lang/en_ZW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/eo.txt b/icu4c/source/data/lang/eo.txt
index 54d439f..763eb26 100644
--- a/icu4c/source/data/lang/eo.txt
+++ b/icu4c/source/data/lang/eo.txt
@@ -156,5 +156,5 @@
         zu{"zulua"}
         zxx{"nelingvaĵo"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/es.txt b/icu4c/source/data/lang/es.txt
index 7e96506..0d0c6ba 100644
--- a/icu4c/source/data/lang/es.txt
+++ b/icu4c/source/data/lang/es.txt
@@ -46,6 +46,7 @@
         arc{"arameo"}
         arn{"mapuche"}
         arp{"arapaho"}
+        ars{"árabe najdí"}
         arw{"arahuaco"}
         as{"asamés"}
         asa{"asu"}
@@ -850,7 +851,7 @@
         VALENCIA{"Valenciano"}
         WADEGILE{"Romanización Wade-Giles"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — Todo"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/es_419.txt b/icu4c/source/data/lang/es_419.txt
index 2d40d74..18bf3f3 100644
--- a/icu4c/source/data/lang/es_419.txt
+++ b/icu4c/source/data/lang/es_419.txt
@@ -14,6 +14,7 @@
         ady{"adigeo"}
         alt{"altái del sur"}
         arp{"arapajó"}
+        ars{"árabe de Néyed"}
         bla{"siksiká"}
         eu{"vasco"}
         fon{"fon"}
@@ -95,7 +96,7 @@
             wara{"dígitos en Warang Citi"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
     characterLabelPattern{
         enclosed{"{0} — Adjunto"}
         extended{"{0} — Extendido"}
diff --git a/icu4c/source/data/lang/es_AR.txt b/icu4c/source/data/lang/es_AR.txt
index 0c870f5..4c9c1b1 100644
--- a/icu4c/source/data/lang/es_AR.txt
+++ b/icu4c/source/data/lang/es_AR.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_BO.txt b/icu4c/source/data/lang/es_BO.txt
index 47d0263..31017a9 100644
--- a/icu4c/source/data/lang/es_BO.txt
+++ b/icu4c/source/data/lang/es_BO.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_BR.txt b/icu4c/source/data/lang/es_BR.txt
index ee8a444..1115ce9 100644
--- a/icu4c/source/data/lang/es_BR.txt
+++ b/icu4c/source/data/lang/es_BR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BR{
     %%Parent{"es_419"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_BZ.txt b/icu4c/source/data/lang/es_BZ.txt
index 7734598..3d2302c 100644
--- a/icu4c/source/data/lang/es_BZ.txt
+++ b/icu4c/source/data/lang/es_BZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BZ{
     %%Parent{"es_419"}
-    Version{"2.1.32.37"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_CL.txt b/icu4c/source/data/lang/es_CL.txt
index c8710ef..d6922df 100644
--- a/icu4c/source/data/lang/es_CL.txt
+++ b/icu4c/source/data/lang/es_CL.txt
@@ -23,5 +23,5 @@
             phonebook{"orden de directorio telefónico"}
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_CO.txt b/icu4c/source/data/lang/es_CO.txt
index 21bda02..35378a7 100644
--- a/icu4c/source/data/lang/es_CO.txt
+++ b/icu4c/source/data/lang/es_CO.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_CR.txt b/icu4c/source/data/lang/es_CR.txt
index 6163d46..b312c2c 100644
--- a/icu4c/source/data/lang/es_CR.txt
+++ b/icu4c/source/data/lang/es_CR.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_CU.txt b/icu4c/source/data/lang/es_CU.txt
index f75d29f..3fb6de1 100644
--- a/icu4c/source/data/lang/es_CU.txt
+++ b/icu4c/source/data/lang/es_CU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CU{
     %%Parent{"es_419"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_DO.txt b/icu4c/source/data/lang/es_DO.txt
index f59748f..d4eb91f 100644
--- a/icu4c/source/data/lang/es_DO.txt
+++ b/icu4c/source/data/lang/es_DO.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_EC.txt b/icu4c/source/data/lang/es_EC.txt
index 3547826..85457a0 100644
--- a/icu4c/source/data/lang/es_EC.txt
+++ b/icu4c/source/data/lang/es_EC.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_GT.txt b/icu4c/source/data/lang/es_GT.txt
index 4b758c5..2ae89a6 100644
--- a/icu4c/source/data/lang/es_GT.txt
+++ b/icu4c/source/data/lang/es_GT.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_HN.txt b/icu4c/source/data/lang/es_HN.txt
index 3bf4d81..92f6618 100644
--- a/icu4c/source/data/lang/es_HN.txt
+++ b/icu4c/source/data/lang/es_HN.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_MX.txt b/icu4c/source/data/lang/es_MX.txt
index 713075f..c2502ba 100644
--- a/icu4c/source/data/lang/es_MX.txt
+++ b/icu4c/source/data/lang/es_MX.txt
@@ -112,7 +112,7 @@
             tibt{"Dígitos en tibetano"}
         }
     }
-    Version{"2.1.37.32"}
+    Version{"2.1.38.73"}
     characterLabelPattern{
         historic{"{0} — Históricos"}
         miscellaneous{"{0} — Varios"}
diff --git a/icu4c/source/data/lang/es_NI.txt b/icu4c/source/data/lang/es_NI.txt
index 28bbcd1..70fb58f 100644
--- a/icu4c/source/data/lang/es_NI.txt
+++ b/icu4c/source/data/lang/es_NI.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_PA.txt b/icu4c/source/data/lang/es_PA.txt
index d9f43ed..47c7033 100644
--- a/icu4c/source/data/lang/es_PA.txt
+++ b/icu4c/source/data/lang/es_PA.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_PE.txt b/icu4c/source/data/lang/es_PE.txt
index 10f89de..4582652 100644
--- a/icu4c/source/data/lang/es_PE.txt
+++ b/icu4c/source/data/lang/es_PE.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_PR.txt b/icu4c/source/data/lang/es_PR.txt
index 11c1889..8dfb486 100644
--- a/icu4c/source/data/lang/es_PR.txt
+++ b/icu4c/source/data/lang/es_PR.txt
@@ -11,5 +11,5 @@
         ss{"siswati"}
         wo{"wolof"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_PY.txt b/icu4c/source/data/lang/es_PY.txt
index 46ceadc..2496b0c 100644
--- a/icu4c/source/data/lang/es_PY.txt
+++ b/icu4c/source/data/lang/es_PY.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_SV.txt b/icu4c/source/data/lang/es_SV.txt
index f60c6b8..85f716d 100644
--- a/icu4c/source/data/lang/es_SV.txt
+++ b/icu4c/source/data/lang/es_SV.txt
@@ -11,5 +11,5 @@
         ss{"siswati"}
         wo{"wolof"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_US.txt b/icu4c/source/data/lang/es_US.txt
index 492171e..7647da4 100644
--- a/icu4c/source/data/lang/es_US.txt
+++ b/icu4c/source/data/lang/es_US.txt
@@ -64,7 +64,7 @@
             laoo{"números en lao"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     characterLabelPattern{
         historic{"{0} — Históricos"}
         miscellaneous{"{0} — Varios"}
diff --git a/icu4c/source/data/lang/es_UY.txt b/icu4c/source/data/lang/es_UY.txt
index cde08bb..8898960 100644
--- a/icu4c/source/data/lang/es_UY.txt
+++ b/icu4c/source/data/lang/es_UY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_UY{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/es_VE.txt b/icu4c/source/data/lang/es_VE.txt
index 7c00bcc..2464ac8 100644
--- a/icu4c/source/data/lang/es_VE.txt
+++ b/icu4c/source/data/lang/es_VE.txt
@@ -18,5 +18,5 @@
         wo{"wolof"}
         zgh{"tamazight marroquí estándar"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/et.txt b/icu4c/source/data/lang/et.txt
index c00810e..8da19fd 100644
--- a/icu4c/source/data/lang/et.txt
+++ b/icu4c/source/data/lang/et.txt
@@ -1036,7 +1036,7 @@
         VALENCIA{"valentsia"}
         WADEGILE{"Wade’i-Gilesi latinisatsioon"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} – kõik"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/eu.txt b/icu4c/source/data/lang/eu.txt
index cf4229b..81f4d46 100644
--- a/icu4c/source/data/lang/eu.txt
+++ b/icu4c/source/data/lang/eu.txt
@@ -27,7 +27,7 @@
         ace{"acehnera"}
         ach{"acholiera"}
         ada{"adangmera"}
-        ady{"adyghera"}
+        ady{"adigera"}
         af{"afrikaansa"}
         agq{"aghemera"}
         ain{"ainuera"}
@@ -423,7 +423,7 @@
         zza{"zazakia"}
     }
     Languages%short{
-        az{"azeriera"}
+        az{"azerbaijanera"}
         en_GB{"Erresuma Batuko ingelesa"}
         en_US{"AEBko ingelesa"}
     }
@@ -625,7 +625,7 @@
         SCOTLAND{"ESKOZIAR INGELESA"}
         VALENCIA{"VALENTZIERA"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — Guztiak"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ewo.txt b/icu4c/source/data/lang/ewo.txt
index 34457ce..6b8ff3e 100644
--- a/icu4c/source/data/lang/ewo.txt
+++ b/icu4c/source/data/lang/ewo.txt
@@ -48,5 +48,5 @@
         zh{"Ǹkɔ́bɔ tsainís"}
         zu{"ǹkɔ́bɔ zulú"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/fa.txt b/icu4c/source/data/lang/fa.txt
index 36cdb4f..fb18cae 100644
--- a/icu4c/source/data/lang/fa.txt
+++ b/icu4c/source/data/lang/fa.txt
@@ -855,7 +855,7 @@
         SAAHO{"ساهویی"}
         SCOTLAND{"انگلیسی معیار اسکاتلند"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — همه"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/fa_AF.txt b/icu4c/source/data/lang/fa_AF.txt
index f66dbcf..219d5a3 100644
--- a/icu4c/source/data/lang/fa_AF.txt
+++ b/icu4c/source/data/lang/fa_AF.txt
@@ -32,5 +32,5 @@
     Scripts{
         Mong{"مغلی"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/ff.txt b/icu4c/source/data/lang/ff.txt
index ee0eac3..7fdfe59 100644
--- a/icu4c/source/data/lang/ff.txt
+++ b/icu4c/source/data/lang/ff.txt
@@ -48,5 +48,5 @@
         zh{"Sinuwaare"}
         zu{"Suluŋkoore"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/fi.txt b/icu4c/source/data/lang/fi.txt
index e072633..0c1fa6b 100644
--- a/icu4c/source/data/lang/fi.txt
+++ b/icu4c/source/data/lang/fi.txt
@@ -51,6 +51,7 @@
         aro{"araona"}
         arp{"arapaho"}
         arq{"algerianarabia"}
+        ars{"arabia – najd"}
         arw{"arawak"}
         ary{"marokonarabia"}
         arz{"egyptinarabia"}
@@ -1117,7 +1118,7 @@
     Variants%secondary{
         FONUPA{"suomalais-ugrilainen tarkekirjoitus"}
     }
-    Version{"2.1.37.67"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} – kaikki"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/fil.txt b/icu4c/source/data/lang/fil.txt
index 23fae49..21a66aa 100644
--- a/icu4c/source/data/lang/fil.txt
+++ b/icu4c/source/data/lang/fil.txt
@@ -664,7 +664,7 @@
         PINYIN{"Pinyin Romanization"}
         WADEGILE{"Wade-Giles Romanization"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — lahat"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/fo.txt b/icu4c/source/data/lang/fo.txt
index 010370c..26f19ab 100644
--- a/icu4c/source/data/lang/fo.txt
+++ b/icu4c/source/data/lang/fo.txt
@@ -50,7 +50,7 @@
         bin{"bini"}
         bla{"siksika"}
         bm{"bambara"}
-        bn{"bengalskt"}
+        bn{"bangla"}
         bo{"tibetskt"}
         br{"bretonskt"}
         brx{"bodo"}
@@ -135,7 +135,7 @@
         hr{"kroatiskt"}
         hsb{"ovara sorbian"}
         hsn{"xiang kinesiskt"}
-        ht{"haitiskt"}
+        ht{"haitiskt creole"}
         hu{"ungarskt"}
         hup{"hupa"}
         hy{"armenskt"}
@@ -278,7 +278,7 @@
         nyn{"nyankole"}
         oc{"occitanskt"}
         om{"oromo"}
-        or{"oriya"}
+        or{"odia"}
         os{"ossetiskt"}
         pa{"punjabi"}
         pag{"pangasinan"}
@@ -419,7 +419,7 @@
     Scripts{
         Arab{"arabisk"}
         Armn{"armenskt"}
-        Beng{"bengali"}
+        Beng{"bangla"}
         Bopo{"bopomofo"}
         Brai{"blindaskrift"}
         Cyrl{"kyrilliskt"}
@@ -448,7 +448,7 @@
         Mlym{"malayalam"}
         Mong{"mongolsk"}
         Mymr{"myanmarskt"}
-        Orya{"oriya"}
+        Orya{"odia"}
         Sinh{"sinhala"}
         Taml{"tamilskt"}
         Telu{"telugu"}
@@ -511,7 +511,7 @@
             arabext{"víðkað arabisk tøl"}
             armn{"armensk tøl"}
             armnlow{"armensk tøl (smáir bókstavir)"}
-            beng{"bengalisk tøl"}
+            beng{"bangla tøl"}
             deva{"devanagarik tøl"}
             ethi{"etiopisk tøl"}
             fullwide{"tøl í fullari longd"}
@@ -534,7 +534,7 @@
             latn{"vesturlendsk tøl"}
             mlym{"malayalam tøl"}
             mymr{"myanmarsk tøl"}
-            orya{"oriya tøl"}
+            orya{"odia tøl"}
             roman{"rómartøl"}
             romanlow{"rómartøl (smáir bókstavir)"}
             taml{"vanlig tamilsk tøl"}
@@ -550,7 +550,7 @@
         POLYTON{"polytonísk"}
         WADEGILE{"Wade-Giles"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — Alt"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/fr.txt b/icu4c/source/data/lang/fr.txt
index 5c7d164..f72cee6 100644
--- a/icu4c/source/data/lang/fr.txt
+++ b/icu4c/source/data/lang/fr.txt
@@ -51,6 +51,7 @@
         aro{"araona"}
         arp{"arapaho"}
         arq{"arabe algérien"}
+        ars{"arabe najdi"}
         arw{"arawak"}
         ary{"arabe marocain"}
         arz{"arabe égyptien"}
@@ -966,7 +967,7 @@
         VALENCIA{"valencien"}
         WADEGILE{"Wade-Giles"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — tout"}
         category-list{"{0} : {1}"}
diff --git a/icu4c/source/data/lang/fr_BE.txt b/icu4c/source/data/lang/fr_BE.txt
index a81d1b9..bdba3ec 100644
--- a/icu4c/source/data/lang/fr_BE.txt
+++ b/icu4c/source/data/lang/fr_BE.txt
@@ -13,5 +13,5 @@
         smn{"same d’Inari"}
         sms{"same skolt"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/fr_CA.txt b/icu4c/source/data/lang/fr_CA.txt
index 9895510..a5859fe 100644
--- a/icu4c/source/data/lang/fr_CA.txt
+++ b/icu4c/source/data/lang/fr_CA.txt
@@ -95,7 +95,7 @@
             taml{"chiffres tamouls traditionnels"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     characterLabelPattern{
         category-list{"{0} : {1}"}
     }
diff --git a/icu4c/source/data/lang/fr_CH.txt b/icu4c/source/data/lang/fr_CH.txt
index 641e7be..579fe08 100644
--- a/icu4c/source/data/lang/fr_CH.txt
+++ b/icu4c/source/data/lang/fr_CH.txt
@@ -6,5 +6,5 @@
         pdc{"allemand de Pennsylvanie"}
         sdh{"kurde méridional"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.85"}
 }
diff --git a/icu4c/source/data/lang/fur.txt b/icu4c/source/data/lang/fur.txt
index 4ed7fd7..7c0f5ea 100644
--- a/icu4c/source/data/lang/fur.txt
+++ b/icu4c/source/data/lang/fur.txt
@@ -299,7 +299,7 @@
         SOLBA{"dialet di Stolvize"}
         VALENCIA{"valenzian"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"Lenghe: {0}"}
         script{"Scriture: {0}"}
diff --git a/icu4c/source/data/lang/fy.txt b/icu4c/source/data/lang/fy.txt
index b9ef37f..5949aa1 100644
--- a/icu4c/source/data/lang/fy.txt
+++ b/icu4c/source/data/lang/fy.txt
@@ -886,7 +886,7 @@
         VALLADER{"Vallader"}
         WADEGILE{"Wade-Giles-romanisering"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"Taal: {0}"}
         script{"Skrift: {0}"}
diff --git a/icu4c/source/data/lang/ga.txt b/icu4c/source/data/lang/ga.txt
index d61a170..b2a81df 100644
--- a/icu4c/source/data/lang/ga.txt
+++ b/icu4c/source/data/lang/ga.txt
@@ -853,7 +853,7 @@
         WADEGILE{"Rómhánú Wade-Giles"}
         XSISTEMO{"XSISTEMO"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — Uile"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/gd.txt b/icu4c/source/data/lang/gd.txt
index 07bb27d..addd5b7 100644
--- a/icu4c/source/data/lang/gd.txt
+++ b/icu4c/source/data/lang/gd.txt
@@ -1004,7 +1004,7 @@
         WADEGILE{"Ròmanachadh Wade-Giles"}
         XSISTEMO{"XSISTEMO"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} – na h-uile"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/gl.txt b/icu4c/source/data/lang/gl.txt
index d751b63..d2f4ae8 100644
--- a/icu4c/source/data/lang/gl.txt
+++ b/icu4c/source/data/lang/gl.txt
@@ -626,7 +626,7 @@
             vaii{"Díxitos Vai"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} (todo)"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/gsw.txt b/icu4c/source/data/lang/gsw.txt
index b7b3935..896d4e6 100644
--- a/icu4c/source/data/lang/gsw.txt
+++ b/icu4c/source/data/lang/gsw.txt
@@ -619,7 +619,7 @@
         SOLBA{"Solbica-Mundart"}
         TARASK{"Taraskievica-Rächtschriibig"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"Schpraach: {0}"}
         script{"Schrift: {0}"}
diff --git a/icu4c/source/data/lang/gu.txt b/icu4c/source/data/lang/gu.txt
index c6b40f3..041a86e 100644
--- a/icu4c/source/data/lang/gu.txt
+++ b/icu4c/source/data/lang/gu.txt
@@ -850,7 +850,7 @@
         PINYIN{"પિનયિન રોમનાઇઝેશન"}
         WADEGILE{"વેડ-ગિલ્સ રોમનાઇઝેશન"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — તમામ"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/guz.txt b/icu4c/source/data/lang/guz.txt
index 30c044f..98176b5 100644
--- a/icu4c/source/data/lang/guz.txt
+++ b/icu4c/source/data/lang/guz.txt
@@ -48,5 +48,5 @@
         zh{"Kichina"}
         zu{"Kizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/gv.txt b/icu4c/source/data/lang/gv.txt
index 4ee492e..0f8cfec 100644
--- a/icu4c/source/data/lang/gv.txt
+++ b/icu4c/source/data/lang/gv.txt
@@ -4,5 +4,5 @@
     Languages{
         gv{"Gaelg"}
     }
-    Version{"2.1.34.91"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/ha.txt b/icu4c/source/data/lang/ha.txt
index c5a2327..ff06e9d 100644
--- a/icu4c/source/data/lang/ha.txt
+++ b/icu4c/source/data/lang/ha.txt
@@ -47,5 +47,5 @@
         zh{"Harshen Sin"}
         zu{"Harshen Zulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/haw.txt b/icu4c/source/data/lang/haw.txt
index 947bb3d..f2d9903 100644
--- a/icu4c/source/data/lang/haw.txt
+++ b/icu4c/source/data/lang/haw.txt
@@ -40,5 +40,5 @@
         zh_Hans{"Pākē Hoʻomaʻalahi ʻia"}
         zh_Hant{"Pākē Kuʻuna"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/he.txt b/icu4c/source/data/lang/he.txt
index dd4e156..5c8aee8 100644
--- a/icu4c/source/data/lang/he.txt
+++ b/icu4c/source/data/lang/he.txt
@@ -46,6 +46,7 @@
         arc{"ארמית"}
         arn{"אראוקנית"}
         arp{"אראפהו"}
+        ars{"ערבית - נג׳ד"}
         arw{"ארוואק"}
         as{"אסאמית"}
         asa{"אסו"}
@@ -782,7 +783,7 @@
         SCOTLAND{"אנגלית סקוטית סטנדרטית"}
         WADEGILE{"ווייד-גיילס, שיטה לתעתוק סינית לאותיות לטיניות"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} - הכל"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/hi.txt b/icu4c/source/data/lang/hi.txt
index 3881e7f..f81dc4a 100644
--- a/icu4c/source/data/lang/hi.txt
+++ b/icu4c/source/data/lang/hi.txt
@@ -46,6 +46,7 @@
         arc{"ऐरेमेक"}
         arn{"मापूचे"}
         arp{"अरापाहो"}
+        ars{"नज्दी अरबी"}
         arw{"अरावक"}
         as{"असमिया"}
         asa{"असु"}
@@ -513,6 +514,7 @@
         was{"वाशो"}
         wbp{"वॉल्पेरी"}
         wo{"वोलोफ़"}
+        wuu{"वू चीनी"}
         xal{"काल्मिक"}
         xh{"ख़ोसा"}
         xog{"सोगा"}
@@ -838,7 +840,7 @@
         POSIX{"कम्प्यूटर"}
         REVISED{"संशोधित वर्तनी"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} - सभी"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/hr.txt b/icu4c/source/data/lang/hr.txt
index 4e6b6c0..7761aeb 100644
--- a/icu4c/source/data/lang/hr.txt
+++ b/icu4c/source/data/lang/hr.txt
@@ -46,6 +46,7 @@
         arc{"aramejski"}
         arn{"mapuche"}
         arp{"arapaho"}
+        ars{"najdi arapski"}
         arw{"aravački"}
         as{"asamski"}
         asa{"asu"}
@@ -915,7 +916,7 @@
         VALENCIA{"valencijski"}
         WADEGILE{"Wade-Giles romanizacija"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — Sve"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/hsb.txt b/icu4c/source/data/lang/hsb.txt
index 4d3dde8..acd303d 100644
--- a/icu4c/source/data/lang/hsb.txt
+++ b/icu4c/source/data/lang/hsb.txt
@@ -378,7 +378,7 @@
             tibt{"tibetske cyfry"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"rěč: {0}"}
         script{"pismo: {0}"}
diff --git a/icu4c/source/data/lang/hu.txt b/icu4c/source/data/lang/hu.txt
index 4b2503f..e31128d 100644
--- a/icu4c/source/data/lang/hu.txt
+++ b/icu4c/source/data/lang/hu.txt
@@ -46,6 +46,7 @@
         arc{"arámi"}
         arn{"mapucse"}
         arp{"arapaho"}
+        ars{"nedzsdi arab"}
         arw{"aravak"}
         as{"asszámi"}
         asa{"asu"}
@@ -899,7 +900,7 @@
         VALLADER{"Vallader"}
         WADEGILE{"Wade-Giles átírás"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} – összes"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/hy.txt b/icu4c/source/data/lang/hy.txt
index 8c3fc66..d70c8e7 100644
--- a/icu4c/source/data/lang/hy.txt
+++ b/icu4c/source/data/lang/hy.txt
@@ -620,7 +620,7 @@
         AREVELA{"արևելահայերեն"}
         AREVMDA{"արեւմտահայերէն"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — բոլորը"}
         category-list{"{0}՝ {1}"}
diff --git a/icu4c/source/data/lang/id.txt b/icu4c/source/data/lang/id.txt
index d9142e3..b54c37d 100644
--- a/icu4c/source/data/lang/id.txt
+++ b/icu4c/source/data/lang/id.txt
@@ -49,6 +49,7 @@
         arn{"Mapuche"}
         arp{"Arapaho"}
         arq{"Arab Aljazair"}
+        ars{"Arab Najdi"}
         arw{"Arawak"}
         ary{"Arab Maroko"}
         arz{"Arab Mesir"}
@@ -963,7 +964,7 @@
         VALLADER{"VALLADER"}
         WADEGILE{"Wade-Giles Latin"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — Semua"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ig.txt b/icu4c/source/data/lang/ig.txt
index 1bdccc7..c47cc84 100644
--- a/icu4c/source/data/lang/ig.txt
+++ b/icu4c/source/data/lang/ig.txt
@@ -47,5 +47,5 @@
         zh{"Mandarịịnị"}
         zu{"Zulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/ii.txt b/icu4c/source/data/lang/ii.txt
index 0692594..6791a47 100644
--- a/icu4c/source/data/lang/ii.txt
+++ b/icu4c/source/data/lang/ii.txt
@@ -33,7 +33,7 @@
             islamic{"ꑳꌦꇂꑍꉖ"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"ꅇꉙ: {0}"}
         script{"ꇇꁱ: {0}"}
diff --git a/icu4c/source/data/lang/is.txt b/icu4c/source/data/lang/is.txt
index a63d932..c5c284b 100644
--- a/icu4c/source/data/lang/is.txt
+++ b/icu4c/source/data/lang/is.txt
@@ -738,7 +738,7 @@
             vaii{"Vai-tölustafir"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — allt"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/it.txt b/icu4c/source/data/lang/it.txt
index 590fabe..2c57ec5 100644
--- a/icu4c/source/data/lang/it.txt
+++ b/icu4c/source/data/lang/it.txt
@@ -51,6 +51,7 @@
         aro{"araona"}
         arp{"arapaho"}
         arq{"arabo algerino"}
+        ars{"arabo, najd"}
         arw{"aruaco"}
         ary{"arabo marocchino"}
         arz{"arabo egiziano"}
@@ -1019,7 +1020,7 @@
         VALENCIA{"valenziano"}
         WADEGILE{"romanizzazione Wade-Giles"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.40"}
     characterLabelPattern{
         all{"{0} — Tutto"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ja.txt b/icu4c/source/data/lang/ja.txt
index d4259e4..cdd7b63 100644
--- a/icu4c/source/data/lang/ja.txt
+++ b/icu4c/source/data/lang/ja.txt
@@ -51,6 +51,7 @@
         aro{"アラオナ語"}
         arp{"アラパホー語"}
         arq{"アルジェリア・アラビア語"}
+        ars{"ナジュド地方・アラビア語"}
         arw{"アラワク語"}
         ary{"モロッコ・アラビア語"}
         arz{"エジプト・アラビア語"}
@@ -1046,7 +1047,7 @@
         VALLADER{"ヴァラダー"}
         WADEGILE{"ウェード式ローマ字表記法"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — すべて"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/jgo.txt b/icu4c/source/data/lang/jgo.txt
index 32b1ffa..510fed4 100644
--- a/icu4c/source/data/lang/jgo.txt
+++ b/icu4c/source/data/lang/jgo.txt
@@ -28,5 +28,5 @@
             latn{"pɛnɔ́mba"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/jmc.txt b/icu4c/source/data/lang/jmc.txt
index 7ce7db1..cdd7487 100644
--- a/icu4c/source/data/lang/jmc.txt
+++ b/icu4c/source/data/lang/jmc.txt
@@ -48,5 +48,5 @@
         zh{"Kyichina"}
         zu{"Kyizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/ka.txt b/icu4c/source/data/lang/ka.txt
index 0118130..c1574cf 100644
--- a/icu4c/source/data/lang/ka.txt
+++ b/icu4c/source/data/lang/ka.txt
@@ -734,7 +734,7 @@
             tibt{"ტიბეტური ციფრები"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — ყველა"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/kab.txt b/icu4c/source/data/lang/kab.txt
index 39e2919..a7055e8 100644
--- a/icu4c/source/data/lang/kab.txt
+++ b/icu4c/source/data/lang/kab.txt
@@ -48,5 +48,5 @@
         zh{"Tacinwat, Tamundarint"}
         zu{"Tazulut"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/kam.txt b/icu4c/source/data/lang/kam.txt
index 459765d..2ca1bc3 100644
--- a/icu4c/source/data/lang/kam.txt
+++ b/icu4c/source/data/lang/kam.txt
@@ -48,5 +48,5 @@
         zh{"Kichina"}
         zu{"Kizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/kde.txt b/icu4c/source/data/lang/kde.txt
index c14893b..77a69d0 100644
--- a/icu4c/source/data/lang/kde.txt
+++ b/icu4c/source/data/lang/kde.txt
@@ -48,5 +48,5 @@
         zh{"Chichina"}
         zu{"Chizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/kea.txt b/icu4c/source/data/lang/kea.txt
index 242e992..7190918 100644
--- a/icu4c/source/data/lang/kea.txt
+++ b/icu4c/source/data/lang/kea.txt
@@ -249,7 +249,7 @@
             latn{"Númerus Arábikus"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"Lingua: {0}"}
         script{"Skrita: {0}"}
diff --git a/icu4c/source/data/lang/khq.txt b/icu4c/source/data/lang/khq.txt
index e92cfce..3400714 100644
--- a/icu4c/source/data/lang/khq.txt
+++ b/icu4c/source/data/lang/khq.txt
@@ -48,5 +48,5 @@
         zh{"Sinuwa senni, Mandareŋ"}
         zu{"Julu senni"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/ki.txt b/icu4c/source/data/lang/ki.txt
index 149e846..6e5fafb 100644
--- a/icu4c/source/data/lang/ki.txt
+++ b/icu4c/source/data/lang/ki.txt
@@ -48,5 +48,5 @@
         zh{"Kĩcaina"}
         zu{"Kizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/kk.txt b/icu4c/source/data/lang/kk.txt
index 5550de9..19429db 100644
--- a/icu4c/source/data/lang/kk.txt
+++ b/icu4c/source/data/lang/kk.txt
@@ -545,7 +545,7 @@
             tibt{"Тибет сандары"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — барлығы"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/kkj.txt b/icu4c/source/data/lang/kkj.txt
index 42fc4de..5cd7b18 100644
--- a/icu4c/source/data/lang/kkj.txt
+++ b/icu4c/source/data/lang/kkj.txt
@@ -6,5 +6,5 @@
         fr{"numbu buy"}
         kkj{"kakɔ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/kl.txt b/icu4c/source/data/lang/kl.txt
index ea936cc..a57de76 100644
--- a/icu4c/source/data/lang/kl.txt
+++ b/icu4c/source/data/lang/kl.txt
@@ -4,7 +4,7 @@
     Languages{
         kl{"kalaallisut"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     localeDisplayPattern{
         keyTypePattern{"{0}: {1}"}
         pattern{"{0} ({1})"}
diff --git a/icu4c/source/data/lang/kln.txt b/icu4c/source/data/lang/kln.txt
index 703208c..0a5e45d 100644
--- a/icu4c/source/data/lang/kln.txt
+++ b/icu4c/source/data/lang/kln.txt
@@ -48,5 +48,5 @@
         zh{"kutitab China"}
         zu{"kutitab Zulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/km.txt b/icu4c/source/data/lang/km.txt
index 527b528..2d33f3e 100644
--- a/icu4c/source/data/lang/km.txt
+++ b/icu4c/source/data/lang/km.txt
@@ -535,7 +535,7 @@
             tibt{"លេខទីបេ"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — ទាំងអស់"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/kn.txt b/icu4c/source/data/lang/kn.txt
index 355489e..3c222d1 100644
--- a/icu4c/source/data/lang/kn.txt
+++ b/icu4c/source/data/lang/kn.txt
@@ -832,7 +832,7 @@
             vaii{"ವಾಯ್ ಅಂಕೆಗಳು"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — ಎಲ್ಲ"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ko.txt b/icu4c/source/data/lang/ko.txt
index b586588..892a68c 100644
--- a/icu4c/source/data/lang/ko.txt
+++ b/icu4c/source/data/lang/ko.txt
@@ -48,6 +48,7 @@
         arn{"마푸둔군어"}
         arp{"아라파호어"}
         arq{"알제리 아랍어"}
+        ars{"나즈디 아랍어"}
         arw{"아라와크어"}
         ary{"모로코 아랍어"}
         arz{"이집트 아랍어"}
@@ -918,7 +919,7 @@
         VAIDIKA{"바이디카"}
         VALLADER{"발라더"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — 전체"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/kok.txt b/icu4c/source/data/lang/kok.txt
index 144e73e..15884d7 100644
--- a/icu4c/source/data/lang/kok.txt
+++ b/icu4c/source/data/lang/kok.txt
@@ -430,7 +430,7 @@
             latn{"अस्तंत अंक"}
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"भाशा: {0}"}
         script{"लिपी: {0}"}
diff --git a/icu4c/source/data/lang/ks.txt b/icu4c/source/data/lang/ks.txt
index 0192c39..28879ee 100644
--- a/icu4c/source/data/lang/ks.txt
+++ b/icu4c/source/data/lang/ks.txt
@@ -609,7 +609,7 @@
         SOLBA{"ثٹولوِزا/سولبِکا بوٗلۍ"}
         TARASK{"تاراسکیٖوِکا علمہ ہِجاِ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"زَبان: {0}"}
         script{"رَسم الخط: {0}"}
diff --git a/icu4c/source/data/lang/ksb.txt b/icu4c/source/data/lang/ksb.txt
index b1c9434..e1bc714 100644
--- a/icu4c/source/data/lang/ksb.txt
+++ b/icu4c/source/data/lang/ksb.txt
@@ -48,5 +48,5 @@
         zh{"Kichina"}
         zu{"Kizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/ksf.txt b/icu4c/source/data/lang/ksf.txt
index 47e1db0..06f60c8 100644
--- a/icu4c/source/data/lang/ksf.txt
+++ b/icu4c/source/data/lang/ksf.txt
@@ -48,5 +48,5 @@
         zh{"ricinɔá"}
         zu{"rizúlu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/ksh.txt b/icu4c/source/data/lang/ksh.txt
index ce3217b..4baa1c6 100644
--- a/icu4c/source/data/lang/ksh.txt
+++ b/icu4c/source/data/lang/ksh.txt
@@ -512,7 +512,7 @@
         VALENCIA{"valenzijaanesche Dijaläk"}
         WADEGILE{"lateijnesche Ömschreff noh Wade-Giles"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"de Schprohch afjekööz met „{0}“"}
         script{"de Schreff afjekööz met „{0}“"}
diff --git a/icu4c/source/data/lang/kw.txt b/icu4c/source/data/lang/kw.txt
index f79afc1..2a31f81 100644
--- a/icu4c/source/data/lang/kw.txt
+++ b/icu4c/source/data/lang/kw.txt
@@ -4,5 +4,5 @@
     Languages{
         kw{"kernewek"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/ky.txt b/icu4c/source/data/lang/ky.txt
index 02c4fa2..6fa2abc 100644
--- a/icu4c/source/data/lang/ky.txt
+++ b/icu4c/source/data/lang/ky.txt
@@ -539,20 +539,20 @@
             tibt{"Тибет сандары"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
-        all{"{0} — Баары"}
+        all{"{0} — баары"}
         category-list{"{0}: {1}"}
-        compatibility{"{0} — Ылайыктуулук"}
-        enclosed{"{0} — Кашаага/Тырмакчага алынган"}
-        extended{"{0} — Кеңейтилген"}
-        historic{"{0} — Тарыхый"}
-        miscellaneous{"{0} — Башка"}
-        other{"{0} —Башкалар"}
+        compatibility{"{0} — ылайыктуулук"}
+        enclosed{"{0} — кашаага/тырмакчага алынган"}
+        extended{"{0} — кеңейтилген"}
+        historic{"{0} — тарыхый"}
+        miscellaneous{"{0} — башка"}
+        other{"{0} — башкалар"}
         scripts{"Жазуулар — {0}"}
         strokes{
             one{"{0} штрих"}
-            other{"{0} штрихтер"}
+            other{"{0} штрих"}
         }
     }
     codePatterns{
diff --git a/icu4c/source/data/lang/lag.txt b/icu4c/source/data/lang/lag.txt
index 94e43ca..a21e086 100644
--- a/icu4c/source/data/lang/lag.txt
+++ b/icu4c/source/data/lang/lag.txt
@@ -48,5 +48,5 @@
         zh{"Kɨchíina"}
         zu{"Kɨzúulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/lb.txt b/icu4c/source/data/lang/lb.txt
index db5c808..ce1b490 100644
--- a/icu4c/source/data/lang/lb.txt
+++ b/icu4c/source/data/lang/lb.txt
@@ -875,7 +875,7 @@
         VALENCIA{"Valencianesch"}
         WADEGILE{"Wade-Giles"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"Sprooch: {0}"}
         script{"Schrëft: {0}"}
diff --git a/icu4c/source/data/lang/lg.txt b/icu4c/source/data/lang/lg.txt
index 01be37d..9ee186d 100644
--- a/icu4c/source/data/lang/lg.txt
+++ b/icu4c/source/data/lang/lg.txt
@@ -48,5 +48,5 @@
         zh{"Lucayina"}
         zu{"Luzzulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/lkt.txt b/icu4c/source/data/lang/lkt.txt
index 886ba5c..b9189e3 100644
--- a/icu4c/source/data/lang/lkt.txt
+++ b/icu4c/source/data/lang/lkt.txt
@@ -152,5 +152,5 @@
         zu{"Zulu Iyápi"}
         zza{"Zaza Iyápi"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/ln.txt b/icu4c/source/data/lang/ln.txt
index e509f0a..6de8280 100644
--- a/icu4c/source/data/lang/ln.txt
+++ b/icu4c/source/data/lang/ln.txt
@@ -48,5 +48,5 @@
         zh{"lisinwa"}
         zu{"zulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/lo.txt b/icu4c/source/data/lang/lo.txt
index cd31914..ede722e 100644
--- a/icu4c/source/data/lang/lo.txt
+++ b/icu4c/source/data/lang/lo.txt
@@ -875,7 +875,7 @@
         VALLADER{"ວັລລາເດີ"}
         WADEGILE{"ການຖອດອັກສອນແບບເວດ-ໄຈລ໌"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — ທັງໝົດ"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/lrc.txt b/icu4c/source/data/lang/lrc.txt
index 5886f82..7e4fb7a 100644
--- a/icu4c/source/data/lang/lrc.txt
+++ b/icu4c/source/data/lang/lrc.txt
@@ -296,7 +296,7 @@
             latn{"عأدأدیا لاتین"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"{0}"}
         script{"{0}"}
diff --git a/icu4c/source/data/lang/lt.txt b/icu4c/source/data/lang/lt.txt
index eea7b9f..7fabc41 100644
--- a/icu4c/source/data/lang/lt.txt
+++ b/icu4c/source/data/lang/lt.txt
@@ -1023,7 +1023,7 @@
         VALENCIA{"Valenciečiai"}
         WADEGILE{"Wade-Giles Romanization"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} – visi"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/lu.txt b/icu4c/source/data/lang/lu.txt
index 8619c93..e46b803 100644
--- a/icu4c/source/data/lang/lu.txt
+++ b/icu4c/source/data/lang/lu.txt
@@ -46,5 +46,5 @@
         zh{"shinɛ"}
         zu{"Nzulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/luo.txt b/icu4c/source/data/lang/luo.txt
index e1eabd1..67331cc 100644
--- a/icu4c/source/data/lang/luo.txt
+++ b/icu4c/source/data/lang/luo.txt
@@ -48,5 +48,5 @@
         zh{"Kichina"}
         zu{"Kizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/luy.txt b/icu4c/source/data/lang/luy.txt
index b4aa87f..125659c 100644
--- a/icu4c/source/data/lang/luy.txt
+++ b/icu4c/source/data/lang/luy.txt
@@ -48,5 +48,5 @@
         zh{"Kichina"}
         zu{"Kizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/lv.txt b/icu4c/source/data/lang/lv.txt
index 4ae6092..a97e768 100644
--- a/icu4c/source/data/lang/lv.txt
+++ b/icu4c/source/data/lang/lv.txt
@@ -796,7 +796,7 @@
         VALENCIA{"valensiešu"}
         WADEGILE{"Veida-Džailza romanizācija"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — visas"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/mas.txt b/icu4c/source/data/lang/mas.txt
index 1f85adb..0ad6dbe 100644
--- a/icu4c/source/data/lang/mas.txt
+++ b/icu4c/source/data/lang/mas.txt
@@ -48,5 +48,5 @@
         zh{"nkʉtʉ́k ɔ́ɔ̄ lchina"}
         zu{"nkʉtʉ́k ɔ́ɔ̄ lzulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/mer.txt b/icu4c/source/data/lang/mer.txt
index ccb4a34..a2f70d2 100644
--- a/icu4c/source/data/lang/mer.txt
+++ b/icu4c/source/data/lang/mer.txt
@@ -48,5 +48,5 @@
         zh{"Kĩchina"}
         zu{"Kĩzulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/mfe.txt b/icu4c/source/data/lang/mfe.txt
index c93d3ac..2fdd8aa 100644
--- a/icu4c/source/data/lang/mfe.txt
+++ b/icu4c/source/data/lang/mfe.txt
@@ -48,5 +48,5 @@
         zh{"sinwa, mandarin"}
         zu{"zoulou"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/mg.txt b/icu4c/source/data/lang/mg.txt
index a3eebf6..0cb6977 100644
--- a/icu4c/source/data/lang/mg.txt
+++ b/icu4c/source/data/lang/mg.txt
@@ -48,5 +48,5 @@
         zh{"Sinoa, Mandarin"}
         zu{"Zolò"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/mgh.txt b/icu4c/source/data/lang/mgh.txt
index 66742c2..9e3d14c 100644
--- a/icu4c/source/data/lang/mgh.txt
+++ b/icu4c/source/data/lang/mgh.txt
@@ -47,5 +47,5 @@
         zh{"Ichina"}
         zu{"Izulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/mgo.txt b/icu4c/source/data/lang/mgo.txt
index 228ed1f..620aa03 100644
--- a/icu4c/source/data/lang/mgo.txt
+++ b/icu4c/source/data/lang/mgo.txt
@@ -18,7 +18,7 @@
             latn{"inu"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"{0}"}
         script{"{0}"}
diff --git a/icu4c/source/data/lang/mk.txt b/icu4c/source/data/lang/mk.txt
index 5fb687b..800e80a 100644
--- a/icu4c/source/data/lang/mk.txt
+++ b/icu4c/source/data/lang/mk.txt
@@ -908,7 +908,7 @@
         PINYIN{"Пинјин романизација"}
         WADEGILE{"Вејд-Џајлс романизација"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} - сите"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ml.txt b/icu4c/source/data/lang/ml.txt
index 4de7ff2..3d569a4 100644
--- a/icu4c/source/data/lang/ml.txt
+++ b/icu4c/source/data/lang/ml.txt
@@ -899,7 +899,7 @@
         POSIX{"കമ്പ്യൂട്ടർ"}
         REVISED{"പരിഷ്ക്കരിച്ച ലിപി"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — എല്ലാം"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/mn.txt b/icu4c/source/data/lang/mn.txt
index 17e2cfa..5f9da33 100644
--- a/icu4c/source/data/lang/mn.txt
+++ b/icu4c/source/data/lang/mn.txt
@@ -100,6 +100,9 @@
         en_US{"америк-англи"}
         eo{"эсперанто"}
         es{"испани"}
+        es_419{"испани хэл (Латин Америк)"}
+        es_ES{"испани хэл (Европ)"}
+        es_MX{"испани хэл (Мексик)"}
         et{"эстони"}
         eu{"баск"}
         ewo{"эвондо"}
@@ -289,6 +292,8 @@
         prg{"прусс"}
         ps{"пашто"}
         pt{"португал"}
+        pt_BR{"португал хэл (Бразил)"}
+        pt_PT{"португал хэл (Европ)"}
         qu{"кечуа"}
         quc{"киче"}
         rap{"рапануи"}
@@ -374,7 +379,7 @@
         ug{"уйгур"}
         uk{"украин"}
         umb{"умбунду"}
-        und{"тодорхойгүй хэл"}
+        und{"Үл мэдэгдэх хэл"}
         ur{"урду"}
         uz{"узбек"}
         vai{"вай"}
@@ -412,7 +417,7 @@
     Scripts{
         Arab{"араб"}
         Armn{"армени"}
-        Beng{"бенгал"}
+        Beng{"бенгал хэл"}
         Bopo{"вопомофо"}
         Brai{"брайл"}
         Cyrl{"кирилл"}
@@ -537,7 +542,7 @@
             tibt{"төвд тоо"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} - Бүгд"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/mr.txt b/icu4c/source/data/lang/mr.txt
index 676441a..3b96bc0 100644
--- a/icu4c/source/data/lang/mr.txt
+++ b/icu4c/source/data/lang/mr.txt
@@ -835,7 +835,7 @@
         PINYIN{"पिनयिन रोमनायझेशन"}
         WADEGILE{"वादे-गिलेस रोमनायझेशन"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — सर्व"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ms.txt b/icu4c/source/data/lang/ms.txt
index 3193252..3269e0d 100644
--- a/icu4c/source/data/lang/ms.txt
+++ b/icu4c/source/data/lang/ms.txt
@@ -44,6 +44,7 @@
         arn{"Mapuche"}
         arp{"Arapaho"}
         arq{"Arab Algeria"}
+        ars{"Arab Najdi"}
         ary{"Arab Maghribi"}
         arz{"Arab Mesir"}
         as{"Assam"}
@@ -716,7 +717,7 @@
     Variants{
         POSIX{"Komputer"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — Semua"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/mt.txt b/icu4c/source/data/lang/mt.txt
index ce45bf8..785b77f 100644
--- a/icu4c/source/data/lang/mt.txt
+++ b/icu4c/source/data/lang/mt.txt
@@ -559,7 +559,7 @@
     Variants{
         REVISED{"Ortografija Irriveda"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"Lingwa: {0}"}
         script{"Skript: {0}"}
diff --git a/icu4c/source/data/lang/mua.txt b/icu4c/source/data/lang/mua.txt
index e496e16..b56a806 100644
--- a/icu4c/source/data/lang/mua.txt
+++ b/icu4c/source/data/lang/mua.txt
@@ -48,5 +48,5 @@
         zh{"zah Syiŋ"}
         zu{"Zulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/my.txt b/icu4c/source/data/lang/my.txt
index 6df87e7..5e2b827 100644
--- a/icu4c/source/data/lang/my.txt
+++ b/icu4c/source/data/lang/my.txt
@@ -580,7 +580,7 @@
         REVISED{"ပြန်လည်စီစစ်ထားသော ရေးထုံး"}
         SCOTLAND{"စကော့ စံ အင်္ဂလိပ်"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — အားလုံး"}
         category-list{"{0} − {1}"}
diff --git a/icu4c/source/data/lang/mzn.txt b/icu4c/source/data/lang/mzn.txt
index 5720a5c..865df12 100644
--- a/icu4c/source/data/lang/mzn.txt
+++ b/icu4c/source/data/lang/mzn.txt
@@ -265,7 +265,7 @@
         Hans{"ساده‌بَیی هان"}
         Hant{"استاندارد ِسنتی هانت"}
     }
-    Version{"2.1.31.86"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"زوون: {0}"}
         script{"اسکریپت: {0}"}
diff --git a/icu4c/source/data/lang/naq.txt b/icu4c/source/data/lang/naq.txt
index 85a342a..3f60d70 100644
--- a/icu4c/source/data/lang/naq.txt
+++ b/icu4c/source/data/lang/naq.txt
@@ -48,5 +48,5 @@
         zh{"Chineesǁî gowab, Mandarinni"}
         zu{"Zulub"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/nb.txt b/icu4c/source/data/lang/nb.txt
index bbed1d0..931d327 100644
--- a/icu4c/source/data/lang/nb.txt
+++ b/icu4c/source/data/lang/nb.txt
@@ -51,6 +51,7 @@
         aro{"araona"}
         arp{"arapaho"}
         arq{"algerisk arabisk"}
+        ars{"najdi-arabisk"}
         arw{"arawak"}
         ary{"marokkansk-arabisk"}
         arz{"egyptisk arabisk"}
@@ -1096,7 +1097,7 @@
         VALLADER{"vallader"}
         WADEGILE{"Wade-Giles-romanisering"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} – alt"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/nd.txt b/icu4c/source/data/lang/nd.txt
index 22457ed..460668e 100644
--- a/icu4c/source/data/lang/nd.txt
+++ b/icu4c/source/data/lang/nd.txt
@@ -48,5 +48,5 @@
         zh{"isi-China"}
         zu{"isi-Zulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/nds.txt b/icu4c/source/data/lang/nds.txt
index d293203..0f3ddc3 100644
--- a/icu4c/source/data/lang/nds.txt
+++ b/icu4c/source/data/lang/nds.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nds{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/ne.txt b/icu4c/source/data/lang/ne.txt
index fd0525b..b3cfb55 100644
--- a/icu4c/source/data/lang/ne.txt
+++ b/icu4c/source/data/lang/ne.txt
@@ -127,6 +127,7 @@
         dar{"दार्ग्वा"}
         dav{"ताइता"}
         de{"जर्मन"}
+        de_AT{"अस्ट्रिएन जर्मन"}
         de_CH{"स्वीस हाई जर्मन"}
         del{"देलावर"}
         dgr{"दोग्रिब"}
@@ -177,6 +178,7 @@
         fon{"फोन"}
         fr{"फ्रान्सेली"}
         fr_CA{"क्यानेडाली फ्रान्सेली"}
+        fr_CH{"स्विस फ्रेन्च"}
         frc{"काहुन फ्रान्सेली"}
         frm{"मध्य फ्रान्सेली"}
         fro{"पुरातन फ्रान्सेली"}
@@ -795,7 +797,7 @@
         AREVELA{"पूर्वी आर्मेनियाली"}
         POSIX{"कम्प्युटर"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0}-सबै"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/nl.txt b/icu4c/source/data/lang/nl.txt
index 54546b7..3d1bca2 100644
--- a/icu4c/source/data/lang/nl.txt
+++ b/icu4c/source/data/lang/nl.txt
@@ -50,6 +50,7 @@
         aro{"Araona"}
         arp{"Arapaho"}
         arq{"Algerijns Arabisch"}
+        ars{"Nadjdi-Arabisch"}
         arw{"Arawak"}
         ary{"Marokkaans Arabisch"}
         arz{"Egyptisch Arabisch"}
@@ -1131,7 +1132,7 @@
         WADEGILE{"Wade-Giles-romanisering"}
         XSISTEMO{"X-sistemo"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — alle"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/nmg.txt b/icu4c/source/data/lang/nmg.txt
index 87951c7..3898596 100644
--- a/icu4c/source/data/lang/nmg.txt
+++ b/icu4c/source/data/lang/nmg.txt
@@ -47,5 +47,5 @@
         zh{"Kiɛl bó chinois"}
         zu{"Zulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/nn.txt b/icu4c/source/data/lang/nn.txt
index 03743c2..520db43 100644
--- a/icu4c/source/data/lang/nn.txt
+++ b/icu4c/source/data/lang/nn.txt
@@ -761,7 +761,7 @@
         TARASK{"taraskievica-ortografi"}
         VALENCIA{"valensisk dialekt"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} – alt"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/nnh.txt b/icu4c/source/data/lang/nnh.txt
index 36037a4..0abdf1d 100644
--- a/icu4c/source/data/lang/nnh.txt
+++ b/icu4c/source/data/lang/nnh.txt
@@ -24,5 +24,5 @@
         yav{"Shwóŋò pʉa shÿó Mbafìa"}
         ybb{"Shwóŋò Tsaŋ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/nus.txt b/icu4c/source/data/lang/nus.txt
index 8eb6712..ae8876b 100644
--- a/icu4c/source/data/lang/nus.txt
+++ b/icu4c/source/data/lang/nus.txt
@@ -48,5 +48,5 @@
         zh{"Thok cayna"}
         zu{"Thok dhuluni"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/nyn.txt b/icu4c/source/data/lang/nyn.txt
index 42d4806..c412905 100644
--- a/icu4c/source/data/lang/nyn.txt
+++ b/icu4c/source/data/lang/nyn.txt
@@ -48,5 +48,5 @@
         zh{"Oruchaina"}
         zu{"Oruzuru"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/om.txt b/icu4c/source/data/lang/om.txt
index 0eb0bc4..5970279 100644
--- a/icu4c/source/data/lang/om.txt
+++ b/icu4c/source/data/lang/om.txt
@@ -92,5 +92,5 @@
     Scripts{
         Latn{"Latin"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/os.txt b/icu4c/source/data/lang/os.txt
index 86c1765..877525f 100644
--- a/icu4c/source/data/lang/os.txt
+++ b/icu4c/source/data/lang/os.txt
@@ -96,7 +96,7 @@
             latn{"Нырыккон цифрӕтӕ"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"Ӕвзаг: {0}"}
         script{"Скрипт: {0}"}
diff --git a/icu4c/source/data/lang/pa.txt b/icu4c/source/data/lang/pa.txt
index d69c2d0..6a1c732 100644
--- a/icu4c/source/data/lang/pa.txt
+++ b/icu4c/source/data/lang/pa.txt
@@ -82,6 +82,7 @@
         dav{"ਟੇਟਾ"}
         de{"ਜਰਮਨ"}
         de_AT{"ਜਰਮਨ (ਆਸਟਰੀਆਈ)"}
+        de_CH{"ਹਾਈ ਜਰਮਨ (ਸਵਿਟਜ਼ਰਲੈਂਡ)"}
         dgr{"ਡੋਗਰਿੱਬ"}
         dje{"ਜ਼ਾਰਮਾ"}
         dsb{"ਲੋਅਰ ਸੋਰਬੀਅਨ"}
@@ -563,7 +564,7 @@
             tibt{"ਤਿੱਬਤੀ ਅੰਕ"}
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — ਸਭ"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/pa_Arab.txt b/icu4c/source/data/lang/pa_Arab.txt
index 042f876..f53e52b 100644
--- a/icu4c/source/data/lang/pa_Arab.txt
+++ b/icu4c/source/data/lang/pa_Arab.txt
@@ -9,5 +9,5 @@
         Arab{"عربی"}
         Guru{"گُرمُکھی"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/pa_Guru.txt b/icu4c/source/data/lang/pa_Guru.txt
index a731d5e..e558d24 100644
--- a/icu4c/source/data/lang/pa_Guru.txt
+++ b/icu4c/source/data/lang/pa_Guru.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa_Guru{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/pl.txt b/icu4c/source/data/lang/pl.txt
index 32a91df..7622c36 100644
--- a/icu4c/source/data/lang/pl.txt
+++ b/icu4c/source/data/lang/pl.txt
@@ -51,6 +51,7 @@
         aro{"araona"}
         arp{"arapaho"}
         arq{"algierski arabski"}
+        ars{"arabski nadżdyjski"}
         arw{"arawak"}
         ary{"marokański arabski"}
         arz{"egipski arabski"}
@@ -965,7 +966,7 @@
         VALENCIA{"walencki"}
         WADEGILE{"latynizacja Wade’a i Gilesa"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.15"}
     characterLabelPattern{
         all{"{0} — wszystko"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/pool.res b/icu4c/source/data/lang/pool.res
index f741932..08c3d35 100644
--- a/icu4c/source/data/lang/pool.res
+++ b/icu4c/source/data/lang/pool.res
Binary files differ
diff --git a/icu4c/source/data/lang/ps.txt b/icu4c/source/data/lang/ps.txt
index 505de25..81aa3f8 100644
--- a/icu4c/source/data/lang/ps.txt
+++ b/icu4c/source/data/lang/ps.txt
@@ -96,6 +96,8 @@
         el{"یوناني"}
         en{"انګریزي"}
         en_AU{"انګریزي (AU)"}
+        en_CA{"کاناډايي انګلیسي"}
+        en_GB{"برتانوی انګلیسي"}
         en_US{"انګریزي (US)"}
         eo{"اسپرانتو"}
         es{"هسپانوي"}
@@ -291,9 +293,10 @@
         quc{"کچی"}
         rap{"رپانوئي"}
         rar{"راروټانګان"}
-        rm{"رومانش"}
+        rm{"رومانیش"}
         rn{"رونډی"}
-        ro{"روماني"}
+        ro{"رومانیایی"}
+        ro_MD{"مولداویایی"}
         rof{"رومبو"}
         root{"روټ"}
         ru{"روسي"}
@@ -338,6 +341,7 @@
         suk{"سکوما"}
         sv{"سویډنی"}
         sw{"سواهېلي"}
+        sw_CD{"کانګو سواهلی"}
         swb{"کومورياني"}
         syr{"سوریاني"}
         ta{"تامیل"}
@@ -531,7 +535,7 @@
             tibt{"tibt"}
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} - ټول"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/pt.txt b/icu4c/source/data/lang/pt.txt
index 8e43d46..046cc5d 100644
--- a/icu4c/source/data/lang/pt.txt
+++ b/icu4c/source/data/lang/pt.txt
@@ -46,6 +46,7 @@
         arc{"aramaico"}
         arn{"mapudungun"}
         arp{"arapaho"}
+        ars{"árabe - Négede"}
         arw{"arauaqui"}
         as{"assamês"}
         asa{"asu"}
@@ -879,7 +880,7 @@
         VALENCIA{"valenciano"}
         WADEGILE{"romanização Wade-Giles"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — Tudo"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/pt_AO.txt b/icu4c/source/data/lang/pt_AO.txt
index 5a8f6f2..4a41792 100644
--- a/icu4c/source/data/lang/pt_AO.txt
+++ b/icu4c/source/data/lang/pt_AO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_AO{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/pt_CH.txt b/icu4c/source/data/lang/pt_CH.txt
index 90d6a1e..acd87d8 100644
--- a/icu4c/source/data/lang/pt_CH.txt
+++ b/icu4c/source/data/lang/pt_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CH{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/pt_CV.txt b/icu4c/source/data/lang/pt_CV.txt
index 6b3cbbb..a42064f 100644
--- a/icu4c/source/data/lang/pt_CV.txt
+++ b/icu4c/source/data/lang/pt_CV.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CV{
     %%Parent{"pt_PT"}
-    Version{"2.1.35.71"}
+    Version{"2.1.39.12"}
 }
diff --git a/icu4c/source/data/lang/pt_GQ.txt b/icu4c/source/data/lang/pt_GQ.txt
index 793e060..8a8947f 100644
--- a/icu4c/source/data/lang/pt_GQ.txt
+++ b/icu4c/source/data/lang/pt_GQ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GQ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/pt_GW.txt b/icu4c/source/data/lang/pt_GW.txt
index e137e51..f131573 100644
--- a/icu4c/source/data/lang/pt_GW.txt
+++ b/icu4c/source/data/lang/pt_GW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GW{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/pt_LU.txt b/icu4c/source/data/lang/pt_LU.txt
index e6d1c60..d30ba91 100644
--- a/icu4c/source/data/lang/pt_LU.txt
+++ b/icu4c/source/data/lang/pt_LU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_LU{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/pt_MO.txt b/icu4c/source/data/lang/pt_MO.txt
index 76fe46e..fb39284 100644
--- a/icu4c/source/data/lang/pt_MO.txt
+++ b/icu4c/source/data/lang/pt_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_MO{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/pt_MZ.txt b/icu4c/source/data/lang/pt_MZ.txt
index b86fd1e..1274cac 100644
--- a/icu4c/source/data/lang/pt_MZ.txt
+++ b/icu4c/source/data/lang/pt_MZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_MZ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/pt_PT.txt b/icu4c/source/data/lang/pt_PT.txt
index d2f5a73..26ca27e 100644
--- a/icu4c/source/data/lang/pt_PT.txt
+++ b/icu4c/source/data/lang/pt_PT.txt
@@ -17,6 +17,7 @@
         ang{"inglês antigo"}
         ar_001{"árabe moderno padrão"}
         arn{"mapuche"}
+        ars{"árabe do Négede"}
         av{"avaric"}
         bax{"bamun"}
         bbj{"ghomala"}
@@ -40,6 +41,7 @@
         en_US{"inglês americano"}
         es_419{"espanhol latino-americano"}
         es_ES{"espanhol europeu"}
+        es_MX{"espanhol mexicano"}
         et{"estónio"}
         fon{"fon"}
         fr_CA{"francês canadiano"}
@@ -249,7 +251,7 @@
         MONOTON{"monotónico"}
         POLYTON{"politónico"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} – tudo"}
         compatibility{"{0} – compatibilidade"}
diff --git a/icu4c/source/data/lang/pt_ST.txt b/icu4c/source/data/lang/pt_ST.txt
index 95f596c..3d6d885 100644
--- a/icu4c/source/data/lang/pt_ST.txt
+++ b/icu4c/source/data/lang/pt_ST.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_ST{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/pt_TL.txt b/icu4c/source/data/lang/pt_TL.txt
index 786b602..0f0ddb9 100644
--- a/icu4c/source/data/lang/pt_TL.txt
+++ b/icu4c/source/data/lang/pt_TL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_TL{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/qu.txt b/icu4c/source/data/lang/qu.txt
index d048ddb..fd2747d 100644
--- a/icu4c/source/data/lang/qu.txt
+++ b/icu4c/source/data/lang/qu.txt
@@ -134,5 +134,5 @@
     Variants{
         VALENCIA{"Valenciano Simi"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/lang/resfiles.mk b/icu4c/source/data/lang/resfiles.mk
index aa1bd06..a563fae 100644
--- a/icu4c/source/data/lang/resfiles.mk
+++ b/icu4c/source/data/lang/resfiles.mk
@@ -1,6 +1,6 @@
 # © 2016 and later: Unicode, Inc. and others.
 # License & terms of use: http://www.unicode.org/copyright.html#License
-LANG_CLDR_VERSION = 32.0.1
+LANG_CLDR_VERSION = 33
 # A list of txt's to build
 # Note:
 #
diff --git a/icu4c/source/data/lang/rm.txt b/icu4c/source/data/lang/rm.txt
index a215938..cfa1bda 100644
--- a/icu4c/source/data/lang/rm.txt
+++ b/icu4c/source/data/lang/rm.txt
@@ -627,7 +627,7 @@
         TARASK{"ortografia taraskievica"}
         VALENCIA{"valencian"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"Lingua: {0}"}
         script{"Scrittira: {0}"}
diff --git a/icu4c/source/data/lang/rn.txt b/icu4c/source/data/lang/rn.txt
index 990a524..f7c45bd 100644
--- a/icu4c/source/data/lang/rn.txt
+++ b/icu4c/source/data/lang/rn.txt
@@ -48,5 +48,5 @@
         zh{"Igishinwa"}
         zu{"Ikizulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/ro.txt b/icu4c/source/data/lang/ro.txt
index 0d5f71c..c2a3882 100644
--- a/icu4c/source/data/lang/ro.txt
+++ b/icu4c/source/data/lang/ro.txt
@@ -46,6 +46,7 @@
         arc{"aramaică"}
         arn{"mapuche"}
         arp{"arapaho"}
+        ars{"arabă najdi"}
         arw{"arawak"}
         as{"asameză"}
         asa{"asu"}
@@ -777,7 +778,7 @@
         SCOTLAND{"engleză standard scoțiană"}
         WADEGILE{"Wade-Giles"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} – toate"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ro_MD.txt b/icu4c/source/data/lang/ro_MD.txt
index f9c3959..bc043ba 100644
--- a/icu4c/source/data/lang/ro_MD.txt
+++ b/icu4c/source/data/lang/ro_MD.txt
@@ -5,5 +5,5 @@
         sw_CD{"swahili (R. D. Congo)"}
         wal{"wolaytta"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/rof.txt b/icu4c/source/data/lang/rof.txt
index 957eacd..22a2f49 100644
--- a/icu4c/source/data/lang/rof.txt
+++ b/icu4c/source/data/lang/rof.txt
@@ -48,5 +48,5 @@
         zh{"Kichina"}
         zu{"Kizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/root.txt b/icu4c/source/data/lang/root.txt
index 1c8b521..9248120 100644
--- a/icu4c/source/data/lang/root.txt
+++ b/icu4c/source/data/lang/root.txt
@@ -4,7 +4,7 @@
  * ICU <specials> source: <path>/common/main/root.xml
  */
 root{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.27"}
     characterLabelPattern{
         all{"{0} — all"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ru.txt b/icu4c/source/data/lang/ru.txt
index 390db96..698bf6e 100644
--- a/icu4c/source/data/lang/ru.txt
+++ b/icu4c/source/data/lang/ru.txt
@@ -46,6 +46,7 @@
         arc{"арамейский"}
         arn{"мапуче"}
         arp{"арапахо"}
+        ars{"арабская — недждийская"}
         arw{"аравакский"}
         as{"ассамский"}
         asa{"асу"}
@@ -606,8 +607,8 @@
         Hang{"хангыль"}
         Hani{"китайская"}
         Hano{"хануну"}
-        Hans{"упрощенный"}
-        Hant{"традиционный"}
+        Hans{"упрощенная китайская"}
+        Hant{"традиционная китайская"}
         Hebr{"еврейская"}
         Hira{"хирагана"}
         Hluw{"лувийские иероглифы"}
@@ -916,17 +917,17 @@
         VALENCIA{"Валенсийский"}
         WADEGILE{"Система Уэйда – Джайлза"}
     }
-    Version{"2.1.37.58"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
-        all{"{0} – все"}
+        all{"{0} — все"}
         category-list{"{0}: {1}"}
-        compatibility{"{0} – совместимые"}
-        enclosed{"{0} – вложенные"}
-        extended{"{0} – расширенные"}
-        historic{"{0} – исторические"}
-        miscellaneous{"{0} – разное"}
-        other{"{0} – другое"}
-        scripts{"письменность – {0}"}
+        compatibility{"{0} — совместимые"}
+        enclosed{"{0} — вложенные"}
+        extended{"{0} — расширенные"}
+        historic{"{0} — исторические"}
+        miscellaneous{"{0} — разное"}
+        other{"{0} — другое"}
+        scripts{"письменности — {0}"}
         strokes{
             few{"{0} черты"}
             many{"{0} черт"}
diff --git a/icu4c/source/data/lang/rw.txt b/icu4c/source/data/lang/rw.txt
index c092305..596277c 100644
--- a/icu4c/source/data/lang/rw.txt
+++ b/icu4c/source/data/lang/rw.txt
@@ -108,5 +108,5 @@
         yi{"Inyeyidishi"}
         zu{"Inyezulu"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/lang/rwk.txt b/icu4c/source/data/lang/rwk.txt
index 7d2b01f..877c30a 100644
--- a/icu4c/source/data/lang/rwk.txt
+++ b/icu4c/source/data/lang/rwk.txt
@@ -48,5 +48,5 @@
         zh{"Kyichina"}
         zu{"Kyizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/sah.txt b/icu4c/source/data/lang/sah.txt
index f834006..7a4a59f 100644
--- a/icu4c/source/data/lang/sah.txt
+++ b/icu4c/source/data/lang/sah.txt
@@ -91,7 +91,7 @@
             h24{"24 чаастаах тиһик (0–24)"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     characterLabelPattern{
         strokes{
             other{"{0} Strokes"}
diff --git a/icu4c/source/data/lang/saq.txt b/icu4c/source/data/lang/saq.txt
index 46d808b..174c4dd 100644
--- a/icu4c/source/data/lang/saq.txt
+++ b/icu4c/source/data/lang/saq.txt
@@ -48,5 +48,5 @@
         zh{"Kichina"}
         zu{"Kizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/sbp.txt b/icu4c/source/data/lang/sbp.txt
index e7c9937..d53e43d 100644
--- a/icu4c/source/data/lang/sbp.txt
+++ b/icu4c/source/data/lang/sbp.txt
@@ -48,5 +48,5 @@
         zh{"Ishishina"}
         zu{"Ishisulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/se.txt b/icu4c/source/data/lang/se.txt
index c411108..e5c79a7 100644
--- a/icu4c/source/data/lang/se.txt
+++ b/icu4c/source/data/lang/se.txt
@@ -154,7 +154,7 @@
         PINYIN{"pinyin"}
         WADEGILE{"Wade-Giles"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"giella: {0}"}
         script{"chállin: {0}"}
diff --git a/icu4c/source/data/lang/se_FI.txt b/icu4c/source/data/lang/se_FI.txt
index 462da68..a6446da 100644
--- a/icu4c/source/data/lang/se_FI.txt
+++ b/icu4c/source/data/lang/se_FI.txt
@@ -62,7 +62,7 @@
             fullwide{"fullwide"}
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
     codePatterns{
         script{"čállin: {0}"}
     }
diff --git a/icu4c/source/data/lang/seh.txt b/icu4c/source/data/lang/seh.txt
index 6b4930d..0b99678 100644
--- a/icu4c/source/data/lang/seh.txt
+++ b/icu4c/source/data/lang/seh.txt
@@ -48,5 +48,5 @@
         zh{"chinês"}
         zu{"zulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/ses.txt b/icu4c/source/data/lang/ses.txt
index f24649b..457bd25 100644
--- a/icu4c/source/data/lang/ses.txt
+++ b/icu4c/source/data/lang/ses.txt
@@ -48,5 +48,5 @@
         zh{"Sinuwa senni, Mandareŋ"}
         zu{"Zulu senni"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/sg.txt b/icu4c/source/data/lang/sg.txt
index 2e02ba6..772bff4 100644
--- a/icu4c/source/data/lang/sg.txt
+++ b/icu4c/source/data/lang/sg.txt
@@ -48,5 +48,5 @@
         zh{"Shinuäa"}
         zu{"Zûlu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/shi.txt b/icu4c/source/data/lang/shi.txt
index 45ce7ee..12dd278 100644
--- a/icu4c/source/data/lang/shi.txt
+++ b/icu4c/source/data/lang/shi.txt
@@ -48,5 +48,5 @@
         zh{"ⵜⴰⵛⵉⵏⵡⵉⵜ"}
         zu{"ⵜⴰⵣⵓⵍⵓⵜ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/shi_Latn.txt b/icu4c/source/data/lang/shi_Latn.txt
index e7f9a59..98b9171 100644
--- a/icu4c/source/data/lang/shi_Latn.txt
+++ b/icu4c/source/data/lang/shi_Latn.txt
@@ -49,5 +49,5 @@
         zh{"Tacinwit"}
         zu{"Tazulut"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/shi_Tfng.txt b/icu4c/source/data/lang/shi_Tfng.txt
index ba03fa3..aaf5c7b 100644
--- a/icu4c/source/data/lang/shi_Tfng.txt
+++ b/icu4c/source/data/lang/shi_Tfng.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi_Tfng{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/si.txt b/icu4c/source/data/lang/si.txt
index 0eecf52..bb9a650 100644
--- a/icu4c/source/data/lang/si.txt
+++ b/icu4c/source/data/lang/si.txt
@@ -548,7 +548,7 @@
             tibt{"ටිබෙට ඉලක්කම්"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — සියල්ල"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/sk.txt b/icu4c/source/data/lang/sk.txt
index c81ad98..1dd31c0 100644
--- a/icu4c/source/data/lang/sk.txt
+++ b/icu4c/source/data/lang/sk.txt
@@ -46,6 +46,7 @@
         arc{"aramejčina"}
         arn{"mapudungun"}
         arp{"arapažština"}
+        ars{"arabčina – nadžd"}
         arw{"arawačtina"}
         as{"ásamčina"}
         asa{"asu"}
@@ -760,7 +761,7 @@
     Variants{
         SCOTLAND{"škótska štandardná angličtina"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} – všetko"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/sl.txt b/icu4c/source/data/lang/sl.txt
index 99bb1ee..ec95506 100644
--- a/icu4c/source/data/lang/sl.txt
+++ b/icu4c/source/data/lang/sl.txt
@@ -395,6 +395,7 @@
         rm{"retoromanščina"}
         rn{"rundščina"}
         ro{"romunščina"}
+        ro_MD{"moldavščina"}
         rof{"rombo"}
         rom{"romščina"}
         root{"rootščina"}
@@ -877,7 +878,7 @@
         VALENCIA{"valencijski pravopis"}
         WADEGILE{"romanizacija Wade-Giles"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} – vse"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/smn.txt b/icu4c/source/data/lang/smn.txt
index d2ca896..e767b3c 100644
--- a/icu4c/source/data/lang/smn.txt
+++ b/icu4c/source/data/lang/smn.txt
@@ -401,7 +401,7 @@
         en_GB{"eŋgâlâskielâ (OK)"}
         en_US{"eŋgâlâskielâ (USA)"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"kielâ: {0}"}
         script{"čäällimvuáhádâh: {0}"}
diff --git a/icu4c/source/data/lang/sn.txt b/icu4c/source/data/lang/sn.txt
index 87d0993..4dd0e3d 100644
--- a/icu4c/source/data/lang/sn.txt
+++ b/icu4c/source/data/lang/sn.txt
@@ -48,5 +48,5 @@
         zh{"chiChinese"}
         zu{"chiZulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/so.txt b/icu4c/source/data/lang/so.txt
index 5d124d0..363697e 100644
--- a/icu4c/source/data/lang/so.txt
+++ b/icu4c/source/data/lang/so.txt
@@ -52,5 +52,5 @@
         Zxxx{"Aan la qorin"}
         Zzzz{"Far aan la aqoon amase aan saxnayn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/sq.txt b/icu4c/source/data/lang/sq.txt
index 7281afd..f20005c 100644
--- a/icu4c/source/data/lang/sq.txt
+++ b/icu4c/source/data/lang/sq.txt
@@ -555,7 +555,7 @@
             tibt{"shifra tibetiane"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — Të gjitha"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/sr.txt b/icu4c/source/data/lang/sr.txt
index c2d26da..c4d720c 100644
--- a/icu4c/source/data/lang/sr.txt
+++ b/icu4c/source/data/lang/sr.txt
@@ -847,7 +847,7 @@
         TARASK{"Тараскијевичка ортографија"}
         VALENCIA{"Валенцијска"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — све"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/sr_Cyrl.txt b/icu4c/source/data/lang/sr_Cyrl.txt
index cac24ec..1d0d0a9 100644
--- a/icu4c/source/data/lang/sr_Cyrl.txt
+++ b/icu4c/source/data/lang/sr_Cyrl.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Cyrl{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/sr_Cyrl_BA.txt b/icu4c/source/data/lang/sr_Cyrl_BA.txt
index 5084ac0..ed55604 100644
--- a/icu4c/source/data/lang/sr_Cyrl_BA.txt
+++ b/icu4c/source/data/lang/sr_Cyrl_BA.txt
@@ -18,5 +18,5 @@
         zgh{"стандардни марокански тамашек"}
         zu{"исизулу"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/sr_Cyrl_ME.txt b/icu4c/source/data/lang/sr_Cyrl_ME.txt
index c367f62..dce11ac 100644
--- a/icu4c/source/data/lang/sr_Cyrl_ME.txt
+++ b/icu4c/source/data/lang/sr_Cyrl_ME.txt
@@ -17,5 +17,5 @@
         zgh{"стандардни марокански тамашек"}
         zu{"исизулу"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/sr_Cyrl_XK.txt b/icu4c/source/data/lang/sr_Cyrl_XK.txt
index af338cd..030c48d 100644
--- a/icu4c/source/data/lang/sr_Cyrl_XK.txt
+++ b/icu4c/source/data/lang/sr_Cyrl_XK.txt
@@ -17,5 +17,5 @@
         zgh{"стандардни марокански тамашек"}
         zu{"исизулу"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/sr_Latn.txt b/icu4c/source/data/lang/sr_Latn.txt
index 330b39e..79a8e57 100644
--- a/icu4c/source/data/lang/sr_Latn.txt
+++ b/icu4c/source/data/lang/sr_Latn.txt
@@ -848,7 +848,7 @@
         TARASK{"Taraskijevička ortografija"}
         VALENCIA{"Valencijska"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
     characterLabelPattern{
         all{"{0} — sve"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/sr_Latn_BA.txt b/icu4c/source/data/lang/sr_Latn_BA.txt
index 8a03c87..ecfb01f 100644
--- a/icu4c/source/data/lang/sr_Latn_BA.txt
+++ b/icu4c/source/data/lang/sr_Latn_BA.txt
@@ -18,5 +18,5 @@
         zgh{"standardni marokanski tamašek"}
         zu{"isizulu"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/sr_Latn_ME.txt b/icu4c/source/data/lang/sr_Latn_ME.txt
index 8a84d59..9a7afe6 100644
--- a/icu4c/source/data/lang/sr_Latn_ME.txt
+++ b/icu4c/source/data/lang/sr_Latn_ME.txt
@@ -17,5 +17,5 @@
         zgh{"standardni marokanski tamašek"}
         zu{"isizulu"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/sr_Latn_XK.txt b/icu4c/source/data/lang/sr_Latn_XK.txt
index 318cdb3..1a576e6 100644
--- a/icu4c/source/data/lang/sr_Latn_XK.txt
+++ b/icu4c/source/data/lang/sr_Latn_XK.txt
@@ -17,5 +17,5 @@
         zgh{"standardni marokanski tamašek"}
         zu{"isizulu"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/sv.txt b/icu4c/source/data/lang/sv.txt
index c9edbe2..7001bed 100644
--- a/icu4c/source/data/lang/sv.txt
+++ b/icu4c/source/data/lang/sv.txt
@@ -51,6 +51,7 @@
         aro{"araoniska"}
         arp{"arapaho"}
         arq{"algerisk arabiska"}
+        ars{"najdiarabiska"}
         arw{"arawakiska"}
         ary{"marockansk arabiska"}
         arz{"egyptisk arabiska"}
@@ -1096,7 +1097,7 @@
         WADEGILE{"Wade-Giles"}
         XSISTEMO{"x-system"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — alla"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/sv_FI.txt b/icu4c/source/data/lang/sv_FI.txt
index 0a89e2b..4eb93e8 100644
--- a/icu4c/source/data/lang/sv_FI.txt
+++ b/icu4c/source/data/lang/sv_FI.txt
@@ -10,5 +10,5 @@
     Scripts%variant{
         Arab{"persisk-arabiska"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/sw.txt b/icu4c/source/data/lang/sw.txt
index cd90f24..732302d 100644
--- a/icu4c/source/data/lang/sw.txt
+++ b/icu4c/source/data/lang/sw.txt
@@ -644,7 +644,7 @@
             vaii{"Dijiti za Vai"}
         }
     }
-    Version{"2.1.37.34"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — zote"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/sw_CD.txt b/icu4c/source/data/lang/sw_CD.txt
index f6f19a2..9fca060 100644
--- a/icu4c/source/data/lang/sw_CD.txt
+++ b/icu4c/source/data/lang/sw_CD.txt
@@ -39,5 +39,5 @@
         wae{"Kiwalser"}
         yi{"Kiyidi"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/sw_KE.txt b/icu4c/source/data/lang/sw_KE.txt
index b02c027..49b8e63 100644
--- a/icu4c/source/data/lang/sw_KE.txt
+++ b/icu4c/source/data/lang/sw_KE.txt
@@ -42,5 +42,5 @@
         wae{"Kiwalser"}
         zgh{"Tamazight Sanifu ya Moroko"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/ta.txt b/icu4c/source/data/lang/ta.txt
index e744139..ed79dba 100644
--- a/icu4c/source/data/lang/ta.txt
+++ b/icu4c/source/data/lang/ta.txt
@@ -841,7 +841,7 @@
         PINYIN{"பின்யின் ரோமானைசெஷன்"}
         WADEGILE{"வேட்-கைல்ஸ் ரோமனைஷேசன்"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — அனைத்தும்"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/te.txt b/icu4c/source/data/lang/te.txt
index 14538ee..a709b6d 100644
--- a/icu4c/source/data/lang/te.txt
+++ b/icu4c/source/data/lang/te.txt
@@ -844,7 +844,7 @@
         REVISED{"సవరించబడిన వర్ణక్రమం"}
         WADEGILE{"వేడ్-గైల్స్ రోమనైజేషన్"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — అన్ని"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/teo.txt b/icu4c/source/data/lang/teo.txt
index 97b27d1..bb05b9f 100644
--- a/icu4c/source/data/lang/teo.txt
+++ b/icu4c/source/data/lang/teo.txt
@@ -48,5 +48,5 @@
         zh{"Kichina"}
         zu{"Kizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/tg.txt b/icu4c/source/data/lang/tg.txt
index d4aadc6..7f26015 100644
--- a/icu4c/source/data/lang/tg.txt
+++ b/icu4c/source/data/lang/tg.txt
@@ -183,7 +183,7 @@
             latn{"Рақамҳои ғарбӣ"}
         }
     }
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
     codePatterns{
         language{"{0}"}
         script{"{0}"}
diff --git a/icu4c/source/data/lang/th.txt b/icu4c/source/data/lang/th.txt
index 088c865..ccd8a35 100644
--- a/icu4c/source/data/lang/th.txt
+++ b/icu4c/source/data/lang/th.txt
@@ -51,6 +51,7 @@
         aro{"อาเรานา"}
         arp{"อาราปาโฮ"}
         arq{"อาหรับแอลจีเรีย"}
+        ars{"อาหรับนัจญ์ดี"}
         arw{"อาราวัก"}
         ary{"อาหรับโมร็อกโก"}
         arz{"อาหรับพื้นเมืองอียิปต์"}
@@ -1054,7 +1055,7 @@
         VALLADER{"วัลลาเดอร์"}
         WADEGILE{"การถอดอักษรแบบเวด-ไจลส์"}
     }
-    Version{"2.1.37.56"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — ทั้งหมด"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ti.txt b/icu4c/source/data/lang/ti.txt
index 862520f..f023fe6 100644
--- a/icu4c/source/data/lang/ti.txt
+++ b/icu4c/source/data/lang/ti.txt
@@ -104,7 +104,7 @@
         Ethi{"ፊደል"}
         Latn{"ላቲን"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     codePatterns{
         language{"{0}"}
         script{"{0}"}
diff --git a/icu4c/source/data/lang/to.txt b/icu4c/source/data/lang/to.txt
index 2929072..a7f3953 100644
--- a/icu4c/source/data/lang/to.txt
+++ b/icu4c/source/data/lang/to.txt
@@ -887,7 +887,7 @@
             tibt{"fika fakatipeti"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.39"}
     codePatterns{
         language{"Lea: {0}"}
         script{"Tohinima: {0}"}
diff --git a/icu4c/source/data/lang/tr.txt b/icu4c/source/data/lang/tr.txt
index 426c58d..59ae100 100644
--- a/icu4c/source/data/lang/tr.txt
+++ b/icu4c/source/data/lang/tr.txt
@@ -51,6 +51,7 @@
         aro{"Araona"}
         arp{"Arapaho Dili"}
         arq{"Cezayir Arapçası"}
+        ars{"Necd Arapçası"}
         arw{"Arawak Dili"}
         ary{"Fas Arapçası"}
         arz{"Mısır Arapçası"}
@@ -1037,7 +1038,7 @@
         VALENCIA{"Valensiyaca"}
         WADEGILE{"Wade-Giles (Latin Alfabesinde Yazımı)"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — tümü"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/tt.txt b/icu4c/source/data/lang/tt.txt
index 0faf267..fdc68ce 100644
--- a/icu4c/source/data/lang/tt.txt
+++ b/icu4c/source/data/lang/tt.txt
@@ -177,7 +177,7 @@
             latn{"көнбатыш цифрлары"}
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     codePatterns{
         language{"Тел: {0}"}
         script{"Язу: {0}"}
diff --git a/icu4c/source/data/lang/twq.txt b/icu4c/source/data/lang/twq.txt
index d99e9d8..f42e9e9 100644
--- a/icu4c/source/data/lang/twq.txt
+++ b/icu4c/source/data/lang/twq.txt
@@ -48,5 +48,5 @@
         zh{"Sinuwa senni, Mandareŋ"}
         zu{"Zulu senni"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/tzm.txt b/icu4c/source/data/lang/tzm.txt
index 6aaedca..044acb7 100644
--- a/icu4c/source/data/lang/tzm.txt
+++ b/icu4c/source/data/lang/tzm.txt
@@ -48,5 +48,5 @@
         zh{"Tacinwit,Mandarin"}
         zu{"tazulut"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/ug.txt b/icu4c/source/data/lang/ug.txt
index fcd2317..ea12245 100644
--- a/icu4c/source/data/lang/ug.txt
+++ b/icu4c/source/data/lang/ug.txt
@@ -830,7 +830,7 @@
         VALENCIA{"ۋالېنسىيە"}
         WADEGILE{"ۋېي ئائىلىسى پىنيىن لاتىنلاشتۇرۇش"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     codePatterns{
         language{"تىل: {0}"}
         script{"يېزىق: {0}"}
diff --git a/icu4c/source/data/lang/uk.txt b/icu4c/source/data/lang/uk.txt
index f806bc8..f07b6ae 100644
--- a/icu4c/source/data/lang/uk.txt
+++ b/icu4c/source/data/lang/uk.txt
@@ -49,6 +49,7 @@
         aro{"араона"}
         arp{"арапахо"}
         arq{"алжирська арабська"}
+        ars{"надждійська арабська"}
         arw{"аравакська"}
         as{"ассамська"}
         asa{"асу"}
@@ -889,7 +890,7 @@
         VALENCIA{"Валенсійська"}
         WADEGILE{"Романізація Вейда-Джайлза"}
     }
-    Version{"2.1.37.12"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — усі"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ur.txt b/icu4c/source/data/lang/ur.txt
index c1ad64e..79f4770 100644
--- a/icu4c/source/data/lang/ur.txt
+++ b/icu4c/source/data/lang/ur.txt
@@ -632,7 +632,7 @@
             vaii{"وائی ہندسے"}
         }
     }
-    Version{"2.1.37.69"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — تمام"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/ur_IN.txt b/icu4c/source/data/lang/ur_IN.txt
index 30751ae..c45d6da 100644
--- a/icu4c/source/data/lang/ur_IN.txt
+++ b/icu4c/source/data/lang/ur_IN.txt
@@ -23,5 +23,5 @@
             tibt{"تبتی ہندسے"}
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/uz.txt b/icu4c/source/data/lang/uz.txt
index 0d9210e..431c8d9 100644
--- a/icu4c/source/data/lang/uz.txt
+++ b/icu4c/source/data/lang/uz.txt
@@ -242,7 +242,7 @@
         min{"minangkabau"}
         mk{"makedon"}
         ml{"malayalam"}
-        mn{"mo‘g‘ul"}
+        mn{"mongol"}
         mni{"manipur"}
         moh{"mohauk"}
         mos{"mossi"}
@@ -269,7 +269,7 @@
         ng{"ndonga"}
         nia{"nias"}
         niu{"niue"}
-        nl{"golland"}
+        nl{"niderland"}
         nl_BE{"flamand"}
         nmg{"kvasio"}
         nn{"norveg-nyunorsk"}
@@ -546,7 +546,7 @@
             tibt{"tibet raqamlari"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — hammasi"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/uz_Arab.txt b/icu4c/source/data/lang/uz_Arab.txt
index b3016e6..c4e907d 100644
--- a/icu4c/source/data/lang/uz_Arab.txt
+++ b/icu4c/source/data/lang/uz_Arab.txt
@@ -10,5 +10,5 @@
     Scripts{
         Arab{"عربی"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/uz_Cyrl.txt b/icu4c/source/data/lang/uz_Cyrl.txt
index afe63e1..d9fe248 100644
--- a/icu4c/source/data/lang/uz_Cyrl.txt
+++ b/icu4c/source/data/lang/uz_Cyrl.txt
@@ -407,7 +407,7 @@
             tibt{"Тибет рақамлари"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"Тил: {0}"}
         script{"{0}"}
diff --git a/icu4c/source/data/lang/uz_Latn.txt b/icu4c/source/data/lang/uz_Latn.txt
index 36553da..66698d6 100644
--- a/icu4c/source/data/lang/uz_Latn.txt
+++ b/icu4c/source/data/lang/uz_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/vai.txt b/icu4c/source/data/lang/vai.txt
index 2199e1a..6705a87 100644
--- a/icu4c/source/data/lang/vai.txt
+++ b/icu4c/source/data/lang/vai.txt
@@ -48,5 +48,5 @@
         zh{"ꕦꕇꔧ"}
         zu{"ꖮꖨ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/vai_Latn.txt b/icu4c/source/data/lang/vai_Latn.txt
index 1a8c8ef..d5be9ea 100644
--- a/icu4c/source/data/lang/vai_Latn.txt
+++ b/icu4c/source/data/lang/vai_Latn.txt
@@ -49,5 +49,5 @@
         zh{"Chaniĩ"}
         zu{"Zúlu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/vai_Vaii.txt b/icu4c/source/data/lang/vai_Vaii.txt
index 487dfa9..6ef4517 100644
--- a/icu4c/source/data/lang/vai_Vaii.txt
+++ b/icu4c/source/data/lang/vai_Vaii.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai_Vaii{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/vi.txt b/icu4c/source/data/lang/vi.txt
index cc44c83..add168e 100644
--- a/icu4c/source/data/lang/vi.txt
+++ b/icu4c/source/data/lang/vi.txt
@@ -50,6 +50,7 @@
         aro{"Tiếng Araona"}
         arp{"Tiếng Arapaho"}
         arq{"Tiếng Ả Rập Algeria"}
+        ars{"Tiếng Ả Rập Najdi"}
         arw{"Tiếng Arawak"}
         arz{"Tiếng Ả Rập Ai Cập"}
         as{"Tiếng Assam"}
@@ -982,7 +983,7 @@
         VALLADER{"VALLADER"}
         WADEGILE{"La Mã hóa Wade-Giles"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — tất cả"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/vun.txt b/icu4c/source/data/lang/vun.txt
index a7bbf05..1c10e5e 100644
--- a/icu4c/source/data/lang/vun.txt
+++ b/icu4c/source/data/lang/vun.txt
@@ -48,5 +48,5 @@
         zh{"Kyichina"}
         zu{"Kyizulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/wae.txt b/icu4c/source/data/lang/wae.txt
index 590d882..f9c7ec9 100644
--- a/icu4c/source/data/lang/wae.txt
+++ b/icu4c/source/data/lang/wae.txt
@@ -193,7 +193,7 @@
             latn{"Arabiši Zálä"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"Sprač: {0}"}
         script{"Alfabét: {0}"}
diff --git a/icu4c/source/data/lang/wo.txt b/icu4c/source/data/lang/wo.txt
index 9ab7735..54ccc13 100644
--- a/icu4c/source/data/lang/wo.txt
+++ b/icu4c/source/data/lang/wo.txt
@@ -181,7 +181,7 @@
             latn{"Siifari Tugal"}
         }
     }
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
     codePatterns{
         language{"{0}"}
         script{"{0}"}
diff --git a/icu4c/source/data/lang/xog.txt b/icu4c/source/data/lang/xog.txt
index ac02ef9..adf7a89 100644
--- a/icu4c/source/data/lang/xog.txt
+++ b/icu4c/source/data/lang/xog.txt
@@ -48,5 +48,5 @@
         zh{"Olucayina"}
         zu{"Oluzzulu"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/yav.txt b/icu4c/source/data/lang/yav.txt
index 97e58ca..af6c9ab 100644
--- a/icu4c/source/data/lang/yav.txt
+++ b/icu4c/source/data/lang/yav.txt
@@ -48,5 +48,5 @@
         zh{"sinúɛ"}
         zu{"nusulú"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/yi.txt b/icu4c/source/data/lang/yi.txt
index 7aa775e..efa9396 100644
--- a/icu4c/source/data/lang/yi.txt
+++ b/icu4c/source/data/lang/yi.txt
@@ -171,7 +171,7 @@
             gregorian{"גרעגארישער קאַלענדאַר"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     codePatterns{
         language{"שפראַך: {0}"}
         script{"שריפֿט: {0}"}
diff --git a/icu4c/source/data/lang/yo.txt b/icu4c/source/data/lang/yo.txt
index 1eb3716..780ab58 100644
--- a/icu4c/source/data/lang/yo.txt
+++ b/icu4c/source/data/lang/yo.txt
@@ -101,5 +101,5 @@
         zh{"Èdè Mandari"}
         zu{"Èdè Ṣulu"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/yo_BJ.txt b/icu4c/source/data/lang/yo_BJ.txt
index 6bdfb5e..fbed6a1 100644
--- a/icu4c/source/data/lang/yo_BJ.txt
+++ b/icu4c/source/data/lang/yo_BJ.txt
@@ -11,5 +11,5 @@
         tr{"Èdè Tɔɔkisi"}
         zu{"Èdè Shulu"}
     }
-    Version{"2.1.37.9"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/yue.txt b/icu4c/source/data/lang/yue.txt
index ab39ca7..4af5a46 100644
--- a/icu4c/source/data/lang/yue.txt
+++ b/icu4c/source/data/lang/yue.txt
@@ -1024,7 +1024,7 @@
         VALLADER{"瑞士瓦勒德方言"}
         WADEGILE{"威妥瑪式拼音"}
     }
-    Version{"2.1.37.33"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — 全部"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/yue_Hans.txt b/icu4c/source/data/lang/yue_Hans.txt
index 70a28bc..80f33be 100644
--- a/icu4c/source/data/lang/yue_Hans.txt
+++ b/icu4c/source/data/lang/yue_Hans.txt
@@ -1025,7 +1025,7 @@
         VALLADER{"瑞士瓦勒德方言"}
         WADEGILE{"威妥玛式拼音"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — 全部"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/yue_Hant.txt b/icu4c/source/data/lang/yue_Hant.txt
index b8cde82..a263f97 100644
--- a/icu4c/source/data/lang/yue_Hant.txt
+++ b/icu4c/source/data/lang/yue_Hant.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue_Hant{
-    Version{"2.1.36.80"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/lang/zgh.txt b/icu4c/source/data/lang/zgh.txt
index b150d07..813df68 100644
--- a/icu4c/source/data/lang/zgh.txt
+++ b/icu4c/source/data/lang/zgh.txt
@@ -61,5 +61,5 @@
             islamic{"ⴰⵙⵎⵍⵓⵙⵙⴰⵏ ⵏ ⵍⵉⵙⵍⴰⵎ"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/lang/zh.txt b/icu4c/source/data/lang/zh.txt
index 29465a6..557bda4 100644
--- a/icu4c/source/data/lang/zh.txt
+++ b/icu4c/source/data/lang/zh.txt
@@ -46,6 +46,7 @@
         arc{"阿拉米语"}
         arn{"马普切语"}
         arp{"阿拉帕霍语"}
+        ars{"纳吉迪阿拉伯文"}
         arw{"阿拉瓦克语"}
         as{"阿萨姆语"}
         asa{"帕雷语"}
@@ -132,7 +133,7 @@
         dsb{"下索布语"}
         dua{"都阿拉语"}
         dum{"中古荷兰语"}
-        dv{"迪维西语"}
+        dv{"迪维希语"}
         dyo{"朱拉语"}
         dyu{"迪尤拉语"}
         dz{"宗卡语"}
@@ -305,7 +306,7 @@
         lua{"卢巴-卢拉语"}
         lui{"卢伊塞诺语"}
         lun{"隆达语"}
-        luo{"卢欧语"}
+        luo{"卢奥语"}
         lus{"米佐语"}
         luy{"卢雅语"}
         lv{"拉脱维亚语"}
@@ -978,7 +979,7 @@
         VALLADER{"瑞士瓦勒德方言"}
         WADEGILE{"WG 威氏拼音法"}
     }
-    Version{"2.1.37.42"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — 全部"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/zh_Hans.txt b/icu4c/source/data/lang/zh_Hans.txt
index e2e6871..a37beac 100644
--- a/icu4c/source/data/lang/zh_Hans.txt
+++ b/icu4c/source/data/lang/zh_Hans.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/zh_Hant.txt b/icu4c/source/data/lang/zh_Hant.txt
index 3286e17..8a5f765 100644
--- a/icu4c/source/data/lang/zh_Hant.txt
+++ b/icu4c/source/data/lang/zh_Hant.txt
@@ -52,6 +52,7 @@
         aro{"阿拉奧納文"}
         arp{"阿拉帕霍文"}
         arq{"阿爾及利亞阿拉伯文"}
+        ars{"納吉迪阿拉伯文"}
         arw{"阿拉瓦克文"}
         ary{"摩洛哥阿拉伯文"}
         arz{"埃及阿拉伯文"}
@@ -1073,7 +1074,7 @@
         VALLADER{"瑞士瓦勒德方言"}
         WADEGILE{"威妥瑪式拼音"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     characterLabelPattern{
         all{"{0} — 全部"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/lang/zh_Hant_HK.txt b/icu4c/source/data/lang/zh_Hant_HK.txt
index 888f849..45280c0 100644
--- a/icu4c/source/data/lang/zh_Hant_HK.txt
+++ b/icu4c/source/data/lang/zh_Hant_HK.txt
@@ -130,7 +130,7 @@
         SCOTLAND{"蘇格蘭標準英語"}
         SOTAV{"SOTAV"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         enclosed{"{0} — 包含"}
         historic{"{0} — 舊式"}
diff --git a/icu4c/source/data/lang/zh_Hant_MO.txt b/icu4c/source/data/lang/zh_Hant_MO.txt
index 78fdee5..f61452c 100644
--- a/icu4c/source/data/lang/zh_Hant_MO.txt
+++ b/icu4c/source/data/lang/zh_Hant_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hant_MO{
     %%Parent{"zh_Hant_HK"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/lang/zu.txt b/icu4c/source/data/lang/zu.txt
index 606e979..f87ef63 100644
--- a/icu4c/source/data/lang/zu.txt
+++ b/icu4c/source/data/lang/zu.txt
@@ -629,7 +629,7 @@
             vaii{"Izinhlazu Zezinombolo ze-Vai"}
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     characterLabelPattern{
         all{"{0} — All"}
         category-list{"{0}: {1}"}
diff --git a/icu4c/source/data/locales/af.txt b/icu4c/source/data/locales/af.txt
index 5a99533..35ce0fe 100644
--- a/icu4c/source/data/locales/af.txt
+++ b/icu4c/source/data/locales/af.txt
@@ -213,7 +213,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/af_NA.txt b/icu4c/source/data/locales/af_NA.txt
index c3d061f..80427b1 100644
--- a/icu4c/source/data/locales/af_NA.txt
+++ b/icu4c/source/data/locales/af_NA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 af_NA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/af_ZA.txt b/icu4c/source/data/locales/af_ZA.txt
index ecf1741..e3d3f39 100644
--- a/icu4c/source/data/locales/af_ZA.txt
+++ b/icu4c/source/data/locales/af_ZA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 af_ZA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/agq.txt b/icu4c/source/data/locales/agq.txt
index 659639d..7bd483f 100644
--- a/icu4c/source/data/locales/agq.txt
+++ b/icu4c/source/data/locales/agq.txt
@@ -23,7 +23,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/agq_CM.txt b/icu4c/source/data/locales/agq_CM.txt
index 4608fa6..fe014d4 100644
--- a/icu4c/source/data/locales/agq_CM.txt
+++ b/icu4c/source/data/locales/agq_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 agq_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ak.txt b/icu4c/source/data/locales/ak.txt
index 35b06e2..907dc4e 100644
--- a/icu4c/source/data/locales/ak.txt
+++ b/icu4c/source/data/locales/ak.txt
@@ -25,7 +25,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ak_GH.txt b/icu4c/source/data/locales/ak_GH.txt
index 6b0fd7f..1877443 100644
--- a/icu4c/source/data/locales/ak_GH.txt
+++ b/icu4c/source/data/locales/ak_GH.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ak_GH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/am.txt b/icu4c/source/data/locales/am.txt
index a5eb3f4..257606f 100644
--- a/icu4c/source/data/locales/am.txt
+++ b/icu4c/source/data/locales/am.txt
@@ -219,7 +219,7 @@
         native{"latn"}
         traditional{"ethi"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -1286,15 +1286,15 @@
         animals_nature{"እንስሳት እና ተፈጥሮ"}
         arrows{"ቀስቶች"}
         body{"ሰውነት"}
-        box_drawing{"Box Drawing"}
+        box_drawing{"ስዕላዊ ሳጥን"}
         braille{"ብሬይል"}
         building{"ህንጻ"}
-        bullets_stars{"ጥይቶች/ኮከቦች"}
-        consonantal_jamo{"Consonantal Jamo"}
+        bullets_stars{"ጥይቶች ወይም ኮከቦች"}
+        consonantal_jamo{"የጃሞ ሆሄያት"}
         currency_symbols{"የምንዛሪ ምልክቶች"}
-        dash_connector{"Dash/Connector"}
+        dash_connector{"ጭረት ወይም አያያዥ"}
         digits{"ዲጂት"}
-        dingbats{"Dingbats"}
+        dingbats{"ነቁጥ"}
         divination_symbols{"የመለኮት ምልክቶች"}
         downwards_arrows{"ወደታች ቀስቶች"}
         downwards_upwards_arrows{"ወደታች ወደላይ ቀስቶች"}
@@ -1303,22 +1303,22 @@
         european_scripts{"የኤውሮጳ ስክሪፕቶች"}
         female{"ሴት"}
         flag{"ባንዲራ"}
-        flags{"Flags"}
+        flags{"ባንዲራዎች"}
         food_drink{"ምግብ እና መጠጥ"}
         format{"ቅርጸት"}
         format_whitespace{"ቅርጸት እና ባዶቦታ"}
-        full_width_form_variant{"Full-Width Form Variants"}
+        full_width_form_variant{"ሙሉ ስፋት የተለያየ መልክ"}
         geometric_shapes{"ጂኦሜትሪክ ቅርጽ"}
-        half_width_form_variant{"Half-Width Form Variants"}
-        han_characters{"Han Characters"}
+        half_width_form_variant{"ግማሽ ስፋት የተለያየ መልክ"}
+        han_characters{"ሃን ቁምፊ"}
         han_radicals{"ሃን ራዲካልስ"}
         hanja{"ሃንጃ"}
         hanzi_simplified{"ሃንዚ(በቀላሉ)"}
         hanzi_traditional{"ሃንዚ(ባህላዊ)"}
         heart{"ልብ"}
         historic_scripts{"ታሪካዊ ስክሪፕቶች"}
-        ideographic_desc_characters{"Ideographic Desc. Characters"}
-        japanese_kana{"Japanese Kana"}
+        ideographic_desc_characters{"ሃሳባዊ ቁምፊዎች"}
+        japanese_kana{"የጃፓን ፊደል"}
         kanbun{"ካንቡን"}
         kanji{"ካንጂ"}
         keycap{"የአብይ ሆሄ ቁልፍ ማብሪያ"}
@@ -1328,43 +1328,43 @@
         limited_use{"የተወሰነ ኣጠቃቀም"}
         male{"ወንድ"}
         math_symbols{"የሂሳብ ምልክቶች"}
-        middle_eastern_scripts{"Middle Eastern Scripts"}
+        middle_eastern_scripts{"የመካከለኛው ምስራቅ ስክሪፕቶች"}
         miscellaneous{"የተለያዩ"}
-        modern_scripts{"Modern Scripts"}
+        modern_scripts{"ዘመናዊ ስክሪፕቶች"}
         modifier{"ማሻሻያ"}
         musical_symbols{"የሙዚቃ ምልክቶች"}
         nature{"ተፈጥሮ"}
-        nonspacing{"Nonspacing"}
+        nonspacing{"የተጣበቁ ቃላት"}
         numbers{"ቁጥሮች"}
         objects{"ነገሮች"}
         other{"ሌሎች"}
         paired{"የተጣመረ"}
         person{"ሰው"}
-        phonetic_alphabet{"Phonetic Alphabet"}
-        pictographs{"Pictographs"}
+        phonetic_alphabet{"የድምፅ ፊደል"}
+        pictographs{"ስዕላዊ"}
         place{"ቦታ"}
         plant{"አትክልት"}
         punctuation{"ስርዓተ ነጥብ"}
         rightwards_arrows{"ወደቀኝ ቀስቶች"}
-        sign_standard_symbols{"Sign/Standard Symbols"}
-        small_form_variant{"Small Form Variants"}
+        sign_standard_symbols{"አርማ ወይም ምልክት"}
+        small_form_variant{"ትንሽ የተለያየ መልክ"}
         smiley{"ሳቅ"}
-        smileys_people{"Smileys & People"}
-        south_asian_scripts{"ደቡብ ኤስያ ስክሪፕት"}
-        southeast_asian_scripts{"Southeast Asian Scripts"}
-        spacing{"Spacing"}
+        smileys_people{"ሳቂታ ወይም ሰው"}
+        south_asian_scripts{"ደቡብ እስያ ስክሪፕት"}
+        southeast_asian_scripts{"ደቡብ ምስራቅ እስያ ስክሪፕት"}
+        spacing{"ባዶ ቦታ"}
         sport{"ስፖርት"}
         symbols{"ምልክቶች"}
         technical_symbols{"ቴክኒካል ምልክቶች"}
-        tone_marks{"Tone Marks"}
+        tone_marks{"የኖታ ምልክት"}
         travel{"ጉዞ"}
         travel_places{"ጉዞ እና ቦታ"}
         upwards_arrows{"ወደላይ ቀስቶች"}
-        variant_forms{"Variant Forms"}
+        variant_forms{"የተለያየ መልክ ቅጾች"}
         vocalic_jamo{"ቮልካኒክ ጃሞ"}
         weather{"የአየር ሁኔታ"}
         western_asian_scripts{"ምእራባዊ ኤስያ ስክሪፕት"}
-        whitespace{"Whitespace"}
+        whitespace{"ባዶ ቦታ"}
     }
     delimiters{
         alternateQuotationEnd{"›"}
diff --git a/icu4c/source/data/locales/am_ET.txt b/icu4c/source/data/locales/am_ET.txt
index 819ecf1..9782c32 100644
--- a/icu4c/source/data/locales/am_ET.txt
+++ b/icu4c/source/data/locales/am_ET.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 am_ET{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ar.txt b/icu4c/source/data/locales/ar.txt
index aafe88a..576884d 100644
--- a/icu4c/source/data/locales/ar.txt
+++ b/icu4c/source/data/locales/ar.txt
@@ -23,7 +23,7 @@
             patterns{
                 currencyFormat{"#,##0.00 ¤"}
                 decimalFormat{"#,##0.###"}
-                percentFormat{"#,##0 %"}
+                percentFormat{"#,##0%"}
                 scientificFormat{"#E0"}
             }
             symbols{
@@ -42,6 +42,7 @@
             }
         }
         default{"arab"}
+        default_latn{"latn"}
         latn{
             miscPatterns{
                 atLeast{"+{0}"}
@@ -383,7 +384,7 @@
         minimumGroupingDigits{"1"}
         native{"arab"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/ar_001.txt b/icu4c/source/data/locales/ar_001.txt
index 7982326..be438e4 100644
--- a/icu4c/source/data/locales/ar_001.txt
+++ b/icu4c/source/data/locales/ar_001.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_001{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ar_AE.txt b/icu4c/source/data/locales/ar_AE.txt
index ff3ecba..e5e2240 100644
--- a/icu4c/source/data/locales/ar_AE.txt
+++ b/icu4c/source/data/locales/ar_AE.txt
@@ -1,7 +1,10 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_AE{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
     calendar{
         gregorian{
             eras{
diff --git a/icu4c/source/data/locales/ar_BH.txt b/icu4c/source/data/locales/ar_BH.txt
index 899a250..694fd35 100644
--- a/icu4c/source/data/locales/ar_BH.txt
+++ b/icu4c/source/data/locales/ar_BH.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_BH{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_DJ.txt b/icu4c/source/data/locales/ar_DJ.txt
index 5769f2a..2481b7b 100644
--- a/icu4c/source/data/locales/ar_DJ.txt
+++ b/icu4c/source/data/locales/ar_DJ.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_DJ{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_DZ.txt b/icu4c/source/data/locales/ar_DZ.txt
index 8319b70..51344ec 100644
--- a/icu4c/source/data/locales/ar_DZ.txt
+++ b/icu4c/source/data/locales/ar_DZ.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             monthNames{
diff --git a/icu4c/source/data/locales/ar_EG.txt b/icu4c/source/data/locales/ar_EG.txt
index 5e606a9..f3874d3 100644
--- a/icu4c/source/data/locales/ar_EG.txt
+++ b/icu4c/source/data/locales/ar_EG.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_EG{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_EH.txt b/icu4c/source/data/locales/ar_EH.txt
index 9cbc091..2e0c26f 100644
--- a/icu4c/source/data/locales/ar_EH.txt
+++ b/icu4c/source/data/locales/ar_EH.txt
@@ -4,5 +4,5 @@
     NumberElements{
         default{"latn"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ar_ER.txt b/icu4c/source/data/locales/ar_ER.txt
index ec96d38..4ce6b01 100644
--- a/icu4c/source/data/locales/ar_ER.txt
+++ b/icu4c/source/data/locales/ar_ER.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_ER{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_IL.txt b/icu4c/source/data/locales/ar_IL.txt
index f44b107..de1c6cb 100644
--- a/icu4c/source/data/locales/ar_IL.txt
+++ b/icu4c/source/data/locales/ar_IL.txt
@@ -1,7 +1,10 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_IL{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ar_IQ.txt b/icu4c/source/data/locales/ar_IQ.txt
index 11b258e..ffead59 100644
--- a/icu4c/source/data/locales/ar_IQ.txt
+++ b/icu4c/source/data/locales/ar_IQ.txt
@@ -1,7 +1,10 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_IQ{
-    Version{"2.1.36.32"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
     calendar{
         gregorian{
             monthNames{
diff --git a/icu4c/source/data/locales/ar_JO.txt b/icu4c/source/data/locales/ar_JO.txt
index e4cdc2a..adce869 100644
--- a/icu4c/source/data/locales/ar_JO.txt
+++ b/icu4c/source/data/locales/ar_JO.txt
@@ -1,7 +1,10 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_JO{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
     calendar{
         gregorian{
             monthNames{
diff --git a/icu4c/source/data/locales/ar_KM.txt b/icu4c/source/data/locales/ar_KM.txt
index 543d719..958de84 100644
--- a/icu4c/source/data/locales/ar_KM.txt
+++ b/icu4c/source/data/locales/ar_KM.txt
@@ -1,7 +1,10 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_KM{
-    Version{"2.1.35.71"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ar_KW.txt b/icu4c/source/data/locales/ar_KW.txt
index 201b69f..4af2dd9 100644
--- a/icu4c/source/data/locales/ar_KW.txt
+++ b/icu4c/source/data/locales/ar_KW.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_KW{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_LB.txt b/icu4c/source/data/locales/ar_LB.txt
index 4b7806e..35189cd 100644
--- a/icu4c/source/data/locales/ar_LB.txt
+++ b/icu4c/source/data/locales/ar_LB.txt
@@ -3,6 +3,7 @@
 ar_LB{
     ExemplarCharactersNumbers{"[\u200E \\- , . % ‰ + 0 1 2 3 4 5 6 7 8 9]"}
     NumberElements{
+        default{"arab"}
         latn{
             symbols{
                 decimal{","}
@@ -10,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.80"}
     calendar{
         gregorian{
             monthNames{
diff --git a/icu4c/source/data/locales/ar_LY.txt b/icu4c/source/data/locales/ar_LY.txt
index ace04c4..fee2834 100644
--- a/icu4c/source/data/locales/ar_LY.txt
+++ b/icu4c/source/data/locales/ar_LY.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             dayPeriod{
diff --git a/icu4c/source/data/locales/ar_MA.txt b/icu4c/source/data/locales/ar_MA.txt
index b4d0428..702351d 100644
--- a/icu4c/source/data/locales/ar_MA.txt
+++ b/icu4c/source/data/locales/ar_MA.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ar_MR.txt b/icu4c/source/data/locales/ar_MR.txt
index b2b4e64..3215c92 100644
--- a/icu4c/source/data/locales/ar_MR.txt
+++ b/icu4c/source/data/locales/ar_MR.txt
@@ -3,6 +3,7 @@
 ar_MR{
     ExemplarCharactersNumbers{"[\u200E \\- , . % ‰ + 0 1 2 3 4 5 6 7 8 9]"}
     NumberElements{
+        default{"arab"}
         latn{
             symbols{
                 decimal{","}
@@ -10,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.80"}
     calendar{
         gregorian{
             monthNames{
diff --git a/icu4c/source/data/locales/ar_OM.txt b/icu4c/source/data/locales/ar_OM.txt
index 61788ee..7db50be 100644
--- a/icu4c/source/data/locales/ar_OM.txt
+++ b/icu4c/source/data/locales/ar_OM.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_OM{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_PS.txt b/icu4c/source/data/locales/ar_PS.txt
index e18fc9f..5006a5f 100644
--- a/icu4c/source/data/locales/ar_PS.txt
+++ b/icu4c/source/data/locales/ar_PS.txt
@@ -1,7 +1,10 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_PS{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
     calendar{
         gregorian{
             monthNames{
diff --git a/icu4c/source/data/locales/ar_QA.txt b/icu4c/source/data/locales/ar_QA.txt
index ab422ea..8f2fdfb 100644
--- a/icu4c/source/data/locales/ar_QA.txt
+++ b/icu4c/source/data/locales/ar_QA.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_QA{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_SA.txt b/icu4c/source/data/locales/ar_SA.txt
index 0086357..c856526 100644
--- a/icu4c/source/data/locales/ar_SA.txt
+++ b/icu4c/source/data/locales/ar_SA.txt
@@ -3,13 +3,14 @@
 ar_SA{
     ExemplarCharactersNumbers{"[\u200E \\- , . ٪ ‰ + 0 1 2 3 4 5 6 7 8 9]"}
     NumberElements{
+        default{"arab"}
         latn{
             symbols{
                 percentSign{"٪"}
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.80"}
     calendar{
         gregorian{
             dayPeriod{
diff --git a/icu4c/source/data/locales/ar_SD.txt b/icu4c/source/data/locales/ar_SD.txt
index bd18ac5..ce071b0 100644
--- a/icu4c/source/data/locales/ar_SD.txt
+++ b/icu4c/source/data/locales/ar_SD.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_SD{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_SO.txt b/icu4c/source/data/locales/ar_SO.txt
index 2d6fd9b..e877daf 100644
--- a/icu4c/source/data/locales/ar_SO.txt
+++ b/icu4c/source/data/locales/ar_SO.txt
@@ -3,11 +3,12 @@
 ar_SO{
     ExemplarCharactersNumbers{"[\u200E \\- , . ٪ ‰ + 0 1 2 3 4 5 6 7 8 9]"}
     NumberElements{
+        default{"arab"}
         latn{
             symbols{
                 percentSign{"٪"}
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_SS.txt b/icu4c/source/data/locales/ar_SS.txt
index 9f385f4..9ca6f67 100644
--- a/icu4c/source/data/locales/ar_SS.txt
+++ b/icu4c/source/data/locales/ar_SS.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_SS{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_SY.txt b/icu4c/source/data/locales/ar_SY.txt
index 1b471c2..ab49d07 100644
--- a/icu4c/source/data/locales/ar_SY.txt
+++ b/icu4c/source/data/locales/ar_SY.txt
@@ -1,7 +1,10 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_SY{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
     calendar{
         gregorian{
             monthNames{
diff --git a/icu4c/source/data/locales/ar_TD.txt b/icu4c/source/data/locales/ar_TD.txt
index 299be31..a2d116f 100644
--- a/icu4c/source/data/locales/ar_TD.txt
+++ b/icu4c/source/data/locales/ar_TD.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_TD{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/ar_TN.txt b/icu4c/source/data/locales/ar_TN.txt
index f84b9e6..5479c9c 100644
--- a/icu4c/source/data/locales/ar_TN.txt
+++ b/icu4c/source/data/locales/ar_TN.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             monthNames{
diff --git a/icu4c/source/data/locales/ar_YE.txt b/icu4c/source/data/locales/ar_YE.txt
index bb0f274..98d2397 100644
--- a/icu4c/source/data/locales/ar_YE.txt
+++ b/icu4c/source/data/locales/ar_YE.txt
@@ -1,5 +1,8 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar_YE{
-    Version{"2.1.31.33"}
+    NumberElements{
+        default{"arab"}
+    }
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/locales/as_IN.txt b/icu4c/source/data/locales/as_IN.txt
index 3801d88..5b23a67 100644
--- a/icu4c/source/data/locales/as_IN.txt
+++ b/icu4c/source/data/locales/as_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 as_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/asa.txt b/icu4c/source/data/locales/asa.txt
index dc615c7..af10af0 100644
--- a/icu4c/source/data/locales/asa.txt
+++ b/icu4c/source/data/locales/asa.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/asa_TZ.txt b/icu4c/source/data/locales/asa_TZ.txt
index 06e6e4c..f3c7039 100644
--- a/icu4c/source/data/locales/asa_TZ.txt
+++ b/icu4c/source/data/locales/asa_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 asa_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ast.txt b/icu4c/source/data/locales/ast.txt
index d9d5d1e..196c21b 100644
--- a/icu4c/source/data/locales/ast.txt
+++ b/icu4c/source/data/locales/ast.txt
@@ -236,7 +236,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -1154,8 +1154,8 @@
                 yQQQ{"QQQ y"}
                 yQQQQ{"QQQQ 'de' y"}
                 yw{
-                    one{"'selmana' w 'de' Y"}
-                    other{"'selmana' w 'de' Y"}
+                    one{"'selmana' w 'de' y"}
+                    other{"'selmana' w 'de' y"}
                 }
             }
             dayNames{
@@ -3934,4 +3934,31 @@
         US{"EE.XX."}
         metric{"Métricu"}
     }
+    parse{
+        date{
+            lenient{
+                "[\\--/]",
+                "[\\:∶]",
+            }
+        }
+        general{
+            lenient{
+                "[.․。︒﹒.。]",
+                "[\$﹩$$]",
+                "[£₤]",
+                "[₨₹{Rp}{Rs}]",
+            }
+        }
+        number{
+            lenient{
+                "[\\-‒⁻₋−➖﹣-]",
+                "[,،٫、︐︑﹐﹑,、]",
+                "[+⁺₊➕﬩﹢+]",
+            }
+            stricter{
+                "[,٫︐﹐,]",
+                "[.․﹒.。]",
+            }
+        }
+    }
 }
diff --git a/icu4c/source/data/locales/ast_ES.txt b/icu4c/source/data/locales/ast_ES.txt
index eafdc8f..a5773ea 100644
--- a/icu4c/source/data/locales/ast_ES.txt
+++ b/icu4c/source/data/locales/ast_ES.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ast_ES{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/az.txt b/icu4c/source/data/locales/az.txt
index 8a5761a..82ab051 100644
--- a/icu4c/source/data/locales/az.txt
+++ b/icu4c/source/data/locales/az.txt
@@ -216,7 +216,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/az_Cyrl.txt b/icu4c/source/data/locales/az_Cyrl.txt
index eb052fa..d12d8f3 100644
--- a/icu4c/source/data/locales/az_Cyrl.txt
+++ b/icu4c/source/data/locales/az_Cyrl.txt
@@ -27,7 +27,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/az_Cyrl_AZ.txt b/icu4c/source/data/locales/az_Cyrl_AZ.txt
index 423abc8..1172d91 100644
--- a/icu4c/source/data/locales/az_Cyrl_AZ.txt
+++ b/icu4c/source/data/locales/az_Cyrl_AZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az_Cyrl_AZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/az_Latn.txt b/icu4c/source/data/locales/az_Latn.txt
index 9df6ff3..47ecb5c 100644
--- a/icu4c/source/data/locales/az_Latn.txt
+++ b/icu4c/source/data/locales/az_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/az_Latn_AZ.txt b/icu4c/source/data/locales/az_Latn_AZ.txt
index 0f07101..5dc6ef7 100644
--- a/icu4c/source/data/locales/az_Latn_AZ.txt
+++ b/icu4c/source/data/locales/az_Latn_AZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az_Latn_AZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bas.txt b/icu4c/source/data/locales/bas.txt
index 40c0f8f..7cf3e96 100644
--- a/icu4c/source/data/locales/bas.txt
+++ b/icu4c/source/data/locales/bas.txt
@@ -24,7 +24,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/bas_CM.txt b/icu4c/source/data/locales/bas_CM.txt
index b928dff..866296e 100644
--- a/icu4c/source/data/locales/bas_CM.txt
+++ b/icu4c/source/data/locales/bas_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bas_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/be.txt b/icu4c/source/data/locales/be.txt
index 9dfb31c..f3a9076 100644
--- a/icu4c/source/data/locales/be.txt
+++ b/icu4c/source/data/locales/be.txt
@@ -287,7 +287,7 @@
         minimumGroupingDigits{"2"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/be_BY.txt b/icu4c/source/data/locales/be_BY.txt
index 614eeec..3da4302 100644
--- a/icu4c/source/data/locales/be_BY.txt
+++ b/icu4c/source/data/locales/be_BY.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 be_BY{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bem.txt b/icu4c/source/data/locales/bem.txt
index efa21c8..0a2a0d0 100644
--- a/icu4c/source/data/locales/bem.txt
+++ b/icu4c/source/data/locales/bem.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/bem_ZM.txt b/icu4c/source/data/locales/bem_ZM.txt
index bfbcc15..2626c2d 100644
--- a/icu4c/source/data/locales/bem_ZM.txt
+++ b/icu4c/source/data/locales/bem_ZM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bem_ZM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bez.txt b/icu4c/source/data/locales/bez.txt
index ccdf34f..32ee427 100644
--- a/icu4c/source/data/locales/bez.txt
+++ b/icu4c/source/data/locales/bez.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/bez_TZ.txt b/icu4c/source/data/locales/bez_TZ.txt
index 97144bb..a996530 100644
--- a/icu4c/source/data/locales/bez_TZ.txt
+++ b/icu4c/source/data/locales/bez_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bez_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bg.txt b/icu4c/source/data/locales/bg.txt
index 3824604..98bf498 100644
--- a/icu4c/source/data/locales/bg.txt
+++ b/icu4c/source/data/locales/bg.txt
@@ -210,7 +210,7 @@
         minimumGroupingDigits{"2"}
         native{"latn"}
     }
-    Version{"2.1.37.59"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/bg_BG.txt b/icu4c/source/data/locales/bg_BG.txt
index 4389928..aa298d4 100644
--- a/icu4c/source/data/locales/bg_BG.txt
+++ b/icu4c/source/data/locales/bg_BG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bg_BG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bm.txt b/icu4c/source/data/locales/bm.txt
index 39452e2..40fe15e 100644
--- a/icu4c/source/data/locales/bm.txt
+++ b/icu4c/source/data/locales/bm.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/bm_ML.txt b/icu4c/source/data/locales/bm_ML.txt
index 31da58d..83d4c44 100644
--- a/icu4c/source/data/locales/bm_ML.txt
+++ b/icu4c/source/data/locales/bm_ML.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bm_ML{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bn.txt b/icu4c/source/data/locales/bn.txt
index e7b3c42..ea512af 100644
--- a/icu4c/source/data/locales/bn.txt
+++ b/icu4c/source/data/locales/bn.txt
@@ -241,7 +241,7 @@
         minimumGroupingDigits{"1"}
         native{"beng"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/bn_BD.txt b/icu4c/source/data/locales/bn_BD.txt
index 06fe8dd..0471242 100644
--- a/icu4c/source/data/locales/bn_BD.txt
+++ b/icu4c/source/data/locales/bn_BD.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bn_BD{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bn_IN.txt b/icu4c/source/data/locales/bn_IN.txt
index 580dab8..5650a40 100644
--- a/icu4c/source/data/locales/bn_IN.txt
+++ b/icu4c/source/data/locales/bn_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bn_IN{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bo.txt b/icu4c/source/data/locales/bo.txt
index 87a1397..a5c4a99 100644
--- a/icu4c/source/data/locales/bo.txt
+++ b/icu4c/source/data/locales/bo.txt
@@ -33,7 +33,7 @@
             }
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/bo_CN.txt b/icu4c/source/data/locales/bo_CN.txt
index bc197c6..d1501ea 100644
--- a/icu4c/source/data/locales/bo_CN.txt
+++ b/icu4c/source/data/locales/bo_CN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bo_CN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bo_IN.txt b/icu4c/source/data/locales/bo_IN.txt
index caa844f..e8ed820 100644
--- a/icu4c/source/data/locales/bo_IN.txt
+++ b/icu4c/source/data/locales/bo_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bo_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/br.txt b/icu4c/source/data/locales/br.txt
index d36e64b..3a45256 100644
--- a/icu4c/source/data/locales/br.txt
+++ b/icu4c/source/data/locales/br.txt
@@ -16,11 +16,133 @@
     MoreInformation{"?"}
     NumberElements{
         arab{
+            patterns{
+                accountingFormat{"#,##0.00 ¤"}
+                currencyFormat{"#,##0.00 ¤"}
+                percentFormat{"#,##0 %"}
+            }
+            symbols{
+                decimal{"٫"}
+                exponential{"اس"}
+                group{"٬"}
+                infinity{"∞"}
+                list{"؛"}
+                minusSign{"؜-"}
+                nan{"NaN"}
+                perMille{"؉"}
+                percentSign{"٪؜"}
+                plusSign{"؜+"}
+                superscriptingExponent{"×"}
+                timeSeparator{":"}
+            }
+        }
+        arabext{
+            symbols{
+                decimal{"٫"}
+                exponential{"×۱۰^"}
+                group{"٬"}
+                infinity{"∞"}
+                list{"؛"}
+                minusSign{"‎-‎"}
+                nan{"NaN"}
+                perMille{"؉"}
+                percentSign{"٪"}
+                plusSign{"‎+‎"}
+                superscriptingExponent{"×"}
+                timeSeparator{"٫"}
+            }
+        }
+        bali{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        beng{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        brah{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        cakm{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        cham{
             symbols{
                 timeSeparator{":"}
             }
         }
         default{"latn"}
+        deva{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        fullwide{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        gonm{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        gujr{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        guru{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        hanidec{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        java{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        kali{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        khmr{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        knda{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        lana{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        lanatham{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        laoo{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
         latn{
             miscPatterns{
                 atLeast{"⩾{0}"}
@@ -33,6 +155,268 @@
                 percentFormat{"#,##0 %"}
                 scientificFormat{"#E0"}
             }
+            patternsLong{
+                decimalFormat{
+                    1000{
+                        few{"0 miliad"}
+                        many{"0 a viliadoù"}
+                        one{"0 miliad"}
+                        other{"0 miliad"}
+                        two{"0 viliad"}
+                    }
+                    10000{
+                        few{"00 miliad"}
+                        many{"00 a viliadoù"}
+                        one{"00 miliad"}
+                        other{"00 miliad"}
+                        two{"00 viliad"}
+                    }
+                    100000{
+                        few{"000 miliad"}
+                        many{"000 a viliadoù"}
+                        one{"000 miliad"}
+                        other{"000 miliad"}
+                        two{"000 viliad"}
+                    }
+                    1000000{
+                        few{"0 milion"}
+                        many{"0 a v/milionoù"}
+                        one{"0 milion"}
+                        other{"0 milion"}
+                        two{"0 v/milion"}
+                    }
+                    10000000{
+                        few{"00 milion"}
+                        many{"00 a v/milionoù"}
+                        one{"00 milion"}
+                        other{"00 milion"}
+                        two{"00 v/milion"}
+                    }
+                    100000000{
+                        few{"000 milion"}
+                        many{"000 a v/milionoù"}
+                        one{"000 milion"}
+                        other{"000 milion"}
+                        two{"000 v/milion"}
+                    }
+                    1000000000{
+                        few{"0 miliard"}
+                        many{"0 a viliardoù"}
+                        one{"0 miliard"}
+                        other{"0 miliard"}
+                        two{"0 viliard"}
+                    }
+                    10000000000{
+                        few{"00 miliard"}
+                        many{"00 a viliardoù"}
+                        one{"00 miliard"}
+                        other{"00 miliard"}
+                        two{"00 viliard"}
+                    }
+                    100000000000{
+                        few{"000 miliard"}
+                        many{"000 a viliardoù"}
+                        one{"000 miliard"}
+                        other{"000 miliard"}
+                        two{"000 viliard"}
+                    }
+                    1000000000000{
+                        few{"0 bilion"}
+                        many{"0 a v/bilionoù"}
+                        one{"0 bilion"}
+                        other{"0 bilion"}
+                        two{"0 v/bilion"}
+                    }
+                    10000000000000{
+                        few{"00 bilion"}
+                        many{"00 a v/bilionoù"}
+                        one{"00 bilion"}
+                        other{"00 bilion"}
+                        two{"00 v/bilion"}
+                    }
+                    100000000000000{
+                        few{"000 bilion"}
+                        many{"000 a v/bilionoù"}
+                        one{"000 bilion"}
+                        other{"000 bilion"}
+                        two{"000 v/bilion"}
+                    }
+                }
+            }
+            patternsShort{
+                currencyFormat{
+                    1000{
+                        few{"0 k¤"}
+                        many{"0 k¤"}
+                        one{"0 k¤"}
+                        other{"0 k¤"}
+                        two{"0 k¤"}
+                    }
+                    10000{
+                        few{"00 k¤"}
+                        many{"00 k¤"}
+                        one{"00 k¤"}
+                        other{"00 k¤"}
+                        two{"00 k¤"}
+                    }
+                    100000{
+                        few{"000 k¤"}
+                        many{"000 k¤"}
+                        one{"000 k¤"}
+                        other{"000 k¤"}
+                        two{"000 k¤"}
+                    }
+                    1000000{
+                        few{"0 M¤"}
+                        many{"0 M¤"}
+                        one{"0 M¤"}
+                        other{"0 M¤"}
+                        two{"0 M¤"}
+                    }
+                    10000000{
+                        few{"00 M¤"}
+                        many{"00 M¤"}
+                        one{"00 M¤"}
+                        other{"00 M¤"}
+                        two{"00 M¤"}
+                    }
+                    100000000{
+                        few{"000 M¤"}
+                        many{"000 M¤"}
+                        one{"000 M¤"}
+                        other{"000 M¤"}
+                        two{"000 M¤"}
+                    }
+                    1000000000{
+                        few{"0 G¤"}
+                        many{"0 G¤"}
+                        one{"0 G¤"}
+                        other{"0 G¤"}
+                        two{"0 G¤"}
+                    }
+                    10000000000{
+                        few{"00 G¤"}
+                        many{"00 G¤"}
+                        one{"00 G¤"}
+                        other{"00 G¤"}
+                        two{"00 G¤"}
+                    }
+                    100000000000{
+                        few{"000 G¤"}
+                        many{"000 G¤"}
+                        one{"000 G¤"}
+                        other{"000 G¤"}
+                        two{"000 G¤"}
+                    }
+                    1000000000000{
+                        few{"0 T¤"}
+                        many{"0 T¤"}
+                        one{"0 T¤"}
+                        other{"0 T¤"}
+                        two{"0 T¤"}
+                    }
+                    10000000000000{
+                        few{"00 T¤"}
+                        many{"00 T¤"}
+                        one{"00 T¤"}
+                        other{"00 T¤"}
+                        two{"00 T¤"}
+                    }
+                    100000000000000{
+                        few{"000 T¤"}
+                        many{"000 T¤"}
+                        one{"000 T¤"}
+                        other{"000 T¤"}
+                        two{"000 T¤"}
+                    }
+                }
+                decimalFormat{
+                    1000{
+                        few{"0k"}
+                        many{"0k"}
+                        one{"0k"}
+                        other{"0k"}
+                        two{"0k"}
+                    }
+                    10000{
+                        few{"00k"}
+                        many{"00k"}
+                        one{"00k"}
+                        other{"00k"}
+                        two{"00k"}
+                    }
+                    100000{
+                        few{"000k"}
+                        many{"000k"}
+                        one{"000k"}
+                        other{"000k"}
+                        two{"000k"}
+                    }
+                    1000000{
+                        few{"0M"}
+                        many{"0M"}
+                        one{"0M"}
+                        other{"0M"}
+                        two{"0M"}
+                    }
+                    10000000{
+                        few{"00M"}
+                        many{"00M"}
+                        one{"00M"}
+                        other{"00M"}
+                        two{"00M"}
+                    }
+                    100000000{
+                        few{"000M"}
+                        many{"000M"}
+                        one{"000M"}
+                        other{"000M"}
+                        two{"000M"}
+                    }
+                    1000000000{
+                        few{"0G"}
+                        many{"0G"}
+                        one{"0G"}
+                        other{"0G"}
+                        two{"0G"}
+                    }
+                    10000000000{
+                        few{"00G"}
+                        many{"00G"}
+                        one{"00G"}
+                        other{"00G"}
+                        two{"00G"}
+                    }
+                    100000000000{
+                        few{"000G"}
+                        many{"000G"}
+                        one{"000G"}
+                        other{"000G"}
+                        two{"000G"}
+                    }
+                    1000000000000{
+                        few{"0T"}
+                        many{"0T"}
+                        one{"0T"}
+                        other{"0T"}
+                        two{"0T"}
+                    }
+                    10000000000000{
+                        few{"00T"}
+                        many{"00T"}
+                        one{"00T"}
+                        other{"00T"}
+                        two{"00T"}
+                    }
+                    100000000000000{
+                        few{"000T"}
+                        many{"000T"}
+                        one{"000T"}
+                        other{"000T"}
+                        two{"000T"}
+                    }
+                }
+            }
             symbols{
                 decimal{","}
                 exponential{"E"}
@@ -48,115 +432,2506 @@
                 timeSeparator{":"}
             }
         }
+        lepc{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        limb{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        minimalPairs{
+            ordinal{
+                other{"{0}vet"}
+            }
+        }
         minimumGroupingDigits{"1"}
+        mlym{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        mong{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        mtei{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        mymr{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        mymrshan{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
         native{"latn"}
+        nkoo{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        olck{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        orya{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        osma{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        saur{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        shrd{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        sora{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        sund{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        takr{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        talu{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        tamldec{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        telu{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        thai{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        tibt{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
+        vaii{
+            symbols{
+                timeSeparator{":"}
+            }
+        }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
+        buddhist{
+            DateTimePatterns{
+                "HH:mm:ss zzzz",
+                "HH:mm:ss z",
+                "HH:mm:ss",
+                "HH:mm",
+                "EEEE d MMMM y G",
+                "d MMMM y G",
+                "d MMM y G",
+                "dd/MM/y GGGG",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
+                "{1} {0}",
+            }
+            availableFormats{
+                Ed{"E d"}
+                Gy{"y G"}
+                GyMMM{"MMM y G"}
+                GyMMMEd{"E d MMM y G"}
+                GyMMMd{"d MMM y G"}
+                MEd{"E dd/MM"}
+                MMM{"LLL"}
+                MMMEd{"E d MMM"}
+                MMMMd{"d MMMM"}
+                MMMd{"d MMM"}
+                Md{"dd/MM"}
+                y{"y G"}
+                yyyy{"y G"}
+                yyyyM{"MM/y GGGGG"}
+                yyyyMEd{"E dd/MM/y GGGGG"}
+                yyyyMMM{"MMM y G"}
+                yyyyMMMEd{"E d MMM y G"}
+                yyyyMMMM{"MMMM y G"}
+                yyyyMMMd{"d MMM y G"}
+                yyyyMd{"dd/MM/y GGGGG"}
+                yyyyQQQ{"QQQ y G"}
+                yyyyQQQQ{"QQQQ y G"}
+            }
+            intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                M{
+                    M{"MM–MM"}
+                }
+                MEd{
+                    M{"E dd/MM – E dd/MM"}
+                    d{"E dd/MM – E dd/MM"}
+                }
+                MMM{
+                    M{"LLL–LLL"}
+                }
+                MMMEd{
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
+                }
+                MMMd{
+                    M{"d MMM – d MMM"}
+                    d{"d–d MMM"}
+                }
+                Md{
+                    M{"dd/MM–dd/MM"}
+                    d{"dd/MM–dd/MM"}
+                }
+                fallback{"{0} – {1}"}
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+                y{
+                    y{"y–y G"}
+                }
+                yM{
+                    M{"MM/y–MM/y GGGGG"}
+                    y{"MM/y–MM/y GGGGG"}
+                }
+                yMEd{
+                    M{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    d{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    y{"E dd/MM/y – E dd/MM/y GGGGG"}
+                }
+                yMMM{
+                    M{"MMM – MMM y G"}
+                    y{"MMM y – MMM y G"}
+                }
+                yMMMEd{
+                    M{"E d MMM – E d MMM y G"}
+                    d{"E d MMM – E d MMM y G"}
+                    y{"E d MMM y – E d MMM y G"}
+                }
+                yMMMM{
+                    M{"MMMM – MMMM y G"}
+                    y{"MMMM y – MMMM y G"}
+                }
+                yMMMd{
+                    M{"d MMM – d MMM y G"}
+                    d{"d–d MMM y G"}
+                    y{"d MMM y – d MMM y G"}
+                }
+                yMd{
+                    M{"dd/MM/y–dd/MM/y GGGGG"}
+                    d{"dd/MM/y–dd/MM/y GGGGG"}
+                    y{"dd/MM/y–dd/MM/y GGGGG"}
+                }
+            }
+        }
+        chinese{
+            DateTimePatterns{
+                "HH:mm:ss zzzz",
+                "HH:mm:ss z",
+                "HH:mm:ss",
+                "HH:mm",
+                "EEEE d MMMM r (U)",
+                "d MMMM r (U)",
+                "d MMM r",
+                "dd/MM/r",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
+                "{1} {0}",
+            }
+            availableFormats{
+                Bh{"h B"}
+                Bhm{"h:mm B"}
+                Bhms{"h:mm:ss B"}
+                E{"ccc"}
+                EBhm{"E h:mm B"}
+                EBhms{"E h:mm:ss B"}
+                Ed{"E d"}
+                Gy{"r (U)"}
+                GyMMM{"MMM r (U)"}
+                H{"HH"}
+                Hm{"HH:mm"}
+                Hms{"HH:mm:ss"}
+                M{"L"}
+                MMM{"LLL"}
+                d{"d"}
+                h{"h a"}
+                hm{"h:mm a"}
+                hms{"h:mm:ss a"}
+                ms{"mm:ss"}
+            }
+            cyclicNameSets{
+                dayParts{
+                    format{
+                        abbreviated{
+                            "zi",
+                            "chou",
+                            "yin",
+                            "mao",
+                            "chen",
+                            "si",
+                            "wu",
+                            "wei",
+                            "shen",
+                            "you",
+                            "xu",
+                            "hai",
+                        }
+                        narrow{
+                            "zi",
+                            "chou",
+                            "yin",
+                            "mao",
+                            "chen",
+                            "si",
+                            "wu",
+                            "wei",
+                            "shen",
+                            "you",
+                            "xu",
+                            "hai",
+                        }
+                        wide{
+                            "zi",
+                            "chou",
+                            "yin",
+                            "mao",
+                            "chen",
+                            "si",
+                            "wu",
+                            "wei",
+                            "shen",
+                            "you",
+                            "xu",
+                            "hai",
+                        }
+                    }
+                }
+                days{
+                    format{
+                        abbreviated{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        narrow{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        wide{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                    }
+                }
+                months{
+                    format{
+                        abbreviated{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        narrow{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        wide{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                    }
+                }
+                years{
+                    format{
+                        abbreviated{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        narrow{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        wide{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                    }
+                }
+            }
+            intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                M{
+                    M{"MM–MM"}
+                }
+                MMM{
+                    M{"LLL–LLL"}
+                }
+                d{
+                    d{"d–d"}
+                }
+                fallback{"{0} – {1}"}
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+                y{
+                    y{"U–U"}
+                }
+            }
+            monthNames{
+                format{
+                    abbreviated{
+                        "kentañ miz",
+                        "eil miz",
+                        "trede miz",
+                        "pevare miz",
+                        "pempvet miz",
+                        "cʼhwecʼhvet miz",
+                        "seizhvet miz",
+                        "eizhvet miz",
+                        "navet miz",
+                        "dekvet miz",
+                        "unnekvet miz",
+                        "daouzekvet miz",
+                    }
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                    }
+                    wide{
+                        "kentañ miz",
+                        "eil miz",
+                        "trede miz",
+                        "pevare miz",
+                        "pempvet miz",
+                        "cʼhwecʼhvet miz",
+                        "seizhvet miz",
+                        "eizhvet miz",
+                        "navet miz",
+                        "dekvet miz",
+                        "unnekvet miz",
+                        "daouzekvet miz",
+                    }
+                }
+                stand-alone{
+                    abbreviated{
+                        "kentañ miz",
+                        "eil miz",
+                        "trede miz",
+                        "pevare miz",
+                        "pempvet miz",
+                        "cʼhwecʼhvet miz",
+                        "seizhvet miz",
+                        "eizhvet miz",
+                        "navet miz",
+                        "dekvet miz",
+                        "unnekvet miz",
+                        "daouzekvet miz",
+                    }
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                    }
+                    wide{
+                        "kentañ miz",
+                        "eil miz",
+                        "trede miz",
+                        "pevare miz",
+                        "pempvet miz",
+                        "cʼhwecʼhvet miz",
+                        "seizhvet miz",
+                        "eizhvet miz",
+                        "navet miz",
+                        "dekvet miz",
+                        "unnekvet miz",
+                        "daouzekvet miz",
+                    }
+                }
+            }
+        }
+        coptic{
+            DateTimePatterns{
+                "HH:mm:ss zzzz",
+                "HH:mm:ss z",
+                "HH:mm:ss",
+                "HH:mm",
+                "EEEE d MMMM y G",
+                "d MMMM y G",
+                "d MMM y G",
+                "dd/MM/y GGGG",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
+                "{1} {0}",
+            }
+            availableFormats{
+                Ed{"E d"}
+                Gy{"y G"}
+                GyMMM{"MMM y G"}
+                GyMMMEd{"E d MMM y G"}
+                GyMMMd{"d MMM y G"}
+                MEd{"E dd/MM"}
+                MMMEd{"E d MMM"}
+                MMMMd{"d MMMM"}
+                MMMd{"d MMM"}
+                Md{"dd/MM"}
+                y{"y G"}
+                yyyy{"y G"}
+                yyyyM{"MM/y GGGGG"}
+                yyyyMEd{"E dd/MM/y GGGGG"}
+                yyyyMMM{"MMM y G"}
+                yyyyMMMEd{"E d MMM y G"}
+                yyyyMMMM{"MMMM y G"}
+                yyyyMMMd{"d MMM y G"}
+                yyyyMd{"dd/MM/y GGGGG"}
+                yyyyQQQ{"QQQ y G"}
+                yyyyQQQQ{"QQQQ y G"}
+            }
+            intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                MEd{
+                    M{"E dd/MM – E dd/MM"}
+                    d{"E dd/MM – E dd/MM"}
+                }
+                MMMEd{
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
+                }
+                MMMd{
+                    M{"d MMM – d MMM"}
+                    d{"d–d MMM"}
+                }
+                Md{
+                    M{"dd/MM–dd/MM"}
+                    d{"dd/MM–dd/MM"}
+                }
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+                y{
+                    y{"y–y G"}
+                }
+                yM{
+                    M{"MM/y–MM/y GGGGG"}
+                    y{"MM/y–MM/y GGGGG"}
+                }
+                yMEd{
+                    M{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    d{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    y{"E dd/MM/y – E dd/MM/y GGGGG"}
+                }
+                yMMM{
+                    M{"MMM – MMM y G"}
+                    y{"MMM y – MMM y G"}
+                }
+                yMMMEd{
+                    M{"E d MMM – E d MMM y G"}
+                    d{"E d MMM – E d MMM y G"}
+                    y{"E d MMM y – E d MMM y G"}
+                }
+                yMMMM{
+                    M{"MMMM – MMMM y G"}
+                    y{"MMMM y – MMMM y G"}
+                }
+                yMMMd{
+                    M{"d MMM – d MMM y G"}
+                    d{"d–d MMM y G"}
+                    y{"d MMM y – d MMM y G"}
+                }
+                yMd{
+                    M{"dd/MM/y–dd/MM/y GGGGG"}
+                    d{"dd/MM/y–dd/MM/y GGGGG"}
+                    y{"dd/MM/y–dd/MM/y GGGGG"}
+                }
+            }
+            monthNames{
+                format{
+                    abbreviated{
+                        "Tout",
+                        "Baba",
+                        "Hator",
+                        "Kiahk",
+                        "Toba",
+                        "Amshir",
+                        "Baramhat",
+                        "Baramouda",
+                        "Bashans",
+                        "Paona",
+                        "Epep",
+                        "Mesra",
+                        "Nasie",
+                    }
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                        "13",
+                    }
+                    wide{
+                        "Tout",
+                        "Baba",
+                        "Hator",
+                        "Kiahk",
+                        "Toba",
+                        "Amshir",
+                        "Baramhat",
+                        "Baramouda",
+                        "Bashans",
+                        "Paona",
+                        "Epep",
+                        "Mesra",
+                        "Nasie",
+                    }
+                }
+                stand-alone{
+                    abbreviated{
+                        "Tout",
+                        "Baba",
+                        "Hator",
+                        "Kiahk",
+                        "Toba",
+                        "Amshir",
+                        "Baramhat",
+                        "Baramouda",
+                        "Bashans",
+                        "Paona",
+                        "Epep",
+                        "Mesra",
+                        "Nasie",
+                    }
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                        "13",
+                    }
+                    wide{
+                        "Tout",
+                        "Baba",
+                        "Hator",
+                        "Kiahk",
+                        "Toba",
+                        "Amshir",
+                        "Baramhat",
+                        "Baramouda",
+                        "Bashans",
+                        "Paona",
+                        "Epep",
+                        "Mesra",
+                        "Nasie",
+                    }
+                }
+            }
+        }
+        dangi{
+            DateTimePatterns{
+                "HH:mm:ss zzzz",
+                "HH:mm:ss z",
+                "HH:mm:ss",
+                "HH:mm",
+                "EEEE d MMMM r (U)",
+                "d MMMM r (U)",
+                "d MMM r",
+                "dd/MM/r",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
+                "{1} {0}",
+            }
+            availableFormats{
+                E{"ccc"}
+                Ed{"E d"}
+                Gy{"r (U)"}
+                GyMMM{"MMM r (U)"}
+                GyMMMEd{"E d MMM r (U)"}
+                GyMMMd{"d MMM r"}
+                M{"L"}
+                MEd{"E, d/M"}
+                MMM{"LLL"}
+                MMMEd{"E d MMM"}
+                MMMMd{"d MMMM"}
+                MMMd{"d MMM"}
+                Md{"d/M"}
+                UM{"M/U"}
+                UMMM{"MMM U"}
+                UMMMd{"d MMM, U"}
+                UMd{"d/M/U"}
+                d{"d"}
+                y{"r (U)"}
+                yMd{"d/M/r"}
+                yyyy{"r (U)"}
+                yyyyM{"M/r"}
+                yyyyMEd{"E, M/d/r"}
+                yyyyMMM{"MMM r (U)"}
+                yyyyMMMEd{"E d MMM r (U)"}
+                yyyyMMMM{"MMMM r (U)"}
+                yyyyMMMd{"d MMM r"}
+                yyyyMd{"d/M/r"}
+                yyyyQQQ{"QQQ r (U)"}
+                yyyyQQQQ{"QQQQ r (U)"}
+            }
+            cyclicNameSets{
+                dayParts{
+                    format{
+                        abbreviated{
+                            "zi",
+                            "chou",
+                            "yin",
+                            "mao",
+                            "chen",
+                            "si",
+                            "wu",
+                            "wei",
+                            "shen",
+                            "you",
+                            "xu",
+                            "hai",
+                        }
+                        narrow{
+                            "zi",
+                            "chou",
+                            "yin",
+                            "mao",
+                            "chen",
+                            "si",
+                            "wu",
+                            "wei",
+                            "shen",
+                            "you",
+                            "xu",
+                            "hai",
+                        }
+                        wide{
+                            "zi",
+                            "chou",
+                            "yin",
+                            "mao",
+                            "chen",
+                            "si",
+                            "wu",
+                            "wei",
+                            "shen",
+                            "you",
+                            "xu",
+                            "hai",
+                        }
+                    }
+                }
+                days{
+                    format{
+                        abbreviated{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        narrow{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        wide{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                    }
+                }
+                months{
+                    format{
+                        abbreviated{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        narrow{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        wide{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                    }
+                }
+                solarTerms{
+                    format{
+                        abbreviated{
+                            "spring begins",
+                            "rain water",
+                            "insects awaken",
+                            "kedez-Veurzh",
+                            "bright and clear",
+                            "grain rain",
+                            "summer begins",
+                            "grain full",
+                            "grain in ear",
+                            "goursav-heol an hañv",
+                            "minor heat",
+                            "major heat",
+                            "autumn begins",
+                            "end of heat",
+                            "white dew",
+                            "autumn equinox",
+                            "cold dew",
+                            "frost descends",
+                            "winter begins",
+                            "minor snow",
+                            "major snow",
+                            "winter solstice",
+                            "minor cold",
+                            "major cold",
+                        }
+                        wide{
+                            "spring begins",
+                            "rain water",
+                            "insects awaken",
+                            "kedez-Veurzh",
+                            "bright and clear",
+                            "grain rain",
+                            "summer begins",
+                            "grain full",
+                            "grain in ear",
+                            "goursav-heol an hañv",
+                            "minor heat",
+                            "major heat",
+                            "autumn begins",
+                            "end of heat",
+                            "white dew",
+                            "autumn equinox",
+                            "cold dew",
+                            "frost descends",
+                            "winter begins",
+                            "minor snow",
+                            "major snow",
+                            "winter solstice",
+                            "minor cold",
+                            "major cold",
+                        }
+                    }
+                }
+                years{
+                    format{
+                        abbreviated{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        narrow{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                        wide{
+                            "jia-zi",
+                            "yi-chou",
+                            "bing-yin",
+                            "ding-mao",
+                            "wu-chen",
+                            "ji-si",
+                            "geng-wu",
+                            "xin-wei",
+                            "ren-shen",
+                            "gui-you",
+                            "jia-xu",
+                            "yi-hai",
+                            "bing-zi",
+                            "ding-chou",
+                            "wu-yin",
+                            "ji-mao",
+                            "geng-chen",
+                            "xin-si",
+                            "ren-wu",
+                            "gui-wei",
+                            "jia-shen",
+                            "yi-you",
+                            "bing-xu",
+                            "ding-hai",
+                            "wu-zi",
+                            "ji-chou",
+                            "geng-yin",
+                            "xin-mao",
+                            "ren-chen",
+                            "gui-si",
+                            "jia-wu",
+                            "yi-wei",
+                            "bing-shen",
+                            "ding-you",
+                            "wu-xu",
+                            "ji-hai",
+                            "geng-zi",
+                            "xin-chou",
+                            "ren-yin",
+                            "gui-mao",
+                            "jia-chen",
+                            "yi-si",
+                            "bing-wu",
+                            "ding-wei",
+                            "wu-shen",
+                            "ji-you",
+                            "geng-xu",
+                            "xin-hai",
+                            "ren-zi",
+                            "gui-chou",
+                            "jia-yin",
+                            "yi-mao",
+                            "bing-chen",
+                            "ding-si",
+                            "wu-wu",
+                            "ji-wei",
+                            "geng-shen",
+                            "xin-you",
+                            "ren-xu",
+                            "gui-hai",
+                        }
+                    }
+                }
+            }
+            intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                M{
+                    M{"MM–MM"}
+                }
+                MMM{
+                    M{"LLL–LLL"}
+                }
+                Md{
+                    M{"MM-dd – MM-dd"}
+                }
+                d{
+                    d{"d–d"}
+                }
+                fallback{"{0} – {1}"}
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+            }
+            monthNames{
+                format{
+                    abbreviated{
+                        "kentañ miz",
+                        "eil miz",
+                        "trede miz",
+                        "pevare miz",
+                        "pempvet miz",
+                        "cʼhwecʼhvet miz",
+                        "seizhvet miz",
+                        "eizhvet miz",
+                        "navet miz",
+                        "dekvet miz",
+                        "unnekvet miz",
+                        "daouzekvet miz",
+                    }
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                    }
+                    wide{
+                        "kentañ miz",
+                        "eil miz",
+                        "trede miz",
+                        "pevare miz",
+                        "pempvet miz",
+                        "cʼhwecʼhvet miz",
+                        "seizhvet miz",
+                        "eizhvet miz",
+                        "navet miz",
+                        "dekvet miz",
+                        "unnekvet miz",
+                        "daouzekvet miz",
+                    }
+                }
+                stand-alone{
+                    abbreviated{
+                        "kentañ miz",
+                        "eil miz",
+                        "trede miz",
+                        "pevare miz",
+                        "pempvet miz",
+                        "cʼhwecʼhvet miz",
+                        "seizhvet miz",
+                        "eizhvet miz",
+                        "navet miz",
+                        "dekvet miz",
+                        "unnekvet miz",
+                        "daouzekvet miz",
+                    }
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                    }
+                    wide{
+                        "kentañ miz",
+                        "eil miz",
+                        "trede miz",
+                        "pevare miz",
+                        "pempvet miz",
+                        "cʼhwecʼhvet miz",
+                        "seizhvet miz",
+                        "eizhvet miz",
+                        "navet miz",
+                        "dekvet miz",
+                        "unnekvet miz",
+                        "daouzekvet miz",
+                    }
+                }
+            }
+        }
+        ethiopic{
+            DateTimePatterns{
+                "HH:mm:ss zzzz",
+                "HH:mm:ss z",
+                "HH:mm:ss",
+                "HH:mm",
+                "EEEE d MMMM y G",
+                "d MMMM y G",
+                "d MMM y G",
+                "dd/MM/y GGGG",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
+                "{1} {0}",
+            }
+            availableFormats{
+                Ed{"E d"}
+                Gy{"y G"}
+                GyMMM{"MMM y G"}
+                GyMMMEd{"E d MMM y G"}
+                GyMMMd{"d MMM y G"}
+                MEd{"E dd/MM"}
+                MMMEd{"E d MMM"}
+                MMMMd{"d MMMM"}
+                MMMd{"d MMM"}
+                Md{"dd/MM"}
+                y{"y G"}
+                yyyy{"y G"}
+                yyyyM{"MM/y GGGGG"}
+                yyyyMEd{"E dd/MM/y GGGGG"}
+                yyyyMMM{"MMM y G"}
+                yyyyMMMEd{"E d MMM y G"}
+                yyyyMMMM{"MMMM y G"}
+                yyyyMMMd{"d MMM y G"}
+                yyyyMd{"dd/MM/y GGGGG"}
+                yyyyQQQ{"QQQ y G"}
+                yyyyQQQQ{"QQQQ y G"}
+            }
+            intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                MEd{
+                    M{"E dd/MM – E dd/MM"}
+                    d{"E dd/MM – E dd/MM"}
+                }
+                MMMEd{
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
+                }
+                MMMd{
+                    M{"d MMM – d MMM"}
+                    d{"d–d MMM"}
+                }
+                Md{
+                    M{"dd/MM–dd/MM"}
+                    d{"dd/MM–dd/MM"}
+                }
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+                y{
+                    y{"y–y G"}
+                }
+                yM{
+                    M{"MM/y–MM/y GGGGG"}
+                    y{"MM/y–MM/y GGGGG"}
+                }
+                yMEd{
+                    M{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    d{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    y{"E dd/MM/y – E dd/MM/y GGGGG"}
+                }
+                yMMM{
+                    M{"MMM – MMM y G"}
+                    y{"MMM y – MMM y G"}
+                }
+                yMMMEd{
+                    M{"E d MMM – E d MMM y G"}
+                    d{"E d MMM – E d MMM y G"}
+                    y{"E d MMM y – E d MMM y G"}
+                }
+                yMMMM{
+                    M{"MMMM – MMMM y G"}
+                    y{"MMMM y – MMMM y G"}
+                }
+                yMMMd{
+                    M{"d MMM – d MMM y G"}
+                    d{"d–d MMM y G"}
+                    y{"d MMM y – d MMM y G"}
+                }
+                yMd{
+                    M{"dd/MM/y–dd/MM/y GGGGG"}
+                    d{"dd/MM/y–dd/MM/y GGGGG"}
+                    y{"dd/MM/y–dd/MM/y GGGGG"}
+                }
+            }
+            monthNames{
+                format{
+                    abbreviated{
+                        "Meskerem",
+                        "Tekemt",
+                        "Hedar",
+                        "Tahsas",
+                        "Ter",
+                        "Yekatit",
+                        "Megabit",
+                        "Miazia",
+                        "Genbot",
+                        "Sene",
+                        "Hamle",
+                        "Nehasse",
+                        "Pagumen",
+                    }
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                        "13",
+                    }
+                    wide{
+                        "Meskerem",
+                        "Tekemt",
+                        "Hedar",
+                        "Tahsas",
+                        "Ter",
+                        "Yekatit",
+                        "Megabit",
+                        "Miazia",
+                        "Genbot",
+                        "Sene",
+                        "Hamle",
+                        "Nehasse",
+                        "Pagumen",
+                    }
+                }
+                stand-alone{
+                    abbreviated{
+                        "Meskerem",
+                        "Tekemt",
+                        "Hedar",
+                        "Tahsas",
+                        "Ter",
+                        "Yekatit",
+                        "Megabit",
+                        "Miazia",
+                        "Genbot",
+                        "Sene",
+                        "Hamle",
+                        "Nehasse",
+                        "Pagumen",
+                    }
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                        "13",
+                    }
+                    wide{
+                        "Meskerem",
+                        "Tekemt",
+                        "Hedar",
+                        "Tahsas",
+                        "Ter",
+                        "Yekatit",
+                        "Megabit",
+                        "Miazia",
+                        "Genbot",
+                        "Sene",
+                        "Hamle",
+                        "Nehasse",
+                        "Pagumen",
+                    }
+                }
+            }
+        }
         generic{
             DateTimePatterns{
                 "HH:mm:ss zzzz",
                 "HH:mm:ss z",
                 "HH:mm:ss",
                 "HH:mm",
-                "G y MMMM d, EEEE",
-                "G y MMMM d",
-                "G y MMM d",
-                "GGGGG y-MM-dd",
-                "{1} {0}",
-                "{1} {0}",
-                "{1} {0}",
-                "{1} {0}",
+                "EEEE d MMMM y G",
+                "d MMMM y G",
+                "d MMM y G",
+                "dd/MM/y GGGG",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
                 "{1} {0}",
             }
             availableFormats{
+                Bh{"h B"}
+                Bhm{"h:mm B"}
+                Bhms{"h:mm:ss B"}
                 E{"ccc"}
-                Ed{"d, E"}
-                Gy{"G y"}
-                GyMMM{"G y MMM"}
-                GyMMMEd{"G y MMM d, E"}
-                GyMMMd{"G y MMM d"}
+                EBhm{"E h:mm B"}
+                EBhms{"E h:mm:ss B"}
+                EHm{"E HH:mm"}
+                EHms{"E HH:mm:ss"}
+                Ed{"E d"}
+                Ehm{"E h:mm a"}
+                Ehms{"E h:mm:ss a"}
+                Gy{"y G"}
+                GyMMM{"MMM y G"}
+                GyMMMEd{"E d MMM y G"}
+                GyMMMd{"d MMM y G"}
+                H{"HH"}
+                Hm{"HH:mm"}
+                Hms{"HH:mm:ss"}
                 M{"L"}
-                MEd{"MM-dd, E"}
+                MEd{"E dd/MM"}
                 MMM{"LLL"}
-                MMMEd{"MMM d, E"}
-                MMMMd{"MMMM d"}
-                MMMd{"MMM d"}
-                Md{"MM-dd"}
+                MMMEd{"E d MMM"}
+                MMMMd{"d MMMM"}
+                MMMd{"d MMM"}
+                Md{"dd/MM"}
                 d{"d"}
-                y{"G y"}
-                yyyy{"G y"}
-                yyyyM{"GGGGG y-MM"}
-                yyyyMEd{"GGGGG y-MM-dd, E"}
-                yyyyMMM{"G y MMM"}
-                yyyyMMMEd{"G y MMM d, E"}
-                yyyyMMMM{"G y MMMM"}
-                yyyyMMMd{"G y MMM d"}
-                yyyyMd{"GGGGG y-MM-dd"}
-                yyyyQQQ{"G y QQQ"}
-                yyyyQQQQ{"G y QQQQ"}
+                h{"h a"}
+                hm{"h:mm a"}
+                hms{"h:mm:ss a"}
+                ms{"mm:ss"}
+                y{"y G"}
+                yyyy{"y G"}
+                yyyyM{"MM/y GGGGG"}
+                yyyyMEd{"E dd/MM/y GGGGG"}
+                yyyyMMM{"MMM y G"}
+                yyyyMMMEd{"E d MMM y G"}
+                yyyyMMMM{"MMMM y G"}
+                yyyyMMMd{"d MMM y G"}
+                yyyyMd{"dd/MM/y GGGGG"}
+                yyyyQQQ{"QQQ y G"}
+                yyyyQQQQ{"QQQQ y G"}
             }
             intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
                 M{
                     M{"MM–MM"}
                 }
                 MEd{
-                    M{"MM-dd, E – MM-dd, E"}
-                    d{"MM-dd, E – MM-dd, E"}
+                    M{"E dd/MM – E dd/MM"}
+                    d{"E dd/MM – E dd/MM"}
                 }
                 MMM{
                     M{"LLL–LLL"}
                 }
                 MMMEd{
-                    M{"MMM d, E – MMM d, E"}
-                    d{"MMM d, E – MMM d, E"}
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
                 }
                 MMMd{
-                    M{"MMM d – MMM d"}
-                    d{"MMM d–d"}
+                    M{"d MMM – d MMM"}
+                    d{"d–d MMM"}
                 }
                 Md{
-                    M{"MM-dd – MM-dd"}
-                    d{"MM-dd – MM-dd"}
+                    M{"dd/MM–dd/MM"}
+                    d{"dd/MM–dd/MM"}
                 }
                 d{
                     d{"d–d"}
                 }
                 fallback{"{0} – {1}"}
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
                 y{
-                    y{"G y–y"}
+                    y{"y–y G"}
                 }
                 yM{
-                    M{"GGGGG y-MM – y-MM"}
-                    y{"GGGGG y-MM – y-MM"}
+                    M{"MM/y–MM/y GGGGG"}
+                    y{"MM/y–MM/y GGGGG"}
                 }
                 yMEd{
-                    M{"GGGGG y-MM-dd, E – y-MM-dd, E"}
-                    d{"GGGGG y-MM-dd, E – y-MM-dd, E"}
-                    y{"GGGGG y-MM-dd, E – y-MM-dd, E"}
+                    M{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    d{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    y{"E dd/MM/y – E dd/MM/y GGGGG"}
                 }
                 yMMM{
-                    M{"G y MMM–MMM"}
-                    y{"G y MMM – y MMM"}
+                    M{"MMM – MMM y G"}
+                    y{"MMM y – MMM y G"}
                 }
                 yMMMEd{
-                    M{"G y MMM d, E – MMM d, E"}
-                    d{"G y MMM d, E – MMM d, E"}
-                    y{"G y MMM d, E – y MMM d, E"}
+                    M{"E d MMM – E d MMM y G"}
+                    d{"E d MMM – E d MMM y G"}
+                    y{"E d MMM y – E d MMM y G"}
                 }
                 yMMMM{
-                    M{"G y MMMM–MMMM"}
-                    y{"G y MMMM – y MMMM"}
+                    M{"MMMM – MMMM y G"}
+                    y{"MMMM y – MMMM y G"}
                 }
                 yMMMd{
-                    M{"G y MMM d – MMM d"}
-                    d{"G y MMM d–d"}
-                    y{"G y MMM d – y MMM d"}
+                    M{"d MMM – d MMM y G"}
+                    d{"d–d MMM y G"}
+                    y{"d MMM y – d MMM y G"}
                 }
                 yMd{
-                    M{"GGGGG y-MM-dd – y-MM-dd"}
-                    d{"GGGGG y-MM-dd – y-MM-dd"}
-                    y{"GGGGG y-MM-dd – y-MM-dd"}
+                    M{"dd/MM/y–dd/MM/y GGGGG"}
+                    d{"dd/MM/y–dd/MM/y GGGGG"}
+                    y{"dd/MM/y–dd/MM/y GGGGG"}
                 }
             }
         }
@@ -178,30 +2953,35 @@
                 "HH:mm:ss z",
                 "HH:mm:ss",
                 "HH:mm",
-                "y MMMM d, EEEE",
-                "y MMMM d",
-                "y MMM d",
-                "y-MM-dd",
-                "{1} {0}",
+                "EEEE d MMMM y",
+                "d MMMM y",
+                "d MMM y",
+                "dd/MM/y",
+                "{1}, {0}",
                 "{1} 'da' {0}",
                 "{1} 'da' {0}",
-                "{1} {0}",
+                "{1}, {0}",
                 "{1} {0}",
             }
             appendItems{
                 Timezone{"{0} {1}"}
             }
             availableFormats{
+                Bh{"h B"}
+                Bhm{"h:mm B"}
+                Bhms{"h:mm:ss B"}
                 E{"ccc"}
+                EBhm{"E h:mm B"}
+                EBhms{"E h:mm:ss B"}
                 EHm{"E HH:mm"}
                 EHms{"E HH:mm:ss"}
                 Ed{"E d"}
                 Ehm{"E h:mm a"}
                 Ehms{"E h:mm:ss a"}
-                Gy{"G y"}
-                GyMMM{"G y MMM"}
-                GyMMMEd{"G y MMM d, E"}
-                GyMMMd{"G y MMM d"}
+                Gy{"y G"}
+                GyMMM{"MMM y G"}
+                GyMMMEd{"E d MMM y G"}
+                GyMMMd{"d MMM y G"}
                 H{"HH"}
                 Hm{"HH:mm"}
                 Hms{"HH:mm:ss"}
@@ -212,13 +2992,13 @@
                 MMM{"LLL"}
                 MMMEd{"E d MMM"}
                 MMMMW{
-                    few{"'week' W 'of' MMM"}
-                    many{"'week' W 'of' MMM"}
-                    one{"'week' W 'of' MMM"}
-                    other{"'week' W 'of' MMM"}
-                    two{"'week' W 'of' MMM"}
+                    few{"'sizhun' W MMM"}
+                    many{"'sizhun' W MMM"}
+                    one{"'sizhun' W MMM"}
+                    other{"'sizhun' W MMM"}
+                    two{"'sizhun' W MMM"}
                 }
-                MMMMd{"MMMM d"}
+                MMMMd{"d MMMM"}
                 MMMd{"d MMM"}
                 Md{"dd/MM"}
                 d{"d"}
@@ -233,17 +3013,17 @@
                 yMEd{"E dd/MM/y"}
                 yMMM{"MMM y"}
                 yMMMEd{"E d MMM y"}
-                yMMMM{"y MMMM"}
+                yMMMM{"MMMM y"}
                 yMMMd{"d MMM y"}
                 yMd{"dd/MM/y"}
                 yQQQ{"QQQ y"}
                 yQQQQ{"QQQQ y"}
                 yw{
-                    few{"'week' w 'of' Y"}
-                    many{"'week' w 'of' Y"}
-                    one{"'week' w 'of' Y"}
-                    other{"'week' w 'of' Y"}
-                    two{"'week' w 'of' Y"}
+                    few{"'sizhun' w Y"}
+                    many{"'sizhun' w Y"}
+                    one{"'sizhun' w Y"}
+                    other{"'sizhun' w Y"}
+                    two{"'sizhun' w Y"}
                 }
             }
             dayNames{
@@ -515,7 +3295,7 @@
                         "Gwen.",
                         "Here",
                         "Du",
-                        "Ker.",
+                        "Kzu.",
                     }
                     narrow{
                         "01",
@@ -590,21 +3370,1503 @@
                 }
             }
         }
+        hebrew{
+            DateTimePatterns{
+                "HH:mm:ss zzzz",
+                "HH:mm:ss z",
+                "HH:mm:ss",
+                "HH:mm",
+                "EEEE d MMMM y G",
+                "d MMMM y G",
+                "d MMM y G",
+                "dd/MM/y GGGG",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
+                "{1} {0}",
+            }
+            availableFormats{
+                E{"ccc"}
+                Ed{"E d"}
+                Gy{"y G"}
+                GyMMM{"MMM y G"}
+                GyMMMEd{"E d MMM y G"}
+                GyMMMd{"d MMM y G"}
+                M{"L"}
+                MEd{"E d MMM"}
+                MMM{"LLL"}
+                MMMEd{"E d MMM"}
+                MMMMd{"d MMMM"}
+                MMMd{"d MMM"}
+                Md{"d MMM"}
+                d{"d"}
+                y{"y"}
+                yyyy{"y G"}
+                yyyyM{"MM/y GGGGG"}
+                yyyyMEd{"E dd/MM/y GGGGG"}
+                yyyyMMM{"MMM y G"}
+                yyyyMMMEd{"E d MMM y G"}
+                yyyyMMMM{"MMMM y G"}
+                yyyyMMMd{"d MMM y G"}
+                yyyyMd{"dd/MM/y GGGGG"}
+                yyyyQQQ{"QQQ y G"}
+                yyyyQQQQ{"QQQQ y G"}
+            }
+            intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                MEd{
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
+                }
+                MMMEd{
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
+                }
+                MMMd{
+                    M{"d MMM – d MMM"}
+                    d{"d–d MMM"}
+                }
+                Md{
+                    M{"d MMM – d MMM"}
+                }
+                fallback{"{0} – {1}"}
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+                y{
+                    y{"y–y G"}
+                }
+                yM{
+                    M{"MMM y – MMM y GGGGG"}
+                    y{"MMM y – MMM y GGGGG"}
+                }
+                yMEd{
+                    M{"E d MMM – E d MMM y GGGGG"}
+                    d{"E d MMM – E d MMM y GGGGG"}
+                    y{"E d MMM y – E d MMM y GGGGG"}
+                }
+                yMMM{
+                    M{"MMM y – MMM y G"}
+                    y{"MMM y – MMM y G"}
+                }
+                yMMMEd{
+                    M{"E d MMM – E d MMM y G"}
+                    d{"E d MMM – E d MMM y G"}
+                    y{"E d MMM y – E d MMM y G"}
+                }
+                yMMMM{
+                    M{"MMMM – MMMM y G"}
+                    y{"MMMM y – MMMM y G"}
+                }
+                yMMMd{
+                    M{"d MMM – d MMM y G"}
+                    d{"d–d MMM y G"}
+                    y{"d MMM y – d MMM y G"}
+                }
+                yMd{
+                    M{"d MMM y – d MMM y GGGGG"}
+                    d{"d–d MMM y GGGGG"}
+                    y{"d MMM y – d MMM y GGGGG"}
+                }
+            }
+            monthNames{
+                format{
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                        "13",
+                        "7",
+                    }
+                }
+                stand-alone{
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                        "13",
+                        "7",
+                    }
+                }
+            }
+        }
+        indian{
+            eras{
+                abbreviated{
+                    "Saka",
+                }
+                narrow{
+                    "Saka",
+                }
+                wide{
+                    "Saka",
+                }
+            }
+            intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                MEd{
+                    M{"E dd/MM – E dd/MM"}
+                    d{"E dd/MM – E dd/MM"}
+                }
+                MMMEd{
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
+                }
+                MMMd{
+                    M{"d MMM – d MMM"}
+                    d{"d–d MMM"}
+                }
+                Md{
+                    M{"dd/MM–dd/MM"}
+                    d{"dd/MM–dd/MM"}
+                }
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+                y{
+                    y{"y–y G"}
+                }
+                yM{
+                    M{"MM/y–MM/y GGGGG"}
+                    y{"MM/y–MM/y GGGGG"}
+                }
+                yMEd{
+                    M{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    d{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    y{"E dd/MM/y – E dd/MM/y GGGGG"}
+                }
+                yMMM{
+                    M{"MMM – MMM y G"}
+                    y{"MMM y – MMM y G"}
+                }
+                yMMMEd{
+                    M{"E d MMM – E d MMM y G"}
+                    d{"E d MMM – E d MMM y G"}
+                    y{"E d MMM y – E d MMM y G"}
+                }
+                yMMMM{
+                    M{"MMMM – MMMM y G"}
+                    y{"MMMM y – MMMM y G"}
+                }
+                yMMMd{
+                    M{"d MMM – d MMM y G"}
+                    d{"d–d MMM y G"}
+                    y{"d MMM y – d MMM y G"}
+                }
+                yMd{
+                    M{"dd/MM/y–dd/MM/y GGGGG"}
+                    d{"dd/MM/y–dd/MM/y GGGGG"}
+                    y{"dd/MM/y–dd/MM/y GGGGG"}
+                }
+            }
+            monthNames{
+                format{
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                    }
+                }
+                stand-alone{
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                    }
+                }
+            }
+        }
+        islamic{
+            DateTimePatterns{
+                "HH:mm:ss zzzz",
+                "HH:mm:ss z",
+                "HH:mm:ss",
+                "HH:mm",
+                "EEEE d MMMM y G",
+                "d MMMM y G",
+                "d MMM y G",
+                "dd/MM/y GGGG",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
+                "{1} {0}",
+            }
+            availableFormats{
+                Ed{"E d"}
+                Gy{"y G"}
+                GyMMM{"MMM y G"}
+                GyMMMEd{"E d MMM y G"}
+                GyMMMd{"d MMM y G"}
+                MEd{"E dd/MM"}
+                MMMEd{"E d MMM"}
+                MMMMd{"d MMMM"}
+                MMMd{"d MMM"}
+                Md{"dd/MM"}
+                y{"y G"}
+                yyyy{"y G"}
+                yyyyM{"MM/y GGGGG"}
+                yyyyMEd{"E dd/MM/y GGGGG"}
+                yyyyMMM{"MMM y G"}
+                yyyyMMMEd{"E d MMM y G"}
+                yyyyMMMM{"MMMM y G"}
+                yyyyMMMd{"d MMM y G"}
+                yyyyMd{"dd/MM/y GGGGG"}
+                yyyyQQQ{"QQQ y G"}
+                yyyyQQQQ{"QQQQ y G"}
+            }
+            intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                MEd{
+                    M{"E dd/MM – E dd/MM"}
+                    d{"E dd/MM – E dd/MM"}
+                }
+                MMMEd{
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
+                }
+                MMMd{
+                    M{"d MMM – d MMM"}
+                    d{"d–d MMM"}
+                }
+                Md{
+                    M{"dd/MM–dd/MM"}
+                }
+                fallback{"{0} – {1}"}
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+                y{
+                    y{"y–y G"}
+                }
+                yM{
+                    M{"MM/y–MM/y GGGGG"}
+                    y{"MM/y–MM/y GGGGG"}
+                }
+                yMEd{
+                    M{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    d{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    y{"E dd/MM/y – E dd/MM/y GGGGG"}
+                }
+                yMMM{
+                    M{"MMM – MMM y G"}
+                    y{"MMM y – MMM y G"}
+                }
+                yMMMEd{
+                    M{"E d MMM – E d MMM y G"}
+                    d{"E d MMM – E d MMM y G"}
+                    y{"E d MMM y – E d MMM y G"}
+                }
+                yMMMM{
+                    M{"MMMM – MMMM y G"}
+                    y{"MMMM y – MMMM y G"}
+                }
+                yMMMd{
+                    M{"d MMM – d MMM y G"}
+                    d{"d–d MMM y G"}
+                    y{"d MMM y – d MMM y G"}
+                }
+                yMd{
+                    M{"dd/MM/y–dd/MM/y GGGGG"}
+                    d{"dd/MM/y–dd/MM/y GGGGG"}
+                    y{"dd/MM/y–dd/MM/y GGGGG"}
+                }
+            }
+            monthNames{
+                format{
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                    }
+                }
+                stand-alone{
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                    }
+                }
+            }
+        }
+        japanese{
+            DateTimePatterns{
+                "HH:mm:ss zzzz",
+                "HH:mm:ss z",
+                "HH:mm:ss",
+                "HH:mm",
+                "EEEE d MMMM y G",
+                "d MMMM y G",
+                "d MMM y G",
+                "dd/MM/y GGGG",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
+                "{1} {0}",
+            }
+            availableFormats{
+                Ed{"E d"}
+                Gy{"y G"}
+                GyMMM{"MMM y G"}
+                GyMMMEd{"E d MMM y G"}
+                GyMMMd{"d MMM y G"}
+                MEd{"E dd/MM"}
+                MMMEd{"E d MMM"}
+                MMMMd{"d MMMM"}
+                MMMd{"d MMM"}
+                Md{"dd/MM"}
+                y{"y G"}
+                yyyy{"y G"}
+                yyyyM{"MM/y GGGGG"}
+                yyyyMEd{"E dd/MM/y GGGGG"}
+                yyyyMMM{"MMM y G"}
+                yyyyMMMEd{"E d MMM y G"}
+                yyyyMMMM{"MMMM y G"}
+                yyyyMMMd{"d MMM y G"}
+                yyyyMd{"dd/MM/y GGGGG"}
+                yyyyQQQ{"QQQ y G"}
+                yyyyQQQQ{"QQQQ y G"}
+            }
+            eras{
+                abbreviated{
+                    "Taika (645–650)",
+                    "Hakuchi (650–671)",
+                    "Hakuhō (672–686)",
+                    "Shuchō (686–701)",
+                    "Taihō (701–704)",
+                    "Keiun (704–708)",
+                    "Wadō (708–715)",
+                    "Reiki (715–717)",
+                    "Yōrō (717–724)",
+                    "Jinki (724–729)",
+                    "Tenpyō (729–749)",
+                    "Tenpyō-kampō (749–749)",
+                    "Tenpyō-shōhō (749–757)",
+                    "Tenpyō-hōji (757–765)",
+                    "Tenpyō-jingo (765–767)",
+                    "Jingo-keiun (767–770)",
+                    "Hōki (770–780)",
+                    "Ten-ō (781–782)",
+                    "Enryaku (782–806)",
+                    "Daidō (806–810)",
+                    "Kōnin (810–824)",
+                    "Tenchō (824–834)",
+                    "Jōwa (834–848)",
+                    "Kajō (848–851)",
+                    "Ninju (851–854)",
+                    "Saikō (854–857)",
+                    "Ten-an (857–859)",
+                    "Jōgan (859–877)",
+                    "Gangyō (877–885)",
+                    "Ninna (885–889)",
+                    "Kanpyō (889–898)",
+                    "Shōtai (898–901)",
+                    "Engi (901–923)",
+                    "Enchō (923–931)",
+                    "Jōhei (931–938)",
+                    "Tengyō (938–947)",
+                    "Tenryaku (947–957)",
+                    "Tentoku (957–961)",
+                    "Ōwa (961–964)",
+                    "Kōhō (964–968)",
+                    "Anna (968–970)",
+                    "Tenroku (970–973)",
+                    "Ten’en (973–976)",
+                    "Jōgen (976–978)",
+                    "Tengen (978–983)",
+                    "Eikan (983–985)",
+                    "Kanna (985–987)",
+                    "Eien (987–989)",
+                    "Eiso (989–990)",
+                    "Shōryaku (990–995)",
+                    "Chōtoku (995–999)",
+                    "Chōhō (999–1004)",
+                    "Kankō (1004–1012)",
+                    "Chōwa (1012–1017)",
+                    "Kannin (1017–1021)",
+                    "Jian (1021–1024)",
+                    "Manju (1024–1028)",
+                    "Chōgen (1028–1037)",
+                    "Chōryaku (1037–1040)",
+                    "Chōkyū (1040–1044)",
+                    "Kantoku (1044–1046)",
+                    "Eishō (1046–1053)",
+                    "Tengi (1053–1058)",
+                    "Kōhei (1058–1065)",
+                    "Jiryaku (1065–1069)",
+                    "Enkyū (1069–1074)",
+                    "Shōho (1074–1077)",
+                    "Shōryaku (1077–1081)",
+                    "Eihō (1081–1084)",
+                    "Ōtoku (1084–1087)",
+                    "Kanji (1087–1094)",
+                    "Kahō (1094–1096)",
+                    "Eichō (1096–1097)",
+                    "Jōtoku (1097–1099)",
+                    "Kōwa (1099–1104)",
+                    "Chōji (1104–1106)",
+                    "Kashō (1106–1108)",
+                    "Tennin (1108–1110)",
+                    "Ten-ei (1110–1113)",
+                    "Eikyū (1113–1118)",
+                    "Gen’ei (1118–1120)",
+                    "Hōan (1120–1124)",
+                    "Tenji (1124–1126)",
+                    "Daiji (1126–1131)",
+                    "Tenshō (1131–1132)",
+                    "Chōshō (1132–1135)",
+                    "Hōen (1135–1141)",
+                    "Eiji (1141–1142)",
+                    "Kōji (1142–1144)",
+                    "Ten’yō (1144–1145)",
+                    "Kyūan (1145–1151)",
+                    "Ninpei (1151–1154)",
+                    "Kyūju (1154–1156)",
+                    "Hōgen (1156–1159)",
+                    "Heiji (1159–1160)",
+                    "Eiryaku (1160–1161)",
+                    "Ōho (1161–1163)",
+                    "Chōkan (1163–1165)",
+                    "Eiman (1165–1166)",
+                    "Nin’an (1166–1169)",
+                    "Kaō (1169–1171)",
+                    "Shōan (1171–1175)",
+                    "Angen (1175–1177)",
+                    "Jishō (1177–1181)",
+                    "Yōwa (1181–1182)",
+                    "Juei (1182–1184)",
+                    "Genryaku (1184–1185)",
+                    "Bunji (1185–1190)",
+                    "Kenkyū (1190–1199)",
+                    "Shōji (1199–1201)",
+                    "Kennin (1201–1204)",
+                    "Genkyū (1204–1206)",
+                    "Ken’ei (1206–1207)",
+                    "Jōgen (1207–1211)",
+                    "Kenryaku (1211–1213)",
+                    "Kenpō (1213–1219)",
+                    "Jōkyū (1219–1222)",
+                    "Jōō (1222–1224)",
+                    "Gennin (1224–1225)",
+                    "Karoku (1225–1227)",
+                    "Antei (1227–1229)",
+                    "Kanki (1229–1232)",
+                    "Jōei (1232–1233)",
+                    "Tenpuku (1233–1234)",
+                    "Bunryaku (1234–1235)",
+                    "Katei (1235–1238)",
+                    "Ryakunin (1238–1239)",
+                    "En’ō (1239–1240)",
+                    "Ninji (1240–1243)",
+                    "Kangen (1243–1247)",
+                    "Hōji (1247–1249)",
+                    "Kenchō (1249–1256)",
+                    "Kōgen (1256–1257)",
+                    "Shōka (1257–1259)",
+                    "Shōgen (1259–1260)",
+                    "Bun’ō (1260–1261)",
+                    "Kōchō (1261–1264)",
+                    "Bun’ei (1264–1275)",
+                    "Kenji (1275–1278)",
+                    "Kōan (1278–1288)",
+                    "Shōō (1288–1293)",
+                    "Einin (1293–1299)",
+                    "Shōan (1299–1302)",
+                    "Kengen (1302–1303)",
+                    "Kagen (1303–1306)",
+                    "Tokuji (1306–1308)",
+                    "Enkyō (1308–1311)",
+                    "Ōchō (1311–1312)",
+                    "Shōwa (1312–1317)",
+                    "Bunpō (1317–1319)",
+                    "Genō (1319–1321)",
+                    "Genkō (1321–1324)",
+                    "Shōchū (1324–1326)",
+                    "Karyaku (1326–1329)",
+                    "Gentoku (1329–1331)",
+                    "Genkō (1331–1334)",
+                    "Kenmu (1334–1336)",
+                    "Engen (1336–1340)",
+                    "Kōkoku (1340–1346)",
+                    "Shōhei (1346–1370)",
+                    "Kentoku (1370–1372)",
+                    "Bunchū (1372–1375)",
+                    "Tenju (1375–1379)",
+                    "Kōryaku (1379–1381)",
+                    "Kōwa (1381–1384)",
+                    "Genchū (1384–1392)",
+                    "Meitoku (1384–1387)",
+                    "Kakei (1387–1389)",
+                    "Kōō (1389–1390)",
+                    "Meitoku (1390–1394)",
+                    "Ōei (1394–1428)",
+                    "Shōchō (1428–1429)",
+                    "Eikyō (1429–1441)",
+                    "Kakitsu (1441–1444)",
+                    "Bun’an (1444–1449)",
+                    "Hōtoku (1449–1452)",
+                    "Kyōtoku (1452–1455)",
+                    "Kōshō (1455–1457)",
+                    "Chōroku (1457–1460)",
+                    "Kanshō (1460–1466)",
+                    "Bunshō (1466–1467)",
+                    "Ōnin (1467–1469)",
+                    "Bunmei (1469–1487)",
+                    "Chōkyō (1487–1489)",
+                    "Entoku (1489–1492)",
+                    "Meiō (1492–1501)",
+                    "Bunki (1501–1504)",
+                    "Eishō (1504–1521)",
+                    "Taiei (1521–1528)",
+                    "Kyōroku (1528–1532)",
+                    "Tenbun (1532–1555)",
+                    "Kōji (1555–1558)",
+                    "Eiroku (1558–1570)",
+                    "Genki (1570–1573)",
+                    "Tenshō (1573–1592)",
+                    "Bunroku (1592–1596)",
+                    "Keichō (1596–1615)",
+                    "Genna (1615–1624)",
+                    "Kan’ei (1624–1644)",
+                    "Shōho (1644–1648)",
+                    "Keian (1648–1652)",
+                    "Jōō (1652–1655)",
+                    "Meireki (1655–1658)",
+                    "Manji (1658–1661)",
+                    "Kanbun (1661–1673)",
+                    "Enpō (1673–1681)",
+                    "Tenna (1681–1684)",
+                    "Jōkyō (1684–1688)",
+                    "Genroku (1688–1704)",
+                    "Hōei (1704–1711)",
+                    "Shōtoku (1711–1716)",
+                    "Kyōhō (1716–1736)",
+                    "Genbun (1736–1741)",
+                    "Kanpō (1741–1744)",
+                    "Enkyō (1744–1748)",
+                    "Kan’en (1748–1751)",
+                    "Hōreki (1751–1764)",
+                    "Meiwa (1764–1772)",
+                    "An’ei (1772–1781)",
+                    "Tenmei (1781–1789)",
+                    "Kansei (1789–1801)",
+                    "Kyōwa (1801–1804)",
+                    "Bunka (1804–1818)",
+                    "Bunsei (1818–1830)",
+                    "Tenpō (1830–1844)",
+                    "Kōka (1844–1848)",
+                    "Kaei (1848–1854)",
+                    "Ansei (1854–1860)",
+                    "Man’en (1860–1861)",
+                    "Bunkyū (1861–1864)",
+                    "Genji (1864–1865)",
+                    "Keiō (1865–1868)",
+                    "Meiji",
+                    "Taishō",
+                    "Shōwa",
+                    "Heisei",
+                }
+                narrow{
+                    "Taika (645–650)",
+                    "Hakuchi (650–671)",
+                    "Hakuhō (672–686)",
+                    "Shuchō (686–701)",
+                    "Taihō (701–704)",
+                    "Keiun (704–708)",
+                    "Wadō (708–715)",
+                    "Reiki (715–717)",
+                    "Yōrō (717–724)",
+                    "Jinki (724–729)",
+                    "Tenpyō (729–749)",
+                    "Tenpyō-kampō (749–749)",
+                    "Tenpyō-shōhō (749–757)",
+                    "Tenpyō-hōji (757–765)",
+                    "Tenpyō-jingo (765–767)",
+                    "Jingo-keiun (767–770)",
+                    "Hōki (770–780)",
+                    "Ten-ō (781–782)",
+                    "Enryaku (782–806)",
+                    "Daidō (806–810)",
+                    "Kōnin (810–824)",
+                    "Tenchō (824–834)",
+                    "Jōwa (834–848)",
+                    "Kajō (848–851)",
+                    "Ninju (851–854)",
+                    "Saikō (854–857)",
+                    "Ten-an (857–859)",
+                    "Jōgan (859–877)",
+                    "Gangyō (877–885)",
+                    "Ninna (885–889)",
+                    "Kanpyō (889–898)",
+                    "Shōtai (898–901)",
+                    "Engi (901–923)",
+                    "Enchō (923–931)",
+                    "Jōhei (931–938)",
+                    "Tengyō (938–947)",
+                    "Tenryaku (947–957)",
+                    "Tentoku (957–961)",
+                    "Ōwa (961–964)",
+                    "Kōhō (964–968)",
+                    "Anna (968–970)",
+                    "Tenroku (970–973)",
+                    "Ten’en (973–976)",
+                    "Jōgen (976–978)",
+                    "Tengen (978–983)",
+                    "Eikan (983–985)",
+                    "Kanna (985–987)",
+                    "Eien (987–989)",
+                    "Eiso (989–990)",
+                    "Shōryaku (990–995)",
+                    "Chōtoku (995–999)",
+                    "Chōhō (999–1004)",
+                    "Kankō (1004–1012)",
+                    "Chōwa (1012–1017)",
+                    "Kannin (1017–1021)",
+                    "Jian (1021–1024)",
+                    "Manju (1024–1028)",
+                    "Chōgen (1028–1037)",
+                    "Chōryaku (1037–1040)",
+                    "Chōkyū (1040–1044)",
+                    "Kantoku (1044–1046)",
+                    "Eishō (1046–1053)",
+                    "Tengi (1053–1058)",
+                    "Kōhei (1058–1065)",
+                    "Jiryaku (1065–1069)",
+                    "Enkyū (1069–1074)",
+                    "Shōho (1074–1077)",
+                    "Shōryaku (1077–1081)",
+                    "Eihō (1081–1084)",
+                    "Ōtoku (1084–1087)",
+                    "Kanji (1087–1094)",
+                    "Kahō (1094–1096)",
+                    "Eichō (1096–1097)",
+                    "Jōtoku (1097–1099)",
+                    "Kōwa (1099–1104)",
+                    "Chōji (1104–1106)",
+                    "Kashō (1106–1108)",
+                    "Tennin (1108–1110)",
+                    "Ten-ei (1110–1113)",
+                    "Eikyū (1113–1118)",
+                    "Gen’ei (1118–1120)",
+                    "Hōan (1120–1124)",
+                    "Tenji (1124–1126)",
+                    "Daiji (1126–1131)",
+                    "Tenshō (1131–1132)",
+                    "Chōshō (1132–1135)",
+                    "Hōen (1135–1141)",
+                    "Eiji (1141–1142)",
+                    "Kōji (1142–1144)",
+                    "Ten’yō (1144–1145)",
+                    "Kyūan (1145–1151)",
+                    "Ninpei (1151–1154)",
+                    "Kyūju (1154–1156)",
+                    "Hōgen (1156–1159)",
+                    "Heiji (1159–1160)",
+                    "Eiryaku (1160–1161)",
+                    "Ōho (1161–1163)",
+                    "Chōkan (1163–1165)",
+                    "Eiman (1165–1166)",
+                    "Nin’an (1166–1169)",
+                    "Kaō (1169–1171)",
+                    "Shōan (1171–1175)",
+                    "Angen (1175–1177)",
+                    "Jishō (1177–1181)",
+                    "Yōwa (1181–1182)",
+                    "Juei (1182–1184)",
+                    "Genryaku (1184–1185)",
+                    "Bunji (1185–1190)",
+                    "Kenkyū (1190–1199)",
+                    "Shōji (1199–1201)",
+                    "Kennin (1201–1204)",
+                    "Genkyū (1204–1206)",
+                    "Ken’ei (1206–1207)",
+                    "Jōgen (1207–1211)",
+                    "Kenryaku (1211–1213)",
+                    "Kenpō (1213–1219)",
+                    "Jōkyū (1219–1222)",
+                    "Jōō (1222–1224)",
+                    "Gennin (1224–1225)",
+                    "Karoku (1225–1227)",
+                    "Antei (1227–1229)",
+                    "Kanki (1229–1232)",
+                    "Jōei (1232–1233)",
+                    "Tenpuku (1233–1234)",
+                    "Bunryaku (1234–1235)",
+                    "Katei (1235–1238)",
+                    "Ryakunin (1238–1239)",
+                    "En’ō (1239–1240)",
+                    "Ninji (1240–1243)",
+                    "Kangen (1243–1247)",
+                    "Hōji (1247–1249)",
+                    "Kenchō (1249–1256)",
+                    "Kōgen (1256–1257)",
+                    "Shōka (1257–1259)",
+                    "Shōgen (1259–1260)",
+                    "Bun’ō (1260–1261)",
+                    "Kōchō (1261–1264)",
+                    "Bun’ei (1264–1275)",
+                    "Kenji (1275–1278)",
+                    "Kōan (1278–1288)",
+                    "Shōō (1288–1293)",
+                    "Einin (1293–1299)",
+                    "Shōan (1299–1302)",
+                    "Kengen (1302–1303)",
+                    "Kagen (1303–1306)",
+                    "Tokuji (1306–1308)",
+                    "Enkyō (1308–1311)",
+                    "Ōchō (1311–1312)",
+                    "Shōwa (1312–1317)",
+                    "Bunpō (1317–1319)",
+                    "Genō (1319–1321)",
+                    "Genkō (1321–1324)",
+                    "Shōchū (1324–1326)",
+                    "Karyaku (1326–1329)",
+                    "Gentoku (1329–1331)",
+                    "Genkō (1331–1334)",
+                    "Kenmu (1334–1336)",
+                    "Engen (1336–1340)",
+                    "Kōkoku (1340–1346)",
+                    "Shōhei (1346–1370)",
+                    "Kentoku (1370–1372)",
+                    "Bunchū (1372–1375)",
+                    "Tenju (1375–1379)",
+                    "Kōryaku (1379–1381)",
+                    "Kōwa (1381–1384)",
+                    "Genchū (1384–1392)",
+                    "Meitoku (1384–1387)",
+                    "Kakei (1387–1389)",
+                    "Kōō (1389–1390)",
+                    "Meitoku (1390–1394)",
+                    "Ōei (1394–1428)",
+                    "Shōchō (1428–1429)",
+                    "Eikyō (1429–1441)",
+                    "Kakitsu (1441–1444)",
+                    "Bun’an (1444–1449)",
+                    "Hōtoku (1449–1452)",
+                    "Kyōtoku (1452–1455)",
+                    "Kōshō (1455–1457)",
+                    "Chōroku (1457–1460)",
+                    "Kanshō (1460–1466)",
+                    "Bunshō (1466–1467)",
+                    "Ōnin (1467–1469)",
+                    "Bunmei (1469–1487)",
+                    "Chōkyō (1487–1489)",
+                    "Entoku (1489–1492)",
+                    "Meiō (1492–1501)",
+                    "Bunki (1501–1504)",
+                    "Eishō (1504–1521)",
+                    "Taiei (1521–1528)",
+                    "Kyōroku (1528–1532)",
+                    "Tenbun (1532–1555)",
+                    "Kōji (1555–1558)",
+                    "Eiroku (1558–1570)",
+                    "Genki (1570–1573)",
+                    "Tenshō (1573–1592)",
+                    "Bunroku (1592–1596)",
+                    "Keichō (1596–1615)",
+                    "Genna (1615–1624)",
+                    "Kan’ei (1624–1644)",
+                    "Shōho (1644–1648)",
+                    "Keian (1648–1652)",
+                    "Jōō (1652–1655)",
+                    "Meireki (1655–1658)",
+                    "Manji (1658–1661)",
+                    "Kanbun (1661–1673)",
+                    "Enpō (1673–1681)",
+                    "Tenna (1681–1684)",
+                    "Jōkyō (1684–1688)",
+                    "Genroku (1688–1704)",
+                    "Hōei (1704–1711)",
+                    "Shōtoku (1711–1716)",
+                    "Kyōhō (1716–1736)",
+                    "Genbun (1736–1741)",
+                    "Kanpō (1741–1744)",
+                    "Enkyō (1744–1748)",
+                    "Kan’en (1748–1751)",
+                    "Hōreki (1751–1764)",
+                    "Meiwa (1764–1772)",
+                    "An’ei (1772–1781)",
+                    "Tenmei (1781–1789)",
+                    "Kansei (1789–1801)",
+                    "Kyōwa (1801–1804)",
+                    "Bunka (1804–1818)",
+                    "Bunsei (1818–1830)",
+                    "Tenpō (1830–1844)",
+                    "Kōka (1844–1848)",
+                    "Kaei (1848–1854)",
+                    "Ansei (1854–1860)",
+                    "Man’en (1860–1861)",
+                    "Bunkyū (1861–1864)",
+                    "Genji (1864–1865)",
+                    "Keiō (1865–1868)",
+                    "M",
+                    "T",
+                    "S",
+                    "H",
+                }
+                wide{
+                    "Taika (645–650)",
+                    "Hakuchi (650–671)",
+                    "Hakuhō (672–686)",
+                    "Shuchō (686–701)",
+                    "Taihō (701–704)",
+                    "Keiun (704–708)",
+                    "Wadō (708–715)",
+                    "Reiki (715–717)",
+                    "Yōrō (717–724)",
+                    "Jinki (724–729)",
+                    "Tenpyō (729–749)",
+                    "Tenpyō-kampō (749–749)",
+                    "Tenpyō-shōhō (749–757)",
+                    "Tenpyō-hōji (757–765)",
+                    "Tenpyō-jingo (765–767)",
+                    "Jingo-keiun (767–770)",
+                    "Hōki (770–780)",
+                    "Ten-ō (781–782)",
+                    "Enryaku (782–806)",
+                    "Daidō (806–810)",
+                    "Kōnin (810–824)",
+                    "Tenchō (824–834)",
+                    "Jōwa (834–848)",
+                    "Kajō (848–851)",
+                    "Ninju (851–854)",
+                    "Saikō (854–857)",
+                    "Ten-an (857–859)",
+                    "Jōgan (859–877)",
+                    "Gangyō (877–885)",
+                    "Ninna (885–889)",
+                    "Kanpyō (889–898)",
+                    "Shōtai (898–901)",
+                    "Engi (901–923)",
+                    "Enchō (923–931)",
+                    "Jōhei (931–938)",
+                    "Tengyō (938–947)",
+                    "Tenryaku (947–957)",
+                    "Tentoku (957–961)",
+                    "Ōwa (961–964)",
+                    "Kōhō (964–968)",
+                    "Anna (968–970)",
+                    "Tenroku (970–973)",
+                    "Ten’en (973–976)",
+                    "Jōgen (976–978)",
+                    "Tengen (978–983)",
+                    "Eikan (983–985)",
+                    "Kanna (985–987)",
+                    "Eien (987–989)",
+                    "Eiso (989–990)",
+                    "Shōryaku (990–995)",
+                    "Chōtoku (995–999)",
+                    "Chōhō (999–1004)",
+                    "Kankō (1004–1012)",
+                    "Chōwa (1012–1017)",
+                    "Kannin (1017–1021)",
+                    "Jian (1021–1024)",
+                    "Manju (1024–1028)",
+                    "Chōgen (1028–1037)",
+                    "Chōryaku (1037–1040)",
+                    "Chōkyū (1040–1044)",
+                    "Kantoku (1044–1046)",
+                    "Eishō (1046–1053)",
+                    "Tengi (1053–1058)",
+                    "Kōhei (1058–1065)",
+                    "Jiryaku (1065–1069)",
+                    "Enkyū (1069–1074)",
+                    "Shōho (1074–1077)",
+                    "Shōryaku (1077–1081)",
+                    "Eihō (1081–1084)",
+                    "Ōtoku (1084–1087)",
+                    "Kanji (1087–1094)",
+                    "Kahō (1094–1096)",
+                    "Eichō (1096–1097)",
+                    "Jōtoku (1097–1099)",
+                    "Kōwa (1099–1104)",
+                    "Chōji (1104–1106)",
+                    "Kashō (1106–1108)",
+                    "Tennin (1108–1110)",
+                    "Ten-ei (1110–1113)",
+                    "Eikyū (1113–1118)",
+                    "Gen’ei (1118–1120)",
+                    "Hōan (1120–1124)",
+                    "Tenji (1124–1126)",
+                    "Daiji (1126–1131)",
+                    "Tenshō (1131–1132)",
+                    "Chōshō (1132–1135)",
+                    "Hōen (1135–1141)",
+                    "Eiji (1141–1142)",
+                    "Kōji (1142–1144)",
+                    "Ten’yō (1144–1145)",
+                    "Kyūan (1145–1151)",
+                    "Ninpei (1151–1154)",
+                    "Kyūju (1154–1156)",
+                    "Hōgen (1156–1159)",
+                    "Heiji (1159–1160)",
+                    "Eiryaku (1160–1161)",
+                    "Ōho (1161–1163)",
+                    "Chōkan (1163–1165)",
+                    "Eiman (1165–1166)",
+                    "Nin’an (1166–1169)",
+                    "Kaō (1169–1171)",
+                    "Shōan (1171–1175)",
+                    "Angen (1175–1177)",
+                    "Jishō (1177–1181)",
+                    "Yōwa (1181–1182)",
+                    "Juei (1182–1184)",
+                    "Genryaku (1184–1185)",
+                    "Bunji (1185–1190)",
+                    "Kenkyū (1190–1199)",
+                    "Shōji (1199–1201)",
+                    "Kennin (1201–1204)",
+                    "Genkyū (1204–1206)",
+                    "Ken’ei (1206–1207)",
+                    "Jōgen (1207–1211)",
+                    "Kenryaku (1211–1213)",
+                    "Kenpō (1213–1219)",
+                    "Jōkyū (1219–1222)",
+                    "Jōō (1222–1224)",
+                    "Gennin (1224–1225)",
+                    "Karoku (1225–1227)",
+                    "Antei (1227–1229)",
+                    "Kanki (1229–1232)",
+                    "Jōei (1232–1233)",
+                    "Tenpuku (1233–1234)",
+                    "Bunryaku (1234–1235)",
+                    "Katei (1235–1238)",
+                    "Ryakunin (1238–1239)",
+                    "En’ō (1239–1240)",
+                    "Ninji (1240–1243)",
+                    "Kangen (1243–1247)",
+                    "Hōji (1247–1249)",
+                    "Kenchō (1249–1256)",
+                    "Kōgen (1256–1257)",
+                    "Shōka (1257–1259)",
+                    "Shōgen (1259–1260)",
+                    "Bun’ō (1260–1261)",
+                    "Kōchō (1261–1264)",
+                    "Bun’ei (1264–1275)",
+                    "Kenji (1275–1278)",
+                    "Kōan (1278–1288)",
+                    "Shōō (1288–1293)",
+                    "Einin (1293–1299)",
+                    "Shōan (1299–1302)",
+                    "Kengen (1302–1303)",
+                    "Kagen (1303–1306)",
+                    "Tokuji (1306–1308)",
+                    "Enkyō (1308–1311)",
+                    "Ōchō (1311–1312)",
+                    "Shōwa (1312–1317)",
+                    "Bunpō (1317–1319)",
+                    "Genō (1319–1321)",
+                    "Genkō (1321–1324)",
+                    "Shōchū (1324–1326)",
+                    "Karyaku (1326–1329)",
+                    "Gentoku (1329–1331)",
+                    "Genkō (1331–1334)",
+                    "Kenmu (1334–1336)",
+                    "Engen (1336–1340)",
+                    "Kōkoku (1340–1346)",
+                    "Shōhei (1346–1370)",
+                    "Kentoku (1370–1372)",
+                    "Bunchū (1372–1375)",
+                    "Tenju (1375–1379)",
+                    "Kōryaku (1379–1381)",
+                    "Kōwa (1381–1384)",
+                    "Genchū (1384–1392)",
+                    "Meitoku (1384–1387)",
+                    "Kakei (1387–1389)",
+                    "Kōō (1389–1390)",
+                    "Meitoku (1390–1394)",
+                    "Ōei (1394–1428)",
+                    "Shōchō (1428–1429)",
+                    "Eikyō (1429–1441)",
+                    "Kakitsu (1441–1444)",
+                    "Bun’an (1444–1449)",
+                    "Hōtoku (1449–1452)",
+                    "Kyōtoku (1452–1455)",
+                    "Kōshō (1455–1457)",
+                    "Chōroku (1457–1460)",
+                    "Kanshō (1460–1466)",
+                    "Bunshō (1466–1467)",
+                    "Ōnin (1467–1469)",
+                    "Bunmei (1469–1487)",
+                    "Chōkyō (1487–1489)",
+                    "Entoku (1489–1492)",
+                    "Meiō (1492–1501)",
+                    "Bunki (1501–1504)",
+                    "Eishō (1504–1521)",
+                    "Taiei (1521–1528)",
+                    "Kyōroku (1528–1532)",
+                    "Tenbun (1532–1555)",
+                    "Kōji (1555–1558)",
+                    "Eiroku (1558–1570)",
+                    "Genki (1570–1573)",
+                    "Tenshō (1573–1592)",
+                    "Bunroku (1592–1596)",
+                    "Keichō (1596–1615)",
+                    "Genna (1615–1624)",
+                    "Kan’ei (1624–1644)",
+                    "Shōho (1644–1648)",
+                    "Keian (1648–1652)",
+                    "Jōō (1652–1655)",
+                    "Meireki (1655–1658)",
+                    "Manji (1658–1661)",
+                    "Kanbun (1661–1673)",
+                    "Enpō (1673–1681)",
+                    "Tenna (1681–1684)",
+                    "Jōkyō (1684–1688)",
+                    "Genroku (1688–1704)",
+                    "Hōei (1704–1711)",
+                    "Shōtoku (1711–1716)",
+                    "Kyōhō (1716–1736)",
+                    "Genbun (1736–1741)",
+                    "Kanpō (1741–1744)",
+                    "Enkyō (1744–1748)",
+                    "Kan’en (1748–1751)",
+                    "Hōreki (1751–1764)",
+                    "Meiwa (1764–1772)",
+                    "An’ei (1772–1781)",
+                    "Tenmei (1781–1789)",
+                    "Kansei (1789–1801)",
+                    "Kyōwa (1801–1804)",
+                    "Bunka (1804–1818)",
+                    "Bunsei (1818–1830)",
+                    "Tenpō (1830–1844)",
+                    "Kōka (1844–1848)",
+                    "Kaei (1848–1854)",
+                    "Ansei (1854–1860)",
+                    "Man’en (1860–1861)",
+                    "Bunkyū (1861–1864)",
+                    "Genji (1864–1865)",
+                    "Keiō (1865–1868)",
+                    "Meiji",
+                    "Taishō",
+                    "Shōwa",
+                    "Heisei",
+                }
+            }
+            intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                MEd{
+                    M{"E dd/MM – E dd/MM"}
+                    d{"E dd/MM – E dd/MM"}
+                }
+                MMMEd{
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
+                }
+                MMMd{
+                    M{"d MMM – d MMM"}
+                    d{"d–d MMM"}
+                }
+                Md{
+                    M{"dd/MM–dd/MM"}
+                    d{"dd/MM–dd/MM"}
+                }
+                fallback{"{0} – {1}"}
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+                y{
+                    y{"y–y G"}
+                }
+                yM{
+                    M{"MM/y–MM/y GGGGG"}
+                    y{"MM/y–MM/y GGGGG"}
+                }
+                yMEd{
+                    M{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    d{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    y{"E dd/MM/y – E dd/MM/y GGGGG"}
+                }
+                yMMM{
+                    M{"MMM – MMM y G"}
+                    y{"MMM y – MMM y G"}
+                }
+                yMMMEd{
+                    M{"E d MMM – E d MMM y G"}
+                    d{"E d MMM – E d MMM y G"}
+                    y{"E d MMM y – E d MMM y G"}
+                }
+                yMMMM{
+                    M{"MMMM – MMMM y G"}
+                    y{"MMMM y – MMMM y G"}
+                }
+                yMMMd{
+                    M{"d MMM – d MMM y G"}
+                    d{"d–d MMM y G"}
+                    y{"d MMM y – d MMM y G"}
+                }
+                yMd{
+                    M{"dd/MM/y–dd/MM/y GGGGG"}
+                    d{"dd/MM/y–dd/MM/y GGGGG"}
+                    y{"dd/MM/y–dd/MM/y GGGGG"}
+                }
+            }
+        }
+        persian{
+            DateTimePatterns{
+                "HH:mm:ss zzzz",
+                "HH:mm:ss z",
+                "HH:mm:ss",
+                "HH:mm",
+                "EEEE d MMMM y G",
+                "d MMMM y G",
+                "d MMM y G",
+                "dd/MM/y GGGG",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
+                "{1} {0}",
+            }
+            availableFormats{
+                Ed{"E d"}
+                Gy{"y G"}
+                GyMMM{"MMM y G"}
+                GyMMMEd{"E d MMM y G"}
+                GyMMMd{"d MMM y G"}
+                MEd{"E dd/MM"}
+                MMMEd{"E d MMM"}
+                MMMMd{"d MMMM"}
+                MMMd{"d MMM"}
+                Md{"dd/MM"}
+                y{"y G"}
+                yyyy{"y G"}
+                yyyyM{"MM/y GGGGG"}
+                yyyyMEd{"E dd/MM/y GGGGG"}
+                yyyyMMM{"MMM y G"}
+                yyyyMMMEd{"E d MMM y G"}
+                yyyyMMMM{"MMMM y G"}
+                yyyyMMMd{"d MMM y G"}
+                yyyyMd{"dd/MM/y GGGGG"}
+                yyyyQQQ{"QQQ y G"}
+                yyyyQQQQ{"QQQQ y G"}
+            }
+            intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                MEd{
+                    M{"E dd/MM – E dd/MM"}
+                    d{"E dd/MM – E dd/MM"}
+                }
+                MMMEd{
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
+                }
+                MMMd{
+                    M{"d MMM – d MMM"}
+                    d{"d–d MMM"}
+                }
+                Md{
+                    M{"dd/MM–dd/MM"}
+                    d{"dd/MM–dd/MM"}
+                }
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+                y{
+                    y{"y–y G"}
+                }
+                yM{
+                    M{"MM/y–MM/y GGGGG"}
+                    y{"MM/y–MM/y GGGGG"}
+                }
+                yMEd{
+                    M{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    d{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    y{"E dd/MM/y – E dd/MM/y GGGGG"}
+                }
+                yMMM{
+                    M{"MMM – MMM y G"}
+                    y{"MMM y – MMM y G"}
+                }
+                yMMMEd{
+                    M{"E d MMM – E d MMM y G"}
+                    d{"E d MMM – E d MMM y G"}
+                    y{"E d MMM y – E d MMM y G"}
+                }
+                yMMMM{
+                    M{"MMMM – MMMM y G"}
+                    y{"MMMM y – MMMM y G"}
+                }
+                yMMMd{
+                    M{"d MMM – d MMM y G"}
+                    d{"d–d MMM y G"}
+                    y{"d MMM y – d MMM y G"}
+                }
+                yMd{
+                    M{"dd/MM/y–dd/MM/y GGGGG"}
+                    d{"dd/MM/y–dd/MM/y GGGGG"}
+                    y{"dd/MM/y–dd/MM/y GGGGG"}
+                }
+            }
+            monthNames{
+                format{
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                    }
+                }
+                stand-alone{
+                    narrow{
+                        "1",
+                        "2",
+                        "3",
+                        "4",
+                        "5",
+                        "6",
+                        "7",
+                        "8",
+                        "9",
+                        "10",
+                        "11",
+                        "12",
+                    }
+                }
+            }
+        }
         roc{
             DateTimePatterns{
                 "HH:mm:ss zzzz",
                 "HH:mm:ss z",
                 "HH:mm:ss",
                 "HH:mm",
-                "G y MMMM d, EEEE",
-                "G y MMMM d",
-                "G y MMM d",
-                "GGGGG y-MM-dd",
+                "EEEE d MMMM y G",
+                "d MMMM y G",
+                "d MMM y G",
+                "dd/MM/y GGGG",
+                "{1}, {0}",
+                "{1} 'da' {0}",
+                "{1} 'da' {0}",
+                "{1}, {0}",
                 "{1} {0}",
-                "{1} {0}",
-                "{1} {0}",
-                "{1} {0}",
-                "{1} {0}",
+            }
+            availableFormats{
+                Ed{"E d"}
+                Gy{"y G"}
+                GyMMM{"MMM y G"}
+                GyMMMEd{"E d MMM y G"}
+                GyMMMd{"d MMM y G"}
+                MEd{"E dd/MM"}
+                MMMEd{"E d MMM"}
+                MMMMd{"d MMMM"}
+                MMMd{"d MMM"}
+                Md{"dd/MM"}
+                y{"y G"}
+                yyyy{"y G"}
+                yyyyM{"MM/y GGGGG"}
+                yyyyMEd{"E dd/MM/y GGGGG"}
+                yyyyMMM{"MMM y G"}
+                yyyyMMMEd{"E d MMM y G"}
+                yyyyMMMM{"MMMM y G"}
+                yyyyMMMd{"d MMM y G"}
+                yyyyMd{"dd/MM/y GGGGG"}
+                yyyyQQQ{"QQQ y G"}
+                yyyyQQQQ{"QQQQ y G"}
             }
             eras{
                 abbreviated{
@@ -621,15 +4883,123 @@
                 }
             }
             intervalFormats{
+                H{
+                    H{"HH–HH"}
+                }
+                Hm{
+                    H{"HH:mm–HH:mm"}
+                    m{"HH:mm–HH:mm"}
+                }
+                Hmv{
+                    H{"HH:mm–HH:mm v"}
+                    m{"HH:mm–HH:mm v"}
+                }
+                Hv{
+                    H{"HH–HH v"}
+                }
+                MEd{
+                    M{"E dd/MM – E dd/MM"}
+                    d{"E dd/MM – E dd/MM"}
+                }
+                MMMEd{
+                    M{"E d MMM – E d MMM"}
+                    d{"E d MMM – E d MMM"}
+                }
+                MMMd{
+                    M{"d MMM – d MMM"}
+                    d{"d–d MMM"}
+                }
+                Md{
+                    M{"dd/MM–dd/MM"}
+                    d{"dd/MM–dd/MM"}
+                }
                 fallback{"{0} – {1}"}
+                h{
+                    a{"h a – h a"}
+                    h{"h–h a"}
+                }
+                hm{
+                    a{"h:mm a – h:mm a"}
+                    h{"h:mm–h:mm a"}
+                    m{"h:mm–h:mm a"}
+                }
+                hmv{
+                    a{"h:mm a – h:mm a v"}
+                    h{"h:mm–h:mm a v"}
+                    m{"h:mm–h:mm a v"}
+                }
+                hv{
+                    a{"h a – h a v"}
+                    h{"h–h a v"}
+                }
+                y{
+                    y{"y–y G"}
+                }
+                yM{
+                    M{"MM/y–MM/y GGGGG"}
+                    y{"MM/y–MM/y GGGGG"}
+                }
+                yMEd{
+                    M{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    d{"E dd/MM/y – E dd/MM/y GGGGG"}
+                    y{"E dd/MM/y – E dd/MM/y GGGGG"}
+                }
+                yMMM{
+                    M{"MMM – MMM y G"}
+                    y{"MMM y – MMM y G"}
+                }
+                yMMMEd{
+                    M{"E d MMM – E d MMM y G"}
+                    d{"E d MMM – E d MMM y G"}
+                    y{"E d MMM y – E d MMM y G"}
+                }
+                yMMMM{
+                    M{"MMMM – MMMM y G"}
+                    y{"MMMM y – MMMM y G"}
+                }
+                yMMMd{
+                    M{"d MMM – d MMM y G"}
+                    d{"d–d MMM y G"}
+                    y{"d MMM y – d MMM y G"}
+                }
+                yMd{
+                    M{"dd/MM/y–dd/MM/y GGGGG"}
+                    d{"dd/MM/y–dd/MM/y GGGGG"}
+                    y{"dd/MM/y–dd/MM/y GGGGG"}
+                }
             }
         }
     }
+    characterLabel{
+        activities{"obererezh"}
+        african_scripts{"skritur Afrika"}
+        american_scripts{"skritur Amerika"}
+        animal{"loen"}
+        animals_nature{"loened pe natur"}
+        arrows{"biroù"}
+        body{"korf"}
+        braille{"braille"}
+        building{"savadur"}
+        currency_symbols{"arouez moneiz"}
+        digits{"sifr"}
+        flag{"banniel"}
+        flags{"bannieloù"}
+        han_radicals{"gwrizienn han"}
+        nature{"natur"}
+        numbers{"niveroù"}
+        objects{"tra"}
+        person{"den"}
+        sport{"sport"}
+        symbols{"arouez"}
+        travel{"beaj"}
+        travel_places{"beaj ha lecʼhioù"}
+        weather{"amzer"}
+    }
     delimiters{
-        alternateQuotationEnd{"”"}
-        alternateQuotationStart{"“"}
-        quotationEnd{"»"}
-        quotationStart{"«"}
+        alternateQuotationEnd{"»"}
+        alternateQuotationStart{"«"}
+        quotationEnd{"”"}
+        quotationStart{"“"}
     }
     fields{
         day{
@@ -719,6 +5089,22 @@
                 "0"{"ar Gwener-mañ"}
                 "1"{"Digwener a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Gwener"}
+                    many{"a-benn {0} a Wenerioù"}
+                    one{"a-benn {0} Gwener"}
+                    other{"a-benn {0} Gwener"}
+                    two{"a-benn {0} Wener"}
+                }
+                past{
+                    few{"{0} Gwener zo"}
+                    many{"{0} a Wenerioù zo"}
+                    one{"{0} Gwener zo"}
+                    other{"{0} Gwener zo"}
+                    two{"{0} Wener zo"}
+                }
+            }
         }
         fri-narrow{
             relative{
@@ -736,6 +5122,9 @@
         }
         hour{
             dn{"eur"}
+            relative{
+                "0"{"dʼan eur-mañ"}
+            }
             relativeTime{
                 future{
                     few{"a-benn {0} eur"}
@@ -774,6 +5163,9 @@
         }
         hour-short{
             dn{"e"}
+            relative{
+                "0"{"dʼan eur-mañ"}
+            }
             relativeTime{
                 future{
                     few{"a-benn {0} e"}
@@ -854,6 +5246,22 @@
                 "0"{"al Lun-mañ"}
                 "1"{"Dilun a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Lun"}
+                    many{"a-benn {0} a Lunioù"}
+                    one{"a-benn {0} Lun"}
+                    other{"a-benn {0} Lun"}
+                    two{"a-benn {0} Lun"}
+                }
+                past{
+                    few{"{0} Lun zo"}
+                    many{"{0} a Lunioù zo"}
+                    one{"{0} Lun zo"}
+                    other{"{0} Lun zo"}
+                    two{"{0} Lun zo"}
+                }
+            }
         }
         mon-narrow{
             relative{
@@ -861,6 +5269,22 @@
                 "0"{"L-mañ"}
                 "1"{"L a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} L"}
+                    many{"a-benn {0} a L"}
+                    one{"a-benn {0} L"}
+                    other{"a-benn {0} L"}
+                    two{"a-benn {0} L"}
+                }
+                past{
+                    few{"{0} L zo"}
+                    many{"{0} a L zo"}
+                    one{"{0} L zo"}
+                    other{"{0} L zo"}
+                    two{"{0} L zo"}
+                }
+            }
         }
         mon-short{
             relative{
@@ -868,6 +5292,22 @@
                 "0"{"Lun-mañ"}
                 "1"{"Lun a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Lun"}
+                    many{"a-benn {0} a Lun."}
+                    one{"a-benn {0} Lun"}
+                    other{"a-benn {0} Lun"}
+                    two{"a-benn {0} Lun"}
+                }
+                past{
+                    few{"{0} Lun zo"}
+                    many{"{0} a Lun. zo"}
+                    one{"{0} Lun zo"}
+                    other{"{0} Lun zo"}
+                    two{"{0} Lun zo"}
+                }
+            }
         }
         month{
             dn{"miz"}
@@ -943,6 +5383,11 @@
         }
         quarter{
             dn{"trimiziad"}
+            relative{
+                "-1"{"an trimiziad diaraok"}
+                "0"{"an trimiziad-mañ"}
+                "1"{"an trimiziad a zeu"}
+            }
             relativeTime{
                 future{
                     few{"a-benn {0} zrimiziad"}
@@ -962,6 +5407,11 @@
         }
         quarter-narrow{
             dn{"trim."}
+            relative{
+                "-1"{"an trim. diaraok"}
+                "0"{"an trim.-mañ"}
+                "1"{"an trim. a zeu"}
+            }
             relativeTime{
                 future{
                     few{"+{0} trim."}
@@ -981,6 +5431,11 @@
         }
         quarter-short{
             dn{"trim."}
+            relative{
+                "-1"{"an trim. diaraok"}
+                "0"{"an trim.-mañ"}
+                "1"{"an trim. a zeu"}
+            }
             relativeTime{
                 future{
                     few{"a-benn {0} trim."}
@@ -1004,6 +5459,22 @@
                 "0"{"ar Sadorn-mañ"}
                 "1"{"Disadorn a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Sadorn"}
+                    many{"a-benn {0} a Sadornioù"}
+                    one{"a-benn {0} Sadorn"}
+                    other{"a-benn {0} Sadorn"}
+                    two{"a-benn {0} Sadorn"}
+                }
+                past{
+                    few{"{0} Sadorn zo"}
+                    many{"{0} a Sadornioù zo"}
+                    one{"{0} Sadorn zo"}
+                    other{"{0} Sadorn zo"}
+                    two{"{0} Sadorn zo"}
+                }
+            }
         }
         sat-narrow{
             relative{
@@ -1011,6 +5482,22 @@
                 "0"{"Sa-mañ"}
                 "1"{"Sa a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Sa"}
+                    many{"a-benn {0} a Sa"}
+                    one{"a-benn {0} Sa"}
+                    other{"a-benn {0} Sa"}
+                    two{"a-benn {0} Sa"}
+                }
+                past{
+                    few{"{0} Sa zo"}
+                    many{"{0} a Sa zo"}
+                    one{"{0} Sa zo"}
+                    other{"{0} Sa zo"}
+                    two{"{0} Sa zo"}
+                }
+            }
         }
         sat-short{
             relative{
@@ -1018,6 +5505,22 @@
                 "0"{"Sad.-mañ"}
                 "1"{"Sad. a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Sad."}
+                    many{"a-benn {0} a Sad."}
+                    one{"a-benn {0} Sad."}
+                    other{"a-benn {0} Sad."}
+                    two{"a-benn {0} Sad."}
+                }
+                past{
+                    few{"{0} Sad. zo"}
+                    many{"{0} a Sad. zo"}
+                    one{"{0} Sad. zo"}
+                    other{"{0} Sad. zo"}
+                    two{"{0} Sad. zo"}
+                }
+            }
         }
         second{
             dn{"eilenn"}
@@ -1091,6 +5594,22 @@
                 "0"{"ar Sul-mañ"}
                 "1"{"Disul a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Sul"}
+                    many{"a-benn {0} a Sulioù"}
+                    one{"a-benn {0} Sul"}
+                    other{"a-benn {0} Sul"}
+                    two{"a-benn {0} Sul"}
+                }
+                past{
+                    few{"{0} Sul zo"}
+                    many{"{0} a Sulioù zo"}
+                    one{"{0} Sul zo"}
+                    other{"{0} Sul zo"}
+                    two{"{0} Sul zo"}
+                }
+            }
         }
         sun-narrow{
             relative{
@@ -1098,6 +5617,22 @@
                 "0"{"Su-mañ"}
                 "1"{"Su a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Su"}
+                    many{"a-benn {0} a Su"}
+                    one{"a-benn {0} Su"}
+                    other{"a-benn {0} Su"}
+                    two{"a-benn {0} Su"}
+                }
+                past{
+                    few{"{0} Su zo"}
+                    many{"{0} a Su zo"}
+                    one{"{0} Su zo"}
+                    other{"{0} Su zo"}
+                    two{"{0} Su zo"}
+                }
+            }
         }
         sun-short{
             relative{
@@ -1105,6 +5640,22 @@
                 "0"{"Sul-mañ"}
                 "1"{"Sul a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Sul"}
+                    many{"a-benn {0} a Sul."}
+                    one{"a-benn {0} Sul"}
+                    other{"a-benn {0} Sul"}
+                    two{"a-benn {0} Sul"}
+                }
+                past{
+                    few{"{0} Sul zo"}
+                    many{"{0} a Sul. zo"}
+                    one{"{0} Sul zo"}
+                    other{"{0} Sul zo"}
+                    two{"{0} Sul zo"}
+                }
+            }
         }
         thu{
             relative{
@@ -1112,12 +5663,44 @@
                 "0"{"ar Yaou-mañ"}
                 "1"{"Diriaou a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Yaou"}
+                    many{"a-benn {0} a Yaouioù"}
+                    one{"a-benn {0} Yaou"}
+                    other{"a-benn {0} Yaou"}
+                    two{"a-benn {0} Yaou"}
+                }
+                past{
+                    few{"{0} Yaou zo"}
+                    many{"{0} a Yaouioù zo"}
+                    one{"{0} Yaou zo"}
+                    other{"{0} Yaou zo"}
+                    two{"{0} Yaou zo"}
+                }
+            }
         }
         thu-narrow{
             relative{
                 "-1"{"Y diwezhañ"}
                 "0"{"Y-mañ"}
-                "1"{"Yaou a zeu"}
+                "1"{"Y a zeu"}
+            }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Y"}
+                    many{"a-benn {0} a Yaou."}
+                    one{"a-benn {0} Y"}
+                    other{"a-benn {0} Y"}
+                    two{"a-benn {0} Y"}
+                }
+                past{
+                    few{"{0} Y zo"}
+                    many{"{0} a Y zo"}
+                    one{"{0} Y zo"}
+                    other{"{0} Y zo"}
+                    two{"{0} Y zo"}
+                }
             }
         }
         thu-short{
@@ -1126,6 +5709,22 @@
                 "0"{"Yaou-mañ"}
                 "1"{"Yaou a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Yaou"}
+                    many{"a-benn {0} a Yaou."}
+                    one{"a-benn {0} Yaou"}
+                    other{"a-benn {0} Yaou"}
+                    two{"a-benn {0} Yaou"}
+                }
+                past{
+                    few{"{0} Yaou zo"}
+                    many{"{0} a Yaou. zo"}
+                    one{"{0} Yaou zo"}
+                    other{"{0} Yaou zo"}
+                    two{"{0} Yaou zo"}
+                }
+            }
         }
         tue{
             relative{
@@ -1133,6 +5732,22 @@
                 "0"{"ar Meurzh-mañ"}
                 "1"{"Dimeurzh a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Meurzh"}
+                    many{"a-benn {0} a Veurzhioù"}
+                    one{"a-benn {0} Meurzh"}
+                    other{"a-benn {0} Meurzh"}
+                    two{"a-benn {0} Veurzh"}
+                }
+                past{
+                    few{"{0} Meurzh zo"}
+                    many{"{0} a Veurzhioù zo"}
+                    one{"{0} Meurzh zo"}
+                    other{"{0} Meurzh zo"}
+                    two{"{0} Veurzh zo"}
+                }
+            }
         }
         tue-narrow{
             relative{
@@ -1154,6 +5769,22 @@
                 "0"{"ar Mercʼher-mañ"}
                 "1"{"Dimercʼher a zeu"}
             }
+            relativeTime{
+                future{
+                    few{"a-benn {0} Mercʼher"}
+                    many{"a-benn {0} a Vercʼherioù"}
+                    one{"a-benn {0} Mercʼher"}
+                    other{"a-benn {0} Mercʼher"}
+                    two{"a-benn {0} Vercʼher"}
+                }
+                past{
+                    few{"{0} Mercʼher zo"}
+                    many{"{0} Mercʼher zo"}
+                    one{"{0} Mercʼher zo"}
+                    other{"{0} Mercʼher zo"}
+                    two{"{0} Vercʼher zo"}
+                }
+            }
         }
         wed-narrow{
             relative{
@@ -1273,6 +5904,12 @@
         }
     }
     listPattern{
+        or{
+            2{"{0} pe {1}"}
+            end{"{0}, pe {1}"}
+            middle{"{0}, {1}"}
+            start{"{0}, {1}"}
+        }
         standard{
             2{"{0}, {1}"}
             end{"{0}, {1}"}
@@ -1303,4 +5940,31 @@
         US{"SU"}
         metric{"metrek"}
     }
+    parse{
+        date{
+            lenient{
+                "[\\--/]",
+                "[\\:∶]",
+            }
+        }
+        general{
+            lenient{
+                "[.․。︒﹒.。]",
+                "[\$﹩$$]",
+                "[£₤]",
+                "[₨₹{Rp}{Rs}]",
+            }
+        }
+        number{
+            lenient{
+                "[\\-‒⁻₋−➖﹣-]",
+                "[,،٫、︐︑﹐﹑,、]",
+                "[+⁺₊➕﬩﹢+]",
+            }
+            stricter{
+                "[,٫︐﹐,]",
+                "[.․﹒.。]",
+            }
+        }
+    }
 }
diff --git a/icu4c/source/data/locales/br_FR.txt b/icu4c/source/data/locales/br_FR.txt
index 253b4a9..9c2d783 100644
--- a/icu4c/source/data/locales/br_FR.txt
+++ b/icu4c/source/data/locales/br_FR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 br_FR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/brx.txt b/icu4c/source/data/locales/brx.txt
index f33c98e..33ad153 100644
--- a/icu4c/source/data/locales/brx.txt
+++ b/icu4c/source/data/locales/brx.txt
@@ -36,7 +36,7 @@
         }
         native{"deva"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/brx_IN.txt b/icu4c/source/data/locales/brx_IN.txt
index 38d535f..4e87445 100644
--- a/icu4c/source/data/locales/brx_IN.txt
+++ b/icu4c/source/data/locales/brx_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 brx_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bs.txt b/icu4c/source/data/locales/bs.txt
index c96089c..a5162f1 100644
--- a/icu4c/source/data/locales/bs.txt
+++ b/icu4c/source/data/locales/bs.txt
@@ -234,7 +234,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -445,9 +445,9 @@
                 yQQQ{"QQQ y."}
                 yQQQQ{"QQQQ y."}
                 yw{
-                    few{"w. 'sedmica' 'u' Y."}
-                    one{"w. 'sedmica' 'u' Y."}
-                    other{"w. 'sedmica' 'u' Y."}
+                    few{"w. 'sedmica' 'u' y."}
+                    one{"w. 'sedmica' 'u' y."}
+                    other{"w. 'sedmica' 'u' y."}
                 }
             }
             dayNames{
@@ -593,14 +593,14 @@
                     "p. n. e.",
                     "n. e.",
                 }
+                narrow{
+                    "p.n.e.",
+                    "n.e.",
+                }
                 wide{
                     "prije nove ere",
                     "nove ere",
                 }
-                wide%variant{
-                    "BCE",
-                    "n. e.",
-                }
             }
             intervalFormats{
                 H{
diff --git a/icu4c/source/data/locales/bs_Cyrl.txt b/icu4c/source/data/locales/bs_Cyrl.txt
index 1c6eeb3..ecc0cd0 100644
--- a/icu4c/source/data/locales/bs_Cyrl.txt
+++ b/icu4c/source/data/locales/bs_Cyrl.txt
@@ -160,8 +160,13 @@
                 superscriptingExponent{"×"}
             }
         }
+        minimalPairs{
+            ordinal{
+                other{"Скрените на {0}. крижању десно."}
+            }
+        }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/bs_Cyrl_BA.txt b/icu4c/source/data/locales/bs_Cyrl_BA.txt
index 4286646..c928fd2 100644
--- a/icu4c/source/data/locales/bs_Cyrl_BA.txt
+++ b/icu4c/source/data/locales/bs_Cyrl_BA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs_Cyrl_BA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/bs_Latn.txt b/icu4c/source/data/locales/bs_Latn.txt
index 5e72765..0ac3778 100644
--- a/icu4c/source/data/locales/bs_Latn.txt
+++ b/icu4c/source/data/locales/bs_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/bs_Latn_BA.txt b/icu4c/source/data/locales/bs_Latn_BA.txt
index e8e2c0a..0a353f2 100644
--- a/icu4c/source/data/locales/bs_Latn_BA.txt
+++ b/icu4c/source/data/locales/bs_Latn_BA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs_Latn_BA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ca.txt b/icu4c/source/data/locales/ca.txt
index a2d38d3..04b36be 100644
--- a/icu4c/source/data/locales/ca.txt
+++ b/icu4c/source/data/locales/ca.txt
@@ -216,7 +216,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -1417,6 +1417,12 @@
         western_asian_scripts{"escriptures de l’Àsia Sud-occidental"}
         whitespace{"espai en blanc"}
     }
+    contextTransforms{
+        typographicNames:intvector{
+            1,
+            1,
+        }
+    }
     delimiters{
         alternateQuotationEnd{"”"}
         alternateQuotationStart{"“"}
diff --git a/icu4c/source/data/locales/ca_AD.txt b/icu4c/source/data/locales/ca_AD.txt
index 0065b43..0697729 100644
--- a/icu4c/source/data/locales/ca_AD.txt
+++ b/icu4c/source/data/locales/ca_AD.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ca_AD{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ca_ES.txt b/icu4c/source/data/locales/ca_ES.txt
index 3c81370..6dcbf69 100644
--- a/icu4c/source/data/locales/ca_ES.txt
+++ b/icu4c/source/data/locales/ca_ES.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ca_ES{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ca_FR.txt b/icu4c/source/data/locales/ca_FR.txt
index 2460090..1bffa0e 100644
--- a/icu4c/source/data/locales/ca_FR.txt
+++ b/icu4c/source/data/locales/ca_FR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ca_FR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ca_IT.txt b/icu4c/source/data/locales/ca_IT.txt
index 52d7e53..391bfd4 100644
--- a/icu4c/source/data/locales/ca_IT.txt
+++ b/icu4c/source/data/locales/ca_IT.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ca_IT{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ccp.txt b/icu4c/source/data/locales/ccp.txt
index cdca6c9..978121e 100644
--- a/icu4c/source/data/locales/ccp.txt
+++ b/icu4c/source/data/locales/ccp.txt
@@ -71,7 +71,7 @@
         minimumGroupingDigits{"1"}
         native{"cakm"}
     }
-    Version{"2.1.37.51"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ccp_BD.txt b/icu4c/source/data/locales/ccp_BD.txt
index 52790de..472b12e 100644
--- a/icu4c/source/data/locales/ccp_BD.txt
+++ b/icu4c/source/data/locales/ccp_BD.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ccp_BD{
-    Version{"2.1.36.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ccp_IN.txt b/icu4c/source/data/locales/ccp_IN.txt
index e05ca5e..79ff39e 100644
--- a/icu4c/source/data/locales/ccp_IN.txt
+++ b/icu4c/source/data/locales/ccp_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ccp_IN{
-    Version{"2.1.36.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ce.txt b/icu4c/source/data/locales/ce.txt
index 6b9bec2..dc4bfea 100644
--- a/icu4c/source/data/locales/ce.txt
+++ b/icu4c/source/data/locales/ce.txt
@@ -193,7 +193,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -299,6 +299,10 @@
                     "в. э. тӀ. я",
                     "в. э",
                 }
+                abbreviated%variant{
+                    "МАССО",
+                    "CE",
+                }
                 wide{
                     "Ӏийса пайхамар вина де кхачале",
                     "Ӏийса пайхамар вина дийнахь дуьйна",
@@ -473,6 +477,15 @@
                 }
             }
         }
+        dayOfYear{
+            dn{"шеран де"}
+        }
+        dayOfYear-narrow{
+            dn{"шеран де"}
+        }
+        dayOfYear-short{
+            dn{"шеран де"}
+        }
         dayperiod{
             dn{"делкъал тӀехьа"}
         }
@@ -485,6 +498,16 @@
                 "0"{"карарчу пӀераскан дийнахь"}
                 "1"{"рогӀерчу пӀераскан дийнахь"}
             }
+            relativeTime{
+                future{
+                    one{"+{0} ПӀерасканденошкахь"}
+                    other{"+{0} ПӀерасканденошкахь"}
+                }
+                past{
+                    one{"-{0} ПӀерасканденошкахь"}
+                    other{"-{0} ПӀерасканденошкахь"}
+                }
+            }
         }
         fri-narrow{
             relative{
@@ -492,6 +515,12 @@
                 "0"{"карарчу пӀераскан д."}
                 "1"{"рогӀерчу пӀераскан д."}
             }
+            relativeTime{
+                past{
+                    one{"-{0} ПӀерасканденошкахь"}
+                    other{"-{0} ПӀерасканденошкахь"}
+                }
+            }
         }
         fri-short{
             relative{
@@ -499,9 +528,18 @@
                 "0"{"карарчу пӀераскан д."}
                 "1"{"рогӀерчу пӀераскан д."}
             }
+            relativeTime{
+                past{
+                    one{"-{0} ПӀерасканденошкахь"}
+                    other{"-{0} ПӀерасканденошкахь"}
+                }
+            }
         }
         hour{
             dn{"сахьт"}
+            relative{
+                "0"{"хӀокху сахьтехь"}
+            }
             relativeTime{
                 future{
                     one{"{0} сахьт даьлча"}
@@ -541,6 +579,9 @@
         }
         minute{
             dn{"минот"}
+            relative{
+                "0"{"хӀокху минотехь"}
+            }
             relativeTime{
                 future{
                     one{"{0} минот яьлча"}
@@ -688,6 +729,16 @@
                 "0"{"карарчу шотдийнахь"}
                 "1"{"рогӀерчу шотдийнахь"}
             }
+            relativeTime{
+                future{
+                    one{"+{0} Шотденошкахь"}
+                    other{"+{0} Шотденошкахь"}
+                }
+                past{
+                    one{"-{0} Шотденошкахь"}
+                    other{"-{0} Шотденошкахь"}
+                }
+            }
         }
         sat-narrow{
             relative{
@@ -705,6 +756,9 @@
         }
         second{
             dn{"секунд"}
+            relative{
+                "0"{"хӀинца"}
+            }
             relativeTime{
                 future{
                     one{"{0} секунд яьлча"}
@@ -748,6 +802,16 @@
                 "0"{"карарчу кӀиранан дийнахь"}
                 "1"{"рогӀерчу кӀиранан дийнахь"}
             }
+            relativeTime{
+                future{
+                    one{"+{0} кӀиранденошкахь"}
+                    other{"+{0} кӀиранденошкахь"}
+                }
+                past{
+                    one{"-{0} кӀиранденошкахь"}
+                    other{"-{0} кӀиранденошкахь"}
+                }
+            }
         }
         sun-narrow{
             relative{
@@ -755,6 +819,16 @@
                 "0"{"карарчу кӀиранан д."}
                 "1"{"рогӀерчу кӀиранан д"}
             }
+            relativeTime{
+                future{
+                    one{"+{0} кӀиранденошкахь"}
+                    other{"+{0} кӀиранденошкахь"}
+                }
+                past{
+                    one{"-{0} кӀиранденошкахь"}
+                    other{"-{0} кӀиранденошкахь"}
+                }
+            }
         }
         sun-short{
             relative{
@@ -762,6 +836,16 @@
                 "0"{"карарчу кӀиранан д."}
                 "1"{"рогӀерчу кӀиранан д."}
             }
+            relativeTime{
+                future{
+                    one{"+{0} кӀиранденошкахь"}
+                    other{"+{0} кӀиранденошкахь"}
+                }
+                past{
+                    one{"-{0} кӀиранденошкахь"}
+                    other{"-{0} кӀиранденошкахь"}
+                }
+            }
         }
         thu{
             relative{
@@ -769,6 +853,16 @@
                 "0"{"карарчу еарин дийнахь"}
                 "1"{"рогӀерчу еарин дийнахь"}
             }
+            relativeTime{
+                future{
+                    one{"+{0} Еаринденошкахь"}
+                    other{"+{0} Еаринденошкахь"}
+                }
+                past{
+                    one{"-{0} Еаринденошкахь"}
+                    other{"-{0} Еаринденошкахь"}
+                }
+            }
         }
         thu-narrow{
             relative{
@@ -776,6 +870,12 @@
                 "0"{"карарчу еарин д."}
                 "1"{"рогӀерчу еарин д."}
             }
+            relativeTime{
+                future{
+                    one{"+{0} Еаринденошкахь"}
+                    other{"+{0} Еаринденошкахь"}
+                }
+            }
         }
         thu-short{
             relative{
@@ -783,6 +883,12 @@
                 "0"{"карарчу еарин д."}
                 "1"{"рогӀерчу еарин д."}
             }
+            relativeTime{
+                future{
+                    one{"+{0} Еаринденошкахь"}
+                    other{"+{0} Еаринденошкахь"}
+                }
+            }
         }
         tue{
             relative{
@@ -790,6 +896,16 @@
                 "0"{"карарчу шинарин дийнахь"}
                 "1"{"рогӀерчу шинарин дийнахь"}
             }
+            relativeTime{
+                future{
+                    one{"+{0} Ширанаденошкахь"}
+                    other{"+{0} Ширанаденошкахь"}
+                }
+                past{
+                    one{"-{0} Ширанаденошкахь"}
+                    other{"-{0} Ширанаденошкахь"}
+                }
+            }
         }
         tue-narrow{
             relative{
@@ -797,6 +913,16 @@
                 "0"{"карарчу шинарин д."}
                 "1"{"рогӀерчу шинарин д."}
             }
+            relativeTime{
+                future{
+                    one{"+{0} Ширанаденошкахь"}
+                    other{"+{0} Ширанаденошкахь"}
+                }
+                past{
+                    one{"-{0} Ширанаденошкахь"}
+                    other{"-{0} Ширанаденошкахь"}
+                }
+            }
         }
         tue-short{
             relative{
@@ -804,6 +930,16 @@
                 "0"{"карарчу шинарин д."}
                 "1"{"рогӀерчу шинарин д."}
             }
+            relativeTime{
+                future{
+                    one{"+{0} Ширанаденошкахь"}
+                    other{"+{0} Ширанаденошкахь"}
+                }
+                past{
+                    one{"-{0} Ширанаденошкахь"}
+                    other{"-{0} Ширанаденошкахь"}
+                }
+            }
         }
         wed{
             relative{
@@ -811,6 +947,16 @@
                 "0"{"карарчу кхаарин дийнахь"}
                 "1"{"рогӀерчу кхаарин дийнахь"}
             }
+            relativeTime{
+                future{
+                    one{"+{0} Кхааринденошкахь"}
+                    other{"+{0} Кхааринденошкахь"}
+                }
+                past{
+                    one{"-{0} Кхааринденошкахь"}
+                    other{"-{0} Кхааринденошкахь"}
+                }
+            }
         }
         wed-narrow{
             relative{
@@ -818,6 +964,12 @@
                 "0"{"карарчу кхаарин д."}
                 "1"{"рогӀерчу кхаарин д."}
             }
+            relativeTime{
+                past{
+                    one{"-{0} Кхааринденошкахь"}
+                    other{"-{0} Кхааринденошкахь"}
+                }
+            }
         }
         wed-short{
             relative{
@@ -825,6 +977,12 @@
                 "0"{"карарчу кхаарин д."}
                 "1"{"рогӀерчу кхаарин д."}
             }
+            relativeTime{
+                past{
+                    one{"-{0} Кхааринденошкахь"}
+                    other{"-{0} Кхааринденошкахь"}
+                }
+            }
         }
         week{
             dn{"кӀира"}
@@ -846,6 +1004,7 @@
         }
         week-narrow{
             dn{"кӀир."}
+            relativePeriod{"кӀирнахь {0}"}
             relativeTime{
                 future{
                     one{"{0} кӀир. даьлча"}
@@ -859,6 +1018,7 @@
         }
         week-short{
             dn{"кӀир."}
+            relativePeriod{"кӀирнахь"}
             relativeTime{
                 future{
                     one{"{0} кӀир. даьлча"}
@@ -870,8 +1030,29 @@
                 }
             }
         }
+        weekOfMonth{
+            dn{"беттан кӀира"}
+        }
+        weekOfMonth-narrow{
+            dn{"беттан кӀира"}
+        }
+        weekOfMonth-short{
+            dn{"беттан кӀира"}
+        }
         weekday{
-            dn{"кӀиран де"}
+            dn{"кӀиранан де"}
+        }
+        weekday-narrow{
+            dn{"кӀиранан де"}
+        }
+        weekday-short{
+            dn{"кӀиранан де"}
+        }
+        weekdayOfMonth{
+            dn{"кӀиранан де"}
+        }
+        weekdayOfMonth-short{
+            dn{"кӀиранан де"}
         }
         year{
             dn{"шо"}
diff --git a/icu4c/source/data/locales/ce_RU.txt b/icu4c/source/data/locales/ce_RU.txt
index 758b560..e55581e 100644
--- a/icu4c/source/data/locales/ce_RU.txt
+++ b/icu4c/source/data/locales/ce_RU.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ce_RU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/cgg.txt b/icu4c/source/data/locales/cgg.txt
index a52a39f..e3bbb4c 100644
--- a/icu4c/source/data/locales/cgg.txt
+++ b/icu4c/source/data/locales/cgg.txt
@@ -10,7 +10,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/cgg_UG.txt b/icu4c/source/data/locales/cgg_UG.txt
index 5270152..415a14d 100644
--- a/icu4c/source/data/locales/cgg_UG.txt
+++ b/icu4c/source/data/locales/cgg_UG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 cgg_UG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/chr.txt b/icu4c/source/data/locales/chr.txt
index 2a5d84a..705e6ba 100644
--- a/icu4c/source/data/locales/chr.txt
+++ b/icu4c/source/data/locales/chr.txt
@@ -116,7 +116,7 @@
                     }
                     10000000000{
                         one{"¤00B"}
-                        other{"¤ 00G"}
+                        other{"¤00B"}
                     }
                     100000000000{
                         one{"¤000B"}
@@ -213,7 +213,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -232,12 +232,22 @@
                 "{1}, {0}",
             }
             availableFormats{
+                Bh{"h B"}
+                Bhm{"h:mm B"}
+                Bhms{"h:mm:ss B"}
                 E{"ccc"}
+                EBhm{"E h:mm B"}
+                EBhms{"E h:mm:ss B"}
+                EHm{"E HH:mm"}
+                EHms{"E HH:mm:ss"}
                 Ed{"d E"}
+                Ehm{"E h:mm a"}
+                Ehms{"E h:mm:ss a"}
                 Gy{"y G"}
                 GyMMM{"MMM y G"}
                 GyMMMEd{"E, MMM d, y G"}
                 GyMMMd{"MMM d, y G"}
+                H{"HH"}
                 Hm{"H:mm"}
                 Hms{"H:mm:ss"}
                 M{"L"}
@@ -248,8 +258,10 @@
                 MMMd{"MMM d"}
                 Md{"M/d"}
                 d{"d"}
+                h{"h a"}
                 hm{"h:mm a"}
                 hms{"h:mm:ss a"}
+                ms{"mm:ss"}
                 y{"y G"}
                 yyyy{"y G"}
                 yyyyM{"M/y GGGGG"}
@@ -333,7 +345,7 @@
             }
             AmPmMarkersAbbr{
                 "ᏌᎾᎴ",
-                "ᏒᎯᏱᎢᏗᏢ",
+                "ᏒᎯᏱᎢ",
             }
             AmPmMarkersNarrow{
                 "Ꮜ",
@@ -358,7 +370,12 @@
                 Timezone{"{0} {1}"}
             }
             availableFormats{
+                Bh{"h B"}
+                Bhm{"h:mm B"}
+                Bhms{"h:mm:ss B"}
                 E{"ccc"}
+                EBhm{"E h:mm B"}
+                EBhms{"E h:mm:ss B"}
                 EHm{"E HH:mm"}
                 EHms{"E HH:mm:ss"}
                 Ed{"d E"}
@@ -508,14 +525,14 @@
                         am{"ᏌᎾᎴ"}
                         morning1{"ᏌᎾᎴ"}
                         noon{"ᎢᎦ"}
-                        pm{"ᏒᎯᏱᎢᏗᏢ"}
+                        pm{"ᏒᎯᏱᎢ"}
                     }
                     narrow{
                         afternoon1{"ᏒᎯᏱᎢᏗᏢ"}
                         am{"ᏌᎾᎴ"}
                         morning1{"ᏌᎾᎴ"}
                         noon{"ᎢᎦ"}
-                        pm{"ᏒᎯᏱᎢᏗᏢ"}
+                        pm{"ᏒᎯᏱᎢ"}
                     }
                     wide{
                         afternoon1{"ᏒᎯᏱᎢᏗᏢ"}
@@ -1640,8 +1657,8 @@
     }
     listPattern{
         or{
-            2{"{0} or {1}"}
-            end{"{0}, or {1}"}
+            2{"{0} ᎠᎴᏱᎩ {1}"}
+            end{"{0}, ᎠᎴᏱᎩ {1}"}
             middle{"{0}, {1}"}
             start{"{0}, {1}"}
         }
diff --git a/icu4c/source/data/locales/chr_US.txt b/icu4c/source/data/locales/chr_US.txt
index 034f2ed..e72b46c 100644
--- a/icu4c/source/data/locales/chr_US.txt
+++ b/icu4c/source/data/locales/chr_US.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 chr_US{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ckb.txt b/icu4c/source/data/locales/ckb.txt
index 9d240ae..91318d2 100644
--- a/icu4c/source/data/locales/ckb.txt
+++ b/icu4c/source/data/locales/ckb.txt
@@ -57,7 +57,7 @@
         minimumGroupingDigits{"1"}
         native{"arab"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.71"}
     calendar{
         generic{
             DateTimePatterns{
@@ -248,8 +248,8 @@
                 yQQQ{"y QQQ"}
                 yQQQQ{"y QQQQ"}
                 yw{
-                    one{"هەفتەی w ی Y"}
-                    other{"هەفتەی w ی Y"}
+                    one{"هەفتەی w ی y"}
+                    other{"هەفتەی w ی y"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/ckb_IQ.txt b/icu4c/source/data/locales/ckb_IQ.txt
index 7513418..8899fde 100644
--- a/icu4c/source/data/locales/ckb_IQ.txt
+++ b/icu4c/source/data/locales/ckb_IQ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ckb_IQ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ckb_IR.txt b/icu4c/source/data/locales/ckb_IR.txt
index 7560a48..1ef80b0 100644
--- a/icu4c/source/data/locales/ckb_IR.txt
+++ b/icu4c/source/data/locales/ckb_IR.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ckb_IR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/cs.txt b/icu4c/source/data/locales/cs.txt
index 6fc8684..6cc5f89 100644
--- a/icu4c/source/data/locales/cs.txt
+++ b/icu4c/source/data/locales/cs.txt
@@ -519,7 +519,7 @@
             }
         }
     }
-    Version{"2.1.37.11"}
+    Version{"2.1.39.15"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -4661,6 +4661,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"‘"}
diff --git a/icu4c/source/data/locales/cs_CZ.txt b/icu4c/source/data/locales/cs_CZ.txt
index c689e8d..e59517a 100644
--- a/icu4c/source/data/locales/cs_CZ.txt
+++ b/icu4c/source/data/locales/cs_CZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 cs_CZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/cy.txt b/icu4c/source/data/locales/cy.txt
index 6471e82..2cc2730 100644
--- a/icu4c/source/data/locales/cy.txt
+++ b/icu4c/source/data/locales/cy.txt
@@ -393,7 +393,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.17"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -727,6 +727,20 @@
             }
             dayPeriod{
                 format{
+                    abbreviated{
+                        afternoon1{"y prynhawn"}
+                        evening1{"yr hwyr"}
+                        midnight{"canol nos"}
+                        morning1{"y bore"}
+                        noon{"canol dydd"}
+                    }
+                    narrow{
+                        afternoon1{"yn y prynhawn"}
+                        evening1{"min nos"}
+                        midnight{"canol nos"}
+                        morning1{"yn y bore"}
+                        noon{"canol dydd"}
+                    }
                     wide{
                         afternoon1{"y prynhawn"}
                         evening1{"yr hwyr"}
@@ -737,11 +751,21 @@
                 }
                 stand-alone{
                     abbreviated{
+                        afternoon1{"prynhawn"}
                         am{"yb"}
+                        evening1{"yr hwyr"}
+                        midnight{"canol nos"}
+                        morning1{"bore"}
+                        noon{"canol dydd"}
                         pm{"yh"}
                     }
                     narrow{
+                        afternoon1{"prynhawn"}
                         am{"yb"}
+                        evening1{"min nos"}
+                        midnight{"canol nos"}
+                        morning1{"bore"}
+                        noon{"canol dydd"}
                         pm{"yh"}
                     }
                     wide{
diff --git a/icu4c/source/data/locales/cy_GB.txt b/icu4c/source/data/locales/cy_GB.txt
index 17ba0ca..96d2964 100644
--- a/icu4c/source/data/locales/cy_GB.txt
+++ b/icu4c/source/data/locales/cy_GB.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 cy_GB{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/da.txt b/icu4c/source/data/locales/da.txt
index 97503ba..07e1fbc 100644
--- a/icu4c/source/data/locales/da.txt
+++ b/icu4c/source/data/locales/da.txt
@@ -210,7 +210,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
@@ -1194,6 +1194,10 @@
             1,
             0,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"’"}
diff --git a/icu4c/source/data/locales/da_DK.txt b/icu4c/source/data/locales/da_DK.txt
index 63822e6..bc54c51 100644
--- a/icu4c/source/data/locales/da_DK.txt
+++ b/icu4c/source/data/locales/da_DK.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 da_DK{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/da_GL.txt b/icu4c/source/data/locales/da_GL.txt
index 1ea6a92..8fcb7df 100644
--- a/icu4c/source/data/locales/da_GL.txt
+++ b/icu4c/source/data/locales/da_GL.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 da_GL{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/dav.txt b/icu4c/source/data/locales/dav.txt
index 0943501..b633212 100644
--- a/icu4c/source/data/locales/dav.txt
+++ b/icu4c/source/data/locales/dav.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/dav_KE.txt b/icu4c/source/data/locales/dav_KE.txt
index c0f0adf..aec12a0 100644
--- a/icu4c/source/data/locales/dav_KE.txt
+++ b/icu4c/source/data/locales/dav_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dav_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/de.txt b/icu4c/source/data/locales/de.txt
index efd2206..c2961aa 100644
--- a/icu4c/source/data/locales/de.txt
+++ b/icu4c/source/data/locales/de.txt
@@ -90,16 +90,16 @@
             patternsShort{
                 currencyFormat{
                     1000{
-                        one{"0 Tsd'.' ¤"}
-                        other{"0 Tsd'.' ¤"}
+                        one{"0"}
+                        other{"0"}
                     }
                     10000{
-                        one{"00 Tsd'.' ¤"}
-                        other{"00 Tsd'.' ¤"}
+                        one{"0"}
+                        other{"0"}
                     }
                     100000{
-                        one{"000 Tsd'.' ¤"}
-                        other{"000 Tsd'.' ¤"}
+                        one{"0"}
+                        other{"0"}
                     }
                     1000000{
                         one{"0 Mio'.' ¤"}
@@ -140,16 +140,16 @@
                 }
                 decimalFormat{
                     1000{
-                        one{"0 Tsd'.'"}
-                        other{"0 Tsd'.'"}
+                        one{"0"}
+                        other{"0"}
                     }
                     10000{
-                        one{"00 Tsd'.'"}
-                        other{"00 Tsd'.'"}
+                        one{"0"}
+                        other{"0"}
                     }
                     100000{
-                        one{"000 Tsd'.'"}
-                        other{"000 Tsd'.'"}
+                        one{"0"}
+                        other{"0"}
                     }
                     1000000{
                         one{"0 Mio'.'"}
@@ -216,7 +216,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.96"}
+    Version{"2.1.39.41"}
     calendar{
         buddhist{
             eras{
@@ -1713,7 +1713,7 @@
         dash_connector{"Gedankenstrich/Bindestrich"}
         digits{"Stellen"}
         dingbats{"Zierrat"}
-        divination_symbols{"Teilungszeichen"}
+        divination_symbols{"Wahrsagezeichen"}
         downwards_arrows{"Abwärtspfeile"}
         downwards_upwards_arrows{"Aufwärts-Abwärtspfeile"}
         east_asian_scripts{"Ostasiatische Schriften"}
@@ -1784,6 +1784,12 @@
         western_asian_scripts{"Westasiatische Schriften"}
         whitespace{"Leerzeichen"}
     }
+    contextTransforms{
+        typographicNames:intvector{
+            1,
+            1,
+        }
+    }
     delimiters{
         alternateQuotationEnd{"‘"}
         alternateQuotationStart{"‚"}
diff --git a/icu4c/source/data/locales/de_AT.txt b/icu4c/source/data/locales/de_AT.txt
index 4eac700..4adf5e0 100644
--- a/icu4c/source/data/locales/de_AT.txt
+++ b/icu4c/source/data/locales/de_AT.txt
@@ -14,7 +14,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             dayPeriod{
diff --git a/icu4c/source/data/locales/de_BE.txt b/icu4c/source/data/locales/de_BE.txt
index 1997b14..b4234ad 100644
--- a/icu4c/source/data/locales/de_BE.txt
+++ b/icu4c/source/data/locales/de_BE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 de_BE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/de_CH.txt b/icu4c/source/data/locales/de_CH.txt
index d0edd75..a201293 100644
--- a/icu4c/source/data/locales/de_CH.txt
+++ b/icu4c/source/data/locales/de_CH.txt
@@ -15,7 +15,7 @@
             }
         }
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
     calendar{
         gregorian{
             dayNames{
diff --git a/icu4c/source/data/locales/de_DE.txt b/icu4c/source/data/locales/de_DE.txt
index 573d78c..a3832ce 100644
--- a/icu4c/source/data/locales/de_DE.txt
+++ b/icu4c/source/data/locales/de_DE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 de_DE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/de_IT.txt b/icu4c/source/data/locales/de_IT.txt
index 5fa4d68..63061c1 100644
--- a/icu4c/source/data/locales/de_IT.txt
+++ b/icu4c/source/data/locales/de_IT.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 de_IT{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             monthNames{
diff --git a/icu4c/source/data/locales/de_LI.txt b/icu4c/source/data/locales/de_LI.txt
index 61de5dc..7d4d545 100644
--- a/icu4c/source/data/locales/de_LI.txt
+++ b/icu4c/source/data/locales/de_LI.txt
@@ -14,7 +14,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             dayPeriod{
diff --git a/icu4c/source/data/locales/de_LU.txt b/icu4c/source/data/locales/de_LU.txt
index 1cc34d0..0a2a9fc 100644
--- a/icu4c/source/data/locales/de_LU.txt
+++ b/icu4c/source/data/locales/de_LU.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 de_LU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkersNarrow{
diff --git a/icu4c/source/data/locales/dje.txt b/icu4c/source/data/locales/dje.txt
index 2bfad78..6065b36 100644
--- a/icu4c/source/data/locales/dje.txt
+++ b/icu4c/source/data/locales/dje.txt
@@ -18,7 +18,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/dje_NE.txt b/icu4c/source/data/locales/dje_NE.txt
index d0bc72a..668530b 100644
--- a/icu4c/source/data/locales/dje_NE.txt
+++ b/icu4c/source/data/locales/dje_NE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dje_NE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/dsb.txt b/icu4c/source/data/locales/dsb.txt
index c548496..d689d1a 100644
--- a/icu4c/source/data/locales/dsb.txt
+++ b/icu4c/source/data/locales/dsb.txt
@@ -196,7 +196,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/dsb_DE.txt b/icu4c/source/data/locales/dsb_DE.txt
index 0f5100e..12186b1 100644
--- a/icu4c/source/data/locales/dsb_DE.txt
+++ b/icu4c/source/data/locales/dsb_DE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dsb_DE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/dua.txt b/icu4c/source/data/locales/dua.txt
index 13cb9ba..118f028 100644
--- a/icu4c/source/data/locales/dua.txt
+++ b/icu4c/source/data/locales/dua.txt
@@ -21,7 +21,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/dua_CM.txt b/icu4c/source/data/locales/dua_CM.txt
index 15ea4e3..02f92e6 100644
--- a/icu4c/source/data/locales/dua_CM.txt
+++ b/icu4c/source/data/locales/dua_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dua_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/dyo.txt b/icu4c/source/data/locales/dyo.txt
index 85b37ef..ebdc001 100644
--- a/icu4c/source/data/locales/dyo.txt
+++ b/icu4c/source/data/locales/dyo.txt
@@ -18,7 +18,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/dyo_SN.txt b/icu4c/source/data/locales/dyo_SN.txt
index 65ccae5..990e2c3 100644
--- a/icu4c/source/data/locales/dyo_SN.txt
+++ b/icu4c/source/data/locales/dyo_SN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dyo_SN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/dz.txt b/icu4c/source/data/locales/dz.txt
index d710b76..1bd86dc 100644
--- a/icu4c/source/data/locales/dz.txt
+++ b/icu4c/source/data/locales/dz.txt
@@ -106,7 +106,7 @@
             }
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/dz_BT.txt b/icu4c/source/data/locales/dz_BT.txt
index aaf05c7..0284835 100644
--- a/icu4c/source/data/locales/dz_BT.txt
+++ b/icu4c/source/data/locales/dz_BT.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dz_BT{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ebu.txt b/icu4c/source/data/locales/ebu.txt
index f9bc646..3452776 100644
--- a/icu4c/source/data/locales/ebu.txt
+++ b/icu4c/source/data/locales/ebu.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ebu_KE.txt b/icu4c/source/data/locales/ebu_KE.txt
index c71213f..1d30fad 100644
--- a/icu4c/source/data/locales/ebu_KE.txt
+++ b/icu4c/source/data/locales/ebu_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ebu_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ee.txt b/icu4c/source/data/locales/ee.txt
index c49fc07..329efec 100644
--- a/icu4c/source/data/locales/ee.txt
+++ b/icu4c/source/data/locales/ee.txt
@@ -193,9 +193,14 @@
                 superscriptingExponent{"×"}
             }
         }
+        minimalPairs{
+            ordinal{
+                other{"{0}lia"}
+            }
+        }
         minimumGroupingDigits{"3"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -426,8 +431,8 @@
                 yQQQ{"QQQ y"}
                 yQQQQ{"QQQQ y"}
                 yw{
-                    one{"'kɔsiɖa' w 'lia' 'le' 'ƒe' Y 'me'"}
-                    other{"'kɔsiɖa' w 'lia' 'le' 'ƒe' Y 'me'"}
+                    one{"'kɔsiɖa' w 'lia' 'le' 'ƒe' y 'me'"}
+                    other{"'kɔsiɖa' w 'lia' 'le' 'ƒe' y 'me'"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/ee_GH.txt b/icu4c/source/data/locales/ee_GH.txt
index 5cd0e19..28651bc 100644
--- a/icu4c/source/data/locales/ee_GH.txt
+++ b/icu4c/source/data/locales/ee_GH.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ee_GH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ee_TG.txt b/icu4c/source/data/locales/ee_TG.txt
index b40bcd1f..dd6aab8 100644
--- a/icu4c/source/data/locales/ee_TG.txt
+++ b/icu4c/source/data/locales/ee_TG.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ee_TG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/el.txt b/icu4c/source/data/locales/el.txt
index e159bbf..badf71b 100644
--- a/icu4c/source/data/locales/el.txt
+++ b/icu4c/source/data/locales/el.txt
@@ -214,7 +214,7 @@
         native{"latn"}
         traditional{"grek"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/el_CY.txt b/icu4c/source/data/locales/el_CY.txt
index 07707c6..0cfe8a5 100644
--- a/icu4c/source/data/locales/el_CY.txt
+++ b/icu4c/source/data/locales/el_CY.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 el_CY{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/el_GR.txt b/icu4c/source/data/locales/el_GR.txt
index 8241aab..f3a1da6 100644
--- a/icu4c/source/data/locales/el_GR.txt
+++ b/icu4c/source/data/locales/el_GR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 el_GR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/en.txt b/icu4c/source/data/locales/en.txt
index 8425005..ff71f0a 100644
--- a/icu4c/source/data/locales/en.txt
+++ b/icu4c/source/data/locales/en.txt
@@ -205,7 +205,7 @@
             }
         }
     }
-    Version{"2.1.37.44"}
+    Version{"2.1.39.27"}
     calendar{
         buddhist{
             eras{
@@ -1221,6 +1221,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"’"}
diff --git a/icu4c/source/data/locales/en_001.txt b/icu4c/source/data/locales/en_001.txt
index a02e518..a8feb5b 100644
--- a/icu4c/source/data/locales/en_001.txt
+++ b/icu4c/source/data/locales/en_001.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_001{
-    Version{"2.1.35.71"}
+    Version{"2.1.38.69"}
     calendar{
         chinese{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_150.txt b/icu4c/source/data/locales/en_150.txt
index 6a50df9..2d64043 100644
--- a/icu4c/source/data/locales/en_150.txt
+++ b/icu4c/source/data/locales/en_150.txt
@@ -14,7 +14,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_AG.txt b/icu4c/source/data/locales/en_AG.txt
index ed7f63d..dab34a4 100644
--- a/icu4c/source/data/locales/en_AG.txt
+++ b/icu4c/source/data/locales/en_AG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_AI.txt b/icu4c/source/data/locales/en_AI.txt
index c5cb011..65007b4 100644
--- a/icu4c/source/data/locales/en_AI.txt
+++ b/icu4c/source/data/locales/en_AI.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_AS.txt b/icu4c/source/data/locales/en_AS.txt
index cc46bee..891295f 100644
--- a/icu4c/source/data/locales/en_AS.txt
+++ b/icu4c/source/data/locales/en_AS.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AS{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_AT.txt b/icu4c/source/data/locales/en_AT.txt
index 16639ec..ca46d13 100644
--- a/icu4c/source/data/locales/en_AT.txt
+++ b/icu4c/source/data/locales/en_AT.txt
@@ -14,5 +14,5 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_AU.txt b/icu4c/source/data/locales/en_AU.txt
index afe3184..10df922 100644
--- a/icu4c/source/data/locales/en_AU.txt
+++ b/icu4c/source/data/locales/en_AU.txt
@@ -10,7 +10,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
     calendar{
         generic{
             availableFormats{
@@ -222,6 +222,26 @@
         upwards_arrows{"upward arrows"}
     }
     fields{
+        day-narrow{
+            relativeTime{
+                future{
+                    other{"in {0} days"}
+                }
+                past{
+                    other{"{0} days ago"}
+                }
+            }
+        }
+        day-short{
+            relativeTime{
+                future{
+                    other{"in {0} days"}
+                }
+                past{
+                    other{"{0} days ago"}
+                }
+            }
+        }
         dayOfYear-narrow{
             dn{"day of yr"}
         }
@@ -483,6 +503,9 @@
             }
         }
         tue-narrow{
+            relative{
+                "-1"{"last Tu"}
+            }
             relativeTime{
                 future{
                     one{"in {0} Tu"}
diff --git a/icu4c/source/data/locales/en_BB.txt b/icu4c/source/data/locales/en_BB.txt
index 2c2c05e..a3a8e74 100644
--- a/icu4c/source/data/locales/en_BB.txt
+++ b/icu4c/source/data/locales/en_BB.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BB{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_BE.txt b/icu4c/source/data/locales/en_BE.txt
index d415e09..4e5b741 100644
--- a/icu4c/source/data/locales/en_BE.txt
+++ b/icu4c/source/data/locales/en_BE.txt
@@ -13,7 +13,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_BI.txt b/icu4c/source/data/locales/en_BI.txt
index 1862f81..f3716d8 100644
--- a/icu4c/source/data/locales/en_BI.txt
+++ b/icu4c/source/data/locales/en_BI.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BI{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_BM.txt b/icu4c/source/data/locales/en_BM.txt
index a07478e..dfb1e87 100644
--- a/icu4c/source/data/locales/en_BM.txt
+++ b/icu4c/source/data/locales/en_BM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_BS.txt b/icu4c/source/data/locales/en_BS.txt
index 3457002..2d87547 100644
--- a/icu4c/source/data/locales/en_BS.txt
+++ b/icu4c/source/data/locales/en_BS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_BW.txt b/icu4c/source/data/locales/en_BW.txt
index 3bdb135..bc14b75 100644
--- a/icu4c/source/data/locales/en_BW.txt
+++ b/icu4c/source/data/locales/en_BW.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_BZ.txt b/icu4c/source/data/locales/en_BZ.txt
index 8b0dbb9..a0c2b7b 100644
--- a/icu4c/source/data/locales/en_BZ.txt
+++ b/icu4c/source/data/locales/en_BZ.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_CA.txt b/icu4c/source/data/locales/en_CA.txt
index 7daea77..7724aa2 100644
--- a/icu4c/source/data/locales/en_CA.txt
+++ b/icu4c/source/data/locales/en_CA.txt
@@ -9,7 +9,7 @@
             }
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     calendar{
         chinese{
             DateTimePatterns{
@@ -199,6 +199,10 @@
                 yMMMEd{"E, MMM d, y"}
                 yMMMd{"MMM d, y"}
                 yMd{"y-MM-dd"}
+                yw{
+                    one{"'week' w 'of' y"}
+                    other{"'week' w 'of' y"}
+                }
             }
             dayNames{
                 format{
@@ -339,6 +343,7 @@
         leftwards_rightwards_arrows{"leftward rightward arrow"}
         letterlike_symbols{"letter-like symbol"}
         limited_use{"limited use"}
+        math_symbols{"math symbol"}
         nonspacing{"non-spacing"}
         rightwards_arrows{"rightward arrow"}
         upwards_arrows{"upward arrows"}
diff --git a/icu4c/source/data/locales/en_CC.txt b/icu4c/source/data/locales/en_CC.txt
index f43f429..8d9d97c 100644
--- a/icu4c/source/data/locales/en_CC.txt
+++ b/icu4c/source/data/locales/en_CC.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_CH.txt b/icu4c/source/data/locales/en_CH.txt
index 66ba1de..4f656e4 100644
--- a/icu4c/source/data/locales/en_CH.txt
+++ b/icu4c/source/data/locales/en_CH.txt
@@ -13,5 +13,5 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_CK.txt b/icu4c/source/data/locales/en_CK.txt
index 547be9b..2530b30 100644
--- a/icu4c/source/data/locales/en_CK.txt
+++ b/icu4c/source/data/locales/en_CK.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_CM.txt b/icu4c/source/data/locales/en_CM.txt
index b81e529..ce6d993 100644
--- a/icu4c/source/data/locales/en_CM.txt
+++ b/icu4c/source/data/locales/en_CM.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_CX.txt b/icu4c/source/data/locales/en_CX.txt
index b5fbece..10082b2 100644
--- a/icu4c/source/data/locales/en_CX.txt
+++ b/icu4c/source/data/locales/en_CX.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CX{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_CY.txt b/icu4c/source/data/locales/en_CY.txt
index 4fa4a14..6e80705 100644
--- a/icu4c/source/data/locales/en_CY.txt
+++ b/icu4c/source/data/locales/en_CY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_DE.txt b/icu4c/source/data/locales/en_DE.txt
index 84b13fe..181ade0 100644
--- a/icu4c/source/data/locales/en_DE.txt
+++ b/icu4c/source/data/locales/en_DE.txt
@@ -12,5 +12,5 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_DG.txt b/icu4c/source/data/locales/en_DG.txt
index d037886..377b962 100644
--- a/icu4c/source/data/locales/en_DG.txt
+++ b/icu4c/source/data/locales/en_DG.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_DK.txt b/icu4c/source/data/locales/en_DK.txt
index 18f9272..79d0aab 100644
--- a/icu4c/source/data/locales/en_DK.txt
+++ b/icu4c/source/data/locales/en_DK.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             availableFormats{
diff --git a/icu4c/source/data/locales/en_DM.txt b/icu4c/source/data/locales/en_DM.txt
index 067f54d..ead644c 100644
--- a/icu4c/source/data/locales/en_DM.txt
+++ b/icu4c/source/data/locales/en_DM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_ER.txt b/icu4c/source/data/locales/en_ER.txt
index dac4b71..9809fe6 100644
--- a/icu4c/source/data/locales/en_ER.txt
+++ b/icu4c/source/data/locales/en_ER.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ER{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_FI.txt b/icu4c/source/data/locales/en_FI.txt
index 04c8adb..1a5a97e 100644
--- a/icu4c/source/data/locales/en_FI.txt
+++ b/icu4c/source/data/locales/en_FI.txt
@@ -14,7 +14,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             availableFormats{
diff --git a/icu4c/source/data/locales/en_FJ.txt b/icu4c/source/data/locales/en_FJ.txt
index 17022d5..32898fb 100644
--- a/icu4c/source/data/locales/en_FJ.txt
+++ b/icu4c/source/data/locales/en_FJ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FJ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_FK.txt b/icu4c/source/data/locales/en_FK.txt
index 1773dc6..82793e5 100644
--- a/icu4c/source/data/locales/en_FK.txt
+++ b/icu4c/source/data/locales/en_FK.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_FM.txt b/icu4c/source/data/locales/en_FM.txt
index 9b1d31f..e4a293d 100644
--- a/icu4c/source/data/locales/en_FM.txt
+++ b/icu4c/source/data/locales/en_FM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_GB.txt b/icu4c/source/data/locales/en_GB.txt
index 0b26898..5c34227 100644
--- a/icu4c/source/data/locales/en_GB.txt
+++ b/icu4c/source/data/locales/en_GB.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GB{
     %%Parent{"en_001"}
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     calendar{
         generic{
             availableFormats{
@@ -154,13 +154,6 @@
                 "1"{"tomorrow"}
             }
         }
-        day-narrow{
-            relative{
-                "-1"{"yesterday"}
-                "0"{"today"}
-                "1"{"tomorrow"}
-            }
-        }
         day-short{
             relativeTime{
                 future{
diff --git a/icu4c/source/data/locales/en_GD.txt b/icu4c/source/data/locales/en_GD.txt
index a006727..9ad43f3 100644
--- a/icu4c/source/data/locales/en_GD.txt
+++ b/icu4c/source/data/locales/en_GD.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_GG.txt b/icu4c/source/data/locales/en_GG.txt
index d1e5a2d..b374bb9 100644
--- a/icu4c/source/data/locales/en_GG.txt
+++ b/icu4c/source/data/locales/en_GG.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_GH.txt b/icu4c/source/data/locales/en_GH.txt
index 50a4429..d244565 100644
--- a/icu4c/source/data/locales/en_GH.txt
+++ b/icu4c/source/data/locales/en_GH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_GI.txt b/icu4c/source/data/locales/en_GI.txt
index 58cd65b..77d07dd 100644
--- a/icu4c/source/data/locales/en_GI.txt
+++ b/icu4c/source/data/locales/en_GI.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_GM.txt b/icu4c/source/data/locales/en_GM.txt
index 9448c85..807df46 100644
--- a/icu4c/source/data/locales/en_GM.txt
+++ b/icu4c/source/data/locales/en_GM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_GU.txt b/icu4c/source/data/locales/en_GU.txt
index 3f9fbc6..749bd26 100644
--- a/icu4c/source/data/locales/en_GU.txt
+++ b/icu4c/source/data/locales/en_GU.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_GY.txt b/icu4c/source/data/locales/en_GY.txt
index 7c5333b..4971e6d 100644
--- a/icu4c/source/data/locales/en_GY.txt
+++ b/icu4c/source/data/locales/en_GY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_HK.txt b/icu4c/source/data/locales/en_HK.txt
index 5b3cd3c..9e15277 100644
--- a/icu4c/source/data/locales/en_HK.txt
+++ b/icu4c/source/data/locales/en_HK.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_HK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_IE.txt b/icu4c/source/data/locales/en_IE.txt
index ecf496b..4b39c7d 100644
--- a/icu4c/source/data/locales/en_IE.txt
+++ b/icu4c/source/data/locales/en_IE.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_IL.txt b/icu4c/source/data/locales/en_IL.txt
index 4c99db4..7d4f569 100644
--- a/icu4c/source/data/locales/en_IL.txt
+++ b/icu4c/source/data/locales/en_IL.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             availableFormats{
diff --git a/icu4c/source/data/locales/en_IM.txt b/icu4c/source/data/locales/en_IM.txt
index f424a5f..10b318a 100644
--- a/icu4c/source/data/locales/en_IM.txt
+++ b/icu4c/source/data/locales/en_IM.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_IN.txt b/icu4c/source/data/locales/en_IN.txt
index c22c943..3cda03e 100644
--- a/icu4c/source/data/locales/en_IN.txt
+++ b/icu4c/source/data/locales/en_IN.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.37.11"}
+    Version{"2.1.38.73"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_IO.txt b/icu4c/source/data/locales/en_IO.txt
index 91937a3..a2031ed 100644
--- a/icu4c/source/data/locales/en_IO.txt
+++ b/icu4c/source/data/locales/en_IO.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_JE.txt b/icu4c/source/data/locales/en_JE.txt
index 299b52e..e7b7626 100644
--- a/icu4c/source/data/locales/en_JE.txt
+++ b/icu4c/source/data/locales/en_JE.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_JE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_JM.txt b/icu4c/source/data/locales/en_JM.txt
index ad3c905..c7e0fef 100644
--- a/icu4c/source/data/locales/en_JM.txt
+++ b/icu4c/source/data/locales/en_JM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_JM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_KE.txt b/icu4c/source/data/locales/en_KE.txt
index bc5062d..385a840 100644
--- a/icu4c/source/data/locales/en_KE.txt
+++ b/icu4c/source/data/locales/en_KE.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_KI.txt b/icu4c/source/data/locales/en_KI.txt
index f671853..74349d3 100644
--- a/icu4c/source/data/locales/en_KI.txt
+++ b/icu4c/source/data/locales/en_KI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_KN.txt b/icu4c/source/data/locales/en_KN.txt
index 573c389..3accb4c 100644
--- a/icu4c/source/data/locales/en_KN.txt
+++ b/icu4c/source/data/locales/en_KN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KN{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_KY.txt b/icu4c/source/data/locales/en_KY.txt
index 0d60082..dfde982 100644
--- a/icu4c/source/data/locales/en_KY.txt
+++ b/icu4c/source/data/locales/en_KY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_LC.txt b/icu4c/source/data/locales/en_LC.txt
index 7033a6a..9c2e8c4 100644
--- a/icu4c/source/data/locales/en_LC.txt
+++ b/icu4c/source/data/locales/en_LC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_LR.txt b/icu4c/source/data/locales/en_LR.txt
index 8d60973..3b6da71 100644
--- a/icu4c/source/data/locales/en_LR.txt
+++ b/icu4c/source/data/locales/en_LR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LR{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_LS.txt b/icu4c/source/data/locales/en_LS.txt
index 61d557f..644ca26 100644
--- a/icu4c/source/data/locales/en_LS.txt
+++ b/icu4c/source/data/locales/en_LS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_MG.txt b/icu4c/source/data/locales/en_MG.txt
index 90ed5ba..92d7d36 100644
--- a/icu4c/source/data/locales/en_MG.txt
+++ b/icu4c/source/data/locales/en_MG.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_MH.txt b/icu4c/source/data/locales/en_MH.txt
index 85717c1..78a903a 100644
--- a/icu4c/source/data/locales/en_MH.txt
+++ b/icu4c/source/data/locales/en_MH.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_MO.txt b/icu4c/source/data/locales/en_MO.txt
index 7c06497..5b0cc9a 100644
--- a/icu4c/source/data/locales/en_MO.txt
+++ b/icu4c/source/data/locales/en_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_MP.txt b/icu4c/source/data/locales/en_MP.txt
index 2acfccc..d739c2c 100644
--- a/icu4c/source/data/locales/en_MP.txt
+++ b/icu4c/source/data/locales/en_MP.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MP{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_MS.txt b/icu4c/source/data/locales/en_MS.txt
index 7c41de3..4655333 100644
--- a/icu4c/source/data/locales/en_MS.txt
+++ b/icu4c/source/data/locales/en_MS.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_MT.txt b/icu4c/source/data/locales/en_MT.txt
index 2cd751d..deb04b0 100644
--- a/icu4c/source/data/locales/en_MT.txt
+++ b/icu4c/source/data/locales/en_MT.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MT{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_MU.txt b/icu4c/source/data/locales/en_MU.txt
index 5afb421..1e74634 100644
--- a/icu4c/source/data/locales/en_MU.txt
+++ b/icu4c/source/data/locales/en_MU.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_MW.txt b/icu4c/source/data/locales/en_MW.txt
index 8f5bed0..f0fe526 100644
--- a/icu4c/source/data/locales/en_MW.txt
+++ b/icu4c/source/data/locales/en_MW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_MY.txt b/icu4c/source/data/locales/en_MY.txt
index fc723c2..4fa38e5 100644
--- a/icu4c/source/data/locales/en_MY.txt
+++ b/icu4c/source/data/locales/en_MY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_NA.txt b/icu4c/source/data/locales/en_NA.txt
index 17f6b27..a07f557 100644
--- a/icu4c/source/data/locales/en_NA.txt
+++ b/icu4c/source/data/locales/en_NA.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NA{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_NF.txt b/icu4c/source/data/locales/en_NF.txt
index ead26b8..cea11e4 100644
--- a/icu4c/source/data/locales/en_NF.txt
+++ b/icu4c/source/data/locales/en_NF.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NF{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_NG.txt b/icu4c/source/data/locales/en_NG.txt
index 8102534..b302284 100644
--- a/icu4c/source/data/locales/en_NG.txt
+++ b/icu4c/source/data/locales/en_NG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_NL.txt b/icu4c/source/data/locales/en_NL.txt
index f7b478f..61bb6fe 100644
--- a/icu4c/source/data/locales/en_NL.txt
+++ b/icu4c/source/data/locales/en_NL.txt
@@ -10,5 +10,5 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_NR.txt b/icu4c/source/data/locales/en_NR.txt
index f73856d..d3850ba 100644
--- a/icu4c/source/data/locales/en_NR.txt
+++ b/icu4c/source/data/locales/en_NR.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NR{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_NU.txt b/icu4c/source/data/locales/en_NU.txt
index 7659da3..159679a 100644
--- a/icu4c/source/data/locales/en_NU.txt
+++ b/icu4c/source/data/locales/en_NU.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_NZ.txt b/icu4c/source/data/locales/en_NZ.txt
index e2a2ce0..7c8ca58 100644
--- a/icu4c/source/data/locales/en_NZ.txt
+++ b/icu4c/source/data/locales/en_NZ.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NZ{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_PG.txt b/icu4c/source/data/locales/en_PG.txt
index 6146600..b0aa15c 100644
--- a/icu4c/source/data/locales/en_PG.txt
+++ b/icu4c/source/data/locales/en_PG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_PH.txt b/icu4c/source/data/locales/en_PH.txt
index 04ac66a..94d6d4c 100644
--- a/icu4c/source/data/locales/en_PH.txt
+++ b/icu4c/source/data/locales/en_PH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_PK.txt b/icu4c/source/data/locales/en_PK.txt
index 919acbb..876d8bb 100644
--- a/icu4c/source/data/locales/en_PK.txt
+++ b/icu4c/source/data/locales/en_PK.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_PN.txt b/icu4c/source/data/locales/en_PN.txt
index d8d8280..46e45eb 100644
--- a/icu4c/source/data/locales/en_PN.txt
+++ b/icu4c/source/data/locales/en_PN.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PN{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_PR.txt b/icu4c/source/data/locales/en_PR.txt
index 2d86a68..b988b0b 100644
--- a/icu4c/source/data/locales/en_PR.txt
+++ b/icu4c/source/data/locales/en_PR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_PW.txt b/icu4c/source/data/locales/en_PW.txt
index 43ec73a..14fe4d0 100644
--- a/icu4c/source/data/locales/en_PW.txt
+++ b/icu4c/source/data/locales/en_PW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_RW.txt b/icu4c/source/data/locales/en_RW.txt
index 564630e..fa5962c 100644
--- a/icu4c/source/data/locales/en_RW.txt
+++ b/icu4c/source/data/locales/en_RW.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_RW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_SB.txt b/icu4c/source/data/locales/en_SB.txt
index 08287c0..135fc64 100644
--- a/icu4c/source/data/locales/en_SB.txt
+++ b/icu4c/source/data/locales/en_SB.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SB{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_SC.txt b/icu4c/source/data/locales/en_SC.txt
index 1d54d45..0b7ed19 100644
--- a/icu4c/source/data/locales/en_SC.txt
+++ b/icu4c/source/data/locales/en_SC.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_SD.txt b/icu4c/source/data/locales/en_SD.txt
index 8fef005..e3323d7 100644
--- a/icu4c/source/data/locales/en_SD.txt
+++ b/icu4c/source/data/locales/en_SD.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_SE.txt b/icu4c/source/data/locales/en_SE.txt
index 994b234..4b33a3e 100644
--- a/icu4c/source/data/locales/en_SE.txt
+++ b/icu4c/source/data/locales/en_SE.txt
@@ -14,7 +14,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_SG.txt b/icu4c/source/data/locales/en_SG.txt
index 7c9da82..71ec7f9 100644
--- a/icu4c/source/data/locales/en_SG.txt
+++ b/icu4c/source/data/locales/en_SG.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_SH.txt b/icu4c/source/data/locales/en_SH.txt
index 467f1c5..76ddef6 100644
--- a/icu4c/source/data/locales/en_SH.txt
+++ b/icu4c/source/data/locales/en_SH.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_SI.txt b/icu4c/source/data/locales/en_SI.txt
index 55b2dde..fc50f43 100644
--- a/icu4c/source/data/locales/en_SI.txt
+++ b/icu4c/source/data/locales/en_SI.txt
@@ -12,5 +12,5 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_SL.txt b/icu4c/source/data/locales/en_SL.txt
index f3ff3f7..627e073 100644
--- a/icu4c/source/data/locales/en_SL.txt
+++ b/icu4c/source/data/locales/en_SL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_SS.txt b/icu4c/source/data/locales/en_SS.txt
index 1b9c52e..fac8b78 100644
--- a/icu4c/source/data/locales/en_SS.txt
+++ b/icu4c/source/data/locales/en_SS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_SX.txt b/icu4c/source/data/locales/en_SX.txt
index e349a5b..b049302 100644
--- a/icu4c/source/data/locales/en_SX.txt
+++ b/icu4c/source/data/locales/en_SX.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SX{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_SZ.txt b/icu4c/source/data/locales/en_SZ.txt
index 734e744..650774b 100644
--- a/icu4c/source/data/locales/en_SZ.txt
+++ b/icu4c/source/data/locales/en_SZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_TC.txt b/icu4c/source/data/locales/en_TC.txt
index 31b22e7..6d30689 100644
--- a/icu4c/source/data/locales/en_TC.txt
+++ b/icu4c/source/data/locales/en_TC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_TK.txt b/icu4c/source/data/locales/en_TK.txt
index 4bc5d7a..5b0208a 100644
--- a/icu4c/source/data/locales/en_TK.txt
+++ b/icu4c/source/data/locales/en_TK.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_TO.txt b/icu4c/source/data/locales/en_TO.txt
index 426b5d6..3f82fa0 100644
--- a/icu4c/source/data/locales/en_TO.txt
+++ b/icu4c/source/data/locales/en_TO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_TT.txt b/icu4c/source/data/locales/en_TT.txt
index 4d6d39d..284f5f7 100644
--- a/icu4c/source/data/locales/en_TT.txt
+++ b/icu4c/source/data/locales/en_TT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TT{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_TV.txt b/icu4c/source/data/locales/en_TV.txt
index d8886c8..c1175eb 100644
--- a/icu4c/source/data/locales/en_TV.txt
+++ b/icu4c/source/data/locales/en_TV.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TV{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_TZ.txt b/icu4c/source/data/locales/en_TZ.txt
index 26d3ea5..5bd8ffe 100644
--- a/icu4c/source/data/locales/en_TZ.txt
+++ b/icu4c/source/data/locales/en_TZ.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_UG.txt b/icu4c/source/data/locales/en_UG.txt
index c00c2b5..18edd97 100644
--- a/icu4c/source/data/locales/en_UG.txt
+++ b/icu4c/source/data/locales/en_UG.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_UG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_UM.txt b/icu4c/source/data/locales/en_UM.txt
index f64eece..0c110c4 100644
--- a/icu4c/source/data/locales/en_UM.txt
+++ b/icu4c/source/data/locales/en_UM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_UM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_US.txt b/icu4c/source/data/locales/en_US.txt
index 3ea240d..a4ecd9b 100644
--- a/icu4c/source/data/locales/en_US.txt
+++ b/icu4c/source/data/locales/en_US.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_US{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_US_POSIX.txt b/icu4c/source/data/locales/en_US_POSIX.txt
index fd4923f..de07ff4 100644
--- a/icu4c/source/data/locales/en_US_POSIX.txt
+++ b/icu4c/source/data/locales/en_US_POSIX.txt
@@ -16,5 +16,5 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_VC.txt b/icu4c/source/data/locales/en_VC.txt
index dc17ae0..7f5fda9 100644
--- a/icu4c/source/data/locales/en_VC.txt
+++ b/icu4c/source/data/locales/en_VC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_VG.txt b/icu4c/source/data/locales/en_VG.txt
index 995ae52..0e708c0 100644
--- a/icu4c/source/data/locales/en_VG.txt
+++ b/icu4c/source/data/locales/en_VG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_VI.txt b/icu4c/source/data/locales/en_VI.txt
index 6884981..e403c83 100644
--- a/icu4c/source/data/locales/en_VI.txt
+++ b/icu4c/source/data/locales/en_VI.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VI{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_VU.txt b/icu4c/source/data/locales/en_VU.txt
index 433c4c9..5fe2f2a 100644
--- a/icu4c/source/data/locales/en_VU.txt
+++ b/icu4c/source/data/locales/en_VU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_WS.txt b/icu4c/source/data/locales/en_WS.txt
index 0697889..00ce51e 100644
--- a/icu4c/source/data/locales/en_WS.txt
+++ b/icu4c/source/data/locales/en_WS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_WS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_ZA.txt b/icu4c/source/data/locales/en_ZA.txt
index 44eef0c..02456d1 100644
--- a/icu4c/source/data/locales/en_ZA.txt
+++ b/icu4c/source/data/locales/en_ZA.txt
@@ -15,7 +15,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/en_ZM.txt b/icu4c/source/data/locales/en_ZM.txt
index 3e9be74..b330b46 100644
--- a/icu4c/source/data/locales/en_ZM.txt
+++ b/icu4c/source/data/locales/en_ZM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/en_ZW.txt b/icu4c/source/data/locales/en_ZW.txt
index 73a8354..7038d59 100644
--- a/icu4c/source/data/locales/en_ZW.txt
+++ b/icu4c/source/data/locales/en_ZW.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/eo.txt b/icu4c/source/data/locales/eo.txt
index 6ac9630..6c399ad 100644
--- a/icu4c/source/data/locales/eo.txt
+++ b/icu4c/source/data/locales/eo.txt
@@ -14,7 +14,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/es.txt b/icu4c/source/data/locales/es.txt
index 6b3e6ee..96a7191 100644
--- a/icu4c/source/data/locales/es.txt
+++ b/icu4c/source/data/locales/es.txt
@@ -213,7 +213,7 @@
         minimumGroupingDigits{"2"}
         native{"latn"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
@@ -751,8 +751,8 @@
                 yQQQ{"QQQ y"}
                 yQQQQ{"QQQQ 'de' y"}
                 yw{
-                    one{"'semana' w 'de' Y"}
-                    other{"'semana' w 'de' Y"}
+                    one{"'semana' w 'de' y"}
+                    other{"'semana' w 'de' y"}
                 }
             }
             dayNames{
@@ -1718,6 +1718,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"”"}
diff --git a/icu4c/source/data/locales/es_419.txt b/icu4c/source/data/locales/es_419.txt
index 1d806cc..849cfd5 100644
--- a/icu4c/source/data/locales/es_419.txt
+++ b/icu4c/source/data/locales/es_419.txt
@@ -57,7 +57,7 @@
             }
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
     calendar{
         coptic{
             monthNames{
@@ -221,6 +221,10 @@
                 yMMMEd{"E, d 'de' MMM 'de' y"}
                 yMMMd{"d 'de' MMMM 'de' y"}
                 yQQQ{"QQQ 'de' y"}
+                yw{
+                    one{"'semana' w 'de' Y"}
+                    other{"'semana' w 'de' Y"}
+                }
             }
             dayNames{
                 format{
diff --git a/icu4c/source/data/locales/es_AR.txt b/icu4c/source/data/locales/es_AR.txt
index be9fc51..1cabc60 100644
--- a/icu4c/source/data/locales/es_AR.txt
+++ b/icu4c/source/data/locales/es_AR.txt
@@ -14,7 +14,7 @@
             }
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             availableFormats{
diff --git a/icu4c/source/data/locales/es_BO.txt b/icu4c/source/data/locales/es_BO.txt
index 35624b7..817593a 100644
--- a/icu4c/source/data/locales/es_BO.txt
+++ b/icu4c/source/data/locales/es_BO.txt
@@ -10,7 +10,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/es_BR.txt b/icu4c/source/data/locales/es_BR.txt
index ee8a444..1115ce9 100644
--- a/icu4c/source/data/locales/es_BR.txt
+++ b/icu4c/source/data/locales/es_BR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BR{
     %%Parent{"es_419"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/es_BZ.txt b/icu4c/source/data/locales/es_BZ.txt
index 7734598..3d2302c 100644
--- a/icu4c/source/data/locales/es_BZ.txt
+++ b/icu4c/source/data/locales/es_BZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BZ{
     %%Parent{"es_419"}
-    Version{"2.1.32.37"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/es_CL.txt b/icu4c/source/data/locales/es_CL.txt
index 2e98df5..2df1071 100644
--- a/icu4c/source/data/locales/es_CL.txt
+++ b/icu4c/source/data/locales/es_CL.txt
@@ -13,7 +13,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/es_CO.txt b/icu4c/source/data/locales/es_CO.txt
index a9912e0..fa22f28 100644
--- a/icu4c/source/data/locales/es_CO.txt
+++ b/icu4c/source/data/locales/es_CO.txt
@@ -13,7 +13,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/es_CR.txt b/icu4c/source/data/locales/es_CR.txt
index 3ab7193..d004d7a 100644
--- a/icu4c/source/data/locales/es_CR.txt
+++ b/icu4c/source/data/locales/es_CR.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/es_CU.txt b/icu4c/source/data/locales/es_CU.txt
index f75d29f..3fb6de1 100644
--- a/icu4c/source/data/locales/es_CU.txt
+++ b/icu4c/source/data/locales/es_CU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CU{
     %%Parent{"es_419"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/es_DO.txt b/icu4c/source/data/locales/es_DO.txt
index 47359ac..f93a070 100644
--- a/icu4c/source/data/locales/es_DO.txt
+++ b/icu4c/source/data/locales/es_DO.txt
@@ -9,7 +9,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/es_EA.txt b/icu4c/source/data/locales/es_EA.txt
index 0b689f6..e3e5700 100644
--- a/icu4c/source/data/locales/es_EA.txt
+++ b/icu4c/source/data/locales/es_EA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_EA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/es_EC.txt b/icu4c/source/data/locales/es_EC.txt
index 6391db9..226472e 100644
--- a/icu4c/source/data/locales/es_EC.txt
+++ b/icu4c/source/data/locales/es_EC.txt
@@ -13,7 +13,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/es_ES.txt b/icu4c/source/data/locales/es_ES.txt
index 64a537a..e248691 100644
--- a/icu4c/source/data/locales/es_ES.txt
+++ b/icu4c/source/data/locales/es_ES.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_ES{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/es_GQ.txt b/icu4c/source/data/locales/es_GQ.txt
index 3e7c3bf..b84a9d3 100644
--- a/icu4c/source/data/locales/es_GQ.txt
+++ b/icu4c/source/data/locales/es_GQ.txt
@@ -8,5 +8,5 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/es_GT.txt b/icu4c/source/data/locales/es_GT.txt
index 59edc3c..2c75b82 100644
--- a/icu4c/source/data/locales/es_GT.txt
+++ b/icu4c/source/data/locales/es_GT.txt
@@ -46,7 +46,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/es_HN.txt b/icu4c/source/data/locales/es_HN.txt
index 35a0e29..7e58fa9 100644
--- a/icu4c/source/data/locales/es_HN.txt
+++ b/icu4c/source/data/locales/es_HN.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_HN{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/es_IC.txt b/icu4c/source/data/locales/es_IC.txt
index c42f579..8f635b9 100644
--- a/icu4c/source/data/locales/es_IC.txt
+++ b/icu4c/source/data/locales/es_IC.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_IC{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/es_MX.txt b/icu4c/source/data/locales/es_MX.txt
index 661dbfc..00dfaa7 100644
--- a/icu4c/source/data/locales/es_MX.txt
+++ b/icu4c/source/data/locales/es_MX.txt
@@ -92,7 +92,7 @@
             }
         }
     }
-    Version{"2.1.37.32"}
+    Version{"2.1.38.73"}
     calendar{
         generic{
             DateTimePatterns{
@@ -180,8 +180,6 @@
                 GyMMMd{"d MMM y G"}
                 Hm{"H:mm"}
                 Hms{"H:mm:ss"}
-                Hmsv{"H:mm:ss v"}
-                Hmv{"H:mm v"}
                 MMMEd{"E d 'de' MMM"}
                 MMd{"d/MM"}
                 MMdd{"dd/MM"}
diff --git a/icu4c/source/data/locales/es_NI.txt b/icu4c/source/data/locales/es_NI.txt
index 0d61b3d..92ed43f 100644
--- a/icu4c/source/data/locales/es_NI.txt
+++ b/icu4c/source/data/locales/es_NI.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_NI{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/es_PA.txt b/icu4c/source/data/locales/es_PA.txt
index eb8a14b..147a98a 100644
--- a/icu4c/source/data/locales/es_PA.txt
+++ b/icu4c/source/data/locales/es_PA.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PA{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/es_PE.txt b/icu4c/source/data/locales/es_PE.txt
index 57cea37..4e5a9cb 100644
--- a/icu4c/source/data/locales/es_PE.txt
+++ b/icu4c/source/data/locales/es_PE.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PE{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/es_PH.txt b/icu4c/source/data/locales/es_PH.txt
index 81aeeae..8e7505c 100644
--- a/icu4c/source/data/locales/es_PH.txt
+++ b/icu4c/source/data/locales/es_PH.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/es_PR.txt b/icu4c/source/data/locales/es_PR.txt
index 9cd211c..885cd81 100644
--- a/icu4c/source/data/locales/es_PR.txt
+++ b/icu4c/source/data/locales/es_PR.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PR{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/es_PY.txt b/icu4c/source/data/locales/es_PY.txt
index ff94271..b2446b9 100644
--- a/icu4c/source/data/locales/es_PY.txt
+++ b/icu4c/source/data/locales/es_PY.txt
@@ -13,7 +13,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/es_SV.txt b/icu4c/source/data/locales/es_SV.txt
index 781876b..f8611bc 100644
--- a/icu4c/source/data/locales/es_SV.txt
+++ b/icu4c/source/data/locales/es_SV.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_SV{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/es_US.txt b/icu4c/source/data/locales/es_US.txt
index 8b5e42e..84601a6 100644
--- a/icu4c/source/data/locales/es_US.txt
+++ b/icu4c/source/data/locales/es_US.txt
@@ -58,7 +58,7 @@
                         other{"0"}
                     }
                     10000{
-                        one{"00 K"}
+                        one{"00 K"}
                         other{"00 K"}
                     }
                     100000{
@@ -81,7 +81,7 @@
             }
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     calendar{
         generic{
             DateTimePatterns{
@@ -261,24 +261,6 @@
                     d{"d–d 'de' MMM 'de' y"}
                 }
             }
-            monthNames{
-                format{
-                    abbreviated{
-                        "ene.",
-                        "feb.",
-                        "mar.",
-                        "abr.",
-                        "may.",
-                        "jun.",
-                        "jul.",
-                        "ago.",
-                        "sep.",
-                        "oct.",
-                        "nov.",
-                        "dic.",
-                    }
-                }
-            }
         }
     }
     characterLabel{
diff --git a/icu4c/source/data/locales/es_UY.txt b/icu4c/source/data/locales/es_UY.txt
index d1e34c2..bb25864 100644
--- a/icu4c/source/data/locales/es_UY.txt
+++ b/icu4c/source/data/locales/es_UY.txt
@@ -14,7 +14,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/es_VE.txt b/icu4c/source/data/locales/es_VE.txt
index bf6f78a..b4b9a39 100644
--- a/icu4c/source/data/locales/es_VE.txt
+++ b/icu4c/source/data/locales/es_VE.txt
@@ -13,7 +13,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/et.txt b/icu4c/source/data/locales/et.txt
index f955f8b..aba4cca 100644
--- a/icu4c/source/data/locales/et.txt
+++ b/icu4c/source/data/locales/et.txt
@@ -210,7 +210,7 @@
         minimumGroupingDigits{"2"}
         native{"latn"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/et_EE.txt b/icu4c/source/data/locales/et_EE.txt
index f302847..04d9f4b 100644
--- a/icu4c/source/data/locales/et_EE.txt
+++ b/icu4c/source/data/locales/et_EE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 et_EE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/eu.txt b/icu4c/source/data/locales/eu.txt
index b68baf4..6e80b38 100644
--- a/icu4c/source/data/locales/eu.txt
+++ b/icu4c/source/data/locales/eu.txt
@@ -213,7 +213,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/eu_ES.txt b/icu4c/source/data/locales/eu_ES.txt
index 2173095..3e1cbb5 100644
--- a/icu4c/source/data/locales/eu_ES.txt
+++ b/icu4c/source/data/locales/eu_ES.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 eu_ES{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ewo.txt b/icu4c/source/data/locales/ewo.txt
index 2684d79..238cc3c 100644
--- a/icu4c/source/data/locales/ewo.txt
+++ b/icu4c/source/data/locales/ewo.txt
@@ -23,7 +23,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ewo_CM.txt b/icu4c/source/data/locales/ewo_CM.txt
index 32ef6c1..93ec118 100644
--- a/icu4c/source/data/locales/ewo_CM.txt
+++ b/icu4c/source/data/locales/ewo_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ewo_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/fa.txt b/icu4c/source/data/locales/fa.txt
index 0ee1698..51b3fc2 100644
--- a/icu4c/source/data/locales/fa.txt
+++ b/icu4c/source/data/locales/fa.txt
@@ -254,7 +254,7 @@
         minimumGroupingDigits{"1"}
         native{"arabext"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
@@ -2626,5 +2626,24 @@
                 "[\\:∶]",
             }
         }
+        general{
+            lenient{
+                "[.․。︒﹒.。]",
+                "[\$﹩$$]",
+                "[£₤]",
+                "[₨₹{Rp}{Rs}]",
+            }
+        }
+        number{
+            lenient{
+                "[\\-‒⁻₋−➖﹣-]",
+                "[,،٫、︐︑﹐﹑,、]",
+                "[+⁺₊➕﬩﹢+]",
+            }
+            stricter{
+                "[,٫︐﹐,]",
+                "[.․﹒.。]",
+            }
+        }
     }
 }
diff --git a/icu4c/source/data/locales/fa_AF.txt b/icu4c/source/data/locales/fa_AF.txt
index 19c1529..07ba15e 100644
--- a/icu4c/source/data/locales/fa_AF.txt
+++ b/icu4c/source/data/locales/fa_AF.txt
@@ -18,7 +18,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             appendItems{
diff --git a/icu4c/source/data/locales/fa_IR.txt b/icu4c/source/data/locales/fa_IR.txt
index ce04110..2d4384d 100644
--- a/icu4c/source/data/locales/fa_IR.txt
+++ b/icu4c/source/data/locales/fa_IR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fa_IR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ff.txt b/icu4c/source/data/locales/ff.txt
index fe78c1a..3d56a72 100644
--- a/icu4c/source/data/locales/ff.txt
+++ b/icu4c/source/data/locales/ff.txt
@@ -16,7 +16,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ff_CM.txt b/icu4c/source/data/locales/ff_CM.txt
index 7e02135..49d5ddc 100644
--- a/icu4c/source/data/locales/ff_CM.txt
+++ b/icu4c/source/data/locales/ff_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ff_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ff_GN.txt b/icu4c/source/data/locales/ff_GN.txt
index 334d533..6f47caf 100644
--- a/icu4c/source/data/locales/ff_GN.txt
+++ b/icu4c/source/data/locales/ff_GN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ff_GN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ff_MR.txt b/icu4c/source/data/locales/ff_MR.txt
index eece95d..ed4e80b 100644
--- a/icu4c/source/data/locales/ff_MR.txt
+++ b/icu4c/source/data/locales/ff_MR.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ff_MR{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ff_SN.txt b/icu4c/source/data/locales/ff_SN.txt
index ceebdf5..b7bbc67 100644
--- a/icu4c/source/data/locales/ff_SN.txt
+++ b/icu4c/source/data/locales/ff_SN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ff_SN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/fi.txt b/icu4c/source/data/locales/fi.txt
index 76ae568..af14c34 100644
--- a/icu4c/source/data/locales/fi.txt
+++ b/icu4c/source/data/locales/fi.txt
@@ -214,7 +214,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.67"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -1450,7 +1450,7 @@
         }
     }
     characterLabel{
-        activities{"toiminnot"}
+        activities{"toiminta"}
         african_scripts{"afrikkalaiset kirjoitusjärjestelmät"}
         american_scripts{"amerikkalaiset kirjoitusjärjestelmät"}
         animal{"eläin"}
@@ -1546,6 +1546,10 @@
             0,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"’"}
diff --git a/icu4c/source/data/locales/fi_FI.txt b/icu4c/source/data/locales/fi_FI.txt
index 82ca41e..6dde768 100644
--- a/icu4c/source/data/locales/fi_FI.txt
+++ b/icu4c/source/data/locales/fi_FI.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fi_FI{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fil.txt b/icu4c/source/data/locales/fil.txt
index 8463c8a..db8e0fc 100644
--- a/icu4c/source/data/locales/fil.txt
+++ b/icu4c/source/data/locales/fil.txt
@@ -211,7 +211,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fil_PH.txt b/icu4c/source/data/locales/fil_PH.txt
index 524c505..515e175 100644
--- a/icu4c/source/data/locales/fil_PH.txt
+++ b/icu4c/source/data/locales/fil_PH.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fil_PH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fo.txt b/icu4c/source/data/locales/fo.txt
index ab30dad..d5d23d9 100644
--- a/icu4c/source/data/locales/fo.txt
+++ b/icu4c/source/data/locales/fo.txt
@@ -210,7 +210,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -1719,4 +1719,31 @@
         US{"US"}
         metric{"metralagið"}
     }
+    parse{
+        date{
+            lenient{
+                "[\\--/]",
+                "[\\:∶]",
+            }
+        }
+        general{
+            lenient{
+                "[.․。︒﹒.。]",
+                "[\$﹩$$]",
+                "[£₤]",
+                "[₨₹{Rp}{Rs}]",
+            }
+        }
+        number{
+            lenient{
+                "[\\-‒⁻₋−➖﹣-]",
+                "[,،٫、︐︑﹐﹑,、]",
+                "[+⁺₊➕﬩﹢+]",
+            }
+            stricter{
+                "[,٫︐﹐,]",
+                "[.․﹒.。]",
+            }
+        }
+    }
 }
diff --git a/icu4c/source/data/locales/fo_DK.txt b/icu4c/source/data/locales/fo_DK.txt
index 1b7e17c..b4f88b1 100644
--- a/icu4c/source/data/locales/fo_DK.txt
+++ b/icu4c/source/data/locales/fo_DK.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fo_DK{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fo_FO.txt b/icu4c/source/data/locales/fo_FO.txt
index 89df7ff..2c22a6f 100644
--- a/icu4c/source/data/locales/fo_FO.txt
+++ b/icu4c/source/data/locales/fo_FO.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fo_FO{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr.txt b/icu4c/source/data/locales/fr.txt
index d3995b0..4df4ca7 100644
--- a/icu4c/source/data/locales/fr.txt
+++ b/icu4c/source/data/locales/fr.txt
@@ -214,7 +214,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -1944,6 +1944,10 @@
             0,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"»"}
diff --git a/icu4c/source/data/locales/fr_BE.txt b/icu4c/source/data/locales/fr_BE.txt
index d593bc5..60cdba0 100644
--- a/icu4c/source/data/locales/fr_BE.txt
+++ b/icu4c/source/data/locales/fr_BE.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_BE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fr_BF.txt b/icu4c/source/data/locales/fr_BF.txt
index 4ca723d..2f08224 100644
--- a/icu4c/source/data/locales/fr_BF.txt
+++ b/icu4c/source/data/locales/fr_BF.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_BF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_BI.txt b/icu4c/source/data/locales/fr_BI.txt
index 91c68ea..a425100 100644
--- a/icu4c/source/data/locales/fr_BI.txt
+++ b/icu4c/source/data/locales/fr_BI.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_BI{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_BJ.txt b/icu4c/source/data/locales/fr_BJ.txt
index c26257e..2badcbb 100644
--- a/icu4c/source/data/locales/fr_BJ.txt
+++ b/icu4c/source/data/locales/fr_BJ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_BJ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_BL.txt b/icu4c/source/data/locales/fr_BL.txt
index 9bb98c1..ee8ccb2 100644
--- a/icu4c/source/data/locales/fr_BL.txt
+++ b/icu4c/source/data/locales/fr_BL.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_BL{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_CA.txt b/icu4c/source/data/locales/fr_CA.txt
index 37d0901..06dcb7d 100644
--- a/icu4c/source/data/locales/fr_CA.txt
+++ b/icu4c/source/data/locales/fr_CA.txt
@@ -91,7 +91,7 @@
             }
         }
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     calendar{
         coptic{
             monthNames{
diff --git a/icu4c/source/data/locales/fr_CD.txt b/icu4c/source/data/locales/fr_CD.txt
index 5be30d4..d243a1b 100644
--- a/icu4c/source/data/locales/fr_CD.txt
+++ b/icu4c/source/data/locales/fr_CD.txt
@@ -8,7 +8,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             dayPeriod{
diff --git a/icu4c/source/data/locales/fr_CF.txt b/icu4c/source/data/locales/fr_CF.txt
index ba5b542..6ca283d 100644
--- a/icu4c/source/data/locales/fr_CF.txt
+++ b/icu4c/source/data/locales/fr_CF.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_CF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_CG.txt b/icu4c/source/data/locales/fr_CG.txt
index 54debb6..6c18f53 100644
--- a/icu4c/source/data/locales/fr_CG.txt
+++ b/icu4c/source/data/locales/fr_CG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_CG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_CH.txt b/icu4c/source/data/locales/fr_CH.txt
index 153725a..240de5b 100644
--- a/icu4c/source/data/locales/fr_CH.txt
+++ b/icu4c/source/data/locales/fr_CH.txt
@@ -4,7 +4,7 @@
     NumberElements{
         latn{
             patterns{
-                currencyFormat{"#,##0.00 ¤ ;-#,##0.00 ¤"}
+                currencyFormat{"#,##0.00 ¤;-#,##0.00 ¤"}
                 percentFormat{"#,##0%"}
             }
             symbols{
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.85"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fr_CI.txt b/icu4c/source/data/locales/fr_CI.txt
index 3737eb2..4d78a54 100644
--- a/icu4c/source/data/locales/fr_CI.txt
+++ b/icu4c/source/data/locales/fr_CI.txt
@@ -8,5 +8,5 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_CM.txt b/icu4c/source/data/locales/fr_CM.txt
index a9c95a7..4745e4b 100644
--- a/icu4c/source/data/locales/fr_CM.txt
+++ b/icu4c/source/data/locales/fr_CM.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/fr_DJ.txt b/icu4c/source/data/locales/fr_DJ.txt
index ca9aecc..4470076 100644
--- a/icu4c/source/data/locales/fr_DJ.txt
+++ b/icu4c/source/data/locales/fr_DJ.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_DJ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fr_DZ.txt b/icu4c/source/data/locales/fr_DZ.txt
index 2a348b5..10726eb 100644
--- a/icu4c/source/data/locales/fr_DZ.txt
+++ b/icu4c/source/data/locales/fr_DZ.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_DZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fr_FR.txt b/icu4c/source/data/locales/fr_FR.txt
index 1b747a4..f7f79f0 100644
--- a/icu4c/source/data/locales/fr_FR.txt
+++ b/icu4c/source/data/locales/fr_FR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_FR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_GA.txt b/icu4c/source/data/locales/fr_GA.txt
index e6fa2ac..045a4b8 100644
--- a/icu4c/source/data/locales/fr_GA.txt
+++ b/icu4c/source/data/locales/fr_GA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_GA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_GF.txt b/icu4c/source/data/locales/fr_GF.txt
index 84c5ab2..8c683fb 100644
--- a/icu4c/source/data/locales/fr_GF.txt
+++ b/icu4c/source/data/locales/fr_GF.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_GF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_GN.txt b/icu4c/source/data/locales/fr_GN.txt
index c908c10..22a685b 100644
--- a/icu4c/source/data/locales/fr_GN.txt
+++ b/icu4c/source/data/locales/fr_GN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_GN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_GP.txt b/icu4c/source/data/locales/fr_GP.txt
index 436b1a5..f01ea59 100644
--- a/icu4c/source/data/locales/fr_GP.txt
+++ b/icu4c/source/data/locales/fr_GP.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_GP{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_GQ.txt b/icu4c/source/data/locales/fr_GQ.txt
index 4c3bf6e..e2ca0a3 100644
--- a/icu4c/source/data/locales/fr_GQ.txt
+++ b/icu4c/source/data/locales/fr_GQ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_GQ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_HT.txt b/icu4c/source/data/locales/fr_HT.txt
index d342043..4d76719 100644
--- a/icu4c/source/data/locales/fr_HT.txt
+++ b/icu4c/source/data/locales/fr_HT.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_HT{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             dayPeriod{
diff --git a/icu4c/source/data/locales/fr_KM.txt b/icu4c/source/data/locales/fr_KM.txt
index fbc5900..bf57963 100644
--- a/icu4c/source/data/locales/fr_KM.txt
+++ b/icu4c/source/data/locales/fr_KM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_KM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_LU.txt b/icu4c/source/data/locales/fr_LU.txt
index 375d76a..15c0a82 100644
--- a/icu4c/source/data/locales/fr_LU.txt
+++ b/icu4c/source/data/locales/fr_LU.txt
@@ -9,5 +9,5 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_MA.txt b/icu4c/source/data/locales/fr_MA.txt
index c207c0b..d618157 100644
--- a/icu4c/source/data/locales/fr_MA.txt
+++ b/icu4c/source/data/locales/fr_MA.txt
@@ -9,7 +9,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/fr_MC.txt b/icu4c/source/data/locales/fr_MC.txt
index f5566e2..d5d9f09 100644
--- a/icu4c/source/data/locales/fr_MC.txt
+++ b/icu4c/source/data/locales/fr_MC.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_MC{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_MF.txt b/icu4c/source/data/locales/fr_MF.txt
index ff2d0b6..1b5d35a 100644
--- a/icu4c/source/data/locales/fr_MF.txt
+++ b/icu4c/source/data/locales/fr_MF.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_MF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_MG.txt b/icu4c/source/data/locales/fr_MG.txt
index d65bc51..eda5ce4 100644
--- a/icu4c/source/data/locales/fr_MG.txt
+++ b/icu4c/source/data/locales/fr_MG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_MG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_ML.txt b/icu4c/source/data/locales/fr_ML.txt
index 19c77c6..3528d0a 100644
--- a/icu4c/source/data/locales/fr_ML.txt
+++ b/icu4c/source/data/locales/fr_ML.txt
@@ -8,7 +8,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fr_MQ.txt b/icu4c/source/data/locales/fr_MQ.txt
index 36602da..4abd376 100644
--- a/icu4c/source/data/locales/fr_MQ.txt
+++ b/icu4c/source/data/locales/fr_MQ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_MQ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_MR.txt b/icu4c/source/data/locales/fr_MR.txt
index 1d15c7c..a874f1c 100644
--- a/icu4c/source/data/locales/fr_MR.txt
+++ b/icu4c/source/data/locales/fr_MR.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_MR{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fr_MU.txt b/icu4c/source/data/locales/fr_MU.txt
index 951444f..476d9fd 100644
--- a/icu4c/source/data/locales/fr_MU.txt
+++ b/icu4c/source/data/locales/fr_MU.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_MU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_NC.txt b/icu4c/source/data/locales/fr_NC.txt
index b9da89a..fc3e073 100644
--- a/icu4c/source/data/locales/fr_NC.txt
+++ b/icu4c/source/data/locales/fr_NC.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_NC{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_NE.txt b/icu4c/source/data/locales/fr_NE.txt
index cc057e8..de9b2d3 100644
--- a/icu4c/source/data/locales/fr_NE.txt
+++ b/icu4c/source/data/locales/fr_NE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_NE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_PF.txt b/icu4c/source/data/locales/fr_PF.txt
index d97d957..a65041e 100644
--- a/icu4c/source/data/locales/fr_PF.txt
+++ b/icu4c/source/data/locales/fr_PF.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_PF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_PM.txt b/icu4c/source/data/locales/fr_PM.txt
index d8182af..33eab54 100644
--- a/icu4c/source/data/locales/fr_PM.txt
+++ b/icu4c/source/data/locales/fr_PM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_PM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_RE.txt b/icu4c/source/data/locales/fr_RE.txt
index 0175995..9f46470 100644
--- a/icu4c/source/data/locales/fr_RE.txt
+++ b/icu4c/source/data/locales/fr_RE.txt
@@ -8,7 +8,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             dayPeriod{
diff --git a/icu4c/source/data/locales/fr_RW.txt b/icu4c/source/data/locales/fr_RW.txt
index e5cfc50..7ad64b6 100644
--- a/icu4c/source/data/locales/fr_RW.txt
+++ b/icu4c/source/data/locales/fr_RW.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_RW{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_SC.txt b/icu4c/source/data/locales/fr_SC.txt
index 5ec6d7a..02615f1 100644
--- a/icu4c/source/data/locales/fr_SC.txt
+++ b/icu4c/source/data/locales/fr_SC.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_SC{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_SN.txt b/icu4c/source/data/locales/fr_SN.txt
index 9a148bf..badf5fb 100644
--- a/icu4c/source/data/locales/fr_SN.txt
+++ b/icu4c/source/data/locales/fr_SN.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_SN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             dayPeriod{
diff --git a/icu4c/source/data/locales/fr_SY.txt b/icu4c/source/data/locales/fr_SY.txt
index adcb794..fc1aaba 100644
--- a/icu4c/source/data/locales/fr_SY.txt
+++ b/icu4c/source/data/locales/fr_SY.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_SY{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fr_TD.txt b/icu4c/source/data/locales/fr_TD.txt
index a0266a7..52dc62b 100644
--- a/icu4c/source/data/locales/fr_TD.txt
+++ b/icu4c/source/data/locales/fr_TD.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_TD{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fr_TG.txt b/icu4c/source/data/locales/fr_TG.txt
index edba47d..46110f6 100644
--- a/icu4c/source/data/locales/fr_TG.txt
+++ b/icu4c/source/data/locales/fr_TG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_TG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_TN.txt b/icu4c/source/data/locales/fr_TN.txt
index 69178be..26ad536 100644
--- a/icu4c/source/data/locales/fr_TN.txt
+++ b/icu4c/source/data/locales/fr_TN.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_TN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fr_VU.txt b/icu4c/source/data/locales/fr_VU.txt
index 4d327c2..3dfcad2 100644
--- a/icu4c/source/data/locales/fr_VU.txt
+++ b/icu4c/source/data/locales/fr_VU.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_VU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fr_WF.txt b/icu4c/source/data/locales/fr_WF.txt
index 9a21cf8..db44b7b 100644
--- a/icu4c/source/data/locales/fr_WF.txt
+++ b/icu4c/source/data/locales/fr_WF.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_WF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fr_YT.txt b/icu4c/source/data/locales/fr_YT.txt
index 40ead0e..0ec388f 100644
--- a/icu4c/source/data/locales/fr_YT.txt
+++ b/icu4c/source/data/locales/fr_YT.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_YT{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/fur.txt b/icu4c/source/data/locales/fur.txt
index 9fce1c5..28fa06d 100644
--- a/icu4c/source/data/locales/fur.txt
+++ b/icu4c/source/data/locales/fur.txt
@@ -27,7 +27,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fur_IT.txt b/icu4c/source/data/locales/fur_IT.txt
index a27dd4a..b8b4ffe 100644
--- a/icu4c/source/data/locales/fur_IT.txt
+++ b/icu4c/source/data/locales/fur_IT.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fur_IT{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/fy.txt b/icu4c/source/data/locales/fy.txt
index 54fa233..c955deb 100644
--- a/icu4c/source/data/locales/fy.txt
+++ b/icu4c/source/data/locales/fy.txt
@@ -155,7 +155,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/fy_NL.txt b/icu4c/source/data/locales/fy_NL.txt
index 7f8f301..4533696 100644
--- a/icu4c/source/data/locales/fy_NL.txt
+++ b/icu4c/source/data/locales/fy_NL.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fy_NL{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ga.txt b/icu4c/source/data/locales/ga.txt
index fb4615a..6824220 100644
--- a/icu4c/source/data/locales/ga.txt
+++ b/icu4c/source/data/locales/ga.txt
@@ -319,7 +319,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -1071,8 +1071,8 @@
         african_scripts{"Scripteanna na hAfraice"}
         american_scripts{"Scripteanna Meiriceánacha"}
         animal{"ainmhí"}
-        animals_nature{"Ainmhithe agus an Nádúr"}
-        arrows{"Saighde"}
+        animals_nature{"Ainmhithe nó an Nádúr"}
+        arrows{"saighead"}
         body{"corp"}
         box_drawing{"Líníocht Boscaí"}
         braille{"Braille"}
@@ -1084,8 +1084,8 @@
         digits{"Digití"}
         dingbats{"Smísteoga"}
         divination_symbols{"Siombailí na Fáistine"}
-        downwards_arrows{"Saighde Síos"}
-        downwards_upwards_arrows{"Saighde Síos Suas"}
+        downwards_arrows{"Saigheada Síos"}
+        downwards_upwards_arrows{"Saigheada Síos Suas"}
         east_asian_scripts{"Scripteanna na hÁise Thoir"}
         emoji{"Emoji"}
         european_scripts{"Scripteanna na hEorpa"}
@@ -1095,9 +1095,9 @@
         food_drink{"Bia agus Deoch"}
         format{"Formáid"}
         format_whitespace{"Formáid agus Spás Bán"}
-        full_width_form_variant{"Foirmeacha Malartacha Lánleithid"}
+        full_width_form_variant{"Foirm Lánleithid"}
         geometric_shapes{"Cruthanna Geoiméadracha"}
-        half_width_form_variant{"Foirmeacha Malartacha Leathleithid"}
+        half_width_form_variant{"Foirm Leathleithid"}
         han_characters{"Carachtair Han"}
         han_radicals{"Fréamhacha Han"}
         hanja{"Hanaí"}
@@ -1110,8 +1110,8 @@
         kanbun{"Kanbun"}
         kanji{"Ceansaí"}
         keycap{"caipín eochrach"}
-        leftwards_arrows{"Saighde Clé"}
-        leftwards_rightwards_arrows{"Saighde Clé-Deas"}
+        leftwards_arrows{"Saighead Chlé"}
+        leftwards_rightwards_arrows{"Saighead Chlé-Dheas"}
         letterlike_symbols{"Siombailí Cosúil le Litreacha"}
         limited_use{"Neamhfhorleathan"}
         male{"fireann"}
@@ -1122,7 +1122,7 @@
         modifier{"Mionathraitheoir"}
         musical_symbols{"Siombailí Ceoil"}
         nature{"nádúr"}
-        nonspacing{"Neamhspásáilte"}
+        nonspacing{"Neamhspásáil"}
         numbers{"Uimhreacha"}
         objects{"Nithe"}
         other{"Eile"}
@@ -1133,11 +1133,11 @@
         place{"áit"}
         plant{"planda"}
         punctuation{"Poncaíocht"}
-        rightwards_arrows{"Saighde Deasa"}
+        rightwards_arrows{"Saighead Dheas"}
         sign_standard_symbols{"Comharthaí/Siombailí Coitianta"}
-        small_form_variant{"Foirmeacha Beaga Malartacha"}
+        small_form_variant{"Foirmeacha Beaga"}
         smiley{"straoiseog"}
-        smileys_people{"Straoiseoga agus Daoine"}
+        smileys_people{"Straoiseoga nó Daoine"}
         south_asian_scripts{"Scripteanna na hÁise Theas"}
         southeast_asian_scripts{"Scripteanna na hÁise Thoir Theas"}
         spacing{"Spásáil"}
@@ -1146,8 +1146,8 @@
         technical_symbols{"Siombailí Teicniúla"}
         tone_marks{"Comharthaí Toin"}
         travel{"taisteal"}
-        travel_places{"Taisteal agus Áiteanna"}
-        upwards_arrows{"Saighde Suas"}
+        travel_places{"Taisteal nó Áiteanna"}
+        upwards_arrows{"Saighead suas"}
         variant_forms{"Foirmeacha Malartacha"}
         vocalic_jamo{"Seamó Guthach"}
         weather{"aimsir"}
diff --git a/icu4c/source/data/locales/ga_IE.txt b/icu4c/source/data/locales/ga_IE.txt
index d0e7b96..a90348f 100644
--- a/icu4c/source/data/locales/ga_IE.txt
+++ b/icu4c/source/data/locales/ga_IE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ga_IE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/gd.txt b/icu4c/source/data/locales/gd.txt
index b31d793..f3ca70f 100644
--- a/icu4c/source/data/locales/gd.txt
+++ b/icu4c/source/data/locales/gd.txt
@@ -915,7 +915,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             intervalFormats{
@@ -1176,10 +1176,10 @@
                 yQQQ{"QQQ y"}
                 yQQQQ{"QQQQ y"}
                 yw{
-                    few{"'seachdain' w 'dhe' Y"}
-                    one{"'seachdain' w 'dhe' Y"}
-                    other{"'seachdain' w 'dhe' Y"}
-                    two{"'seachdain' w 'dhe' Y"}
+                    few{"'seachdain' w 'dhe' y"}
+                    one{"'seachdain' w 'dhe' y"}
+                    other{"'seachdain' w 'dhe' y"}
+                    two{"'seachdain' w 'dhe' y"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/gd_GB.txt b/icu4c/source/data/locales/gd_GB.txt
index d942da9..5b68c49 100644
--- a/icu4c/source/data/locales/gd_GB.txt
+++ b/icu4c/source/data/locales/gd_GB.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gd_GB{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/gl.txt b/icu4c/source/data/locales/gl.txt
index 6db2b6b..6ab0b97 100644
--- a/icu4c/source/data/locales/gl.txt
+++ b/icu4c/source/data/locales/gl.txt
@@ -157,8 +157,8 @@
                         other{"00 mill'.'"}
                     }
                     100000000{
-                        one{"000 mill'.'"}
-                        other{"000 mill'.'"}
+                        one{"000 mill"}
+                        other{"000 mill"}
                     }
                     1000000000{
                         one{"0"}
@@ -213,7 +213,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/gl_ES.txt b/icu4c/source/data/locales/gl_ES.txt
index 617a70f..bef0bb2 100644
--- a/icu4c/source/data/locales/gl_ES.txt
+++ b/icu4c/source/data/locales/gl_ES.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gl_ES{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/gsw.txt b/icu4c/source/data/locales/gsw.txt
index eb5e3f9..945b3d7 100644
--- a/icu4c/source/data/locales/gsw.txt
+++ b/icu4c/source/data/locales/gsw.txt
@@ -180,7 +180,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/gsw_CH.txt b/icu4c/source/data/locales/gsw_CH.txt
index a49edf4..b1b0be3 100644
--- a/icu4c/source/data/locales/gsw_CH.txt
+++ b/icu4c/source/data/locales/gsw_CH.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gsw_CH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/gsw_FR.txt b/icu4c/source/data/locales/gsw_FR.txt
index 655981a..cc6ede9 100644
--- a/icu4c/source/data/locales/gsw_FR.txt
+++ b/icu4c/source/data/locales/gsw_FR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gsw_FR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/gsw_LI.txt b/icu4c/source/data/locales/gsw_LI.txt
index 8b52b8c..baa9c7b 100644
--- a/icu4c/source/data/locales/gsw_LI.txt
+++ b/icu4c/source/data/locales/gsw_LI.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gsw_LI{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/gu.txt b/icu4c/source/data/locales/gu.txt
index fb0fc59..49cee56 100644
--- a/icu4c/source/data/locales/gu.txt
+++ b/icu4c/source/data/locales/gu.txt
@@ -250,7 +250,7 @@
         minimumGroupingDigits{"1"}
         native{"gujr"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/gu_IN.txt b/icu4c/source/data/locales/gu_IN.txt
index 99e6221..512c1d9 100644
--- a/icu4c/source/data/locales/gu_IN.txt
+++ b/icu4c/source/data/locales/gu_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gu_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/guz.txt b/icu4c/source/data/locales/guz.txt
index 0981568..8bd0d98 100644
--- a/icu4c/source/data/locales/guz.txt
+++ b/icu4c/source/data/locales/guz.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/guz_KE.txt b/icu4c/source/data/locales/guz_KE.txt
index 9de7fc9..c7be344 100644
--- a/icu4c/source/data/locales/guz_KE.txt
+++ b/icu4c/source/data/locales/guz_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 guz_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/gv.txt b/icu4c/source/data/locales/gv.txt
index 0d92cc6..706f126 100644
--- a/icu4c/source/data/locales/gv.txt
+++ b/icu4c/source/data/locales/gv.txt
@@ -23,7 +23,7 @@
             }
         }
     }
-    Version{"2.1.34.91"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/gv_IM.txt b/icu4c/source/data/locales/gv_IM.txt
index d59bb4b..831a140 100644
--- a/icu4c/source/data/locales/gv_IM.txt
+++ b/icu4c/source/data/locales/gv_IM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gv_IM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ha.txt b/icu4c/source/data/locales/ha.txt
index 98acbd1..9fd19cd 100644
--- a/icu4c/source/data/locales/ha.txt
+++ b/icu4c/source/data/locales/ha.txt
@@ -173,7 +173,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ha_GH.txt b/icu4c/source/data/locales/ha_GH.txt
index c853f1a..a4315ff 100644
--- a/icu4c/source/data/locales/ha_GH.txt
+++ b/icu4c/source/data/locales/ha_GH.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ha_GH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ha_NE.txt b/icu4c/source/data/locales/ha_NE.txt
index 879225e..c7e0ab0 100644
--- a/icu4c/source/data/locales/ha_NE.txt
+++ b/icu4c/source/data/locales/ha_NE.txt
@@ -1,5 +1,17 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ha_NE{
-    Version{"2.1.31.33"}
+    AuxExemplarCharacters{"[á à â é è ê í ì î ó ò ô p q {r\u0303} ú ù û v x {ʼy}]"}
+    ExemplarCharacters{"[a b ɓ c d ɗ e f g h i j k ƙ l m n o r s {sh} t {ts} u w y ƴ z ʼ]"}
+    ExemplarCharactersIndex{"[A B Ɓ C D Ɗ E F G H I J K Ƙ L M N O P Q R S T U V W X Y Ƴ Z]"}
+    Version{"2.1.39.37"}
+    fields{
+        day{
+            relative{
+                "-1"{"Jiya"}
+                "0"{"Yau"}
+                "1"{"Gobe"}
+            }
+        }
+    }
 }
diff --git a/icu4c/source/data/locales/ha_NG.txt b/icu4c/source/data/locales/ha_NG.txt
index eb448f8..8bdb020 100644
--- a/icu4c/source/data/locales/ha_NG.txt
+++ b/icu4c/source/data/locales/ha_NG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ha_NG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/haw.txt b/icu4c/source/data/locales/haw.txt
index 068c732..86519b0 100644
--- a/icu4c/source/data/locales/haw.txt
+++ b/icu4c/source/data/locales/haw.txt
@@ -32,7 +32,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/haw_US.txt b/icu4c/source/data/locales/haw_US.txt
index 249d39e..dde92aa 100644
--- a/icu4c/source/data/locales/haw_US.txt
+++ b/icu4c/source/data/locales/haw_US.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 haw_US{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/he.txt b/icu4c/source/data/locales/he.txt
index 427dd79..582e115 100644
--- a/icu4c/source/data/locales/he.txt
+++ b/icu4c/source/data/locales/he.txt
@@ -300,7 +300,7 @@
         native{"latn"}
         traditional{"hebr"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
@@ -2014,7 +2014,7 @@
         miscellaneous{"שונות"}
         modern_scripts{"סקריפטים מודרניים"}
         modifier{"סימן מחליף"}
-        musical_symbols{"סמלים מוסיקליים"}
+        musical_symbols{"סמלים מוזיקליים"}
         nature{"טבע"}
         nonspacing{"ללא ריווח"}
         numbers{"מספרים"}
@@ -2045,6 +2045,7 @@
         variant_forms{"חלופות"}
         vocalic_jamo{"ג׳אמו ווקאלי"}
         weather{"מזג אוויר"}
+        western_asian_scripts{"סקריפטים ממערב אסיה"}
         whitespace{"רווח לבן"}
     }
     delimiters{
@@ -3105,4 +3106,31 @@
         US{"ארה״ב"}
         metric{"מטרי"}
     }
+    parse{
+        date{
+            lenient{
+                "[\\--/]",
+                "[\\:∶]",
+            }
+        }
+        general{
+            lenient{
+                "[.․。︒﹒.。]",
+                "[\$﹩$$]",
+                "[£₤]",
+                "[₨₹{Rp}{Rs}]",
+            }
+        }
+        number{
+            lenient{
+                "[\\-‒⁻₋−➖﹣-]",
+                "[,،٫、︐︑﹐﹑,、]",
+                "[+⁺₊➕﬩﹢+]",
+            }
+            stricter{
+                "[,٫︐﹐,]",
+                "[.․﹒.。]",
+            }
+        }
+    }
 }
diff --git a/icu4c/source/data/locales/he_IL.txt b/icu4c/source/data/locales/he_IL.txt
index 24cae18..cfd8a46 100644
--- a/icu4c/source/data/locales/he_IL.txt
+++ b/icu4c/source/data/locales/he_IL.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 he_IL{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/hi.txt b/icu4c/source/data/locales/hi.txt
index cd8d0c9..3dcb856 100644
--- a/icu4c/source/data/locales/hi.txt
+++ b/icu4c/source/data/locales/hi.txt
@@ -236,7 +236,7 @@
         minimumGroupingDigits{"1"}
         native{"deva"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     calendar{
         ethiopic{
             monthNames{
diff --git a/icu4c/source/data/locales/hi_IN.txt b/icu4c/source/data/locales/hi_IN.txt
index 006fb3a..05e655f 100644
--- a/icu4c/source/data/locales/hi_IN.txt
+++ b/icu4c/source/data/locales/hi_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hi_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/hr.txt b/icu4c/source/data/locales/hr.txt
index 34322a8..2e17d73 100644
--- a/icu4c/source/data/locales/hr.txt
+++ b/icu4c/source/data/locales/hr.txt
@@ -237,10 +237,20 @@
                 timeSeparator{":"}
             }
         }
+        minimalPairs{
+            ordinal{
+                other{"Skrenite {0}. desno."}
+            }
+            plural{
+                few{"{0} dana"}
+                one{"{0} dan"}
+                other{"{0} dan/a"}
+            }
+        }
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/hr_BA.txt b/icu4c/source/data/locales/hr_BA.txt
index 25d2636..d4d85e1 100644
--- a/icu4c/source/data/locales/hr_BA.txt
+++ b/icu4c/source/data/locales/hr_BA.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hr_BA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/hr_HR.txt b/icu4c/source/data/locales/hr_HR.txt
index c098116..3614a30 100644
--- a/icu4c/source/data/locales/hr_HR.txt
+++ b/icu4c/source/data/locales/hr_HR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hr_HR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/hsb.txt b/icu4c/source/data/locales/hsb.txt
index 63e2ff2..fcaedd8 100644
--- a/icu4c/source/data/locales/hsb.txt
+++ b/icu4c/source/data/locales/hsb.txt
@@ -196,7 +196,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/hsb_DE.txt b/icu4c/source/data/locales/hsb_DE.txt
index 04d3611..6d00ed4 100644
--- a/icu4c/source/data/locales/hsb_DE.txt
+++ b/icu4c/source/data/locales/hsb_DE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hsb_DE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/hu.txt b/icu4c/source/data/locales/hu.txt
index 648a17f..ba34075 100644
--- a/icu4c/source/data/locales/hu.txt
+++ b/icu4c/source/data/locales/hu.txt
@@ -221,7 +221,7 @@
         minimumGroupingDigits{"4"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
@@ -1524,6 +1524,12 @@
         western_asian_scripts{"nyugat-ázsiai írásrendszerek"}
         whitespace{"térköz"}
     }
+    contextTransforms{
+        typographicNames:intvector{
+            1,
+            1,
+        }
+    }
     delimiters{
         alternateQuotationEnd{"«"}
         alternateQuotationStart{"»"}
diff --git a/icu4c/source/data/locales/hu_HU.txt b/icu4c/source/data/locales/hu_HU.txt
index edaf618..155793b 100644
--- a/icu4c/source/data/locales/hu_HU.txt
+++ b/icu4c/source/data/locales/hu_HU.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hu_HU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/hy.txt b/icu4c/source/data/locales/hy.txt
index 9b3951e..22f1dbc 100644
--- a/icu4c/source/data/locales/hy.txt
+++ b/icu4c/source/data/locales/hy.txt
@@ -214,7 +214,7 @@
         native{"latn"}
         traditional{"armn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/hy_AM.txt b/icu4c/source/data/locales/hy_AM.txt
index 0a88e3c..b94fdec 100644
--- a/icu4c/source/data/locales/hy_AM.txt
+++ b/icu4c/source/data/locales/hy_AM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hy_AM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/id.txt b/icu4c/source/data/locales/id.txt
index ac9eb42..89556a9 100644
--- a/icu4c/source/data/locales/id.txt
+++ b/icu4c/source/data/locales/id.txt
@@ -173,7 +173,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -2460,6 +2460,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"’"}
diff --git a/icu4c/source/data/locales/id_ID.txt b/icu4c/source/data/locales/id_ID.txt
index 99bd9f4..dbc0837 100644
--- a/icu4c/source/data/locales/id_ID.txt
+++ b/icu4c/source/data/locales/id_ID.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 id_ID{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ig.txt b/icu4c/source/data/locales/ig.txt
index e7bd2ed..b5ca35e 100644
--- a/icu4c/source/data/locales/ig.txt
+++ b/icu4c/source/data/locales/ig.txt
@@ -90,7 +90,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
@@ -208,7 +208,7 @@
                 yQQQ{"QQQ y"}
                 yQQQQ{"QQQQ y"}
                 yw{
-                    other{"'week' w 'of' Y"}
+                    other{"'week' w 'of' y"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/ig_NG.txt b/icu4c/source/data/locales/ig_NG.txt
index 0eb225d..65b7962 100644
--- a/icu4c/source/data/locales/ig_NG.txt
+++ b/icu4c/source/data/locales/ig_NG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ig_NG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ii.txt b/icu4c/source/data/locales/ii.txt
index b77ee4f..1988851 100644
--- a/icu4c/source/data/locales/ii.txt
+++ b/icu4c/source/data/locales/ii.txt
@@ -20,7 +20,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/ii_CN.txt b/icu4c/source/data/locales/ii_CN.txt
index 802ee4f..7df5b6d 100644
--- a/icu4c/source/data/locales/ii_CN.txt
+++ b/icu4c/source/data/locales/ii_CN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ii_CN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/is.txt b/icu4c/source/data/locales/is.txt
index 2bf9fa0..343609a 100644
--- a/icu4c/source/data/locales/is.txt
+++ b/icu4c/source/data/locales/is.txt
@@ -219,7 +219,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/is_IS.txt b/icu4c/source/data/locales/is_IS.txt
index b727c18..c4bc78f 100644
--- a/icu4c/source/data/locales/is_IS.txt
+++ b/icu4c/source/data/locales/is_IS.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 is_IS{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/it.txt b/icu4c/source/data/locales/it.txt
index e8ff951..8fd9330 100644
--- a/icu4c/source/data/locales/it.txt
+++ b/icu4c/source/data/locales/it.txt
@@ -211,7 +211,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.40"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/it_CH.txt b/icu4c/source/data/locales/it_CH.txt
index fb60721..51d7f82 100644
--- a/icu4c/source/data/locales/it_CH.txt
+++ b/icu4c/source/data/locales/it_CH.txt
@@ -13,7 +13,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/it_IT.txt b/icu4c/source/data/locales/it_IT.txt
index 8a1344d..2a998eb 100644
--- a/icu4c/source/data/locales/it_IT.txt
+++ b/icu4c/source/data/locales/it_IT.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 it_IT{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/it_SM.txt b/icu4c/source/data/locales/it_SM.txt
index d754d33..b9b0b4e 100644
--- a/icu4c/source/data/locales/it_SM.txt
+++ b/icu4c/source/data/locales/it_SM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 it_SM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/it_VA.txt b/icu4c/source/data/locales/it_VA.txt
index b075886..54596de 100644
--- a/icu4c/source/data/locales/it_VA.txt
+++ b/icu4c/source/data/locales/it_VA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 it_VA{
-    Version{"2.1.32.51"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ja.txt b/icu4c/source/data/locales/ja.txt
index ab8c0ab..6166be5 100644
--- a/icu4c/source/data/locales/ja.txt
+++ b/icu4c/source/data/locales/ja.txt
@@ -233,7 +233,7 @@
         native{"latn"}
         traditional{"jpan"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ja_JP.txt b/icu4c/source/data/locales/ja_JP.txt
index 47a9381..44c4c7c 100644
--- a/icu4c/source/data/locales/ja_JP.txt
+++ b/icu4c/source/data/locales/ja_JP.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ja_JP{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/jgo.txt b/icu4c/source/data/locales/jgo.txt
index d80f11a..8ab831e 100644
--- a/icu4c/source/data/locales/jgo.txt
+++ b/icu4c/source/data/locales/jgo.txt
@@ -39,7 +39,7 @@
         }
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/jgo_CM.txt b/icu4c/source/data/locales/jgo_CM.txt
index 04883eb..45b2e1f 100644
--- a/icu4c/source/data/locales/jgo_CM.txt
+++ b/icu4c/source/data/locales/jgo_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 jgo_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/jmc.txt b/icu4c/source/data/locales/jmc.txt
index 512a801..3454b20 100644
--- a/icu4c/source/data/locales/jmc.txt
+++ b/icu4c/source/data/locales/jmc.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/jmc_TZ.txt b/icu4c/source/data/locales/jmc_TZ.txt
index 45009e9..f52c4d9 100644
--- a/icu4c/source/data/locales/jmc_TZ.txt
+++ b/icu4c/source/data/locales/jmc_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 jmc_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ka.txt b/icu4c/source/data/locales/ka.txt
index d771569..52380c2 100644
--- a/icu4c/source/data/locales/ka.txt
+++ b/icu4c/source/data/locales/ka.txt
@@ -219,7 +219,7 @@
         native{"latn"}
         traditional{"geor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ka_GE.txt b/icu4c/source/data/locales/ka_GE.txt
index cc4e174..e170147 100644
--- a/icu4c/source/data/locales/ka_GE.txt
+++ b/icu4c/source/data/locales/ka_GE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ka_GE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/kab.txt b/icu4c/source/data/locales/kab.txt
index 3d54511..c84f2e7 100644
--- a/icu4c/source/data/locales/kab.txt
+++ b/icu4c/source/data/locales/kab.txt
@@ -16,7 +16,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/kab_DZ.txt b/icu4c/source/data/locales/kab_DZ.txt
index 0206933..40fa767 100644
--- a/icu4c/source/data/locales/kab_DZ.txt
+++ b/icu4c/source/data/locales/kab_DZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kab_DZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/kam.txt b/icu4c/source/data/locales/kam.txt
index 087266c..4cf18de 100644
--- a/icu4c/source/data/locales/kam.txt
+++ b/icu4c/source/data/locales/kam.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/kam_KE.txt b/icu4c/source/data/locales/kam_KE.txt
index f2e2a29..5679069 100644
--- a/icu4c/source/data/locales/kam_KE.txt
+++ b/icu4c/source/data/locales/kam_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kam_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/kde.txt b/icu4c/source/data/locales/kde.txt
index 87e4326..de2bda0 100644
--- a/icu4c/source/data/locales/kde.txt
+++ b/icu4c/source/data/locales/kde.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/kde_TZ.txt b/icu4c/source/data/locales/kde_TZ.txt
index b0f9589..a8a773a 100644
--- a/icu4c/source/data/locales/kde_TZ.txt
+++ b/icu4c/source/data/locales/kde_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kde_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/kea.txt b/icu4c/source/data/locales/kea.txt
index 5728a90..ec13336 100644
--- a/icu4c/source/data/locales/kea.txt
+++ b/icu4c/source/data/locales/kea.txt
@@ -129,7 +129,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/kea_CV.txt b/icu4c/source/data/locales/kea_CV.txt
index 2ba78e3..b1fa17d 100644
--- a/icu4c/source/data/locales/kea_CV.txt
+++ b/icu4c/source/data/locales/kea_CV.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kea_CV{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/khq.txt b/icu4c/source/data/locales/khq.txt
index d6f2b5b..fe93f1c 100644
--- a/icu4c/source/data/locales/khq.txt
+++ b/icu4c/source/data/locales/khq.txt
@@ -15,7 +15,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/khq_ML.txt b/icu4c/source/data/locales/khq_ML.txt
index 8f71801..2f1fe0b 100644
--- a/icu4c/source/data/locales/khq_ML.txt
+++ b/icu4c/source/data/locales/khq_ML.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 khq_ML{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ki.txt b/icu4c/source/data/locales/ki.txt
index 83f77a3..e641f87 100644
--- a/icu4c/source/data/locales/ki.txt
+++ b/icu4c/source/data/locales/ki.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ki_KE.txt b/icu4c/source/data/locales/ki_KE.txt
index 5e2dd21..1b02fb0 100644
--- a/icu4c/source/data/locales/ki_KE.txt
+++ b/icu4c/source/data/locales/ki_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ki_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/kk.txt b/icu4c/source/data/locales/kk.txt
index aaf8ceb..0822024 100644
--- a/icu4c/source/data/locales/kk.txt
+++ b/icu4c/source/data/locales/kk.txt
@@ -219,7 +219,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -600,6 +600,10 @@
                     "б.з.д.",
                     "б.з.",
                 }
+                abbreviated%variant{
+                    "BCE",
+                    "CE",
+                }
                 wide{
                     "Біздің заманымызға дейін",
                     "біздің заманымыз",
diff --git a/icu4c/source/data/locales/kk_KZ.txt b/icu4c/source/data/locales/kk_KZ.txt
index 338db74..ff0a3ec 100644
--- a/icu4c/source/data/locales/kk_KZ.txt
+++ b/icu4c/source/data/locales/kk_KZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kk_KZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/kkj.txt b/icu4c/source/data/locales/kkj.txt
index 33fc635..fc3a1b6 100644
--- a/icu4c/source/data/locales/kkj.txt
+++ b/icu4c/source/data/locales/kkj.txt
@@ -24,7 +24,7 @@
         }
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/kkj_CM.txt b/icu4c/source/data/locales/kkj_CM.txt
index 973868b..1a02f5a 100644
--- a/icu4c/source/data/locales/kkj_CM.txt
+++ b/icu4c/source/data/locales/kkj_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kkj_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/kl.txt b/icu4c/source/data/locales/kl.txt
index de4c234..89533c7 100644
--- a/icu4c/source/data/locales/kl.txt
+++ b/icu4c/source/data/locales/kl.txt
@@ -25,7 +25,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/kl_GL.txt b/icu4c/source/data/locales/kl_GL.txt
index dd127fb..065da69 100644
--- a/icu4c/source/data/locales/kl_GL.txt
+++ b/icu4c/source/data/locales/kl_GL.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kl_GL{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/kln.txt b/icu4c/source/data/locales/kln.txt
index 1d728cc..99daff3 100644
--- a/icu4c/source/data/locales/kln.txt
+++ b/icu4c/source/data/locales/kln.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/kln_KE.txt b/icu4c/source/data/locales/kln_KE.txt
index fc26bf6..f27c381 100644
--- a/icu4c/source/data/locales/kln_KE.txt
+++ b/icu4c/source/data/locales/kln_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kln_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/km.txt b/icu4c/source/data/locales/km.txt
index da047a7..c318568 100644
--- a/icu4c/source/data/locales/km.txt
+++ b/icu4c/source/data/locales/km.txt
@@ -176,7 +176,7 @@
         minimumGroupingDigits{"1"}
         native{"khmr"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/km_KH.txt b/icu4c/source/data/locales/km_KH.txt
index ba6a34f..c72c5f7 100644
--- a/icu4c/source/data/locales/km_KH.txt
+++ b/icu4c/source/data/locales/km_KH.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 km_KH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/kn.txt b/icu4c/source/data/locales/kn.txt
index 86962b4..f3fc2f9 100644
--- a/icu4c/source/data/locales/kn.txt
+++ b/icu4c/source/data/locales/kn.txt
@@ -238,7 +238,7 @@
         minimumGroupingDigits{"1"}
         native{"knda"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
@@ -717,8 +717,8 @@
                 yQQQ{"QQQ y"}
                 yQQQQ{"QQQQ y"}
                 yw{
-                    one{"'week' w 'of' Y"}
-                    other{"'week' w 'of' Y"}
+                    one{"'week' w 'of' y"}
+                    other{"'week' w 'of' y"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/kn_IN.txt b/icu4c/source/data/locales/kn_IN.txt
index 3deb135..0767baa 100644
--- a/icu4c/source/data/locales/kn_IN.txt
+++ b/icu4c/source/data/locales/kn_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kn_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ko.txt b/icu4c/source/data/locales/ko.txt
index df9f96e..b120431 100644
--- a/icu4c/source/data/locales/ko.txt
+++ b/icu4c/source/data/locales/ko.txt
@@ -205,7 +205,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/ko_KP.txt b/icu4c/source/data/locales/ko_KP.txt
index fd457d8..e7a59aa 100644
--- a/icu4c/source/data/locales/ko_KP.txt
+++ b/icu4c/source/data/locales/ko_KP.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ko_KP{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ko_KR.txt b/icu4c/source/data/locales/ko_KR.txt
index 02a34f5..64c8955 100644
--- a/icu4c/source/data/locales/ko_KR.txt
+++ b/icu4c/source/data/locales/ko_KR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ko_KR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/kok.txt b/icu4c/source/data/locales/kok.txt
index 34add27..5d99588 100644
--- a/icu4c/source/data/locales/kok.txt
+++ b/icu4c/source/data/locales/kok.txt
@@ -180,7 +180,7 @@
         minimumGroupingDigits{"1"}
         native{"deva"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
@@ -282,7 +282,7 @@
                 yQQQ{"y QQQ"}
                 yQQQQ{"y QQQQ"}
                 yw{
-                    other{"'week' w 'of' Y"}
+                    other{"'week' w 'of' y"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/kok_IN.txt b/icu4c/source/data/locales/kok_IN.txt
index 8ef3196..999a314 100644
--- a/icu4c/source/data/locales/kok_IN.txt
+++ b/icu4c/source/data/locales/kok_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kok_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ks.txt b/icu4c/source/data/locales/ks.txt
index 23dd8a6..1a5c524 100644
--- a/icu4c/source/data/locales/ks.txt
+++ b/icu4c/source/data/locales/ks.txt
@@ -32,7 +32,7 @@
         }
         native{"arabext"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ks_IN.txt b/icu4c/source/data/locales/ks_IN.txt
index 1cbe895..b1005d6 100644
--- a/icu4c/source/data/locales/ks_IN.txt
+++ b/icu4c/source/data/locales/ks_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ks_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ksb.txt b/icu4c/source/data/locales/ksb.txt
index 5c0e649..23c6e82 100644
--- a/icu4c/source/data/locales/ksb.txt
+++ b/icu4c/source/data/locales/ksb.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ksb_TZ.txt b/icu4c/source/data/locales/ksb_TZ.txt
index 7d39888..02ea056 100644
--- a/icu4c/source/data/locales/ksb_TZ.txt
+++ b/icu4c/source/data/locales/ksb_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ksb_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ksf.txt b/icu4c/source/data/locales/ksf.txt
index 3d4f4ee..d2c83d3 100644
--- a/icu4c/source/data/locales/ksf.txt
+++ b/icu4c/source/data/locales/ksf.txt
@@ -20,7 +20,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ksf_CM.txt b/icu4c/source/data/locales/ksf_CM.txt
index 4202708..4fab913 100644
--- a/icu4c/source/data/locales/ksf_CM.txt
+++ b/icu4c/source/data/locales/ksf_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ksf_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ksh.txt b/icu4c/source/data/locales/ksh.txt
index bed97e5..149dff1 100644
--- a/icu4c/source/data/locales/ksh.txt
+++ b/icu4c/source/data/locales/ksh.txt
@@ -161,7 +161,7 @@
         }
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ksh_DE.txt b/icu4c/source/data/locales/ksh_DE.txt
index 4592225..00fe1fa 100644
--- a/icu4c/source/data/locales/ksh_DE.txt
+++ b/icu4c/source/data/locales/ksh_DE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ksh_DE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/kw.txt b/icu4c/source/data/locales/kw.txt
index e8887cd..24960a9 100644
--- a/icu4c/source/data/locales/kw.txt
+++ b/icu4c/source/data/locales/kw.txt
@@ -9,7 +9,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/kw_GB.txt b/icu4c/source/data/locales/kw_GB.txt
index 896f6b8..bca10c3 100644
--- a/icu4c/source/data/locales/kw_GB.txt
+++ b/icu4c/source/data/locales/kw_GB.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kw_GB{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ky.txt b/icu4c/source/data/locales/ky.txt
index cb1ba27..ed626a9 100644
--- a/icu4c/source/data/locales/ky.txt
+++ b/icu4c/source/data/locales/ky.txt
@@ -212,7 +212,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -804,36 +804,36 @@
         }
     }
     characterLabel{
-        activities{"Аракеттер"}
-        african_scripts{"Африка жазуулары"}
-        american_scripts{"Америка жазуулары"}
+        activities{"аракеттер"}
+        african_scripts{"африка жазуулары"}
+        american_scripts{"америка жазуулары"}
         animal{"жаныбар"}
-        animals_nature{"Жаныбарлар жана жаратылыш"}
-        arrows{"Жебелер"}
+        animals_nature{"жаныбарлар же жаратылыш"}
+        arrows{"жебелер"}
         body{"дене"}
-        box_drawing{"Кутуча чийүү"}
+        box_drawing{"кутуча чийүү"}
         braille{"Брайль"}
         building{"имарат"}
-        bullets_stars{"Маркерлер/Жылдызчалар"}
-        consonantal_jamo{"Үнсүз Жамо"}
-        currency_symbols{"Валюта белгилери"}
-        dash_connector{"Тире/Байламта"}
-        digits{"Сандар"}
-        dingbats{"Полиграфиялык белгилер"}
-        divination_symbols{"Төлгө белгилери"}
-        downwards_arrows{"Төмөн караган жебелер"}
-        downwards_upwards_arrows{"Төмөн жана жогору караган жебелер"}
+        bullets_stars{"маркерлер/жылдызчалар"}
+        consonantal_jamo{"үнсүз жамо"}
+        currency_symbols{"валюта белгилери"}
+        dash_connector{"тире/байламта"}
+        digits{"сандар"}
+        dingbats{"полиграфиялык белгилер"}
+        divination_symbols{"төлгө белгиси"}
+        downwards_arrows{"төмөн караган жебе"}
+        downwards_upwards_arrows{"төмөн жана жогору караган жебе"}
         east_asian_scripts{"Чыгыш Азия өлкөлөрүнүн жазуулары"}
-        emoji{"Быйтыкчалар"}
+        emoji{"быйтыкча"}
         european_scripts{"Европа өлкөлөрүнүн жазуулары"}
         female{"аял"}
         flag{"желек"}
-        flags{"Желекчелер"}
-        food_drink{"Тамак-аш жана суусундуктар"}
-        format{"Формат"}
-        format_whitespace{"Формат жана боштук"}
+        flags{"желектер"}
+        food_drink{"тамак-аш жана суусундуктар"}
+        format{"формат"}
+        format_whitespace{"формат жана боштук"}
         full_width_form_variant{"Толук жазы формасынын варианттары"}
-        geometric_shapes{"Геометриялык фигуралар"}
+        geometric_shapes{"геометриялык фигуралар"}
         half_width_form_variant{"Жарым жазы формасынын варианттары"}
         han_characters{"Хань белгилери"}
         han_radicals{"Хань уңгулары"}
@@ -841,8 +841,8 @@
         hanzi_simplified{"Ханьзи (Жөнөкөйлөштүрүлгөн)"}
         hanzi_traditional{"Ханьзи (Салттуу)"}
         heart{"жүрөк"}
-        historic_scripts{"Тарыхый жазуулар"}
-        ideographic_desc_characters{"Идеографиялык сүрөттөө белгилери"}
+        historic_scripts{"тарыхый жазуулар"}
+        ideographic_desc_characters{"ideographic desc. character"}
         japanese_kana{"Жапон Канасы"}
         kanbun{"Канбун"}
         kanji{"Кандзи"}
diff --git a/icu4c/source/data/locales/ky_KG.txt b/icu4c/source/data/locales/ky_KG.txt
index 9e55b2c..03d0a53 100644
--- a/icu4c/source/data/locales/ky_KG.txt
+++ b/icu4c/source/data/locales/ky_KG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ky_KG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/lag.txt b/icu4c/source/data/locales/lag.txt
index 07607b7..ec12caf 100644
--- a/icu4c/source/data/locales/lag.txt
+++ b/icu4c/source/data/locales/lag.txt
@@ -3,7 +3,7 @@
 lag{
     ExemplarCharacters{"[a á b c d e é f g h i í ɨ j k l m n o ó p q r s t u ú ʉ v w x y z]"}
     ExemplarCharactersIndex{"[A B C D E F G H I Ɨ J K L M N O P Q R S T U Ʉ V W X Y Z]"}
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/lag_TZ.txt b/icu4c/source/data/locales/lag_TZ.txt
index 1813e8a..944841d 100644
--- a/icu4c/source/data/locales/lag_TZ.txt
+++ b/icu4c/source/data/locales/lag_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lag_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/lb.txt b/icu4c/source/data/locales/lb.txt
index aed1bb5..066a319 100644
--- a/icu4c/source/data/locales/lb.txt
+++ b/icu4c/source/data/locales/lb.txt
@@ -156,7 +156,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/lb_LU.txt b/icu4c/source/data/locales/lb_LU.txt
index 54b59b4..30ca230 100644
--- a/icu4c/source/data/locales/lb_LU.txt
+++ b/icu4c/source/data/locales/lb_LU.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lb_LU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/lg.txt b/icu4c/source/data/locales/lg.txt
index 4a4e91a..ea9e7de 100644
--- a/icu4c/source/data/locales/lg.txt
+++ b/icu4c/source/data/locales/lg.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/lg_UG.txt b/icu4c/source/data/locales/lg_UG.txt
index e2a232f..628db15 100644
--- a/icu4c/source/data/locales/lg_UG.txt
+++ b/icu4c/source/data/locales/lg_UG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lg_UG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/lkt.txt b/icu4c/source/data/locales/lkt.txt
index d3d4181..23853be 100644
--- a/icu4c/source/data/locales/lkt.txt
+++ b/icu4c/source/data/locales/lkt.txt
@@ -9,7 +9,7 @@
     ExemplarCharactersIndex{"[A B Č E G Ǧ H Ȟ I K L M N Ŋ O P S Š T U W Y Z Ž]"}
     ExemplarCharactersNumbers{"[\\- , . % ‰ + 0 1 2 3 4 5 6 7 8 9]"}
     ExemplarCharactersPunctuation{"[\\- ‐ – — , ; \\: ! ? . \u0022 “ ” ( ) \\[ \\] @ * / \\& #]"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             dayNames{
diff --git a/icu4c/source/data/locales/lkt_US.txt b/icu4c/source/data/locales/lkt_US.txt
index a57b4d0..8ab9e39 100644
--- a/icu4c/source/data/locales/lkt_US.txt
+++ b/icu4c/source/data/locales/lkt_US.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lkt_US{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ln.txt b/icu4c/source/data/locales/ln.txt
index 9d14e7f..24bfff5 100644
--- a/icu4c/source/data/locales/ln.txt
+++ b/icu4c/source/data/locales/ln.txt
@@ -24,7 +24,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ln_AO.txt b/icu4c/source/data/locales/ln_AO.txt
index b8dc09d..8d6d0d2 100644
--- a/icu4c/source/data/locales/ln_AO.txt
+++ b/icu4c/source/data/locales/ln_AO.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ln_AO{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ln_CD.txt b/icu4c/source/data/locales/ln_CD.txt
index 7d83aea..3a63315 100644
--- a/icu4c/source/data/locales/ln_CD.txt
+++ b/icu4c/source/data/locales/ln_CD.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ln_CD{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ln_CF.txt b/icu4c/source/data/locales/ln_CF.txt
index 20d49ba..242f0a0 100644
--- a/icu4c/source/data/locales/ln_CF.txt
+++ b/icu4c/source/data/locales/ln_CF.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ln_CF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ln_CG.txt b/icu4c/source/data/locales/ln_CG.txt
index f469f37..2db71f1 100644
--- a/icu4c/source/data/locales/ln_CG.txt
+++ b/icu4c/source/data/locales/ln_CG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ln_CG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/lo.txt b/icu4c/source/data/locales/lo.txt
index cf70906..938d698 100644
--- a/icu4c/source/data/locales/lo.txt
+++ b/icu4c/source/data/locales/lo.txt
@@ -266,7 +266,7 @@
         minimumGroupingDigits{"1"}
         native{"laoo"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         chinese{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/lo_LA.txt b/icu4c/source/data/locales/lo_LA.txt
index 05a5354..5614451 100644
--- a/icu4c/source/data/locales/lo_LA.txt
+++ b/icu4c/source/data/locales/lo_LA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lo_LA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/lrc.txt b/icu4c/source/data/locales/lrc.txt
index 89aed19..c0cefdf 100644
--- a/icu4c/source/data/locales/lrc.txt
+++ b/icu4c/source/data/locales/lrc.txt
@@ -31,7 +31,7 @@
         }
         native{"arabext"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/lrc_IQ.txt b/icu4c/source/data/locales/lrc_IQ.txt
index be1efd5..ad53edb 100644
--- a/icu4c/source/data/locales/lrc_IQ.txt
+++ b/icu4c/source/data/locales/lrc_IQ.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lrc_IQ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/lrc_IR.txt b/icu4c/source/data/locales/lrc_IR.txt
index 626b597..c30fc0a 100644
--- a/icu4c/source/data/locales/lrc_IR.txt
+++ b/icu4c/source/data/locales/lrc_IR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lrc_IR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/lt.txt b/icu4c/source/data/locales/lt.txt
index 88f50bf..49e209d 100644
--- a/icu4c/source/data/locales/lt.txt
+++ b/icu4c/source/data/locales/lt.txt
@@ -290,7 +290,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
@@ -3723,4 +3723,31 @@
         US{"JAV"}
         metric{"metrinė"}
     }
+    parse{
+        date{
+            lenient{
+                "[\\--/]",
+                "[\\:∶]",
+            }
+        }
+        general{
+            lenient{
+                "[.․。︒﹒.。]",
+                "[\$﹩$$]",
+                "[£₤]",
+                "[₨₹{Rp}{Rs}]",
+            }
+        }
+        number{
+            lenient{
+                "[\\-‒⁻₋−➖﹣-]",
+                "[,،٫、︐︑﹐﹑,、]",
+                "[+⁺₊➕﬩﹢+]",
+            }
+            stricter{
+                "[,٫︐﹐,]",
+                "[.․﹒.。]",
+            }
+        }
+    }
 }
diff --git a/icu4c/source/data/locales/lt_LT.txt b/icu4c/source/data/locales/lt_LT.txt
index 6b8889e..24816a4 100644
--- a/icu4c/source/data/locales/lt_LT.txt
+++ b/icu4c/source/data/locales/lt_LT.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lt_LT{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/lu.txt b/icu4c/source/data/locales/lu.txt
index 14bb6ae..58230e9 100644
--- a/icu4c/source/data/locales/lu.txt
+++ b/icu4c/source/data/locales/lu.txt
@@ -20,7 +20,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/lu_CD.txt b/icu4c/source/data/locales/lu_CD.txt
index e8544c5..c29cc6b 100644
--- a/icu4c/source/data/locales/lu_CD.txt
+++ b/icu4c/source/data/locales/lu_CD.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lu_CD{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/luo.txt b/icu4c/source/data/locales/luo.txt
index 30f5ac3..90cee05 100644
--- a/icu4c/source/data/locales/luo.txt
+++ b/icu4c/source/data/locales/luo.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/luo_KE.txt b/icu4c/source/data/locales/luo_KE.txt
index 1526f11..6446e42 100644
--- a/icu4c/source/data/locales/luo_KE.txt
+++ b/icu4c/source/data/locales/luo_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 luo_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/luy.txt b/icu4c/source/data/locales/luy.txt
index 20a27ed..52fbb7c 100644
--- a/icu4c/source/data/locales/luy.txt
+++ b/icu4c/source/data/locales/luy.txt
@@ -10,7 +10,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/luy_KE.txt b/icu4c/source/data/locales/luy_KE.txt
index 668cfc2..ce26edc 100644
--- a/icu4c/source/data/locales/luy_KE.txt
+++ b/icu4c/source/data/locales/luy_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 luy_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/lv.txt b/icu4c/source/data/locales/lv.txt
index ba03117..0e32e23 100644
--- a/icu4c/source/data/locales/lv.txt
+++ b/icu4c/source/data/locales/lv.txt
@@ -250,7 +250,7 @@
         minimumGroupingDigits{"2"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/lv_LV.txt b/icu4c/source/data/locales/lv_LV.txt
index fc43b39..031cd13 100644
--- a/icu4c/source/data/locales/lv_LV.txt
+++ b/icu4c/source/data/locales/lv_LV.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lv_LV{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mas.txt b/icu4c/source/data/locales/mas.txt
index 4e4fa83..0629f99 100644
--- a/icu4c/source/data/locales/mas.txt
+++ b/icu4c/source/data/locales/mas.txt
@@ -15,7 +15,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/mas_KE.txt b/icu4c/source/data/locales/mas_KE.txt
index 3260852..af1aaa8 100644
--- a/icu4c/source/data/locales/mas_KE.txt
+++ b/icu4c/source/data/locales/mas_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mas_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mas_TZ.txt b/icu4c/source/data/locales/mas_TZ.txt
index a330ac3..57a38a0 100644
--- a/icu4c/source/data/locales/mas_TZ.txt
+++ b/icu4c/source/data/locales/mas_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mas_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mer.txt b/icu4c/source/data/locales/mer.txt
index 42a123c..47a9de5 100644
--- a/icu4c/source/data/locales/mer.txt
+++ b/icu4c/source/data/locales/mer.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/mer_KE.txt b/icu4c/source/data/locales/mer_KE.txt
index 1ec8451..5fe7cfc 100644
--- a/icu4c/source/data/locales/mer_KE.txt
+++ b/icu4c/source/data/locales/mer_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mer_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mfe.txt b/icu4c/source/data/locales/mfe.txt
index 18f8b48..d3ecefd 100644
--- a/icu4c/source/data/locales/mfe.txt
+++ b/icu4c/source/data/locales/mfe.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/mfe_MU.txt b/icu4c/source/data/locales/mfe_MU.txt
index 0c72cf4..38ef2d5 100644
--- a/icu4c/source/data/locales/mfe_MU.txt
+++ b/icu4c/source/data/locales/mfe_MU.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mfe_MU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mg.txt b/icu4c/source/data/locales/mg.txt
index 5f99f6a..37c6796 100644
--- a/icu4c/source/data/locales/mg.txt
+++ b/icu4c/source/data/locales/mg.txt
@@ -33,7 +33,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/mg_MG.txt b/icu4c/source/data/locales/mg_MG.txt
index dbc7d17..c14cfdf 100644
--- a/icu4c/source/data/locales/mg_MG.txt
+++ b/icu4c/source/data/locales/mg_MG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mg_MG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mgh.txt b/icu4c/source/data/locales/mgh.txt
index 9db76b9..7796dca 100644
--- a/icu4c/source/data/locales/mgh.txt
+++ b/icu4c/source/data/locales/mgh.txt
@@ -13,7 +13,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/mgh_MZ.txt b/icu4c/source/data/locales/mgh_MZ.txt
index 0f80867..d816fb8 100644
--- a/icu4c/source/data/locales/mgh_MZ.txt
+++ b/icu4c/source/data/locales/mgh_MZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mgh_MZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mgo.txt b/icu4c/source/data/locales/mgo.txt
index ae7c709..e5960bb 100644
--- a/icu4c/source/data/locales/mgo.txt
+++ b/icu4c/source/data/locales/mgo.txt
@@ -39,7 +39,7 @@
         }
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/mgo_CM.txt b/icu4c/source/data/locales/mgo_CM.txt
index 8e68210..e4f442c 100644
--- a/icu4c/source/data/locales/mgo_CM.txt
+++ b/icu4c/source/data/locales/mgo_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mgo_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mk.txt b/icu4c/source/data/locales/mk.txt
index bd2898c..168a0b6 100644
--- a/icu4c/source/data/locales/mk.txt
+++ b/icu4c/source/data/locales/mk.txt
@@ -213,7 +213,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/mk_MK.txt b/icu4c/source/data/locales/mk_MK.txt
index 1045b85..b3be82b 100644
--- a/icu4c/source/data/locales/mk_MK.txt
+++ b/icu4c/source/data/locales/mk_MK.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mk_MK{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ml.txt b/icu4c/source/data/locales/ml.txt
index 7814ab0..4808d83 100644
--- a/icu4c/source/data/locales/ml.txt
+++ b/icu4c/source/data/locales/ml.txt
@@ -239,7 +239,7 @@
         }
         native{"mlym"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/ml_IN.txt b/icu4c/source/data/locales/ml_IN.txt
index 08c3960..ddb6d48 100644
--- a/icu4c/source/data/locales/ml_IN.txt
+++ b/icu4c/source/data/locales/ml_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ml_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mn.txt b/icu4c/source/data/locales/mn.txt
index 88aa540..7f33d7b 100644
--- a/icu4c/source/data/locales/mn.txt
+++ b/icu4c/source/data/locales/mn.txt
@@ -212,7 +212,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -387,8 +387,8 @@
                 "HH:mm:ss (z)",
                 "HH:mm:ss",
                 "HH:mm",
-                "y 'оны' MMM'ын' d. EEEE 'гараг'.",
-                "y 'оны' MMM'ын' d",
+                "y.MM.dd, EEEE",
+                "y.MM.dd",
                 "y.MM.dd",
                 "y.MM.dd",
                 "{1} {0}",
diff --git a/icu4c/source/data/locales/mn_MN.txt b/icu4c/source/data/locales/mn_MN.txt
index 906e22a..ff42a15 100644
--- a/icu4c/source/data/locales/mn_MN.txt
+++ b/icu4c/source/data/locales/mn_MN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mn_MN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/mr.txt b/icu4c/source/data/locales/mr.txt
index e13b094..5eebb75 100644
--- a/icu4c/source/data/locales/mr.txt
+++ b/icu4c/source/data/locales/mr.txt
@@ -241,7 +241,7 @@
         minimumGroupingDigits{"1"}
         native{"deva"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/mr_IN.txt b/icu4c/source/data/locales/mr_IN.txt
index 549a126..92e16cd 100644
--- a/icu4c/source/data/locales/mr_IN.txt
+++ b/icu4c/source/data/locales/mr_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mr_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ms.txt b/icu4c/source/data/locales/ms.txt
index 23c8698..577a874 100644
--- a/icu4c/source/data/locales/ms.txt
+++ b/icu4c/source/data/locales/ms.txt
@@ -180,7 +180,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/ms_BN.txt b/icu4c/source/data/locales/ms_BN.txt
index ac813e4..e20faa2 100644
--- a/icu4c/source/data/locales/ms_BN.txt
+++ b/icu4c/source/data/locales/ms_BN.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ms_MY.txt b/icu4c/source/data/locales/ms_MY.txt
index 46eb161..663a6e0 100644
--- a/icu4c/source/data/locales/ms_MY.txt
+++ b/icu4c/source/data/locales/ms_MY.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ms_MY{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ms_SG.txt b/icu4c/source/data/locales/ms_SG.txt
index 6af17c7..ab83719 100644
--- a/icu4c/source/data/locales/ms_SG.txt
+++ b/icu4c/source/data/locales/ms_SG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ms_SG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/mt.txt b/icu4c/source/data/locales/mt.txt
index c9c411c..e22c428 100644
--- a/icu4c/source/data/locales/mt.txt
+++ b/icu4c/source/data/locales/mt.txt
@@ -45,7 +45,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/mt_MT.txt b/icu4c/source/data/locales/mt_MT.txt
index a3e6593..0e89a7a 100644
--- a/icu4c/source/data/locales/mt_MT.txt
+++ b/icu4c/source/data/locales/mt_MT.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mt_MT{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mua.txt b/icu4c/source/data/locales/mua.txt
index 788924d..8c4786f 100644
--- a/icu4c/source/data/locales/mua.txt
+++ b/icu4c/source/data/locales/mua.txt
@@ -19,7 +19,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/mua_CM.txt b/icu4c/source/data/locales/mua_CM.txt
index c877d27..99059cb 100644
--- a/icu4c/source/data/locales/mua_CM.txt
+++ b/icu4c/source/data/locales/mua_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mua_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/my.txt b/icu4c/source/data/locales/my.txt
index 6b129e6..2116943 100644
--- a/icu4c/source/data/locales/my.txt
+++ b/icu4c/source/data/locales/my.txt
@@ -201,7 +201,7 @@
         }
         native{"mymr"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -440,7 +440,7 @@
                 yQQQ{"y QQQ"}
                 yQQQQ{"y QQQQ"}
                 yw{
-                    other{"Y ခု w ပတ်မြောက်"}
+                    other{"y ခု w ပတ်မြောက်"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/my_MM.txt b/icu4c/source/data/locales/my_MM.txt
index 799b2d8..1685187 100644
--- a/icu4c/source/data/locales/my_MM.txt
+++ b/icu4c/source/data/locales/my_MM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 my_MM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/mzn.txt b/icu4c/source/data/locales/mzn.txt
index 5049395..42ec44b 100644
--- a/icu4c/source/data/locales/mzn.txt
+++ b/icu4c/source/data/locales/mzn.txt
@@ -21,7 +21,7 @@
         default{"arabext"}
         native{"arabext"}
     }
-    Version{"2.1.31.86"}
+    Version{"2.1.39.11"}
     calendar{
         gregorian{
             eras{
diff --git a/icu4c/source/data/locales/mzn_IR.txt b/icu4c/source/data/locales/mzn_IR.txt
index 2cef1ac..dd88cb2 100644
--- a/icu4c/source/data/locales/mzn_IR.txt
+++ b/icu4c/source/data/locales/mzn_IR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mzn_IR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/naq.txt b/icu4c/source/data/locales/naq.txt
index 6d38428..b7ec3b4 100644
--- a/icu4c/source/data/locales/naq.txt
+++ b/icu4c/source/data/locales/naq.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/naq_NA.txt b/icu4c/source/data/locales/naq_NA.txt
index 66e41ab..05c53b9 100644
--- a/icu4c/source/data/locales/naq_NA.txt
+++ b/icu4c/source/data/locales/naq_NA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 naq_NA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/nb.txt b/icu4c/source/data/locales/nb.txt
index d3a0037..0d26068 100644
--- a/icu4c/source/data/locales/nb.txt
+++ b/icu4c/source/data/locales/nb.txt
@@ -1277,7 +1277,7 @@
             }
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -6488,6 +6488,10 @@
             0,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"’"}
@@ -6520,8 +6524,10 @@
             dn{"d."}
             relative{
                 "-1"{"i går"}
+                "-2"{"-2 d."}
                 "0"{"i dag"}
                 "1"{"i morgen"}
+                "2"{"+2 d."}
             }
             relativeTime{
                 future{
diff --git a/icu4c/source/data/locales/nb_NO.txt b/icu4c/source/data/locales/nb_NO.txt
index 0a2e388..28ece09 100644
--- a/icu4c/source/data/locales/nb_NO.txt
+++ b/icu4c/source/data/locales/nb_NO.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nb_NO{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/nb_SJ.txt b/icu4c/source/data/locales/nb_SJ.txt
index c122357..26c5c2e 100644
--- a/icu4c/source/data/locales/nb_SJ.txt
+++ b/icu4c/source/data/locales/nb_SJ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nb_SJ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/nd.txt b/icu4c/source/data/locales/nd.txt
index 9eb4e47..288c1bb 100644
--- a/icu4c/source/data/locales/nd.txt
+++ b/icu4c/source/data/locales/nd.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/nd_ZW.txt b/icu4c/source/data/locales/nd_ZW.txt
index 7bb76b9..bf36465 100644
--- a/icu4c/source/data/locales/nd_ZW.txt
+++ b/icu4c/source/data/locales/nd_ZW.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nd_ZW{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/nds.txt b/icu4c/source/data/locales/nds.txt
index 9604615..1b99366 100644
--- a/icu4c/source/data/locales/nds.txt
+++ b/icu4c/source/data/locales/nds.txt
@@ -4,5 +4,5 @@
     AuxExemplarCharacters{"[á à ă â ā æ ç é è ĕ ê ë ę ē í ì ĭ î ï ī ñ ó ò ŏ ô ø ō œ ú ù ŭ û ū ÿ]"}
     ExemplarCharacters{"[a å ä b c d e f g h i j k l m n o ö p q r s t u ü v w x y z]"}
     ExemplarCharactersNumbers{"[\\- , . % ‰ + 0 1 2 3 4 5 6 7 8 9]"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/nds_DE.txt b/icu4c/source/data/locales/nds_DE.txt
index 06b962f..95d0a19 100644
--- a/icu4c/source/data/locales/nds_DE.txt
+++ b/icu4c/source/data/locales/nds_DE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nds_DE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/nds_NL.txt b/icu4c/source/data/locales/nds_NL.txt
index c049e62..62314eb 100644
--- a/icu4c/source/data/locales/nds_NL.txt
+++ b/icu4c/source/data/locales/nds_NL.txt
@@ -8,5 +8,5 @@
         "[\\- ‐ – — , ; \\: ! ? . … ' ‘ ’ \u0022 “ ” ( ) \\[ \\] § @ * / \\& # † ‡ ′ "
         "″]"
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ne.txt b/icu4c/source/data/locales/ne.txt
index 8f5c733..c8430c0 100644
--- a/icu4c/source/data/locales/ne.txt
+++ b/icu4c/source/data/locales/ne.txt
@@ -235,7 +235,7 @@
         minimumGroupingDigits{"1"}
         native{"deva"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -925,7 +925,7 @@
         punctuation{"विराम"}
         rightwards_arrows{"दायाँतर्फी बाँणहरू"}
         sign_standard_symbols{"संकेत/मानक चिन्हहरू"}
-        small_form_variant{"सानो फाराम भ्यारियन्टहरू"}
+        small_form_variant{"साना भ्यारियन्टहरू"}
         smiley{"स्माइली"}
         smileys_people{"स्माइली तथा व्यक्तिहरू"}
         south_asian_scripts{"दक्षिण एशियाली लिपिहरू"}
@@ -938,7 +938,7 @@
         travel{"यात्रा"}
         travel_places{"यात्रा तथा ठाउँहरू"}
         upwards_arrows{"माथितिरका बाँणहरू"}
-        variant_forms{"भ्यारियन्ट फारामहरू"}
+        variant_forms{"भ्यारियन्ट"}
         vocalic_jamo{"भोकालिक जामोहरू"}
         weather{"मौंसम"}
         western_asian_scripts{"पश्चिमी एशियाली लिपिहरू"}
diff --git a/icu4c/source/data/locales/ne_IN.txt b/icu4c/source/data/locales/ne_IN.txt
index 6ffc94b..0924c1f 100644
--- a/icu4c/source/data/locales/ne_IN.txt
+++ b/icu4c/source/data/locales/ne_IN.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ne_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ne_NP.txt b/icu4c/source/data/locales/ne_NP.txt
index ce6916b..8d31fab 100644
--- a/icu4c/source/data/locales/ne_NP.txt
+++ b/icu4c/source/data/locales/ne_NP.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ne_NP{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/nl.txt b/icu4c/source/data/locales/nl.txt
index 0430a50..addfbd7 100644
--- a/icu4c/source/data/locales/nl.txt
+++ b/icu4c/source/data/locales/nl.txt
@@ -1319,7 +1319,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -5643,6 +5643,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"”"}
diff --git a/icu4c/source/data/locales/nl_AW.txt b/icu4c/source/data/locales/nl_AW.txt
index 87cf5fe..80b6301 100644
--- a/icu4c/source/data/locales/nl_AW.txt
+++ b/icu4c/source/data/locales/nl_AW.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nl_AW{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/nl_BE.txt b/icu4c/source/data/locales/nl_BE.txt
index bedf45a..7387243 100644
--- a/icu4c/source/data/locales/nl_BE.txt
+++ b/icu4c/source/data/locales/nl_BE.txt
@@ -8,7 +8,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/nl_BQ.txt b/icu4c/source/data/locales/nl_BQ.txt
index ce670df..f628e30 100644
--- a/icu4c/source/data/locales/nl_BQ.txt
+++ b/icu4c/source/data/locales/nl_BQ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nl_BQ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/nl_CW.txt b/icu4c/source/data/locales/nl_CW.txt
index c138fea..5fa1e17 100644
--- a/icu4c/source/data/locales/nl_CW.txt
+++ b/icu4c/source/data/locales/nl_CW.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nl_CW{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/nl_NL.txt b/icu4c/source/data/locales/nl_NL.txt
index 9a55e1b..4a46e24 100644
--- a/icu4c/source/data/locales/nl_NL.txt
+++ b/icu4c/source/data/locales/nl_NL.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nl_NL{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/nl_SR.txt b/icu4c/source/data/locales/nl_SR.txt
index 3f1089f..8b21ffc 100644
--- a/icu4c/source/data/locales/nl_SR.txt
+++ b/icu4c/source/data/locales/nl_SR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nl_SR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/nl_SX.txt b/icu4c/source/data/locales/nl_SX.txt
index 5f552bd..5facb31 100644
--- a/icu4c/source/data/locales/nl_SX.txt
+++ b/icu4c/source/data/locales/nl_SX.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nl_SX{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/nmg.txt b/icu4c/source/data/locales/nmg.txt
index 156e270..7df4da2 100644
--- a/icu4c/source/data/locales/nmg.txt
+++ b/icu4c/source/data/locales/nmg.txt
@@ -22,7 +22,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/nmg_CM.txt b/icu4c/source/data/locales/nmg_CM.txt
index 7767ea9..909100b 100644
--- a/icu4c/source/data/locales/nmg_CM.txt
+++ b/icu4c/source/data/locales/nmg_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nmg_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/nn.txt b/icu4c/source/data/locales/nn.txt
index eeffe0b..65d3284 100644
--- a/icu4c/source/data/locales/nn.txt
+++ b/icu4c/source/data/locales/nn.txt
@@ -98,7 +98,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/nn_NO.txt b/icu4c/source/data/locales/nn_NO.txt
index 916d807..8b769ef 100644
--- a/icu4c/source/data/locales/nn_NO.txt
+++ b/icu4c/source/data/locales/nn_NO.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nn_NO{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/nnh.txt b/icu4c/source/data/locales/nnh.txt
index 9b65a77..bc6abe1 100644
--- a/icu4c/source/data/locales/nnh.txt
+++ b/icu4c/source/data/locales/nnh.txt
@@ -28,7 +28,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/nnh_CM.txt b/icu4c/source/data/locales/nnh_CM.txt
index d59b706..dcc09c5 100644
--- a/icu4c/source/data/locales/nnh_CM.txt
+++ b/icu4c/source/data/locales/nnh_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nnh_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/nus.txt b/icu4c/source/data/locales/nus.txt
index 4d25c2c..74dcd4c 100644
--- a/icu4c/source/data/locales/nus.txt
+++ b/icu4c/source/data/locales/nus.txt
@@ -22,7 +22,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/nus_SS.txt b/icu4c/source/data/locales/nus_SS.txt
index 96ae0dd..a190847 100644
--- a/icu4c/source/data/locales/nus_SS.txt
+++ b/icu4c/source/data/locales/nus_SS.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nus_SS{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/nyn.txt b/icu4c/source/data/locales/nyn.txt
index 2c61f86..6a142b0 100644
--- a/icu4c/source/data/locales/nyn.txt
+++ b/icu4c/source/data/locales/nyn.txt
@@ -10,7 +10,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/nyn_UG.txt b/icu4c/source/data/locales/nyn_UG.txt
index 89dd530..c441d3a 100644
--- a/icu4c/source/data/locales/nyn_UG.txt
+++ b/icu4c/source/data/locales/nyn_UG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nyn_UG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/om.txt b/icu4c/source/data/locales/om.txt
index 5d301ef..e542947 100644
--- a/icu4c/source/data/locales/om.txt
+++ b/icu4c/source/data/locales/om.txt
@@ -35,7 +35,7 @@
         native{"latn"}
         traditional{"ethi"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/om_ET.txt b/icu4c/source/data/locales/om_ET.txt
index bd452f3..ae4e997 100644
--- a/icu4c/source/data/locales/om_ET.txt
+++ b/icu4c/source/data/locales/om_ET.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 om_ET{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/om_KE.txt b/icu4c/source/data/locales/om_KE.txt
index f092530..7d48844 100644
--- a/icu4c/source/data/locales/om_KE.txt
+++ b/icu4c/source/data/locales/om_KE.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 om_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/or_IN.txt b/icu4c/source/data/locales/or_IN.txt
index 93e5fa2..186607a 100644
--- a/icu4c/source/data/locales/or_IN.txt
+++ b/icu4c/source/data/locales/or_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 or_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/os.txt b/icu4c/source/data/locales/os.txt
index 9bf5355..6c15ee6 100644
--- a/icu4c/source/data/locales/os.txt
+++ b/icu4c/source/data/locales/os.txt
@@ -44,7 +44,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/os_GE.txt b/icu4c/source/data/locales/os_GE.txt
index c1d7390..cba5baf 100644
--- a/icu4c/source/data/locales/os_GE.txt
+++ b/icu4c/source/data/locales/os_GE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 os_GE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/os_RU.txt b/icu4c/source/data/locales/os_RU.txt
index 5a03778..f8d50f2 100644
--- a/icu4c/source/data/locales/os_RU.txt
+++ b/icu4c/source/data/locales/os_RU.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 os_RU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/pa.txt b/icu4c/source/data/locales/pa.txt
index 3d7cad5..402c1c6 100644
--- a/icu4c/source/data/locales/pa.txt
+++ b/icu4c/source/data/locales/pa.txt
@@ -254,7 +254,7 @@
         minimumGroupingDigits{"1"}
         native{"guru"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/pa_Arab.txt b/icu4c/source/data/locales/pa_Arab.txt
index 3d09b38..7bff8b1 100644
--- a/icu4c/source/data/locales/pa_Arab.txt
+++ b/icu4c/source/data/locales/pa_Arab.txt
@@ -18,7 +18,7 @@
         }
         native{"arabext"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/pa_Arab_PK.txt b/icu4c/source/data/locales/pa_Arab_PK.txt
index b154751..51dc9b0 100644
--- a/icu4c/source/data/locales/pa_Arab_PK.txt
+++ b/icu4c/source/data/locales/pa_Arab_PK.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa_Arab_PK{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/pa_Guru.txt b/icu4c/source/data/locales/pa_Guru.txt
index a731d5e..e558d24 100644
--- a/icu4c/source/data/locales/pa_Guru.txt
+++ b/icu4c/source/data/locales/pa_Guru.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa_Guru{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/pa_Guru_IN.txt b/icu4c/source/data/locales/pa_Guru_IN.txt
index cce945c..ffecc0e 100644
--- a/icu4c/source/data/locales/pa_Guru_IN.txt
+++ b/icu4c/source/data/locales/pa_Guru_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa_Guru_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/pl.txt b/icu4c/source/data/locales/pl.txt
index d9cdc99..32a475d 100644
--- a/icu4c/source/data/locales/pl.txt
+++ b/icu4c/source/data/locales/pl.txt
@@ -287,7 +287,7 @@
         minimumGroupingDigits{"2"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.15"}
     calendar{
         buddhist{
             eras{
@@ -1713,6 +1713,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"»"}
diff --git a/icu4c/source/data/locales/pl_PL.txt b/icu4c/source/data/locales/pl_PL.txt
index 410d179..5b197e5 100644
--- a/icu4c/source/data/locales/pl_PL.txt
+++ b/icu4c/source/data/locales/pl_PL.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pl_PL{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/pool.res b/icu4c/source/data/locales/pool.res
index e9ba99d..917ec42 100644
--- a/icu4c/source/data/locales/pool.res
+++ b/icu4c/source/data/locales/pool.res
Binary files differ
diff --git a/icu4c/source/data/locales/ps.txt b/icu4c/source/data/locales/ps.txt
index 276e438..a6504ee 100644
--- a/icu4c/source/data/locales/ps.txt
+++ b/icu4c/source/data/locales/ps.txt
@@ -230,7 +230,7 @@
         minimumGroupingDigits{"1"}
         native{"arabext"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ps_AF.txt b/icu4c/source/data/locales/ps_AF.txt
index 7507ea5..aa0966a 100644
--- a/icu4c/source/data/locales/ps_AF.txt
+++ b/icu4c/source/data/locales/ps_AF.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ps_AF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/pt.txt b/icu4c/source/data/locales/pt.txt
index ffaa0f0..99a87d3 100644
--- a/icu4c/source/data/locales/pt.txt
+++ b/icu4c/source/data/locales/pt.txt
@@ -216,7 +216,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
@@ -1757,6 +1757,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"’"}
diff --git a/icu4c/source/data/locales/pt_AO.txt b/icu4c/source/data/locales/pt_AO.txt
index 96477f4..06c4599 100644
--- a/icu4c/source/data/locales/pt_AO.txt
+++ b/icu4c/source/data/locales/pt_AO.txt
@@ -5,5 +5,5 @@
     NumberElements{
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/pt_BR.txt b/icu4c/source/data/locales/pt_BR.txt
index 79d6b24..86a0355 100644
--- a/icu4c/source/data/locales/pt_BR.txt
+++ b/icu4c/source/data/locales/pt_BR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_BR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/pt_CH.txt b/icu4c/source/data/locales/pt_CH.txt
index 90d6a1e..acd87d8 100644
--- a/icu4c/source/data/locales/pt_CH.txt
+++ b/icu4c/source/data/locales/pt_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CH{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/pt_CV.txt b/icu4c/source/data/locales/pt_CV.txt
index 6b3cbbb..a42064f 100644
--- a/icu4c/source/data/locales/pt_CV.txt
+++ b/icu4c/source/data/locales/pt_CV.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CV{
     %%Parent{"pt_PT"}
-    Version{"2.1.35.71"}
+    Version{"2.1.39.12"}
 }
diff --git a/icu4c/source/data/locales/pt_GQ.txt b/icu4c/source/data/locales/pt_GQ.txt
index 793e060..8a8947f 100644
--- a/icu4c/source/data/locales/pt_GQ.txt
+++ b/icu4c/source/data/locales/pt_GQ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GQ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/pt_GW.txt b/icu4c/source/data/locales/pt_GW.txt
index e137e51..f131573 100644
--- a/icu4c/source/data/locales/pt_GW.txt
+++ b/icu4c/source/data/locales/pt_GW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GW{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/pt_LU.txt b/icu4c/source/data/locales/pt_LU.txt
index e6d1c60..d30ba91 100644
--- a/icu4c/source/data/locales/pt_LU.txt
+++ b/icu4c/source/data/locales/pt_LU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_LU{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/pt_MO.txt b/icu4c/source/data/locales/pt_MO.txt
index b010000..c7d61f4 100644
--- a/icu4c/source/data/locales/pt_MO.txt
+++ b/icu4c/source/data/locales/pt_MO.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_MO{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/pt_MZ.txt b/icu4c/source/data/locales/pt_MZ.txt
index b86fd1e..1274cac 100644
--- a/icu4c/source/data/locales/pt_MZ.txt
+++ b/icu4c/source/data/locales/pt_MZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_MZ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/pt_PT.txt b/icu4c/source/data/locales/pt_PT.txt
index 90a464c..29e3966 100644
--- a/icu4c/source/data/locales/pt_PT.txt
+++ b/icu4c/source/data/locales/pt_PT.txt
@@ -156,7 +156,7 @@
         }
         minimumGroupingDigits{"2"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/pt_ST.txt b/icu4c/source/data/locales/pt_ST.txt
index 95f596c..3d6d885 100644
--- a/icu4c/source/data/locales/pt_ST.txt
+++ b/icu4c/source/data/locales/pt_ST.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_ST{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/locales/pt_TL.txt b/icu4c/source/data/locales/pt_TL.txt
index 786b602..0f0ddb9 100644
--- a/icu4c/source/data/locales/pt_TL.txt
+++ b/icu4c/source/data/locales/pt_TL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_TL{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/qu.txt b/icu4c/source/data/locales/qu.txt
index dfd64c2..428b2db 100644
--- a/icu4c/source/data/locales/qu.txt
+++ b/icu4c/source/data/locales/qu.txt
@@ -153,7 +153,7 @@
             }
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/qu_BO.txt b/icu4c/source/data/locales/qu_BO.txt
index 65eebd6..749eb1e 100644
--- a/icu4c/source/data/locales/qu_BO.txt
+++ b/icu4c/source/data/locales/qu_BO.txt
@@ -9,5 +9,5 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/qu_EC.txt b/icu4c/source/data/locales/qu_EC.txt
index df92db8..66be261 100644
--- a/icu4c/source/data/locales/qu_EC.txt
+++ b/icu4c/source/data/locales/qu_EC.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 qu_EC{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/qu_PE.txt b/icu4c/source/data/locales/qu_PE.txt
index 9707bf0..29d9775 100644
--- a/icu4c/source/data/locales/qu_PE.txt
+++ b/icu4c/source/data/locales/qu_PE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 qu_PE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/resfiles.mk b/icu4c/source/data/locales/resfiles.mk
index 8d6c4a2..ddae10b 100644
--- a/icu4c/source/data/locales/resfiles.mk
+++ b/icu4c/source/data/locales/resfiles.mk
@@ -1,6 +1,6 @@
 # © 2016 and later: Unicode, Inc. and others.
 # License & terms of use: http://www.unicode.org/copyright.html#License
-GENRB_CLDR_VERSION = 32.0.1
+GENRB_CLDR_VERSION = 33
 # A list of txt's to build
 # Note:
 #
diff --git a/icu4c/source/data/locales/rm.txt b/icu4c/source/data/locales/rm.txt
index a18c661..4e6c037 100644
--- a/icu4c/source/data/locales/rm.txt
+++ b/icu4c/source/data/locales/rm.txt
@@ -35,7 +35,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/rm_CH.txt b/icu4c/source/data/locales/rm_CH.txt
index 62fcb64..97dc36d 100644
--- a/icu4c/source/data/locales/rm_CH.txt
+++ b/icu4c/source/data/locales/rm_CH.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rm_CH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/rn.txt b/icu4c/source/data/locales/rn.txt
index cde4ac8..e29ea9c 100644
--- a/icu4c/source/data/locales/rn.txt
+++ b/icu4c/source/data/locales/rn.txt
@@ -17,7 +17,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/rn_BI.txt b/icu4c/source/data/locales/rn_BI.txt
index 09c2afb..7ff073e 100644
--- a/icu4c/source/data/locales/rn_BI.txt
+++ b/icu4c/source/data/locales/rn_BI.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rn_BI{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ro.txt b/icu4c/source/data/locales/ro.txt
index 439b00f..82cec7b 100644
--- a/icu4c/source/data/locales/ro.txt
+++ b/icu4c/source/data/locales/ro.txt
@@ -248,7 +248,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
@@ -1718,6 +1718,12 @@
         western_asian_scripts{"scriere vest-asiatică"}
         whitespace{"spațiu alb"}
     }
+    contextTransforms{
+        typographicNames:intvector{
+            1,
+            1,
+        }
+    }
     delimiters{
         alternateQuotationEnd{"»"}
         alternateQuotationStart{"«"}
diff --git a/icu4c/source/data/locales/ro_MD.txt b/icu4c/source/data/locales/ro_MD.txt
index 2eb4fea..9fddc2b 100644
--- a/icu4c/source/data/locales/ro_MD.txt
+++ b/icu4c/source/data/locales/ro_MD.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ro_MD{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             dayNames{
diff --git a/icu4c/source/data/locales/ro_RO.txt b/icu4c/source/data/locales/ro_RO.txt
index ba86b4b..6e73795 100644
--- a/icu4c/source/data/locales/ro_RO.txt
+++ b/icu4c/source/data/locales/ro_RO.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ro_RO{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/rof.txt b/icu4c/source/data/locales/rof.txt
index d87c949..80212cd 100644
--- a/icu4c/source/data/locales/rof.txt
+++ b/icu4c/source/data/locales/rof.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/rof_TZ.txt b/icu4c/source/data/locales/rof_TZ.txt
index 7e6ec67..6a1b6ca 100644
--- a/icu4c/source/data/locales/rof_TZ.txt
+++ b/icu4c/source/data/locales/rof_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rof_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/root.txt b/icu4c/source/data/locales/root.txt
index e419ce9..7c2f82e 100644
--- a/icu4c/source/data/locales/root.txt
+++ b/icu4c/source/data/locales/root.txt
@@ -22,7 +22,7 @@
             patterns{
                 accountingFormat:alias{"/LOCALE/NumberElements/arab/patterns/currencyFormat"}
                 currencyFormat{"#,##0.00 ¤"}
-                percentFormat{"#,##0 %"}
+                percentFormat{"#,##0%"}
             }
             symbols{
                 decimal{"٫"}
@@ -172,7 +172,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.27"}
     calendar{
         buddhist{
             AmPmMarkers:alias{"/LOCALE/calendar/gregorian/AmPmMarkers"}
diff --git a/icu4c/source/data/locales/ru.txt b/icu4c/source/data/locales/ru.txt
index 3fdd356..a207718 100644
--- a/icu4c/source/data/locales/ru.txt
+++ b/icu4c/source/data/locales/ru.txt
@@ -290,7 +290,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.58"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
@@ -1962,8 +1962,8 @@
     }
     characterLabel{
         activities{"занятия"}
-        african_scripts{"африканская письменность"}
-        american_scripts{"американская письменность"}
+        african_scripts{"письменности Африки"}
+        american_scripts{"письменности Америки"}
         animal{"животные"}
         animals_nature{"животные и природа"}
         arrows{"стрелки"}
@@ -1972,7 +1972,7 @@
         braille{"шрифт Брайля"}
         building{"здания"}
         bullets_stars{"маркеры списка/звезды"}
-        consonantal_jamo{"согласные джамо"}
+        consonantal_jamo{"согласные чамо"}
         currency_symbols{"символы валюты"}
         dash_connector{"тире/связка"}
         digits{"цифры"}
@@ -1980,9 +1980,9 @@
         divination_symbols{"оккультные символы"}
         downwards_arrows{"стрелки вниз"}
         downwards_upwards_arrows{"стрелки вверх и вниз"}
-        east_asian_scripts{"восточноазиатская письменность"}
+        east_asian_scripts{"письменности Восточной Азии"}
         emoji{"эмодзи"}
-        european_scripts{"европейская письменность"}
+        european_scripts{"письменности Европы"}
         female{"женщины"}
         flag{"флаги"}
         flags{"флаги"}
@@ -2010,10 +2010,10 @@
         limited_use{"ограниченное использование"}
         male{"мужчины"}
         math_symbols{"математические символы"}
-        middle_eastern_scripts{"центрально-восточная письменность"}
+        middle_eastern_scripts{"письменности Среднего Востока"}
         miscellaneous{"разное"}
         modern_scripts{"современная письменность"}
-        modifier{"модификатор"}
+        modifier{"модификаторы"}
         musical_symbols{"музыкальные символы"}
         nature{"природа"}
         nonspacing{"непротяженные символы"}
@@ -2032,9 +2032,9 @@
         small_form_variant{"маленькие варианты формы"}
         smiley{"смайлики"}
         smileys_people{"смайлики и люди"}
-        south_asian_scripts{"южноазиатская письменность"}
-        southeast_asian_scripts{"письменность Юго-Восточной Азии"}
-        spacing{"пробелы"}
+        south_asian_scripts{"письменности Южной Азии"}
+        southeast_asian_scripts{"письменности Юго-Восточной Азии"}
+        spacing{"промежутки"}
         sport{"спорт"}
         symbols{"символы"}
         technical_symbols{"технические символы"}
@@ -2043,9 +2043,9 @@
         travel_places{"путешествия и места"}
         upwards_arrows{"стрелки вверх"}
         variant_forms{"вариативные формы"}
-        vocalic_jamo{"гласные джамо"}
+        vocalic_jamo{"гласные чамо"}
         weather{"погода"}
-        western_asian_scripts{"западноазиатская письменность"}
+        western_asian_scripts{"письменности Западной Азии"}
         whitespace{"пробелы"}
     }
     contextTransforms{
@@ -2093,6 +2093,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"“"}
diff --git a/icu4c/source/data/locales/ru_BY.txt b/icu4c/source/data/locales/ru_BY.txt
index 2a8f81e..2450101 100644
--- a/icu4c/source/data/locales/ru_BY.txt
+++ b/icu4c/source/data/locales/ru_BY.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ru_BY{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ru_KG.txt b/icu4c/source/data/locales/ru_KG.txt
index 525ff34..922da6c 100644
--- a/icu4c/source/data/locales/ru_KG.txt
+++ b/icu4c/source/data/locales/ru_KG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ru_KG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ru_KZ.txt b/icu4c/source/data/locales/ru_KZ.txt
index c07d5bc..2b4ca44 100644
--- a/icu4c/source/data/locales/ru_KZ.txt
+++ b/icu4c/source/data/locales/ru_KZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ru_KZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ru_MD.txt b/icu4c/source/data/locales/ru_MD.txt
index 085734a..4643fa1 100644
--- a/icu4c/source/data/locales/ru_MD.txt
+++ b/icu4c/source/data/locales/ru_MD.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ru_MD{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ru_RU.txt b/icu4c/source/data/locales/ru_RU.txt
index 15adf54..9c48e15 100644
--- a/icu4c/source/data/locales/ru_RU.txt
+++ b/icu4c/source/data/locales/ru_RU.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ru_RU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ru_UA.txt b/icu4c/source/data/locales/ru_UA.txt
index 935aef1..22d7777 100644
--- a/icu4c/source/data/locales/ru_UA.txt
+++ b/icu4c/source/data/locales/ru_UA.txt
@@ -4,7 +4,7 @@
     NumberElements{
         minimumGroupingDigits{"2"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/rw.txt b/icu4c/source/data/locales/rw.txt
index f679c42..6baf968 100644
--- a/icu4c/source/data/locales/rw.txt
+++ b/icu4c/source/data/locales/rw.txt
@@ -32,7 +32,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     calendar{
         generic{
             DateTimePatterns{
@@ -126,7 +126,7 @@
                 yQQQ{"y QQQ"}
                 yQQQQ{"y QQQQ"}
                 yw{
-                    other{"'week' w 'of' Y"}
+                    other{"'week' w 'of' y"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/rw_RW.txt b/icu4c/source/data/locales/rw_RW.txt
index f08e646..811265b 100644
--- a/icu4c/source/data/locales/rw_RW.txt
+++ b/icu4c/source/data/locales/rw_RW.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rw_RW{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/rwk.txt b/icu4c/source/data/locales/rwk.txt
index 0f65b8e..da1178d 100644
--- a/icu4c/source/data/locales/rwk.txt
+++ b/icu4c/source/data/locales/rwk.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/rwk_TZ.txt b/icu4c/source/data/locales/rwk_TZ.txt
index e904291..eaf5168 100644
--- a/icu4c/source/data/locales/rwk_TZ.txt
+++ b/icu4c/source/data/locales/rwk_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rwk_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/sah.txt b/icu4c/source/data/locales/sah.txt
index bec8ebd..21bd4fd 100644
--- a/icu4c/source/data/locales/sah.txt
+++ b/icu4c/source/data/locales/sah.txt
@@ -164,7 +164,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/sah_RU.txt b/icu4c/source/data/locales/sah_RU.txt
index 86129e3..c3b0448 100644
--- a/icu4c/source/data/locales/sah_RU.txt
+++ b/icu4c/source/data/locales/sah_RU.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sah_RU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/saq.txt b/icu4c/source/data/locales/saq.txt
index 846b0a9..607f81f 100644
--- a/icu4c/source/data/locales/saq.txt
+++ b/icu4c/source/data/locales/saq.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/saq_KE.txt b/icu4c/source/data/locales/saq_KE.txt
index d5045a4..de4feff 100644
--- a/icu4c/source/data/locales/saq_KE.txt
+++ b/icu4c/source/data/locales/saq_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 saq_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/sbp.txt b/icu4c/source/data/locales/sbp.txt
index 76b06f6..8c25ee0 100644
--- a/icu4c/source/data/locales/sbp.txt
+++ b/icu4c/source/data/locales/sbp.txt
@@ -18,7 +18,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/sbp_TZ.txt b/icu4c/source/data/locales/sbp_TZ.txt
index 87bac8d..0a48a7f 100644
--- a/icu4c/source/data/locales/sbp_TZ.txt
+++ b/icu4c/source/data/locales/sbp_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sbp_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/se.txt b/icu4c/source/data/locales/se.txt
index a1cbc08..9a6d66b 100644
--- a/icu4c/source/data/locales/se.txt
+++ b/icu4c/source/data/locales/se.txt
@@ -166,7 +166,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/se_FI.txt b/icu4c/source/data/locales/se_FI.txt
index 74dfeb7..576bba8 100644
--- a/icu4c/source/data/locales/se_FI.txt
+++ b/icu4c/source/data/locales/se_FI.txt
@@ -1,7 +1,68 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 se_FI{
-    Version{"2.1.37.6"}
+    NumberElements{
+        latn{
+            patternsLong{
+                decimalFormat{
+                    1000{
+                        other{"0 duháhat"}
+                        two{"0 dt"}
+                    }
+                    10000{
+                        one{"00 duháhat"}
+                        two{"00 dt"}
+                    }
+                    100000{
+                        one{"000 duháhat"}
+                        two{"000 dt"}
+                    }
+                    1000000{
+                        two{"0 mn"}
+                    }
+                    10000000{
+                        one{"00 miljonat"}
+                        two{"00 mn"}
+                    }
+                    100000000{
+                        one{"000 miljonat"}
+                        two{"000 mn"}
+                    }
+                    1000000000{
+                        one{"0 miljárda"}
+                        other{"0 miljárdat"}
+                        two{"0 miljárdat"}
+                    }
+                    10000000000{
+                        one{"00 miljárdat"}
+                        other{"00 miljárdat"}
+                        two{"00 md"}
+                    }
+                    100000000000{
+                        one{"000 miljárdat"}
+                        other{"000 miljárdat"}
+                        two{"000 md"}
+                    }
+                    1000000000000{
+                        one{"0 biljovdna"}
+                        other{"0 biljovdnat"}
+                        two{"0 bn"}
+                    }
+                    10000000000000{
+                        one{"00 biljovdnat"}
+                        other{"00 biljovdnat"}
+                        two{"00 bn"}
+                    }
+                    100000000000000{
+                        one{"000 biljovdnat"}
+                        other{"000 biljovdnat"}
+                        two{"000 bn"}
+                    }
+                }
+            }
+        }
+    }
+    Version{"2.1.38.73"}
     calendar{
         generic{
             DateTimePatterns{
@@ -482,20 +543,30 @@
             }
         }
         fri-narrow{
+            relative{
+                "-1"{"mannan be"}
+                "0"{"dán be"}
+                "1"{"boahtte be"}
+            }
             relativeTime{
                 future{
-                    one{"boahtte be"}
+                    one{"boahtte {0} be"}
                     other{"boahtte {0} be"}
                     two{"boahtte {0} bearjadaga"}
                 }
                 past{
-                    one{"mannan be"}
+                    one{"{0} mannan be"}
                     other{"-{0} be dás ovdal"}
                     two{"ovddet bearjadaga"}
                 }
             }
         }
         fri-short{
+            relative{
+                "-1"{"mannan be"}
+                "0"{"dán be"}
+                "1"{"boahtte be"}
+            }
             relativeTime{
                 future{
                     one{"boahtte be"}
@@ -623,6 +694,11 @@
             }
         }
         mon-narrow{
+            relative{
+                "-1"{"mannan má"}
+                "0"{"dán má"}
+                "1"{"boahtte má"}
+            }
             relativeTime{
                 future{
                     one{"{0} boahtte má"}
@@ -630,13 +706,18 @@
                     two{"{0} boahtte mánnodaga"}
                 }
                 past{
-                    one{"mannan má"}
+                    one{"{0} mannan má"}
                     other{"{0} má dás ovdal"}
                     two{"ovddet má"}
                 }
             }
         }
         mon-short{
+            relative{
+                "-1"{"mannan má"}
+                "0"{"dán má"}
+                "1"{"boahtte má"}
+            }
             relativeTime{
                 future{
                     one{"{0} boahtte má"}
@@ -769,6 +850,11 @@
             }
         }
         sat-narrow{
+            relative{
+                "-1"{"mannan lá"}
+                "0"{"dán lá"}
+                "1"{"boahtte lá"}
+            }
             relativeTime{
                 future{
                     one{"+{0} boahtte lá"}
@@ -776,13 +862,18 @@
                     two{"boahtte {0} lá"}
                 }
                 past{
-                    one{"mannan lá"}
+                    one{"{0} mannan lá"}
                     other{"-{0} lá dás ovdal"}
                     two{"ovddet lá"}
                 }
             }
         }
         sat-short{
+            relative{
+                "-1"{"mannan lá"}
+                "0"{"dán lá"}
+                "1"{"boahtte lá"}
+            }
             relativeTime{
                 future{
                     one{"+{0} boahtte lá"}
@@ -863,6 +954,11 @@
             }
         }
         sun-narrow{
+            relative{
+                "-1"{"mannan so"}
+                "0"{"dán so"}
+                "1"{"boahtte so"}
+            }
             relativeTime{
                 future{
                     one{"{0} boahtte so"}
@@ -870,13 +966,18 @@
                     two{"boahtte {0} sotnabeaivve"}
                 }
                 past{
-                    one{"mannan so"}
+                    one{"{0} mannan so"}
                     other{"{0} so dás ovdal"}
                     two{"ovddet sotnabeaivve"}
                 }
             }
         }
         sun-short{
+            relative{
+                "-1"{"mannan so"}
+                "0"{"dán so"}
+                "1"{"boahtte so"}
+            }
             relativeTime{
                 future{
                     one{"boahtte so"}
@@ -910,20 +1011,30 @@
             }
         }
         thu-narrow{
+            relative{
+                "-1"{"mannan du"}
+                "0"{"dán du"}
+                "1"{"boahtte du"}
+            }
             relativeTime{
                 future{
-                    one{"boahtte du"}
+                    one{"{0} boahtte du"}
                     other{"+{0} boahtte du"}
                     two{"+{0} boahtte duorastaga"}
                 }
                 past{
-                    one{"mannan du"}
+                    one{"{0} mannan du"}
                     other{"{0} du dás ovdal"}
                     two{"ovddet duorastaga"}
                 }
             }
         }
         thu-short{
+            relative{
+                "-1"{"mannan du"}
+                "0"{"dán du"}
+                "1"{"boahtte du"}
+            }
             relativeTime{
                 future{
                     one{"boahtte du"}
@@ -957,20 +1068,30 @@
             }
         }
         tue-narrow{
+            relative{
+                "-1"{"mannan di"}
+                "0"{"dán di"}
+                "1"{"boahtte di"}
+            }
             relativeTime{
                 future{
-                    one{"boahtte di"}
+                    one{"{0} boahtte di"}
                     other{"{0} boahtte di"}
                     two{"{0} boahtte disdaga"}
                 }
                 past{
-                    one{"mannan di"}
+                    one{"{0} mannan di"}
                     other{"{0} di dás ovdal"}
                     two{"ovddet disdaga"}
                 }
             }
         }
         tue-short{
+            relative{
+                "-1"{"mannan di"}
+                "0"{"dán di"}
+                "1"{"boahtte di"}
+            }
             relativeTime{
                 future{
                     one{"boahtte di"}
@@ -1004,20 +1125,30 @@
             }
         }
         wed-narrow{
+            relative{
+                "-1"{"mannan ga"}
+                "0"{"dán ga"}
+                "1"{"boahtte ga"}
+            }
             relativeTime{
                 future{
-                    one{"boahtte ga"}
+                    one{"{0} boahtte ga"}
                     other{"{0} boahtte ga"}
                     two{"{0} boahtte gaskavahku"}
                 }
                 past{
-                    one{"mannan ga"}
+                    one{"{0} mannan ga"}
                     other{"{0} ga dás ovdal"}
                     two{"ovddet gaskavahku"}
                 }
             }
         }
         wed-short{
+            relative{
+                "-1"{"mannan ga"}
+                "0"{"dán ga"}
+                "1"{"boahtte ga"}
+            }
             relativeTime{
                 future{
                     one{"boahtte ga"}
diff --git a/icu4c/source/data/locales/se_NO.txt b/icu4c/source/data/locales/se_NO.txt
index cc82d07..27f2b84 100644
--- a/icu4c/source/data/locales/se_NO.txt
+++ b/icu4c/source/data/locales/se_NO.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 se_NO{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/se_SE.txt b/icu4c/source/data/locales/se_SE.txt
index aa1b0e7..f0a67c0 100644
--- a/icu4c/source/data/locales/se_SE.txt
+++ b/icu4c/source/data/locales/se_SE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 se_SE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/seh.txt b/icu4c/source/data/locales/seh.txt
index ef8ef1d..4f15f87 100644
--- a/icu4c/source/data/locales/seh.txt
+++ b/icu4c/source/data/locales/seh.txt
@@ -18,7 +18,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/seh_MZ.txt b/icu4c/source/data/locales/seh_MZ.txt
index 08a83a1..1056476 100644
--- a/icu4c/source/data/locales/seh_MZ.txt
+++ b/icu4c/source/data/locales/seh_MZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 seh_MZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ses.txt b/icu4c/source/data/locales/ses.txt
index 2dd9aec..4b1d4b0 100644
--- a/icu4c/source/data/locales/ses.txt
+++ b/icu4c/source/data/locales/ses.txt
@@ -15,7 +15,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ses_ML.txt b/icu4c/source/data/locales/ses_ML.txt
index 05ece0f..ff0ae1c 100644
--- a/icu4c/source/data/locales/ses_ML.txt
+++ b/icu4c/source/data/locales/ses_ML.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ses_ML{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/sg.txt b/icu4c/source/data/locales/sg.txt
index 2fb5d3c..943ffee 100644
--- a/icu4c/source/data/locales/sg.txt
+++ b/icu4c/source/data/locales/sg.txt
@@ -16,7 +16,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/sg_CF.txt b/icu4c/source/data/locales/sg_CF.txt
index 0cccdf3..a66d1f6 100644
--- a/icu4c/source/data/locales/sg_CF.txt
+++ b/icu4c/source/data/locales/sg_CF.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sg_CF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/shi.txt b/icu4c/source/data/locales/shi.txt
index cd2eb5c..f9f5794 100644
--- a/icu4c/source/data/locales/shi.txt
+++ b/icu4c/source/data/locales/shi.txt
@@ -15,7 +15,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/shi_Latn.txt b/icu4c/source/data/locales/shi_Latn.txt
index 93fecda..ab16d2f 100644
--- a/icu4c/source/data/locales/shi_Latn.txt
+++ b/icu4c/source/data/locales/shi_Latn.txt
@@ -17,7 +17,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/shi_Latn_MA.txt b/icu4c/source/data/locales/shi_Latn_MA.txt
index 545342c..6a951bf 100644
--- a/icu4c/source/data/locales/shi_Latn_MA.txt
+++ b/icu4c/source/data/locales/shi_Latn_MA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi_Latn_MA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/shi_Tfng.txt b/icu4c/source/data/locales/shi_Tfng.txt
index ba03fa3..aaf5c7b 100644
--- a/icu4c/source/data/locales/shi_Tfng.txt
+++ b/icu4c/source/data/locales/shi_Tfng.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi_Tfng{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/shi_Tfng_MA.txt b/icu4c/source/data/locales/shi_Tfng_MA.txt
index 7c55162..c057e58 100644
--- a/icu4c/source/data/locales/shi_Tfng_MA.txt
+++ b/icu4c/source/data/locales/shi_Tfng_MA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi_Tfng_MA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/si.txt b/icu4c/source/data/locales/si.txt
index db21516..c4b1ee5 100644
--- a/icu4c/source/data/locales/si.txt
+++ b/icu4c/source/data/locales/si.txt
@@ -219,7 +219,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/si_LK.txt b/icu4c/source/data/locales/si_LK.txt
index fd62c4c..9156ed3 100644
--- a/icu4c/source/data/locales/si_LK.txt
+++ b/icu4c/source/data/locales/si_LK.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 si_LK{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/sk.txt b/icu4c/source/data/locales/sk.txt
index a6525d4..e3e19ae 100644
--- a/icu4c/source/data/locales/sk.txt
+++ b/icu4c/source/data/locales/sk.txt
@@ -287,7 +287,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
@@ -1582,6 +1582,13 @@
         }
         day-narrow{
             dn{"d."}
+            relative{
+                "-1"{"včera"}
+                "-2"{"predvčerom"}
+                "0"{"dnes"}
+                "1"{"zajtra"}
+                "2"{"pozajtra"}
+            }
             relativeTime{
                 future{
                     few{"o {0} d."}
@@ -1599,6 +1606,13 @@
         }
         day-short{
             dn{"d."}
+            relative{
+                "-1"{"včera"}
+                "-2"{"predvčerom"}
+                "0"{"dnes"}
+                "1"{"zajtra"}
+                "2"{"pozajtra"}
+            }
             relativeTime{
                 future{
                     few{"o {0} d."}
diff --git a/icu4c/source/data/locales/sk_SK.txt b/icu4c/source/data/locales/sk_SK.txt
index 5e0310e..5f4d1e3 100644
--- a/icu4c/source/data/locales/sk_SK.txt
+++ b/icu4c/source/data/locales/sk_SK.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sk_SK{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/sl.txt b/icu4c/source/data/locales/sl.txt
index 351bcac..3d2a977 100644
--- a/icu4c/source/data/locales/sl.txt
+++ b/icu4c/source/data/locales/sl.txt
@@ -287,7 +287,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/sl_SI.txt b/icu4c/source/data/locales/sl_SI.txt
index 34132e7..4eb2ab1 100644
--- a/icu4c/source/data/locales/sl_SI.txt
+++ b/icu4c/source/data/locales/sl_SI.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sl_SI{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/smn.txt b/icu4c/source/data/locales/smn.txt
index 57dc234..52a2d57 100644
--- a/icu4c/source/data/locales/smn.txt
+++ b/icu4c/source/data/locales/smn.txt
@@ -98,7 +98,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/smn_FI.txt b/icu4c/source/data/locales/smn_FI.txt
index f76c55c..6cf0af4 100644
--- a/icu4c/source/data/locales/smn_FI.txt
+++ b/icu4c/source/data/locales/smn_FI.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 smn_FI{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/sn.txt b/icu4c/source/data/locales/sn.txt
index 9e5b2fa..f347fed 100644
--- a/icu4c/source/data/locales/sn.txt
+++ b/icu4c/source/data/locales/sn.txt
@@ -33,7 +33,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/sn_ZW.txt b/icu4c/source/data/locales/sn_ZW.txt
index 341039b..abcd24d 100644
--- a/icu4c/source/data/locales/sn_ZW.txt
+++ b/icu4c/source/data/locales/sn_ZW.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sn_ZW{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/so.txt b/icu4c/source/data/locales/so.txt
index 2ebb56b..0835dde 100644
--- a/icu4c/source/data/locales/so.txt
+++ b/icu4c/source/data/locales/so.txt
@@ -30,7 +30,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/so_DJ.txt b/icu4c/source/data/locales/so_DJ.txt
index 3ee31fc..b6bba4e 100644
--- a/icu4c/source/data/locales/so_DJ.txt
+++ b/icu4c/source/data/locales/so_DJ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 so_DJ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/so_ET.txt b/icu4c/source/data/locales/so_ET.txt
index 4f59952..0b2b091 100644
--- a/icu4c/source/data/locales/so_ET.txt
+++ b/icu4c/source/data/locales/so_ET.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 so_ET{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/so_KE.txt b/icu4c/source/data/locales/so_KE.txt
index a35014f..c9375ab 100644
--- a/icu4c/source/data/locales/so_KE.txt
+++ b/icu4c/source/data/locales/so_KE.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 so_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/so_SO.txt b/icu4c/source/data/locales/so_SO.txt
index c8d718d..9c2a1e1 100644
--- a/icu4c/source/data/locales/so_SO.txt
+++ b/icu4c/source/data/locales/so_SO.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 so_SO{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/sq.txt b/icu4c/source/data/locales/sq.txt
index edf5aff..3469fa8 100644
--- a/icu4c/source/data/locales/sq.txt
+++ b/icu4c/source/data/locales/sq.txt
@@ -220,7 +220,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -848,7 +848,7 @@
         currency_symbols{"simbole monedhash/valutash"}
         dash_connector{"vizë lidhëse"}
         digits{"shifra"}
-        dingbats{"dingbats (shndërrues germash në yje ose figura)"}
+        dingbats{"dingbat (shndërrues germash në yje ose figura)"}
         divination_symbols{"simbole parashikimi"}
         downwards_arrows{"shigjeta për së poshti"}
         downwards_upwards_arrows{"shigjeta lart-poshtë"}
diff --git a/icu4c/source/data/locales/sq_AL.txt b/icu4c/source/data/locales/sq_AL.txt
index baafec9..a366464 100644
--- a/icu4c/source/data/locales/sq_AL.txt
+++ b/icu4c/source/data/locales/sq_AL.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sq_AL{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/sq_MK.txt b/icu4c/source/data/locales/sq_MK.txt
index f1b8374..63d7724 100644
--- a/icu4c/source/data/locales/sq_MK.txt
+++ b/icu4c/source/data/locales/sq_MK.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sq_MK{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/sq_XK.txt b/icu4c/source/data/locales/sq_XK.txt
index ffbc2a3..27f7632 100644
--- a/icu4c/source/data/locales/sq_XK.txt
+++ b/icu4c/source/data/locales/sq_XK.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sq_XK{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/sr.txt b/icu4c/source/data/locales/sr.txt
index 821d13a..c794713 100644
--- a/icu4c/source/data/locales/sr.txt
+++ b/icu4c/source/data/locales/sr.txt
@@ -234,10 +234,20 @@
                 timeSeparator{":"}
             }
         }
+        minimalPairs{
+            ordinal{
+                other{"Скрените у {0}. десно."}
+            }
+            plural{
+                few{"{0} сата"}
+                one{"{0} сат"}
+                other{"{0} сати"}
+            }
+        }
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/sr_Cyrl.txt b/icu4c/source/data/locales/sr_Cyrl.txt
index cac24ec..1d0d0a9 100644
--- a/icu4c/source/data/locales/sr_Cyrl.txt
+++ b/icu4c/source/data/locales/sr_Cyrl.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Cyrl{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/sr_Cyrl_BA.txt b/icu4c/source/data/locales/sr_Cyrl_BA.txt
index 967ed0d..7ecb457 100644
--- a/icu4c/source/data/locales/sr_Cyrl_BA.txt
+++ b/icu4c/source/data/locales/sr_Cyrl_BA.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Cyrl_BA{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             intervalFormats{
diff --git a/icu4c/source/data/locales/sr_Cyrl_ME.txt b/icu4c/source/data/locales/sr_Cyrl_ME.txt
index c66eb27..d98d138 100644
--- a/icu4c/source/data/locales/sr_Cyrl_ME.txt
+++ b/icu4c/source/data/locales/sr_Cyrl_ME.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Cyrl_ME{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             intervalFormats{
diff --git a/icu4c/source/data/locales/sr_Cyrl_RS.txt b/icu4c/source/data/locales/sr_Cyrl_RS.txt
index 7a8ea8f..39dd10c 100644
--- a/icu4c/source/data/locales/sr_Cyrl_RS.txt
+++ b/icu4c/source/data/locales/sr_Cyrl_RS.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Cyrl_RS{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/sr_Cyrl_XK.txt b/icu4c/source/data/locales/sr_Cyrl_XK.txt
index 1d45fad..27c160d 100644
--- a/icu4c/source/data/locales/sr_Cyrl_XK.txt
+++ b/icu4c/source/data/locales/sr_Cyrl_XK.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Cyrl_XK{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             intervalFormats{
diff --git a/icu4c/source/data/locales/sr_Latn.txt b/icu4c/source/data/locales/sr_Latn.txt
index 57a1279..3ca3dc8 100644
--- a/icu4c/source/data/locales/sr_Latn.txt
+++ b/icu4c/source/data/locales/sr_Latn.txt
@@ -235,10 +235,20 @@
                 timeSeparator{":"}
             }
         }
+        minimalPairs{
+            ordinal{
+                other{"Skrenite u {0}. desno."}
+            }
+            plural{
+                few{"{0} sata"}
+                one{"{0} sat"}
+                other{"{0} sati"}
+            }
+        }
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/sr_Latn_BA.txt b/icu4c/source/data/locales/sr_Latn_BA.txt
index 7007a1c..eef550d 100644
--- a/icu4c/source/data/locales/sr_Latn_BA.txt
+++ b/icu4c/source/data/locales/sr_Latn_BA.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Latn_BA{
-    Version{"2.1.37.8"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             intervalFormats{
diff --git a/icu4c/source/data/locales/sr_Latn_ME.txt b/icu4c/source/data/locales/sr_Latn_ME.txt
index 1e40950..6ac50ae 100644
--- a/icu4c/source/data/locales/sr_Latn_ME.txt
+++ b/icu4c/source/data/locales/sr_Latn_ME.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Latn_ME{
-    Version{"2.1.37.8"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             intervalFormats{
diff --git a/icu4c/source/data/locales/sr_Latn_RS.txt b/icu4c/source/data/locales/sr_Latn_RS.txt
index c5b4bac..1129c77 100644
--- a/icu4c/source/data/locales/sr_Latn_RS.txt
+++ b/icu4c/source/data/locales/sr_Latn_RS.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Latn_RS{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/sr_Latn_XK.txt b/icu4c/source/data/locales/sr_Latn_XK.txt
index 60d7b5e..259fcf3 100644
--- a/icu4c/source/data/locales/sr_Latn_XK.txt
+++ b/icu4c/source/data/locales/sr_Latn_XK.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Latn_XK{
-    Version{"2.1.37.8"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             intervalFormats{
diff --git a/icu4c/source/data/locales/sv.txt b/icu4c/source/data/locales/sv.txt
index 01debf9..067bfc2 100644
--- a/icu4c/source/data/locales/sv.txt
+++ b/icu4c/source/data/locales/sv.txt
@@ -251,7 +251,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
@@ -1839,6 +1839,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"’"}
diff --git a/icu4c/source/data/locales/sv_AX.txt b/icu4c/source/data/locales/sv_AX.txt
index 3d5b2e8..cdc0958 100644
--- a/icu4c/source/data/locales/sv_AX.txt
+++ b/icu4c/source/data/locales/sv_AX.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sv_AX{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/sv_FI.txt b/icu4c/source/data/locales/sv_FI.txt
index 834c2ef..9fc83af 100644
--- a/icu4c/source/data/locales/sv_FI.txt
+++ b/icu4c/source/data/locales/sv_FI.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sv_FI{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/sv_SE.txt b/icu4c/source/data/locales/sv_SE.txt
index 81d88fb..3a47107 100644
--- a/icu4c/source/data/locales/sv_SE.txt
+++ b/icu4c/source/data/locales/sv_SE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sv_SE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/sw.txt b/icu4c/source/data/locales/sw.txt
index 471a016..1c30e0b 100644
--- a/icu4c/source/data/locales/sw.txt
+++ b/icu4c/source/data/locales/sw.txt
@@ -209,7 +209,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.34"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -864,14 +864,14 @@
         divination_symbols{"alama za kugawa"}
         downwards_arrows{"mishale inayoelekea chini"}
         downwards_upwards_arrows{"mishale ya kuwili"}
-        east_asian_scripts{"hati za mashariki wa Asia"}
+        east_asian_scripts{"hati za mashariki ya Asia"}
         emoji{"emoji"}
         european_scripts{"hati za Ulaya"}
         female{"mwanamke"}
         flag{"bendera"}
         flags{"bendera"}
         food_drink{"vyakula na vinywaji"}
-        format{"miundo"}
+        format{"muundo"}
         format_whitespace{"miundo na sehemu wazi"}
         full_width_form_variant{"sehemu za fomu ya upana kamili"}
         geometric_shapes{"maumbo ya jiometri"}
@@ -884,14 +884,14 @@
         heart{"moyo"}
         historic_scripts{"hati za kihistoria"}
         ideographic_desc_characters{"herufi za maelezo ya idiografia"}
-        japanese_kana{"herufi za kijapani"}
+        japanese_kana{"herufi za kijapani (kana)"}
         kanbun{"herufi za kanbun"}
-        kanji{"kanji"}
+        kanji{"herufi za kijapani (kanji)"}
         keycap{"kitufe"}
         leftwards_arrows{"mishale inayoelekea kushoto"}
         leftwards_rightwards_arrows{"mishale inayoelekea kulia na kushoto"}
-        letterlike_symbols{"alama Zinazofanana na Herufi"}
-        limited_use{"matumizi machache"}
+        letterlike_symbols{"alama zinazofanana na herufi"}
+        limited_use{"matumizi finyu"}
         male{"mwanamume"}
         math_symbols{"alama za hesabu"}
         middle_eastern_scripts{"hati za mashariki ya kati"}
@@ -929,7 +929,7 @@
         variant_forms{"maumbo mbalimbali"}
         vocalic_jamo{"vibambo vya jamo vya sauti"}
         weather{"hali ya hewa"}
-        western_asian_scripts{"hati za magharibi wa Asia"}
+        western_asian_scripts{"hati za magharibi mwa Asia"}
         whitespace{"sehemu wazi"}
     }
     delimiters{
diff --git a/icu4c/source/data/locales/sw_CD.txt b/icu4c/source/data/locales/sw_CD.txt
index 132dcea..57c611d 100644
--- a/icu4c/source/data/locales/sw_CD.txt
+++ b/icu4c/source/data/locales/sw_CD.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             availableFormats{
diff --git a/icu4c/source/data/locales/sw_KE.txt b/icu4c/source/data/locales/sw_KE.txt
index c2e4a96..9c3a627 100644
--- a/icu4c/source/data/locales/sw_KE.txt
+++ b/icu4c/source/data/locales/sw_KE.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sw_KE{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/sw_TZ.txt b/icu4c/source/data/locales/sw_TZ.txt
index 1422ca3..a7f0b13 100644
--- a/icu4c/source/data/locales/sw_TZ.txt
+++ b/icu4c/source/data/locales/sw_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sw_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/sw_UG.txt b/icu4c/source/data/locales/sw_UG.txt
index e557327..8f10592 100644
--- a/icu4c/source/data/locales/sw_UG.txt
+++ b/icu4c/source/data/locales/sw_UG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sw_UG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ta.txt b/icu4c/source/data/locales/ta.txt
index 49160cc..af92e05 100644
--- a/icu4c/source/data/locales/ta.txt
+++ b/icu4c/source/data/locales/ta.txt
@@ -236,7 +236,7 @@
         }
         traditional{"taml"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/ta_IN.txt b/icu4c/source/data/locales/ta_IN.txt
index a48c549..f0bde6c 100644
--- a/icu4c/source/data/locales/ta_IN.txt
+++ b/icu4c/source/data/locales/ta_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ta_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ta_LK.txt b/icu4c/source/data/locales/ta_LK.txt
index ade1eaa..eddb4c4 100644
--- a/icu4c/source/data/locales/ta_LK.txt
+++ b/icu4c/source/data/locales/ta_LK.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ta_LK{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ta_MY.txt b/icu4c/source/data/locales/ta_MY.txt
index 4079324..52e1641 100644
--- a/icu4c/source/data/locales/ta_MY.txt
+++ b/icu4c/source/data/locales/ta_MY.txt
@@ -10,5 +10,5 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ta_SG.txt b/icu4c/source/data/locales/ta_SG.txt
index 6cd57c6..be33cae 100644
--- a/icu4c/source/data/locales/ta_SG.txt
+++ b/icu4c/source/data/locales/ta_SG.txt
@@ -10,5 +10,5 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/te.txt b/icu4c/source/data/locales/te.txt
index 537e062..2b2f07b 100644
--- a/icu4c/source/data/locales/te.txt
+++ b/icu4c/source/data/locales/te.txt
@@ -238,7 +238,7 @@
             }
         }
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
diff --git a/icu4c/source/data/locales/te_IN.txt b/icu4c/source/data/locales/te_IN.txt
index 1ab2a86..7383589 100644
--- a/icu4c/source/data/locales/te_IN.txt
+++ b/icu4c/source/data/locales/te_IN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 te_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/teo.txt b/icu4c/source/data/locales/teo.txt
index 3db1ed7..5020d17 100644
--- a/icu4c/source/data/locales/teo.txt
+++ b/icu4c/source/data/locales/teo.txt
@@ -12,7 +12,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/teo_KE.txt b/icu4c/source/data/locales/teo_KE.txt
index 32b3926..cb3b31e 100644
--- a/icu4c/source/data/locales/teo_KE.txt
+++ b/icu4c/source/data/locales/teo_KE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 teo_KE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/teo_UG.txt b/icu4c/source/data/locales/teo_UG.txt
index 19c4cc7..b8d45dd 100644
--- a/icu4c/source/data/locales/teo_UG.txt
+++ b/icu4c/source/data/locales/teo_UG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 teo_UG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/tg.txt b/icu4c/source/data/locales/tg.txt
index f2d0f46..e227d9d 100644
--- a/icu4c/source/data/locales/tg.txt
+++ b/icu4c/source/data/locales/tg.txt
@@ -34,7 +34,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
     calendar{
         generic{
             DateTimePatterns{
@@ -143,7 +143,7 @@
                 yQQQ{"QQQ y"}
                 yQQQQ{"QQQQ y"}
                 yw{
-                    other{"'ҳафтаи' w, Y"}
+                    other{"'ҳафтаи' w, y"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/tg_TJ.txt b/icu4c/source/data/locales/tg_TJ.txt
index 417d976..8052edb 100644
--- a/icu4c/source/data/locales/tg_TJ.txt
+++ b/icu4c/source/data/locales/tg_TJ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tg_TJ{
-    Version{"2.1.36.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/th.txt b/icu4c/source/data/locales/th.txt
index 8944fd5..aed3a19 100644
--- a/icu4c/source/data/locales/th.txt
+++ b/icu4c/source/data/locales/th.txt
@@ -181,7 +181,7 @@
         minimumGroupingDigits{"1"}
         native{"thai"}
     }
-    Version{"2.1.37.56"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/th_TH.txt b/icu4c/source/data/locales/th_TH.txt
index d251ddf..4170ffc 100644
--- a/icu4c/source/data/locales/th_TH.txt
+++ b/icu4c/source/data/locales/th_TH.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 th_TH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ti.txt b/icu4c/source/data/locales/ti.txt
index eb94cb2..6840c40 100644
--- a/icu4c/source/data/locales/ti.txt
+++ b/icu4c/source/data/locales/ti.txt
@@ -202,7 +202,7 @@
         native{"latn"}
         traditional{"ethi"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     calendar{
         generic{
             DateTimePatterns{
@@ -312,8 +312,8 @@
                 yQQQ{"QQQ y"}
                 yQQQQ{"y QQQQ"}
                 yw{
-                    one{"መበል w ሰሙን ናይ Y"}
-                    other{"መበል w ሰሙን ናይ Y"}
+                    one{"መበል w ሰሙን ናይ y"}
+                    other{"መበል w ሰሙን ናይ y"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/ti_ER.txt b/icu4c/source/data/locales/ti_ER.txt
index 299a920..572d66f 100644
--- a/icu4c/source/data/locales/ti_ER.txt
+++ b/icu4c/source/data/locales/ti_ER.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ti_ER{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/ti_ET.txt b/icu4c/source/data/locales/ti_ET.txt
index 4cb7be8..fcff8d9 100644
--- a/icu4c/source/data/locales/ti_ET.txt
+++ b/icu4c/source/data/locales/ti_ET.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ti_ET{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/to.txt b/icu4c/source/data/locales/to.txt
index 7dd74f5..f69b43f 100644
--- a/icu4c/source/data/locales/to.txt
+++ b/icu4c/source/data/locales/to.txt
@@ -166,7 +166,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.39"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/to_TO.txt b/icu4c/source/data/locales/to_TO.txt
index 97a16ae..4db9e52 100644
--- a/icu4c/source/data/locales/to_TO.txt
+++ b/icu4c/source/data/locales/to_TO.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 to_TO{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/tr.txt b/icu4c/source/data/locales/tr.txt
index ed544a9..819ee75 100644
--- a/icu4c/source/data/locales/tr.txt
+++ b/icu4c/source/data/locales/tr.txt
@@ -216,7 +216,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
@@ -412,7 +412,12 @@
                 "{1} {0}",
             }
             availableFormats{
+                Bh{"B h"}
+                Bhm{"B h:mm"}
+                Bhms{"B h:mm:ss"}
                 E{"ccc"}
+                EBhm{"E B h:mm"}
+                EBhms{"E B h:mm:ss"}
                 EHm{"E HH:mm"}
                 EHms{"E HH:mm:ss"}
                 Ed{"d E"}
@@ -1403,6 +1408,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"’"}
diff --git a/icu4c/source/data/locales/tr_CY.txt b/icu4c/source/data/locales/tr_CY.txt
index ad482b7..d66de16 100644
--- a/icu4c/source/data/locales/tr_CY.txt
+++ b/icu4c/source/data/locales/tr_CY.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tr_CY{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     calendar{
         gregorian{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/tr_TR.txt b/icu4c/source/data/locales/tr_TR.txt
index dd4f99f..cf12f14 100644
--- a/icu4c/source/data/locales/tr_TR.txt
+++ b/icu4c/source/data/locales/tr_TR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tr_TR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/tt.txt b/icu4c/source/data/locales/tt.txt
index bb41500..35edede 100644
--- a/icu4c/source/data/locales/tt.txt
+++ b/icu4c/source/data/locales/tt.txt
@@ -40,7 +40,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     calendar{
         generic{
             DateTimePatterns{
@@ -135,7 +135,7 @@
                 yQQQ{"QQQ, y 'ел'"}
                 yQQQQ{"QQQQ, y 'ел'"}
                 yw{
-                    other{"Y 'елның' w 'атнасы'"}
+                    other{"y 'елның' w 'атнасы'"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/tt_RU.txt b/icu4c/source/data/locales/tt_RU.txt
index 16d146b..b8e6b95 100644
--- a/icu4c/source/data/locales/tt_RU.txt
+++ b/icu4c/source/data/locales/tt_RU.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tt_RU{
-    Version{"2.1.36.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/twq.txt b/icu4c/source/data/locales/twq.txt
index d2c733a..4f0fec1 100644
--- a/icu4c/source/data/locales/twq.txt
+++ b/icu4c/source/data/locales/twq.txt
@@ -17,7 +17,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/twq_NE.txt b/icu4c/source/data/locales/twq_NE.txt
index a7c756d..e8ddfae 100644
--- a/icu4c/source/data/locales/twq_NE.txt
+++ b/icu4c/source/data/locales/twq_NE.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 twq_NE{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/tzm.txt b/icu4c/source/data/locales/tzm.txt
index 696549b..729cd6e 100644
--- a/icu4c/source/data/locales/tzm.txt
+++ b/icu4c/source/data/locales/tzm.txt
@@ -16,7 +16,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/tzm_MA.txt b/icu4c/source/data/locales/tzm_MA.txt
index e503aa7..98fb458 100644
--- a/icu4c/source/data/locales/tzm_MA.txt
+++ b/icu4c/source/data/locales/tzm_MA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tzm_MA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/ug.txt b/icu4c/source/data/locales/ug.txt
index 1f3a77a..070baf5 100644
--- a/icu4c/source/data/locales/ug.txt
+++ b/icu4c/source/data/locales/ug.txt
@@ -142,7 +142,7 @@
         }
         native{"arabext"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
@@ -406,8 +406,8 @@
                 yQQQ{"y QQQ"}
                 yQQQQ{"y QQQQ"}
                 yw{
-                    one{"Y، w-ھەپتە"}
-                    other{"Y، w-ھەپتە"}
+                    one{"y، w-ھەپتە"}
+                    other{"y، w-ھەپتە"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/ug_CN.txt b/icu4c/source/data/locales/ug_CN.txt
index ee7ab2c..4fc6dcd 100644
--- a/icu4c/source/data/locales/ug_CN.txt
+++ b/icu4c/source/data/locales/ug_CN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ug_CN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/uk.txt b/icu4c/source/data/locales/uk.txt
index 9bf8cb4..8916d4b 100644
--- a/icu4c/source/data/locales/uk.txt
+++ b/icu4c/source/data/locales/uk.txt
@@ -288,7 +288,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.12"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             eras{
@@ -1550,6 +1550,10 @@
             1,
             1,
         }
+        typographicNames:intvector{
+            1,
+            1,
+        }
     }
     delimiters{
         alternateQuotationEnd{"“"}
diff --git a/icu4c/source/data/locales/uk_UA.txt b/icu4c/source/data/locales/uk_UA.txt
index 4e2add6..99bf4ea 100644
--- a/icu4c/source/data/locales/uk_UA.txt
+++ b/icu4c/source/data/locales/uk_UA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uk_UA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/ur.txt b/icu4c/source/data/locales/ur.txt
index 66dee3e..5121f25 100644
--- a/icu4c/source/data/locales/ur.txt
+++ b/icu4c/source/data/locales/ur.txt
@@ -240,7 +240,7 @@
         minimumGroupingDigits{"1"}
         native{"arabext"}
     }
-    Version{"2.1.37.69"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             eras{
@@ -458,7 +458,7 @@
                 MEd{"E، d/M"}
                 MMM{"LLL"}
                 MMMEd{"E، d MMM"}
-                MMMMd{"MMMM d"}
+                MMMMd{"d MMMM"}
                 MMMd{"d MMM"}
                 Md{"d/M"}
                 d{"d"}
@@ -592,9 +592,9 @@
                 "h:mm:ss a z",
                 "h:mm:ss a",
                 "h:mm a",
-                "EEEE, MMMM d, y",
-                "MMMM d, y",
-                "MMM d, y",
+                "EEEE، d MMMM، y",
+                "d MMMM، y",
+                "d MMM، y",
                 "d/M/yy",
                 "{1} {0}",
                 "{1} {0}",
@@ -634,7 +634,7 @@
                     one{"MMMM کا ہفتہ W"}
                     other{"MMMM کا ہفتہ W"}
                 }
-                MMMMd{"MMMM d"}
+                MMMMd{"d MMMM"}
                 MMMd{"d MMM"}
                 Md{"d/M"}
                 d{"d"}
@@ -901,7 +901,7 @@
                 }
                 yMMMd{
                     M{"d MMM – d MMM، y"}
-                    d{"y MMM d–d"}
+                    d{"d–d MMM y"}
                     y{"d MMM، y – d MMM، y"}
                 }
                 yMd{
diff --git a/icu4c/source/data/locales/ur_IN.txt b/icu4c/source/data/locales/ur_IN.txt
index 87fbdbc..157abb8 100644
--- a/icu4c/source/data/locales/ur_IN.txt
+++ b/icu4c/source/data/locales/ur_IN.txt
@@ -14,7 +14,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     fields{
         day-narrow{
             relativeTime{
diff --git a/icu4c/source/data/locales/ur_PK.txt b/icu4c/source/data/locales/ur_PK.txt
index ecf1f7e..5ef8983 100644
--- a/icu4c/source/data/locales/ur_PK.txt
+++ b/icu4c/source/data/locales/ur_PK.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ur_PK{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/uz.txt b/icu4c/source/data/locales/uz.txt
index 078872f..3881176 100644
--- a/icu4c/source/data/locales/uz.txt
+++ b/icu4c/source/data/locales/uz.txt
@@ -233,7 +233,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -439,8 +439,8 @@
                 yQQQ{"y, QQQ"}
                 yQQQQ{"y, QQQQ"}
                 yw{
-                    one{"Y, w-'hafta'"}
-                    other{"Y, w-'hafta'"}
+                    one{"y, w-'hafta'"}
+                    other{"y, w-'hafta'"}
                 }
             }
             dayNames{
@@ -987,6 +987,15 @@
                 }
             }
         }
+        dayOfYear{
+            dn{"yilning kuni"}
+        }
+        dayOfYear-narrow{
+            dn{"yilning kuni"}
+        }
+        dayOfYear-short{
+            dn{"yilning kuni"}
+        }
         dayperiod{
             dn{"TO/TK"}
         }
diff --git a/icu4c/source/data/locales/uz_Arab.txt b/icu4c/source/data/locales/uz_Arab.txt
index 249cce5..1ef17f9 100644
--- a/icu4c/source/data/locales/uz_Arab.txt
+++ b/icu4c/source/data/locales/uz_Arab.txt
@@ -28,7 +28,7 @@
         }
         native{"arabext"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     calendar{
         gregorian{
             dayNames{
diff --git a/icu4c/source/data/locales/uz_Arab_AF.txt b/icu4c/source/data/locales/uz_Arab_AF.txt
index f3d2fb2..0dc5bcb 100644
--- a/icu4c/source/data/locales/uz_Arab_AF.txt
+++ b/icu4c/source/data/locales/uz_Arab_AF.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Arab_AF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/uz_Cyrl.txt b/icu4c/source/data/locales/uz_Cyrl.txt
index 8188560..811f956 100644
--- a/icu4c/source/data/locales/uz_Cyrl.txt
+++ b/icu4c/source/data/locales/uz_Cyrl.txt
@@ -165,7 +165,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/uz_Cyrl_UZ.txt b/icu4c/source/data/locales/uz_Cyrl_UZ.txt
index 7eeb177..ee0c8f0 100644
--- a/icu4c/source/data/locales/uz_Cyrl_UZ.txt
+++ b/icu4c/source/data/locales/uz_Cyrl_UZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Cyrl_UZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/uz_Latn.txt b/icu4c/source/data/locales/uz_Latn.txt
index 36553da..66698d6 100644
--- a/icu4c/source/data/locales/uz_Latn.txt
+++ b/icu4c/source/data/locales/uz_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/uz_Latn_UZ.txt b/icu4c/source/data/locales/uz_Latn_UZ.txt
index 871f1ee..4209f6a 100644
--- a/icu4c/source/data/locales/uz_Latn_UZ.txt
+++ b/icu4c/source/data/locales/uz_Latn_UZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Latn_UZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/vai.txt b/icu4c/source/data/locales/vai.txt
index 13c1f2e..7e59ff0 100644
--- a/icu4c/source/data/locales/vai.txt
+++ b/icu4c/source/data/locales/vai.txt
@@ -28,7 +28,7 @@
         }
         native{"vaii"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -125,7 +125,7 @@
             monthNames{
                 format{
                     abbreviated{
-                        "ꖨꕪꖃ",
+                        "ꖨꖕꔞ",
                         "ꕒꕡ",
                         "ꕾꖺ",
                         "ꖢꖕ",
@@ -136,10 +136,10 @@
                         "ꕢꕌ",
                         "ꕭꖃ",
                         "ꔞꘋ",
-                        "ꖨꕪꕱ",
+                        "ꖨꖕꗏ",
                     }
                     wide{
-                        "ꖨꕪꖃ ꔞꕮ",
+                        "ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ",
                         "ꕒꕡꖝꖕ",
                         "ꕾꖺ",
                         "ꖢꖕ",
@@ -150,12 +150,12 @@
                         "ꕢꕌ",
                         "ꕭꖃ",
                         "ꔞꘋꕔꕿ ꕸꖃꗏ",
-                        "ꖨꕪꕱ ꗏꕮ",
+                        "ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ",
                     }
                 }
                 stand-alone{
                     abbreviated{
-                        "ꖨꕪꖃ",
+                        "ꖨꖕꔞ",
                         "ꕒꕡ",
                         "ꕾꖺ",
                         "ꖢꖕ",
@@ -166,10 +166,10 @@
                         "ꕢꕌ",
                         "ꕭꖃ",
                         "ꔞꘋ",
-                        "ꖨꕪꕱ",
+                        "ꖨꖕꗏ",
                     }
                     wide{
-                        "ꖨꕪꖃ ꔞꕮ",
+                        "ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ",
                         "ꕒꕡꖝꖕ",
                         "ꕾꖺ",
                         "ꖢꖕ",
@@ -180,7 +180,7 @@
                         "ꕢꕌ",
                         "ꕭꖃ",
                         "ꔞꘋꕔꕿ ꕸꖃꗏ",
-                        "ꖨꕪꕱ ꗏꕮ",
+                        "ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ",
                     }
                 }
             }
diff --git a/icu4c/source/data/locales/vai_Latn.txt b/icu4c/source/data/locales/vai_Latn.txt
index 9f09509..9d9418d 100644
--- a/icu4c/source/data/locales/vai_Latn.txt
+++ b/icu4c/source/data/locales/vai_Latn.txt
@@ -23,7 +23,7 @@
         }
         native{"vaii"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/vai_Latn_LR.txt b/icu4c/source/data/locales/vai_Latn_LR.txt
index f8a96ff..4f4a8c5 100644
--- a/icu4c/source/data/locales/vai_Latn_LR.txt
+++ b/icu4c/source/data/locales/vai_Latn_LR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai_Latn_LR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/vai_Vaii.txt b/icu4c/source/data/locales/vai_Vaii.txt
index 487dfa9..6ef4517 100644
--- a/icu4c/source/data/locales/vai_Vaii.txt
+++ b/icu4c/source/data/locales/vai_Vaii.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai_Vaii{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/vai_Vaii_LR.txt b/icu4c/source/data/locales/vai_Vaii_LR.txt
index 37fdc3c..494a1ed 100644
--- a/icu4c/source/data/locales/vai_Vaii_LR.txt
+++ b/icu4c/source/data/locales/vai_Vaii_LR.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai_Vaii_LR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/vi.txt b/icu4c/source/data/locales/vi.txt
index 36813d5..aeb6ad4 100644
--- a/icu4c/source/data/locales/vi.txt
+++ b/icu4c/source/data/locales/vi.txt
@@ -182,7 +182,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -1040,7 +1040,7 @@
                     "sau CN",
                 }
                 abbreviated%variant{
-                    "BCE",
+                    "trước CN",
                     "CN",
                 }
                 narrow{
@@ -1052,7 +1052,7 @@
                     "sau CN",
                 }
                 wide%variant{
-                    "BCE",
+                    "trước CN",
                     "CN",
                 }
             }
@@ -1611,6 +1611,12 @@
         western_asian_scripts{"chữ viết Tây Á"}
         whitespace{"dấu cách"}
     }
+    contextTransforms{
+        typographicNames:intvector{
+            1,
+            1,
+        }
+    }
     delimiters{
         alternateQuotationEnd{"’"}
         alternateQuotationStart{"‘"}
@@ -2275,6 +2281,9 @@
         weekday{
             dn{"ngày trong tuần"}
         }
+        weekday-narrow{
+            dn{"ngày trong tuần"}
+        }
         weekday-short{
             dn{"ngày trong tuần"}
         }
diff --git a/icu4c/source/data/locales/vi_VN.txt b/icu4c/source/data/locales/vi_VN.txt
index d806d1a..1110af9 100644
--- a/icu4c/source/data/locales/vi_VN.txt
+++ b/icu4c/source/data/locales/vi_VN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vi_VN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/vun.txt b/icu4c/source/data/locales/vun.txt
index 169d7bb..53cd57e 100644
--- a/icu4c/source/data/locales/vun.txt
+++ b/icu4c/source/data/locales/vun.txt
@@ -11,7 +11,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/vun_TZ.txt b/icu4c/source/data/locales/vun_TZ.txt
index ad0140d..661c47d 100644
--- a/icu4c/source/data/locales/vun_TZ.txt
+++ b/icu4c/source/data/locales/vun_TZ.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vun_TZ{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/wae.txt b/icu4c/source/data/locales/wae.txt
index 74330f9..4f2842b 100644
--- a/icu4c/source/data/locales/wae.txt
+++ b/icu4c/source/data/locales/wae.txt
@@ -16,7 +16,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/wae_CH.txt b/icu4c/source/data/locales/wae_CH.txt
index 13645e8..af79304 100644
--- a/icu4c/source/data/locales/wae_CH.txt
+++ b/icu4c/source/data/locales/wae_CH.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 wae_CH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/wo.txt b/icu4c/source/data/locales/wo.txt
index 2e14640..3d69966 100644
--- a/icu4c/source/data/locales/wo.txt
+++ b/icu4c/source/data/locales/wo.txt
@@ -35,7 +35,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/wo_SN.txt b/icu4c/source/data/locales/wo_SN.txt
index a45a1c2..955cbc4 100644
--- a/icu4c/source/data/locales/wo_SN.txt
+++ b/icu4c/source/data/locales/wo_SN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 wo_SN{
-    Version{"2.1.36.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/xog.txt b/icu4c/source/data/locales/xog.txt
index e2340b2..1aa24a1 100644
--- a/icu4c/source/data/locales/xog.txt
+++ b/icu4c/source/data/locales/xog.txt
@@ -10,7 +10,7 @@
             }
         }
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/xog_UG.txt b/icu4c/source/data/locales/xog_UG.txt
index 3a0bde7..51930fa 100644
--- a/icu4c/source/data/locales/xog_UG.txt
+++ b/icu4c/source/data/locales/xog_UG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 xog_UG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/yav.txt b/icu4c/source/data/locales/yav.txt
index d8ecb40..16bb936 100644
--- a/icu4c/source/data/locales/yav.txt
+++ b/icu4c/source/data/locales/yav.txt
@@ -22,7 +22,7 @@
             }
         }
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/yav_CM.txt b/icu4c/source/data/locales/yav_CM.txt
index 2f4b9dc..87478a8 100644
--- a/icu4c/source/data/locales/yav_CM.txt
+++ b/icu4c/source/data/locales/yav_CM.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yav_CM{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/yi.txt b/icu4c/source/data/locales/yi.txt
index 619faa2..9cad3a7 100644
--- a/icu4c/source/data/locales/yi.txt
+++ b/icu4c/source/data/locales/yi.txt
@@ -29,7 +29,7 @@
         native{"latn"}
         traditional{"hebr"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/yi_001.txt b/icu4c/source/data/locales/yi_001.txt
index 3a0addf..de146a4 100644
--- a/icu4c/source/data/locales/yi_001.txt
+++ b/icu4c/source/data/locales/yi_001.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yi_001{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/yo.txt b/icu4c/source/data/locales/yo.txt
index 302708d..40463b7 100644
--- a/icu4c/source/data/locales/yo.txt
+++ b/icu4c/source/data/locales/yo.txt
@@ -36,7 +36,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -154,7 +154,7 @@
                 yQQQ{"QQQ y"}
                 yQQQQ{"QQQQ y"}
                 yw{
-                    other{"'week' w 'of' Y"}
+                    other{"'week' w 'of' y"}
                 }
             }
             dayNames{
diff --git a/icu4c/source/data/locales/yo_BJ.txt b/icu4c/source/data/locales/yo_BJ.txt
index 4548fd8..882f9a4 100644
--- a/icu4c/source/data/locales/yo_BJ.txt
+++ b/icu4c/source/data/locales/yo_BJ.txt
@@ -5,7 +5,7 @@
         "[a á à b d e é è ɛ {ɛ\u0301} {ɛ\u0300} f g {gb} h i í ì j k l m n o ó ò ɔ {ɔ"
         "\u0301} {ɔ\u0300} p r s {sh} t u ú ù w y]"
     }
-    Version{"2.1.37.9"}
+    Version{"2.1.39.11"}
     calendar{
         gregorian{
             AmPmMarkers{
diff --git a/icu4c/source/data/locales/yo_NG.txt b/icu4c/source/data/locales/yo_NG.txt
index 8ca4a58..50ccbfd 100644
--- a/icu4c/source/data/locales/yo_NG.txt
+++ b/icu4c/source/data/locales/yo_NG.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yo_NG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/yue.txt b/icu4c/source/data/locales/yue.txt
index 74dd462..a0202b1 100644
--- a/icu4c/source/data/locales/yue.txt
+++ b/icu4c/source/data/locales/yue.txt
@@ -118,7 +118,7 @@
             patternsLong{
                 decimalFormat{
                     1000{
-                        other{"0"}
+                        other{"0千"}
                     }
                     10000{
                         other{"0萬"}
@@ -158,7 +158,7 @@
             patternsShort{
                 currencyFormat{
                     1000{
-                        other{"0"}
+                        other{"¤0千"}
                     }
                     10000{
                         other{"¤0萬"}
@@ -196,7 +196,7 @@
                 }
                 decimalFormat{
                     1000{
-                        other{"0"}
+                        other{"0千"}
                     }
                     10000{
                         other{"0萬"}
@@ -260,7 +260,7 @@
         native{"hanidec"}
         traditional{"hant"}
     }
-    Version{"2.1.37.33"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
@@ -2619,7 +2619,7 @@
         sign_standard_symbols{"標記/標準符號"}
         small_form_variant{"小寫變體"}
         smiley{"表情符號"}
-        smileys_people{"表情符號與人"}
+        smileys_people{"表情符號同人"}
         south_asian_scripts{"南亞字體"}
         southeast_asian_scripts{"東南亞字體"}
         spacing{"空位"}
@@ -2628,7 +2628,7 @@
         technical_symbols{"技術符號"}
         tone_marks{"聲調符號"}
         travel{"旅遊"}
-        travel_places{"旅遊和地點"}
+        travel_places{"旅遊同地點"}
         upwards_arrows{"向上箭咀"}
         variant_forms{"變化型"}
         vocalic_jamo{"元音字母"}
diff --git a/icu4c/source/data/locales/yue_Hans.txt b/icu4c/source/data/locales/yue_Hans.txt
index b087983..641927d 100644
--- a/icu4c/source/data/locales/yue_Hans.txt
+++ b/icu4c/source/data/locales/yue_Hans.txt
@@ -258,7 +258,7 @@
         native{"hanidec"}
         traditional{"hans"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/yue_Hans_CN.txt b/icu4c/source/data/locales/yue_Hans_CN.txt
index f023c5e..f423ec4 100644
--- a/icu4c/source/data/locales/yue_Hans_CN.txt
+++ b/icu4c/source/data/locales/yue_Hans_CN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue_Hans_CN{
-    Version{"2.1.36.80"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/yue_Hant.txt b/icu4c/source/data/locales/yue_Hant.txt
index b8cde82..a263f97 100644
--- a/icu4c/source/data/locales/yue_Hant.txt
+++ b/icu4c/source/data/locales/yue_Hant.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue_Hant{
-    Version{"2.1.36.80"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/yue_Hant_HK.txt b/icu4c/source/data/locales/yue_Hant_HK.txt
index ef784a2..946754c 100644
--- a/icu4c/source/data/locales/yue_Hant_HK.txt
+++ b/icu4c/source/data/locales/yue_Hant_HK.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue_Hant_HK{
-    Version{"2.1.36.80"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/zgh.txt b/icu4c/source/data/locales/zgh.txt
index dc55799..55fd030 100644
--- a/icu4c/source/data/locales/zgh.txt
+++ b/icu4c/source/data/locales/zgh.txt
@@ -32,7 +32,7 @@
         }
         minimumGroupingDigits{"1"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/zgh_MA.txt b/icu4c/source/data/locales/zgh_MA.txt
index d6598a6..a699c8e 100644
--- a/icu4c/source/data/locales/zgh_MA.txt
+++ b/icu4c/source/data/locales/zgh_MA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zgh_MA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/locales/zh.txt b/icu4c/source/data/locales/zh.txt
index 6e8013b..9d73df9 100644
--- a/icu4c/source/data/locales/zh.txt
+++ b/icu4c/source/data/locales/zh.txt
@@ -825,7 +825,7 @@
             }
         }
     }
-    Version{"2.1.37.42"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/zh_Hans.txt b/icu4c/source/data/locales/zh_Hans.txt
index e2e6871..a37beac 100644
--- a/icu4c/source/data/locales/zh_Hans.txt
+++ b/icu4c/source/data/locales/zh_Hans.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/zh_Hans_CN.txt b/icu4c/source/data/locales/zh_Hans_CN.txt
index c5fe732..1de587b 100644
--- a/icu4c/source/data/locales/zh_Hans_CN.txt
+++ b/icu4c/source/data/locales/zh_Hans_CN.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans_CN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/zh_Hans_HK.txt b/icu4c/source/data/locales/zh_Hans_HK.txt
index 78c87a6..1851383 100644
--- a/icu4c/source/data/locales/zh_Hans_HK.txt
+++ b/icu4c/source/data/locales/zh_Hans_HK.txt
@@ -31,7 +31,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/zh_Hans_MO.txt b/icu4c/source/data/locales/zh_Hans_MO.txt
index 0cc19ba..5e232c6 100644
--- a/icu4c/source/data/locales/zh_Hans_MO.txt
+++ b/icu4c/source/data/locales/zh_Hans_MO.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans_MO{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         chinese{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/zh_Hans_SG.txt b/icu4c/source/data/locales/zh_Hans_SG.txt
index cc63963..6fe1ce9 100644
--- a/icu4c/source/data/locales/zh_Hans_SG.txt
+++ b/icu4c/source/data/locales/zh_Hans_SG.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans_SG{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/zh_Hant.txt b/icu4c/source/data/locales/zh_Hant.txt
index 5ff361e..d99bc73 100644
--- a/icu4c/source/data/locales/zh_Hant.txt
+++ b/icu4c/source/data/locales/zh_Hant.txt
@@ -1374,7 +1374,7 @@
             }
         }
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     calendar{
         buddhist{
             DateTimePatterns{
diff --git a/icu4c/source/data/locales/zh_Hant_HK.txt b/icu4c/source/data/locales/zh_Hant_HK.txt
index 38e4cb1..d9f1812 100644
--- a/icu4c/source/data/locales/zh_Hant_HK.txt
+++ b/icu4c/source/data/locales/zh_Hant_HK.txt
@@ -91,7 +91,7 @@
             }
         }
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
     calendar{
         buddhist{
             availableFormats{
diff --git a/icu4c/source/data/locales/zh_Hant_MO.txt b/icu4c/source/data/locales/zh_Hant_MO.txt
index 78fdee5..f61452c 100644
--- a/icu4c/source/data/locales/zh_Hant_MO.txt
+++ b/icu4c/source/data/locales/zh_Hant_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hant_MO{
     %%Parent{"zh_Hant_HK"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/zh_Hant_TW.txt b/icu4c/source/data/locales/zh_Hant_TW.txt
index dbc6d3a..f59f2c1 100644
--- a/icu4c/source/data/locales/zh_Hant_TW.txt
+++ b/icu4c/source/data/locales/zh_Hant_TW.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hant_TW{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/locales/zu.txt b/icu4c/source/data/locales/zu.txt
index 5575e7a..ef361dd 100644
--- a/icu4c/source/data/locales/zu.txt
+++ b/icu4c/source/data/locales/zu.txt
@@ -216,7 +216,7 @@
         minimumGroupingDigits{"1"}
         native{"latn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     calendar{
         generic{
             DateTimePatterns{
@@ -1776,6 +1776,10 @@
                 "[,،٫、︐︑﹐﹑,、]",
                 "[+⁺₊➕﬩﹢+]",
             }
+            stricter{
+                "[,٫︐﹐,]",
+                "[.․﹒.。]",
+            }
         }
     }
 }
diff --git a/icu4c/source/data/locales/zu_ZA.txt b/icu4c/source/data/locales/zu_ZA.txt
index 350b1f8..f548fb3 100644
--- a/icu4c/source/data/locales/zu_ZA.txt
+++ b/icu4c/source/data/locales/zu_ZA.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zu_ZA{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/makedata.mak b/icu4c/source/data/makedata.mak
index 6e3bde5..1b6f7ea 100644
--- a/icu4c/source/data/makedata.mak
+++ b/icu4c/source/data/makedata.mak
@@ -12,11 +12,11 @@
 
 ##############################################################################
 # Keep the following in sync with the version - see common/unicode/uvernum.h
-U_ICUDATA_NAME=icudt60
+U_ICUDATA_NAME=icudt61
 ##############################################################################
 !IF "$(UWP)" == "UWP"
 # Optionally change the name of the data file for the UWP version.
-U_ICUDATA_NAME=icudt60
+U_ICUDATA_NAME=icudt61
 !ENDIF
 U_ICUDATA_ENDIAN_SUFFIX=l
 UNICODE_VERSION=10.0
@@ -38,7 +38,7 @@
 
 ICUOUT=$(ICUMAKE)\out
 
-#  the prefix "icudt21_" for use in filenames
+#  the prefix "icudt61_" for use in filenames
 ICUPKG=$(U_ICUDATA_NAME)$(U_ICUDATA_ENDIAN_SUFFIX)
 
 # need to nuke \\ for .NET...
diff --git a/icu4c/source/data/makedata.vcxproj b/icu4c/source/data/makedata.vcxproj
index 4430e8e..9c94ae4 100644
--- a/icu4c/source/data/makedata.vcxproj
+++ b/icu4c/source/data/makedata.vcxproj
@@ -1,28 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
   <PropertyGroup Label="Globals">
     <ProjectGuid>{D9DF7F2F-93B7-4810-B5CD-96F4F33C079B}</ProjectGuid>
     <Keyword>MakeFileProj</Keyword>
-    <PlatformToolset>v140</PlatformToolset>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
     <ConfigurationType>Makefile</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
   </PropertyGroup>
diff --git a/icu4c/source/data/makedata_uwp.vcxproj b/icu4c/source/data/makedata_uwp.vcxproj
index 7baae5f..8573b36 100644
--- a/icu4c/source/data/makedata_uwp.vcxproj
+++ b/icu4c/source/data/makedata_uwp.vcxproj
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <!-- The following import will include the 'default' configuration options for VS UWP projects. -->
+  <Import Project="..\allinone\Build.Windows.UWP.ProjectConfiguration.props" />
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
       <Configuration>Debug</Configuration>
@@ -30,12 +32,6 @@
     <ProjectGuid>{B1D53358-37BD-48BC-B27C-68BAF1E78508}</ProjectGuid>
     <Keyword>MakeFileProj</Keyword>
     <DefaultLanguage>en-US</DefaultLanguage>
-    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
-    <AppContainerApplication>true</AppContainerApplication>
-    <ApplicationType>Windows Store</ApplicationType>
-    <WindowsTargetPlatformVersion>10.0.10586.0</WindowsTargetPlatformVersion>
-    <WindowsTargetPlatformMinVersion>10.0.10240.0</WindowsTargetPlatformMinVersion>
-    <ApplicationTypeRevision>10.0</ApplicationTypeRevision>
     <ConfigurationType>Makefile</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
   </PropertyGroup>
diff --git a/icu4c/source/data/misc/currencyNumericCodes.txt b/icu4c/source/data/misc/currencyNumericCodes.txt
index 6d20233..9ce3e6c 100644
--- a/icu4c/source/data/misc/currencyNumericCodes.txt
+++ b/icu4c/source/data/misc/currencyNumericCodes.txt
@@ -1,4 +1,4 @@
-//---------------------------------------------------------
+//---------------------------------------------------------
 // Copyright (C) 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html
 //---------------------------------------------------------
@@ -6,7 +6,7 @@
 // Corporation and others.  All Rights Reserved.
 //---------------------------------------------------------
 // Build tool: com.ibm.icu.dev.tool.currency.NumericCodeData
-// Build date: 2017-09-28T21:49:02Z
+// Build date: 2018-03-06T17:38:16Z
 //---------------------------------------------------------
 // >> !!! >>   THIS IS A MACHINE-GENERATED FILE   << !!! <<
 // >> !!! >>>            DO NOT EDIT             <<< !!! <<
@@ -179,6 +179,7 @@
         MNT:int{496}
         MOP:int{446}
         MRO:int{478}
+        MRU:int{929}
         MTL:int{470}
         MTP:int{470}
         MUR:int{480}
@@ -239,6 +240,7 @@
         SRG:int{740}
         SSP:int{728}
         STD:int{678}
+        STN:int{930}
         SUR:int{810}
         SVC:int{222}
         SYP:int{760}
diff --git a/icu4c/source/data/misc/icuver.txt b/icu4c/source/data/misc/icuver.txt
index 1938d4f..dcc4bfb 100644
--- a/icu4c/source/data/misc/icuver.txt
+++ b/icu4c/source/data/misc/icuver.txt
@@ -8,6 +8,6 @@
 // ***************************************************************************
 
 icuver:table(nofallback){ 
-    DataVersion { "59.1.0.0" }
-    ICUVersion  { "59.1.0.0" }
+    DataVersion { "61.1.0.0" }
+    ICUVersion  { "61.1.0.0" }
 }
diff --git a/icu4c/source/data/misc/keyTypeData.txt b/icu4c/source/data/misc/keyTypeData.txt
index b5a3dcb..dd434ad 100644
--- a/icu4c/source/data/misc/keyTypeData.txt
+++ b/icu4c/source/data/misc/keyTypeData.txt
@@ -335,6 +335,7 @@
             mnt{""}
             mop{""}
             mro{""}
+            mru{""}
             mtl{""}
             mtp{""}
             mur{""}
diff --git a/icu4c/source/data/misc/likelySubtags.txt b/icu4c/source/data/misc/likelySubtags.txt
index c8d0091..147cd70 100644
--- a/icu4c/source/data/misc/likelySubtags.txt
+++ b/icu4c/source/data/misc/likelySubtags.txt
@@ -1577,7 +1577,7 @@
     und_Plrd{"hmd_Plrd_CN"}
     und_Prti{"xpr_Prti_IR"}
     und_QA{"ar_Arab_QA"}
-    und_QO{"en_Latn_IO"}
+    und_QO{"en_Latn_DG"}
     und_RE{"fr_Latn_RE"}
     und_RO{"ro_Latn_RO"}
     und_RS{"sr_Cyrl_RS"}
diff --git a/icu4c/source/data/misc/metadata.txt b/icu4c/source/data/misc/metadata.txt
index 06d2b21..5a2449a 100644
--- a/icu4c/source/data/misc/metadata.txt
+++ b/icu4c/source/data/misc/metadata.txt
@@ -199,6 +199,10 @@
                 reason{"macrolanguage"}
                 replacement{"zh"}
             }
+            cnr{
+                reason{"legacy"}
+                replacement{"sr_ME"}
+            }
             cor{
                 reason{"overlong"}
                 replacement{"kw"}
@@ -1355,6 +1359,130 @@
             }
         }
         subdivision{
+            cn11{
+                reason{"deprecated"}
+                replacement{"cnbj"}
+            }
+            cn12{
+                reason{"deprecated"}
+                replacement{"cntj"}
+            }
+            cn13{
+                reason{"deprecated"}
+                replacement{"cnhe"}
+            }
+            cn14{
+                reason{"deprecated"}
+                replacement{"cnsx"}
+            }
+            cn15{
+                reason{"deprecated"}
+                replacement{"cnmn"}
+            }
+            cn21{
+                reason{"deprecated"}
+                replacement{"cnln"}
+            }
+            cn22{
+                reason{"deprecated"}
+                replacement{"cnjl"}
+            }
+            cn23{
+                reason{"deprecated"}
+                replacement{"cnhl"}
+            }
+            cn31{
+                reason{"deprecated"}
+                replacement{"cnsh"}
+            }
+            cn32{
+                reason{"deprecated"}
+                replacement{"cnjs"}
+            }
+            cn33{
+                reason{"deprecated"}
+                replacement{"cnzj"}
+            }
+            cn34{
+                reason{"deprecated"}
+                replacement{"cnah"}
+            }
+            cn35{
+                reason{"deprecated"}
+                replacement{"cnfj"}
+            }
+            cn36{
+                reason{"deprecated"}
+                replacement{"cnjx"}
+            }
+            cn37{
+                reason{"deprecated"}
+                replacement{"cnsd"}
+            }
+            cn41{
+                reason{"deprecated"}
+                replacement{"cnha"}
+            }
+            cn42{
+                reason{"deprecated"}
+                replacement{"cnhb"}
+            }
+            cn43{
+                reason{"deprecated"}
+                replacement{"cnhn"}
+            }
+            cn44{
+                reason{"deprecated"}
+                replacement{"cngd"}
+            }
+            cn45{
+                reason{"deprecated"}
+                replacement{"cngx"}
+            }
+            cn46{
+                reason{"deprecated"}
+                replacement{"cnhi"}
+            }
+            cn50{
+                reason{"deprecated"}
+                replacement{"cncq"}
+            }
+            cn51{
+                reason{"deprecated"}
+                replacement{"cnsc"}
+            }
+            cn52{
+                reason{"deprecated"}
+                replacement{"cngz"}
+            }
+            cn53{
+                reason{"deprecated"}
+                replacement{"cnyn"}
+            }
+            cn54{
+                reason{"deprecated"}
+                replacement{"cnxz"}
+            }
+            cn61{
+                reason{"deprecated"}
+                replacement{"cnsn"}
+            }
+            cn62{
+                reason{"deprecated"}
+                replacement{"cngs"}
+            }
+            cn63{
+                reason{"deprecated"}
+                replacement{"cnqh"}
+            }
+            cn64{
+                reason{"deprecated"}
+                replacement{"cnnx"}
+            }
+            cn65{
+                reason{"deprecated"}
+                replacement{"cnxj"}
+            }
             cn71{
                 reason{"overlong"}
                 replacement{"TW"}
@@ -1367,10 +1495,94 @@
                 reason{"overlong"}
                 replacement{"MO"}
             }
+            cnhk{
+                reason{"overlong"}
+                replacement{"HK"}
+            }
+            cnmo{
+                reason{"overlong"}
+                replacement{"MO"}
+            }
+            cntw{
+                reason{"overlong"}
+                replacement{"TW"}
+            }
+            cz10a{
+                reason{"deprecated"}
+                replacement{"cz110"}
+            }
+            cz10b{
+                reason{"deprecated"}
+                replacement{"cz111"}
+            }
+            cz10c{
+                reason{"deprecated"}
+                replacement{"cz112"}
+            }
+            cz10d{
+                reason{"deprecated"}
+                replacement{"cz113"}
+            }
+            cz10e{
+                reason{"deprecated"}
+                replacement{"cz114"}
+            }
+            cz10f{
+                reason{"deprecated"}
+                replacement{"cz115"}
+            }
+            cz611{
+                reason{"deprecated"}
+                replacement{"cz663"}
+            }
+            cz612{
+                reason{"deprecated"}
+                replacement{"cz632"}
+            }
+            cz613{
+                reason{"deprecated"}
+                replacement{"cz633"}
+            }
+            cz614{
+                reason{"deprecated"}
+                replacement{"cz634"}
+            }
+            cz615{
+                reason{"deprecated"}
+                replacement{"cz635"}
+            }
+            cz621{
+                reason{"deprecated"}
+                replacement{"cz641"}
+            }
+            cz622{
+                reason{"deprecated"}
+                replacement{"cz642"}
+            }
+            cz623{
+                reason{"deprecated"}
+                replacement{"cz643"}
+            }
+            cz624{
+                reason{"deprecated"}
+                replacement{"cz644"}
+            }
+            cz626{
+                reason{"deprecated"}
+                replacement{"cz646"}
+            }
+            cz627{
+                reason{"deprecated"}
+                replacement{"cz647"}
+            }
             czjc{
                 reason{"deprecated"}
                 replacement{"cz31"}
             }
+            czjm{
+                reason{"deprecated"}
+                replacement{"cz64"}
+            }
             czka{
                 reason{"deprecated"}
                 replacement{"cz41"}
@@ -1399,6 +1611,10 @@
                 reason{"deprecated"}
                 replacement{"cz32"}
             }
+            czpr{
+                reason{"deprecated"}
+                replacement{"cz10"}
+            }
             czst{
                 reason{"deprecated"}
                 replacement{"cz20"}
@@ -1407,6 +1623,10 @@
                 reason{"deprecated"}
                 replacement{"cz42"}
             }
+            czvy{
+                reason{"deprecated"}
+                replacement{"cz63"}
+            }
             czzl{
                 reason{"deprecated"}
                 replacement{"cz72"}
@@ -4445,6 +4665,7 @@
         "sah_RU",
         "saq_KE",
         "sbp_TZ",
+        "scn_IT",
         "sd_PK",
         "sdh_IR",
         "se_NO",
diff --git a/icu4c/source/data/misc/plurals.txt b/icu4c/source/data/misc/plurals.txt
index 78c4419..3ed3b93 100644
--- a/icu4c/source/data/misc/plurals.txt
+++ b/icu4c/source/data/misc/plurals.txt
@@ -149,6 +149,7 @@
         rwk{"set8"}
         sah{"set0"}
         saq{"set8"}
+        scn{"set4"}
         sd{"set8"}
         sdh{"set8"}
         se{"set16"}
@@ -278,6 +279,7 @@
         ro{"set37"}
         root{"set35"}
         ru{"set35"}
+        scn{"set44"}
         sd{"set35"}
         sh{"set35"}
         si{"set35"}
@@ -329,14 +331,14 @@
         }
         set11{
             one{
-                "v = 0 and i % 10 = 1 or f % 10 = 1 @integer 1, 11, 21, 31, 41, 51, 6"
-                "1, 71, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1,"
-                " 10.1, 100.1, 1000.1, …"
+                "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != "
+                "11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1"
+                ", 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …"
             }
             other{
-                " @integer 0, 2~10, 12~17, 100, 1000, 10000, 100000, 1000000, … @deci"
-                "mal 0.0, 0.2~1.0, 1.2~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1"
-                "000000.0, …"
+                " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0"
+                ", 0.2~1.0, 1.2~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000."
+                "0, …"
             }
         }
         set12{
diff --git a/icu4c/source/data/misc/supplementalData.txt b/icu4c/source/data/misc/supplementalData.txt
index 3f9d7d9..e79dbbd 100644
--- a/icu4c/source/data/misc/supplementalData.txt
+++ b/icu4c/source/data/misc/supplementalData.txt
@@ -1841,7 +1841,7 @@
             "islamic-tbla",
         }
     }
-    cldrVersion{"32.0.1"}
+    cldrVersion{"33"}
     codeMappings{
         {
             "AA",
@@ -3753,6 +3753,10 @@
             "478",
         }
         {
+            "MRU",
+            "929",
+        }
+        {
             "MUR",
             "480",
         }
@@ -3905,6 +3909,10 @@
             "678",
         }
         {
+            "STN",
+            "930",
+        }
+        {
             "SYP",
             "760",
         }
@@ -4171,6 +4179,7 @@
                 "SIT",
                 "SKK",
                 "SRG",
+                "STD",
                 "SUR",
                 "SVC",
                 "TJR",
@@ -4338,7 +4347,7 @@
                 "SOS",
                 "SRD",
                 "SSP",
-                "STD",
+                "STN",
                 "SYP",
                 "SZL",
                 "THB",
@@ -4383,6 +4392,7 @@
                 "bxr",
                 "cld",
                 "cmn",
+                "cnr",
                 "cwd",
                 "dgo",
                 "dhd",
@@ -10798,6 +10808,7 @@
                 "hsistemo",
                 "ijekavsk",
                 "itihasa",
+                "ivanchov",
                 "jauer",
                 "jyutping",
                 "kkcor",
@@ -19384,40 +19395,40 @@
             "cmsw",
         }
         CN{
-            "cn11",
-            "cn12",
-            "cn13",
-            "cn14",
-            "cn15",
-            "cn21",
-            "cn22",
-            "cn23",
-            "cn31",
-            "cn32",
-            "cn33",
-            "cn34",
-            "cn35",
-            "cn36",
-            "cn37",
-            "cn41",
-            "cn42",
-            "cn43",
-            "cn44",
-            "cn45",
-            "cn46",
-            "cn50",
-            "cn51",
-            "cn52",
-            "cn53",
-            "cn54",
-            "cn61",
-            "cn62",
-            "cn63",
-            "cn64",
-            "cn65",
-            "cn71",
-            "cn91",
-            "cn92",
+            "cnah",
+            "cnbj",
+            "cncq",
+            "cnfj",
+            "cngd",
+            "cngs",
+            "cngx",
+            "cngz",
+            "cnha",
+            "cnhb",
+            "cnhe",
+            "cnhi",
+            "cnhk",
+            "cnhl",
+            "cnhn",
+            "cnjl",
+            "cnjs",
+            "cnjx",
+            "cnln",
+            "cnmo",
+            "cnnm",
+            "cnnx",
+            "cnqh",
+            "cnsc",
+            "cnsd",
+            "cnsh",
+            "cnsn",
+            "cnsx",
+            "cntj",
+            "cntw",
+            "cnxj",
+            "cnxz",
+            "cnyn",
+            "cnzj",
         }
         CO{
             "coama",
@@ -20371,6 +20382,7 @@
             "kp09",
             "kp10",
             "kp13",
+            "kp14",
         }
         KR{
             "kr11",
@@ -20939,6 +20951,8 @@
             "ml6",
             "ml7",
             "ml8",
+            "ml9",
+            "ml10",
             "mlbko",
         }
         MM{
@@ -21547,6 +21561,7 @@
             "qakh",
             "qams",
             "qara",
+            "qash",
             "qaus",
             "qawa",
             "qaza",
@@ -24380,6 +24395,7 @@
             "ug122",
             "ug123",
             "ug124",
+            "ug125",
         }
         uge{
             "ug201",
@@ -24414,6 +24430,8 @@
             "ug230",
             "ug231",
             "ug232",
+            "ug233",
+            "ug234",
         }
         ugn{
             "ug301",
@@ -24446,6 +24464,8 @@
             "ug328",
             "ug329",
             "ug330",
+            "ug331",
+            "ug332",
         }
         ugw{
             "ug401",
@@ -24474,6 +24494,11 @@
             "ug424",
             "ug425",
             "ug426",
+            "ug427",
+            "ug428",
+            "ug429",
+            "ug430",
+            "ug431",
         }
     }
     telephoneCodeData{
@@ -25801,11 +25826,13 @@
             "AR",
             "BO",
             "BR",
+            "BV",
             "CL",
             "CO",
             "EC",
             "FK",
             "GF",
+            "GS",
             "GY",
             "PE",
             "PY",
@@ -25854,6 +25881,7 @@
             "DJ",
             "ER",
             "ET",
+            "IO",
             "KE",
             "KM",
             "MG",
@@ -25998,6 +26026,9 @@
         }
         053{
             "AU",
+            "CC",
+            "CX",
+            "HM",
             "NF",
             "NZ",
         }
@@ -26016,6 +26047,7 @@
             "MP",
             "NR",
             "PW",
+            "UM",
         }
         061{
             "AS",
@@ -26060,6 +26092,7 @@
             "QA",
             "SA",
             "SY",
+            "TF",
             "TR",
             "YE",
         }
@@ -26112,14 +26145,6 @@
         }
         QO{
             "AQ",
-            "BV",
-            "CC",
-            "CX",
-            "GS",
-            "HM",
-            "IO",
-            "TF",
-            "UM",
             "AC",
             "CP",
             "DG",
@@ -26174,7 +26199,7 @@
                 populationShareF:int{49990000}
             }
             territoryF:intvector{
-                57404600,
+                57418000,
                 49990000,
                 52940000,
             }
@@ -26214,7 +26239,7 @@
                 populationShareF:int{48290000}
             }
             territoryF:intvector{
-                61667200,
+                61691900,
                 49900000,
                 56607248,
             }
@@ -26246,7 +26271,7 @@
                 populationShareF:int{49430000}
             }
             territoryF:intvector{
-                60640800,
+                60695100,
                 49281000,
                 57341248,
             }
@@ -26271,7 +26296,7 @@
                 populationShareF:int{48170000}
             }
             territoryF:intvector{
-                59217100,
+                59239000,
                 49990000,
                 54947310,
             }
@@ -26299,7 +26324,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                60339000,
+                60358700,
                 49968000,
                 56304799,
             }
@@ -26316,7 +26341,7 @@
                 populationShareF:int{48330000}
             }
             territoryF:intvector{
-                60263000,
+                60272100,
                 49996000,
                 56304519,
             }
@@ -26334,7 +26359,7 @@
                 populationShareF:int{49670000}
             }
             territoryF:intvector{
-                61189000,
+                61192000,
                 49704000,
                 57293103,
             }
@@ -26344,7 +26369,7 @@
         }
         AQ{
             territoryF:intvector{
-                57170500,
+                57177800,
                 49990000,
                 52300000,
             }
@@ -26367,7 +26392,7 @@
                 populationShareF:int{46470000}
             }
             territoryF:intvector{
-                61879400,
+                61911500,
                 49979000,
                 57442933,
             }
@@ -26417,7 +26442,7 @@
                 populationShareF:int{47370000}
             }
             territoryF:intvector{
-                61416600,
+                61434100,
                 49980000,
                 56875441,
             }
@@ -26431,7 +26456,7 @@
                 populationShareF:int{48190000}
             }
             territoryF:intvector{
-                62118900,
+                62123500,
                 49990000,
                 57232324,
             }
@@ -26484,7 +26509,7 @@
                 populationShareF:int{47240000}
             }
             territoryF:intvector{
-                61167900,
+                61166800,
                 49998000,
                 56996140,
             }
@@ -26525,7 +26550,7 @@
                 writingShareF:int{48500000}
             }
             territoryF:intvector{
-                60425300,
+                60438500,
                 49980000,
                 56385618,
             }
@@ -26536,7 +26561,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                59480400,
+                59491900,
                 49997000,
                 55292336,
             }
@@ -26573,7 +26598,7 @@
                 populationShareF:int{48500000}
             }
             territoryF:intvector{
-                61628400,
+                61686500,
                 49577000,
                 58157827,
             }
@@ -26595,7 +26620,7 @@
                 populationShareF:int{49550000}
             }
             territoryF:intvector{
-                61508600,
+                61526400,
                 49990000,
                 57114913,
             }
@@ -26619,7 +26644,7 @@
                 populationShareF:int{49400000}
             }
             territoryF:intvector{
-                60329900,
+                60356800,
                 49287000,
                 57201075,
             }
@@ -26639,7 +26664,7 @@
                 populationShareF:int{49230000}
             }
             territoryF:intvector{
-                61143100,
+                61152400,
                 49984000,
                 56710151,
             }
@@ -26656,7 +26681,7 @@
                 populationShareF:int{48330000}
             }
             territoryF:intvector{
-                60663700,
+                60697700,
                 49946000,
                 56141094,
             }
@@ -26678,7 +26703,7 @@
                 populationShareF:int{46550000}
             }
             territoryF:intvector{
-                59789200,
+                59798500,
                 49672000,
                 57114668,
             }
@@ -26692,7 +26717,7 @@
                 populationShareF:int{49350000}
             }
             territoryF:intvector{
-                60243100,
+                60252900,
                 49424000,
                 57110388,
             }
@@ -26735,7 +26760,7 @@
                 populationShareF:int{48500000}
             }
             territoryF:intvector{
-                60337300,
+                60329100,
                 49954000,
                 55443593,
             }
@@ -26763,7 +26788,7 @@
                 populationShareF:int{49320000}
             }
             territoryF:intvector{
-                60783500,
+                60835000,
                 49912000,
                 57111382,
             }
@@ -26812,7 +26837,7 @@
                 populationShareF:int{49910000}
             }
             territoryF:intvector{
-                62308100,
+                62321900,
                 49904000,
                 58207353,
             }
@@ -26829,7 +26854,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                59906600,
+                59933900,
                 49956000,
                 55329988,
             }
@@ -26849,7 +26874,7 @@
                 populationShareF:int{49170000}
             }
             territoryF:intvector{
-                59643200,
+                59701100,
                 49528000,
                 55758288,
             }
@@ -26859,7 +26884,7 @@
         }
         BV{
             territoryF:intvector{
-                54430400,
+                54444700,
                 49990000,
                 50100000,
             }
@@ -26876,7 +26901,7 @@
                 populationShareF:int{49810000}
             }
             territoryF:intvector{
-                60359000,
+                60395500,
                 49851000,
                 56221486,
             }
@@ -26895,7 +26920,7 @@
                 populationShareF:int{49120000}
             }
             territoryF:intvector{
-                61165400,
+                61175900,
                 49996000,
                 56954975,
             }
@@ -26909,7 +26934,7 @@
                 populationShareF:int{49280000}
             }
             territoryF:intvector{
-                59308800,
+                59323000,
                 49769000,
                 55360346,
             }
@@ -26993,7 +27018,7 @@
                 populationShareF:int{45350000}
             }
             territoryF:intvector{
-                62167400,
+                62176400,
                 49990000,
                 57356237,
             }
@@ -27010,7 +27035,7 @@
                 populationShareF:int{49830000}
             }
             territoryF:intvector{
-                57305000,
+                57316800,
                 49990000,
                 52596000,
             }
@@ -27046,7 +27071,7 @@
                 populationShareF:int{49500000}
             }
             territoryF:intvector{
-                60660100,
+                60679900,
                 49668000,
                 57833012,
             }
@@ -27064,7 +27089,7 @@
                 populationShareF:int{49490000}
             }
             territoryF:intvector{
-                59320600,
+                59339500,
                 49566000,
                 56562512,
             }
@@ -27078,7 +27103,7 @@
                 populationShareF:int{48240000}
             }
             territoryF:intvector{
-                60302700,
+                60291600,
                 49838000,
                 56495467,
             }
@@ -27119,7 +27144,7 @@
                 populationShareF:int{47290000}
             }
             territoryF:intvector{
-                61496300,
+                61516700,
                 49990000,
                 56823630,
             }
@@ -27152,7 +27177,7 @@
                 writingShareF:int{48500000}
             }
             territoryF:intvector{
-                60871200,
+                60962700,
                 49569000,
                 57241848,
             }
@@ -27180,7 +27205,7 @@
                 populationShareF:int{49980000}
             }
             territoryF:intvector{
-                61436100,
+                61452100,
                 49986000,
                 57177893,
             }
@@ -27274,7 +27299,7 @@
                 populationShareF:int{48140000}
             }
             territoryF:intvector{
-                60772400,
+                60815500,
                 49713000,
                 57249949,
             }
@@ -27346,7 +27371,7 @@
                 populationShareF:int{46190000}
             }
             territoryF:intvector{
-                63211400,
+                63231200,
                 49951000,
                 59137930,
             }
@@ -27384,14 +27409,14 @@
                 populationShareF:int{47270000}
             }
             territoryF:intvector{
-                61688000,
+                61712500,
                 49936000,
                 57476985,
             }
         }
         CP{
             territoryF:intvector{
-                54402200,
+                54421100,
                 49990000,
                 50100000,
             }
@@ -27405,7 +27430,7 @@
                 populationShareF:int{49950000}
             }
             territoryF:intvector{
-                60792600,
+                60852000,
                 49963000,
                 56493026,
             }
@@ -27430,7 +27455,7 @@
                 populationShareF:int{49760000}
             }
             territoryF:intvector{
-                59358300,
+                59373400,
                 49849000,
                 55560899,
             }
@@ -27459,7 +27484,7 @@
                 populationShareF:int{49630000}
             }
             territoryF:intvector{
-                58112800,
+                58117200,
                 49990000,
                 53220500,
             }
@@ -27482,7 +27507,7 @@
                 populationShareF:int{47220000}
             }
             territoryF:intvector{
-                60292600,
+                60311900,
                 49987000,
                 56122155,
             }
@@ -27509,7 +27534,7 @@
                 populationShareF:int{49160000}
             }
             territoryF:intvector{
-                61350900,
+                61372600,
                 49990000,
                 57106747,
             }
@@ -27592,7 +27617,7 @@
                 writingShareF:int{48500000}
             }
             territoryF:intvector{
-                62397900,
+                62415000,
                 49990000,
                 57805940,
             }
@@ -27609,7 +27634,7 @@
                 populationShareF:int{49990000}
             }
             territoryF:intvector{
-                57215200,
+                57222300,
                 49990000,
                 52500000,
             }
@@ -27630,7 +27655,7 @@
                 populationShareF:int{49410000}
             }
             territoryF:intvector{
-                59334500,
+                59364000,
                 49679000,
                 55865267,
             }
@@ -27661,7 +27686,7 @@
                 populationShareF:int{49130000}
             }
             territoryF:intvector{
-                61264800,
+                61285500,
                 49990000,
                 56560595,
             }
@@ -27672,7 +27697,7 @@
                 populationShareF:int{49940000}
             }
             territoryF:intvector{
-                58812000,
+                58851000,
                 49940000,
                 54738970,
             }
@@ -27686,7 +27711,7 @@
                 populationShareF:int{49780000}
             }
             territoryF:intvector{
-                61161900,
+                61172600,
                 49901000,
                 57107342,
             }
@@ -27711,7 +27736,7 @@
                 populationShareF:int{48780000}
             }
             territoryF:intvector{
-                61609400,
+                61629300,
                 49726000,
                 57409694,
             }
@@ -27722,7 +27747,7 @@
                 populationShareF:int{49980000}
             }
             territoryF:intvector{
-                59517800,
+                59542000,
                 49977000,
                 55150000,
             }
@@ -27740,7 +27765,7 @@
                 populationShareF:int{48570000}
             }
             territoryF:intvector{
-                61182400,
+                61188500,
                 49916000,
                 57162909,
             }
@@ -27760,7 +27785,7 @@
                 populationShareF:int{49560000}
             }
             territoryF:intvector{
-                60387000,
+                60412000,
                 49998000,
                 56125158,
             }
@@ -27783,7 +27808,7 @@
                 populationShareF:int{49350000}
             }
             territoryF:intvector{
-                62110500,
+                62119900,
                 49739000,
                 57970411,
             }
@@ -27819,7 +27844,7 @@
                 populationShareF:int{48360000}
             }
             territoryF:intvector{
-                59916900,
+                59963100,
                 49689000,
                 56591892,
             }
@@ -27859,7 +27884,7 @@
                 populationShareF:int{48700000}
             }
             territoryF:intvector{
-                62169000,
+                62176900,
                 49977000,
                 57489582,
             }
@@ -27885,7 +27910,7 @@
                 populationShareF:int{48600000}
             }
             territoryF:intvector{
-                61174700,
+                61195800,
                 49390000,
                 58105350,
             }
@@ -27930,7 +27955,7 @@
                 populationShareF:int{49440000}
             }
             territoryF:intvector{
-                61225700,
+                61242400,
                 50100000,
                 56551837,
             }
@@ -27955,7 +27980,7 @@
                 populationShareF:int{47270000}
             }
             territoryF:intvector{
-                59837400,
+                59864700,
                 49937000,
                 55920938,
             }
@@ -27986,7 +28011,7 @@
                 populationShareF:int{49230000}
             }
             territoryF:intvector{
-                58314000,
+                58347000,
                 49890000,
                 55104196,
             }
@@ -28063,7 +28088,7 @@
                 populationShareF:int{48130000}
             }
             territoryF:intvector{
-                62269900,
+                62282600,
                 49990000,
                 57671062,
             }
@@ -28077,7 +28102,7 @@
                 populationShareF:int{48900000}
             }
             territoryF:intvector{
-                60359800,
+                60367500,
                 49890000,
                 56177226,
             }
@@ -28135,7 +28160,7 @@
                 populationShareF:int{47510000}
             }
             territoryF:intvector{
-                62278800,
+                62288000,
                 49990000,
                 57647695,
             }
@@ -28152,7 +28177,7 @@
                 populationShareF:int{49960000}
             }
             territoryF:intvector{
-                59151100,
+                59159000,
                 49960000,
                 55111724,
             }
@@ -28180,7 +28205,7 @@
                 populationShareF:int{48900000}
             }
             territoryF:intvector{
-                60372700,
+                60393200,
                 49997000,
                 56492633,
             }
@@ -28252,7 +28277,7 @@
                 populationShareF:int{46150000}
             }
             territoryF:intvector{
-                61120800,
+                61130200,
                 49715000,
                 57274999,
             }
@@ -28294,7 +28319,7 @@
                 populationShareF:int{49290000}
             }
             territoryF:intvector{
-                59338700,
+                59358200,
                 49511000,
                 56205136,
             }
@@ -28320,7 +28345,7 @@
                 populationShareF:int{49110000}
             }
             territoryF:intvector{
-                60160800,
+                60264500,
                 49410000,
                 57124139,
             }
@@ -28356,7 +28381,7 @@
                 populationShareF:int{44100000}
             }
             territoryF:intvector{
-                60317700,
+                60293800,
                 49942000,
                 55778358,
             }
@@ -28388,7 +28413,7 @@
                 populationShareF:int{46930000}
             }
             territoryF:intvector{
-                61290500,
+                61299500,
                 49973000,
                 57107685,
             }
@@ -28401,7 +28426,7 @@
         }
         GS{
             territoryF:intvector{
-                55860900,
+                55889300,
                 49990000,
                 51200000,
             }
@@ -28420,7 +28445,7 @@
                 populationShareF:int{48700000}
             }
             territoryF:intvector{
-                61131800,
+                61138300,
                 49759000,
                 57154607,
             }
@@ -28449,7 +28474,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                59285100,
+                59307100,
                 49553000,
                 56179234,
             }
@@ -28460,7 +28485,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                59609300,
+                59636700,
                 49918000,
                 55737718,
             }
@@ -28471,7 +28496,7 @@
                 populationShareF:int{49510000}
             }
             territoryF:intvector{
-                61427400,
+                61453000,
                 49935000,
                 56719150,
             }
@@ -28488,7 +28513,7 @@
         }
         HM{
             territoryF:intvector{
-                54511800,
+                54531600,
                 49990000,
                 50100000,
             }
@@ -28506,7 +28531,7 @@
                 populationShareF:int{49780000}
             }
             territoryF:intvector{
-                60431900,
+                60456800,
                 49851000,
                 56903874,
             }
@@ -28524,7 +28549,7 @@
                 populationShareF:int{48160000}
             }
             territoryF:intvector{
-                60942400,
+                61100200,
                 49989000,
                 56429210,
             }
@@ -28540,7 +28565,7 @@
                 populationShareF:int{49810000}
             }
             territoryF:intvector{
-                60193400,
+                60198800,
                 49487000,
                 57106467,
             }
@@ -28572,7 +28597,7 @@
                 populationShareF:int{46510000}
             }
             territoryF:intvector{
-                61267600,
+                61283600,
                 49990000,
                 56985085,
             }
@@ -28583,7 +28608,7 @@
                 populationShareF:int{49980000}
             }
             territoryF:intvector{
-                60724400,
+                60758300,
                 49977000,
                 56209859,
             }
@@ -28681,7 +28706,7 @@
                 populationShareF:int{46920000}
             }
             territoryF:intvector{
-                62302800,
+                62324300,
                 49928000,
                 58260581,
             }
@@ -28702,7 +28727,7 @@
                 populationShareF:int{49220000}
             }
             territoryF:intvector{
-                61322000,
+                61344800,
                 49990000,
                 56501110,
             }
@@ -28741,7 +28766,7 @@
                 populationShareF:int{49110000}
             }
             territoryF:intvector{
-                61297000,
+                61315600,
                 49971000,
                 56829971,
             }
@@ -29007,7 +29032,7 @@
                 populationShareF:int{48720000}
             }
             territoryF:intvector{
-                62872100,
+                62944700,
                 49628000,
                 59128194,
             }
@@ -29042,7 +29067,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                58150700,
+                58155600,
                 49990000,
                 53350000,
             }
@@ -29073,7 +29098,7 @@
                 populationShareF:int{47500000}
             }
             territoryF:intvector{
-                61596700,
+                61660700,
                 49785000,
                 57391921,
             }
@@ -29144,7 +29169,7 @@
                 populationShareF:int{48370000}
             }
             territoryF:intvector{
-                62145900,
+                62163100,
                 49850000,
                 57820216,
             }
@@ -29161,7 +29186,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                60161500,
+                60177300,
                 49990000,
                 55339747,
             }
@@ -29227,7 +29252,7 @@
                 populationShareF:int{47170000}
             }
             territoryF:intvector{
-                62222100,
+                62230700,
                 49990000,
                 57621378,
             }
@@ -29255,7 +29280,7 @@
                 populationShareF:int{49950000}
             }
             territoryF:intvector{
-                60253900,
+                60262000,
                 49870000,
                 56299056,
             }
@@ -29269,7 +29294,7 @@
                 populationShareF:int{49450000}
             }
             territoryF:intvector{
-                60861900,
+                60890500,
                 49959000,
                 57102481,
             }
@@ -29287,7 +29312,7 @@
                 writingShareF:int{48500000}
             }
             territoryF:intvector{
-                62493200,
+                62540500,
                 49990000,
                 58126451,
             }
@@ -29361,7 +29386,7 @@
                 populationShareF:int{47740000}
             }
             territoryF:intvector{
-                61152700,
+                61163400,
                 49874000,
                 57476157,
             }
@@ -29376,7 +29401,7 @@
                 populationShareF:int{49360000}
             }
             territoryF:intvector{
-                60210100,
+                60226400,
                 49992000,
                 56578912,
             }
@@ -29393,7 +29418,7 @@
                 populationShareF:int{49890000}
             }
             territoryF:intvector{
-                60589400,
+                60642100,
                 49739000,
                 57162045,
             }
@@ -29408,7 +29433,7 @@
                 populationShareF:int{49600000}
             }
             territoryF:intvector{
-                58211000,
+                58224000,
                 49900000,
                 55108145,
             }
@@ -29423,7 +29448,7 @@
                 populationShareF:int{49560000}
             }
             territoryF:intvector{
-                59125900,
+                59132300,
                 49755000,
                 55808080,
             }
@@ -29442,7 +29467,7 @@
                 populationShareF:int{49980000}
             }
             territoryF:intvector{
-                59142700,
+                59152800,
                 49978000,
                 54527150,
             }
@@ -29464,7 +29489,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                62192900,
+                62202700,
                 49979000,
                 57511813,
             }
@@ -29475,7 +29500,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                61301100,
+                61302500,
                 49939000,
                 56287542,
             }
@@ -29507,7 +29532,7 @@
                 populationShareF:int{49720000}
             }
             territoryF:intvector{
-                61460700,
+                61474300,
                 49997000,
                 57185567,
             }
@@ -29527,7 +29552,7 @@
                 populationShareF:int{49690000}
             }
             territoryF:intvector{
-                60409600,
+                60492100,
                 49727000,
                 56712671,
             }
@@ -29550,7 +29575,7 @@
                 populationShareF:int{48160000}
             }
             territoryF:intvector{
-                60851600,
+                60878900,
                 49896000,
                 56622979,
             }
@@ -29561,7 +29586,7 @@
                 populationShareF:int{49900000}
             }
             territoryF:intvector{
-                59208300,
+                59238400,
                 49901000,
                 55164994,
             }
@@ -29598,7 +29623,7 @@
                 populationShareF:int{49150000}
             }
             territoryF:intvector{
-                61236700,
+                61278200,
                 49912000,
                 57224094,
             }
@@ -29615,7 +29640,7 @@
                 populationShareF:int{47480000}
             }
             territoryF:intvector{
-                59388100,
+                59390600,
                 49608000,
                 56468902,
             }
@@ -29639,7 +29664,7 @@
                 populationShareF:int{49980000}
             }
             territoryF:intvector{
-                59601900,
+                59744800,
                 49896000,
                 56195804,
             }
@@ -29668,7 +29693,7 @@
                 populationShareF:int{0}
             }
             territoryF:intvector{
-                60856200,
+                60906300,
                 49997000,
                 56282386,
             }
@@ -29694,7 +29719,7 @@
                 populationShareF:int{49160000}
             }
             territoryF:intvector{
-                60587400,
+                60643900,
                 50100000,
                 55594130,
             }
@@ -29714,7 +29739,7 @@
                 populationShareF:int{49380000}
             }
             territoryF:intvector{
-                60506500,
+                60534700,
                 49998000,
                 56194464,
             }
@@ -29725,7 +29750,7 @@
                 populationShareF:int{49740000}
             }
             territoryF:intvector{
-                60908900,
+                60631400,
                 49895000,
                 56665321,
             }
@@ -29763,7 +29788,7 @@
                 populationShareF:int{48870000}
             }
             territoryF:intvector{
-                61282800,
+                61300100,
                 49671000,
                 57339867,
             }
@@ -29802,7 +29827,7 @@
                 populationShareF:int{48300000}
             }
             territoryF:intvector{
-                60185400,
+                60200700,
                 49990000,
                 56347412,
             }
@@ -29822,7 +29847,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                60106100,
+                60108600,
                 49985000,
                 55642550,
             }
@@ -29852,7 +29877,7 @@
                 populationShareF:int{49900000}
             }
             territoryF:intvector{
-                60368600,
+                60398100,
                 49645000,
                 57250542,
             }
@@ -29867,7 +29892,7 @@
                 populationShareF:int{49730000}
             }
             territoryF:intvector{
-                58180000,
+                58189000,
                 49937000,
                 54745390,
             }
@@ -29882,7 +29907,7 @@
                 populationShareF:int{49250000}
             }
             territoryF:intvector{
-                60295200,
+                60315500,
                 49974000,
                 56210372,
             }
@@ -29932,7 +29957,7 @@
                 populationShareF:int{48590000}
             }
             territoryF:intvector{
-                60380900,
+                60409800,
                 49334000,
                 57178852,
             }
@@ -29958,7 +29983,7 @@
                 populationShareF:int{48640000}
             }
             territoryF:intvector{
-                61311100,
+                61330900,
                 49927000,
                 57551238,
             }
@@ -29975,7 +30000,7 @@
                 populationShareF:int{47130000}
             }
             territoryF:intvector{
-                60370000,
+                60384000,
                 49974000,
                 56306824,
             }
@@ -29995,7 +30020,7 @@
                 populationShareF:int{48500000}
             }
             territoryF:intvector{
-                60632200,
+                60735800,
                 49956000,
                 55601969,
             }
@@ -30044,7 +30069,7 @@
                 populationShareF:int{49170000}
             }
             territoryF:intvector{
-                60167100,
+                60173700,
                 49586000,
                 56375857,
             }
@@ -30079,7 +30104,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                60163200,
+                60185300,
                 49924000,
                 55416338,
             }
@@ -30103,7 +30128,7 @@
                 populationShareF:int{48250000}
             }
             territoryF:intvector{
-                60258500,
+                60274400,
                 49888000,
                 56135639,
             }
@@ -30117,7 +30142,7 @@
                 populationShareF:int{49940000}
             }
             territoryF:intvector{
-                59540700,
+                59689600,
                 49984000,
                 55392709,
             }
@@ -30132,7 +30157,7 @@
                 populationShareF:int{49630000}
             }
             territoryF:intvector{
-                60212000,
+                60224700,
                 49748000,
                 57191962,
             }
@@ -30170,7 +30195,7 @@
                 populationShareF:int{44700000}
             }
             territoryF:intvector{
-                62230700,
+                62240600,
                 49935000,
                 58124575,
             }
@@ -30208,7 +30233,7 @@
                 populationShareF:int{48420000}
             }
             territoryF:intvector{
-                61863000,
+                61926100,
                 49931000,
                 57313820,
             }
@@ -30246,7 +30271,7 @@
                 populationShareF:int{46350000}
             }
             territoryF:intvector{
-                60350100,
+                60373900,
                 49561000,
                 57265737,
             }
@@ -30287,7 +30312,7 @@
                 populationShareF:int{49210000}
             }
             territoryF:intvector{
-                60259900,
+                60270200,
                 49888000,
                 56248478,
             }
@@ -30324,7 +30349,7 @@
                 populationShareF:int{49410000}
             }
             territoryF:intvector{
-                60201500,
+                60216200,
                 49287000,
                 57192453,
             }
@@ -30341,7 +30366,7 @@
                 populationShareF:int{49760000}
             }
             territoryF:intvector{
-                58113100,
+                58117500,
                 49990000,
                 53221000,
             }
@@ -30392,7 +30417,7 @@
                 populationShareF:int{49210000}
             }
             territoryF:intvector{
-                62108900,
+                62111800,
                 49613000,
                 58190632,
             }
@@ -30411,7 +30436,7 @@
                 populationShareF:int{49780000}
             }
             territoryF:intvector{
-                60335500,
+                60362200,
                 49780000,
                 56602595,
             }
@@ -30454,7 +30479,7 @@
                 populationShareF:int{48120000}
             }
             territoryF:intvector{
-                61870800,
+                61915200,
                 49990000,
                 57170847,
             }
@@ -30479,7 +30504,7 @@
                 populationShareF:int{47290000}
             }
             territoryF:intvector{
-                61364700,
+                61375900,
                 50100000,
                 56532005,
             }
@@ -30557,7 +30582,7 @@
                 populationShareF:int{47120000}
             }
             territoryF:intvector{
-                60715200,
+                60785500,
                 49574000,
                 57293843,
             }
@@ -30593,7 +30618,7 @@
                 populationShareF:int{49710000}
             }
             territoryF:intvector{
-                58150800,
+                58159000,
                 49990000,
                 53964200,
             }
@@ -30623,7 +30648,7 @@
                 populationShareF:int{48280000}
             }
             territoryF:intvector{
-                61174800,
+                61185700,
                 49990000,
                 56451033,
             }
@@ -30640,7 +30665,7 @@
                 populationShareF:int{47940000}
             }
             territoryF:intvector{
-                61173100,
+                61187900,
                 49869000,
                 56342439,
             }
@@ -30654,7 +30679,7 @@
                 populationShareF:int{49690000}
             }
             territoryF:intvector{
-                60931200,
+                60994300,
                 49941000,
                 56375314,
             }
@@ -30675,7 +30700,7 @@
                 populationShareF:int{49150000}
             }
             territoryF:intvector{
-                61410400,
+                61424600,
                 49896000,
                 57310367,
             }
@@ -30709,7 +30734,7 @@
                 writingShareF:int{48500000}
             }
             territoryF:intvector{
-                60280200,
+                60308400,
                 49624000,
                 56690970,
             }
@@ -30783,7 +30808,7 @@
                 populationShareF:int{45960000}
             }
             territoryF:intvector{
-                61801900,
+                61874500,
                 49954000,
                 58104256,
             }
@@ -30867,7 +30892,7 @@
                 populationShareF:int{48910000}
             }
             territoryF:intvector{
-                61988200,
+                62105600,
                 49549000,
                 58204925,
             }
@@ -30912,7 +30937,7 @@
                 populationShareF:int{48130000}
             }
             territoryF:intvector{
-                62105200,
+                62111100,
                 49997000,
                 57384763,
             }
@@ -30940,7 +30965,7 @@
                 populationShareF:int{49850000}
             }
             territoryF:intvector{
-                56232400,
+                56240100,
                 49990000,
                 51540000,
             }
@@ -30955,7 +30980,7 @@
                 populationShareF:int{49870000}
             }
             territoryF:intvector{
-                61131000,
+                61127300,
                 49903000,
                 56335183,
             }
@@ -30989,7 +31014,7 @@
                 populationShareF:int{49960000}
             }
             territoryF:intvector{
-                61297100,
+                61311300,
                 49954000,
                 57108395,
             }
@@ -31004,7 +31029,7 @@
                 populationShareF:int{49740000}
             }
             territoryF:intvector{
-                58276000,
+                58301000,
                 49920000,
                 54214310,
             }
@@ -31022,7 +31047,7 @@
                 populationShareF:int{49800000}
             }
             territoryF:intvector{
-                60646700,
+                60680500,
                 49939000,
                 56694374,
             }
@@ -31039,7 +31064,7 @@
                 populationShareF:int{47280000}
             }
             territoryF:intvector{
-                61334500,
+                61341700,
                 49963000,
                 56231431,
             }
@@ -31094,7 +31119,7 @@
                 populationShareF:int{47120000}
             }
             territoryF:intvector{
-                61441000,
+                61474000,
                 49977000,
                 57215300,
             }
@@ -31132,7 +31157,7 @@
                 writingShareF:int{48500000}
             }
             territoryF:intvector{
-                61101800,
+                61106600,
                 49980000,
                 56711102,
             }
@@ -31254,7 +31279,7 @@
                 populationShareF:int{45350000}
             }
             territoryF:intvector{
-                62374500,
+                62400000,
                 49997000,
                 58142258,
             }
@@ -31291,7 +31316,7 @@
                 populationShareF:int{49770000}
             }
             territoryF:intvector{
-                60219700,
+                60246100,
                 49711000,
                 57119015,
             }
@@ -31302,7 +31327,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                62173100,
+                62178900,
                 49872000,
                 57285718,
             }
@@ -31316,7 +31341,7 @@
                 populationShareF:int{48150000}
             }
             territoryF:intvector{
-                59119800,
+                59131700,
                 49841000,
                 55647581,
             }
@@ -31334,7 +31359,7 @@
                 populationShareF:int{49600000}
             }
             territoryF:intvector{
-                59260800,
+                59271200,
                 49918000,
                 54939200,
             }
@@ -31364,7 +31389,7 @@
                 populationShareF:int{47990000}
             }
             territoryF:intvector{
-                61176300,
+                61186800,
                 49719000,
                 57373459,
             }
@@ -31404,7 +31429,7 @@
                 populationShareF:int{49950000}
             }
             territoryF:intvector{
-                61498100,
+                61521700,
                 49990000,
                 56996049,
             }
@@ -31432,7 +31457,7 @@
                 populationShareF:int{48210000}
             }
             territoryF:intvector{
-                61487900,
+                61513700,
                 49959000,
                 56588893,
             }
@@ -31473,7 +31498,7 @@
                 populationShareF:int{49870000}
             }
             territoryF:intvector{
-                60683500,
+                60703600,
                 49997000,
                 56197213,
             }
@@ -31487,7 +31512,7 @@
                 populationShareF:int{49450000}
             }
             territoryF:intvector{
-                58182800,
+                58188400,
                 50100000,
                 53266700,
             }
@@ -31513,7 +31538,7 @@
                 populationShareF:int{49900000}
             }
             territoryF:intvector{
-                61168800,
+                61178700,
                 49996000,
                 56544583,
             }
@@ -31537,7 +31562,7 @@
                 populationShareF:int{49260000}
             }
             territoryF:intvector{
-                60106400,
+                60117500,
                 49433000,
                 56616320,
             }
@@ -31551,7 +31576,7 @@
                 populationShareF:int{49890000}
             }
             territoryF:intvector{
-                59202300,
+                59208300,
                 49960000,
                 54335370,
             }
@@ -31610,7 +31635,7 @@
                 populationShareF:int{49110000}
             }
             territoryF:intvector{
-                60397200,
+                60430700,
                 49497000,
                 57146685,
             }
@@ -31641,7 +31666,7 @@
                 populationShareF:int{48200000}
             }
             territoryF:intvector{
-                59471900,
+                60174700,
                 49378000,
                 57110314,
             }
@@ -31656,7 +31681,7 @@
                 populationShareF:int{49680000}
             }
             territoryF:intvector{
-                59854700,
+                59792800,
                 49947000,
                 55591919,
             }
@@ -31676,7 +31701,7 @@
                 populationShareF:int{48560000}
             }
             territoryF:intvector{
-                60208800,
+                60197500,
                 49270000,
                 57130261,
             }
@@ -31687,7 +31712,7 @@
                 populationShareF:int{49850000}
             }
             territoryF:intvector{
-                58694000,
+                58682000,
                 49695000,
                 55201025,
             }
@@ -31698,7 +31723,7 @@
                 populationShareF:int{49890000}
             }
             territoryF:intvector{
-                60547900,
+                60569000,
                 49845000,
                 56617201,
             }
@@ -31759,7 +31784,7 @@
                 populationShareF:int{49580000}
             }
             territoryF:intvector{
-                60110600,
+                60113400,
                 49878000,
                 56146715,
             }
@@ -31775,7 +31800,7 @@
                 populationShareF:int{49990000}
             }
             territoryF:intvector{
-                57118400,
+                57122300,
                 49990000,
                 52275000,
             }
@@ -31801,7 +31826,7 @@
                 populationShareF:int{49260000}
             }
             territoryF:intvector{
-                60305900,
+                60296400,
                 49354000,
                 57120760,
             }
@@ -31812,7 +31837,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                56563100,
+                56589600,
                 49990000,
                 52140000,
             }
@@ -31830,7 +31855,7 @@
                 populationShareF:int{48130000}
             }
             territoryF:intvector{
-                60116100,
+                60124300,
                 49604000,
                 56796506,
             }
@@ -31871,7 +31896,7 @@
                 writingShareF:int{48500000}
             }
             territoryF:intvector{
-                62116100,
+                62122900,
                 49935000,
                 57684141,
             }
@@ -31899,7 +31924,7 @@
                 populationShareF:int{49120000}
             }
             territoryF:intvector{
-                60258100,
+                60276700,
                 49997000,
                 56846856,
             }
@@ -31931,7 +31956,7 @@
                 populationShareF:int{49590000}
             }
             territoryF:intvector{
-                59497500,
+                59621100,
                 49583000,
                 56129136,
             }
@@ -31948,7 +31973,7 @@
                 populationShareF:int{49120000}
             }
             territoryF:intvector{
-                60947200,
+                61103500,
                 49996000,
                 56535128,
             }
@@ -31973,7 +31998,7 @@
                 populationShareF:int{49740000}
             }
             territoryF:intvector{
-                61130800,
+                61135900,
                 49791000,
                 57114038,
             }
@@ -31984,7 +32009,7 @@
                 populationShareF:int{49280000}
             }
             territoryF:intvector{
-                58557000,
+                58587000,
                 49990000,
                 55106479,
             }
@@ -32053,7 +32078,7 @@
                 writingShareF:int{48500000}
             }
             territoryF:intvector{
-                62167000,
+                62213300,
                 49941000,
                 57808452,
             }
@@ -32080,7 +32105,7 @@
                 populationShareF:int{47340000}
             }
             territoryF:intvector{
-                60435700,
+                60427800,
                 49988000,
                 56121821,
             }
@@ -32091,7 +32116,7 @@
                 populationShareF:int{48970000}
             }
             territoryF:intvector{
-                57390000,
+                57420000,
                 49950000,
                 54110520,
             }
@@ -32102,7 +32127,7 @@
         }
         TW{
             territoryF:intvector{
-                62112700,
+                62117500,
                 49961000,
                 57235084,
             }
@@ -32165,7 +32190,7 @@
                 populationShareF:int{49900000}
             }
             territoryF:intvector{
-                61150600,
+                61162800,
                 49678000,
                 57539509,
             }
@@ -32203,7 +32228,7 @@
                 populationShareF:int{48120000}
             }
             territoryF:intvector{
-                61352600,
+                61366400,
                 49997000,
                 57440339,
             }
@@ -32255,7 +32280,7 @@
                 populationShareF:int{48390000}
             }
             territoryF:intvector{
-                60849300,
+                60886100,
                 49732000,
                 57395701,
             }
@@ -32272,7 +32297,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                57179600,
+                57187300,
                 49990000,
                 52316000,
             }
@@ -32341,7 +32366,7 @@
                 populationShareF:int{47240000}
             }
             territoryF:intvector{
-                63185600,
+                63193600,
                 49990000,
                 58326626,
             }
@@ -32361,7 +32386,7 @@
                 populationShareF:int{49880000}
             }
             territoryF:intvector{
-                60732500,
+                60784100,
                 49981000,
                 56336015,
             }
@@ -32374,7 +32399,7 @@
                 populationShareF:int{49140000}
             }
             territoryF:intvector{
-                61202300,
+                61221700,
                 49994000,
                 57297489,
             }
@@ -32399,7 +32424,7 @@
                 populationShareF:int{49820000}
             }
             territoryF:intvector{
-                57357400,
+                57371300,
                 50100000,
                 53100000,
             }
@@ -32410,7 +32435,7 @@
                 populationShareF:int{49960000}
             }
             territoryF:intvector{
-                59124100,
+                59128100,
                 49960000,
                 55102089,
             }
@@ -32421,7 +32446,7 @@
                 populationShareF:int{49820000}
             }
             territoryF:intvector{
-                61468600,
+                61389400,
                 49955000,
                 57313040,
             }
@@ -32454,7 +32479,7 @@
                 populationShareF:int{46890000}
             }
             territoryF:intvector{
-                61594900,
+                61643900,
                 49934000,
                 57961602,
             }
@@ -32480,7 +32505,7 @@
                 populationShareF:int{49500000}
             }
             territoryF:intvector{
-                58723000,
+                58787000,
                 49832000,
                 55282814,
             }
@@ -32512,7 +32537,7 @@
                 populationShareF:int{50100000}
             }
             territoryF:intvector{
-                59104600,
+                59113000,
                 49988000,
                 55200108,
             }
@@ -32534,7 +32559,7 @@
                 populationShareF:int{48500000}
             }
             territoryF:intvector{
-                60184900,
+                60193800,
                 49919000,
                 56189525,
             }
@@ -32548,7 +32573,7 @@
                 populationShareF:int{48900000}
             }
             territoryF:intvector{
-                60734500,
+                60689500,
                 49653000,
                 57280368,
             }
@@ -32613,7 +32638,7 @@
                 populationShareF:int{45180000}
             }
             territoryF:intvector{
-                61739100,
+                61757300,
                 49930000,
                 57548416,
             }
@@ -32658,7 +32683,7 @@
                 populationShareF:int{49150000}
             }
             territoryF:intvector{
-                60651700,
+                60689000,
                 49614000,
                 57159720,
             }
@@ -32689,7 +32714,7 @@
                 populationShareF:int{49810000}
             }
             territoryF:intvector{
-                60283300,
+                60338700,
                 49836000,
                 57138051,
             }
@@ -35203,7 +35228,7 @@
             86400000,
         }
         BD:intvector{
-            6,
+            1,
             1,
             7,
             0,
diff --git a/icu4c/source/data/misc/zoneinfo64.txt b/icu4c/source/data/misc/zoneinfo64.txt
index 43ea032..519db6f 100644
--- a/icu4c/source/data/misc/zoneinfo64.txt
+++ b/icu4c/source/data/misc/zoneinfo64.txt
@@ -3,10 +3,10 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 //---------------------------------------------------------
 // Build tool:  tz2icu
-// Build date:  Tue May  8 20:49:43 2018
+// Build date:  Fri May  4 16:06:17 2018
 // tz database: ftp://ftp.iana.org/tz/
 // tz version:  2018e
-// ICU version: 60.2
+// ICU version: 61.1
 //---------------------------------------------------------
 // >> !!! >>   THIS IS A MACHINE-GENERATED FILE   << !!! <<
 // >> !!! >>>            DO NOT EDIT             <<< !!! <<
diff --git a/icu4c/source/data/rbnf/ccp.txt b/icu4c/source/data/rbnf/ccp.txt
new file mode 100644
index 0000000..63384ff
--- /dev/null
+++ b/icu4c/source/data/rbnf/ccp.txt
@@ -0,0 +1,55 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+ccp{
+    RBNFRules{
+        SpelloutRules{
+            "%spellout-numbering-year:",
+            "0: =%spellout-numbering=;",
+            "%spellout-numbering:",
+            "0: =%spellout-cardinal=;",
+            "%spellout-cardinal:",
+            "-x: \U0001111C\U00011122\U00011127\U00011107\U00011134 >>;",
+            "x.x: << \U0001111C\U0001112A\U00011118\U0001112E >>;",
+            "Inf: \U00011103\U00011127\U0001111C\U0001112A\U00011122\U00011127\U0001111A\U00011134\U00011118\U00011128;",
+            "NaN: \U0001111A\U00011118 \U0001111A\U00011127\U00011120\U00011134;",
+            "0: \U00011125\U0001112A\U0001111A\U00011133\U00011120\U00011134\U00011127;",
+            "1: \U00011106\U00011107\U00011134;",
+            "2: \U00011118\U00011128;",
+            "3: \U00011116\U00011128\U0001111A\U00011134;",
+            "4: \U0001110C\U00011133\U00011106\U0001112C\U00011122\U00011134;",
+            "5: \U0001111B\U0001110C\U00011134;",
+            "6: \U0001110D\U00011127;",
+            "7: \U00011125\U00011116\U00011134;",
+            "8: \U00011103\U00011116\U00011133\U00011120\U00011134\U00011127;",
+            "9: \U0001111A\U00011127;",
+            "10: \U00011118\U00011127\U0001110C\U00011134;",
+            "11: \U00011106\U00011109\U00011122\U00011127;",
+            "12: \U0001111D\U00011122\U00011133\U00011126\U00011127;",
+            "13: \U00011116\U0001112C\U00011122\U00011133\U00011126\U00011127;",
+            "14: \U0001110C\U0001112E\U00011116\U00011134\U00011119\U0001112E;",
+            "15: \U0001111B\U00011127\U0001111A\U00011134\U00011118\U00011133\U00011122\U00011127;",
+            "16: \U00011125\U0001112A\U00011123\U0001112E;",
+            "17: \U00011125\U00011127\U00011116\U00011134\U00011127\U00011122\U00011127;",
+            "18: \U00011103\U00011118\U00011127\U00011122\U00011133\U00011126\U00011127;",
+            "19: \U00011103\U0001112A\U0001111A\U00011134\U0001112E\U0001110C\U00011134;",
+            "20: \U00011107\U0001112A\U00011122\U00011128[ >>];",
+            "30: \U00011116\U00011133\U00011122\U00011128\U0001110C\U00011134[ >>];",
+            "40: \U0001110C\U00011123\U00011128\U00011128\U0001110C\U00011134[ >>];",
+            "50: \U0001111B\U00011127\U0001111A\U00011134\U0001110E\U0001110C\U00011134[ >>];",
+            "60: \U00011126\U0001112C\U00011116\U00011134[ >>];",
+            "70: \U00011126\U0001112E\U00011116\U00011134\U0001112A\U00011122\U00011134[ >>];",
+            "80: \U00011103\U0001110E\U00011128[ >>];",
+            "90: \U0001111A\U00011127\U0001111B\U00011134\U0001111D\U00011130[ >>];",
+            "100: <<\U00011125\U00011127[ >>];",
+            "1000: << \U00011126\U0001110E\U00011122\U00011134[ >>];",
+            "100000: << \U00011123\U00011107\U00011134[ >>];",
+            "10000000: << \U00011107\U0001112A\U00011116\U00011128[ >>];",
+            "100000000000000000: =#,##,##0=;",
+            "%spellout-ordinal:",
+            "-x: \U0001111C\U00011122\U00011127\U00011107\U00011134 >>;",
+            "x.x: =#,##,##0.0=;",
+            "0: =%spellout-numbering= \U0001111B\U00011133\U00011106\U00011118\U00011133\U00011120\U0001112C;",
+        }
+    }
+    Version{"2.1.38.68"}
+}
diff --git a/icu4c/source/data/rbnf/ff.txt b/icu4c/source/data/rbnf/ff.txt
new file mode 100644
index 0000000..fb4fb22
--- /dev/null
+++ b/icu4c/source/data/rbnf/ff.txt
@@ -0,0 +1,89 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+ff{
+    RBNFRules{
+        SpelloutRules{
+            "%spellout-numbering-year:",
+            "x.x: =0.0=;",
+            "0: =%spellout-numbering=;",
+            "%spellout-numbering:",
+            "0: =%spellout-cardinal=;",
+            "%spellout-cardinal:",
+            "NaN: alaa limoore;",
+            "Inf: infinity;",
+            "-x: minus >>;",
+            "x.x: << poofirgel >>;",
+            "0: \u0253olum;",
+            "1: go\u02BCo;",
+            "2: \u0257i\u0257i;",
+            "3: tati;",
+            "4: nawi;",
+            "5: jowi;",
+            "6: jeego\u02BCo;",
+            "7: jee\u0257i\u0257i;",
+            "8: jeetati;",
+            "9: jeenawi;",
+            "10: sappo[ e >>];",
+            "20: noogas[ e >>];",
+            "30: cepanze <<[ e >>];",
+            "100: temedere <<[ e >>];",
+            "1000: ujunere <<[ e >>];",
+            "1000000: miliyo <<[, >>];",
+            "1000000000: miliyaari <<[, >>];",
+            "1000000000000: biliyo <<[, >>];",
+            "1000000000000000: biliyaari <<[, >>];",
+            "1000000000000000000: =#,##0=;",
+            "%spellout-cardinal-class-o:",
+            "NaN: alaa limoore;",
+            "Inf: infinity;",
+            "-x: minus >>;",
+            "x.x: << poofirgel >>;",
+            "0: \u0253olum;",
+            "1: gooto;",
+            "2: \u0257i\u0257o;",
+            "3: tato;",
+            "4: nawo;",
+            "5: njowo;",
+            "6: jeegomo;",
+            "7: jee\u0257i\u0257o;",
+            "8: jeetato;",
+            "9: jeenawo;",
+            "10: sappo[ e >>];",
+            "20: noogas[ e >>];",
+            "30: cepanze <<[ e >>];",
+            "100: temedere <<[ e >>];",
+            "1000: ujunere <<[ e >>];",
+            "1000000: miliyo <<[, >>];",
+            "1000000000: miliyaari <<[, >>];",
+            "1000000000000: biliyo <<[, >>];",
+            "1000000000000000: biliyaari <<[, >>];",
+            "1000000000000000000: =#,##0=;",
+            "%spellout-ordinal:",
+            "NaN: alaa limoore;",
+            "Inf: infinity;",
+            "-x: minus >>;",
+            "x.x: =#,##0.0=;",
+            "0: \u0253olum;",
+            "1: arande;",
+            "2: \u0257i\u0257a\u0253o;",
+            "3: tatia\u0253o;",
+            "4: nawa\u0253o;",
+            "5: jowa\u0253o;",
+            "6: jeearande;",
+            "7: jee\u0257i\u0257a\u0253o;",
+            "8: jeetata\u0253o;",
+            "9: jeenawa\u0253o;",
+            "10: sappo[ e >>];",
+            "20: noogas[ e >>];",
+            "30: cepanze <<[ e >>];",
+            "100: temedere <<[ e >>];",
+            "1000: ujunere <<[ e >>];",
+            "1000000: miliyo <<[, >>];",
+            "1000000000: miliyaari <<[, >>];",
+            "1000000000000: biliyo <<[, >>];",
+            "1000000000000000: biliyaari <<[, >>];",
+            "1000000000000000000: =#,##0=;",
+        }
+    }
+    Version{"2.1.38.68"}
+}
diff --git a/icu4c/source/data/rbnf/he.txt b/icu4c/source/data/rbnf/he.txt
index 3ec09a1..b50dd3b 100644
--- a/icu4c/source/data/rbnf/he.txt
+++ b/icu4c/source/data/rbnf/he.txt
@@ -207,7 +207,7 @@
             "x.x: <%%spellout-numbering-m< \u05E0\u05E7\u05D5\u05D3\u05D4 >> ;",
             "0: \u05D0\u05E4\u05E1;",
             "1: \u05D0\u05D7\u05D3;",
-            "2: \u05E9\u05E0\u05D9\u05D9\u05DD;",
+            "2: \u05E9\u05E0\u05D9;",
             "3: \u05E9\u05DC\u05D5\u05E9\u05D4;",
             "4: \u05D0\u05E8\u05D1\u05E2\u05D4;",
             "5: \u05D7\u05DE\u05D9\u05E9\u05D4;",
@@ -248,6 +248,18 @@
             "3000000000000000: <%%spellout-numbering-m< \u05D8\u05E8\u05D9\u05DC\u05D9\u05D5\u05DF[ >%%and-masculine>];",
             "1000000000000000000: =#,##0=;",
             "%spellout-cardinal-feminine:",
+            "-x: \u05DE\u05D9\u05E0\u05D5\u05E1 >>;",
+            "x.x: << \u05E0\u05E7\u05D5\u05D3\u05D4 >>;",
+            "0: =%spellout-numbering=;",
+            "2: \u05E9\u05EA\u05D9;",
+            "3: =%spellout-numbering=;",
+            "%spellout-cardinal-masculine-standalone:",
+            "-x: \u05DE\u05D9\u05E0\u05D5\u05E1 >>;",
+            "x.x: <%%spellout-numbering-m< \u05E0\u05E7\u05D5\u05D3\u05D4 >> ;",
+            "0: =%spellout-cardinal-masculine=;",
+            "2: \u05E9\u05E0\u05D9\u05D9\u05DD;",
+            "3: =%spellout-cardinal-masculine=;",
+            "%spellout-cardinal-feminine-standalone:",
             "0: =%spellout-numbering=;",
             "%spellout-construct-masculine:",
             "-x: \u05DE\u05D9\u05E0\u05D5\u05E1 >>;",
@@ -300,5 +312,5 @@
             "11: =%spellout-numbering=;",
         }
     }
-    Version{"2.1.27.22"}
+    Version{"2.1.38.34"}
 }
diff --git a/icu4c/source/data/rbnf/lb.txt b/icu4c/source/data/rbnf/lb.txt
new file mode 100644
index 0000000..a8fbb7c
--- /dev/null
+++ b/icu4c/source/data/rbnf/lb.txt
@@ -0,0 +1,205 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+lb{
+    RBNFRules{
+        SpelloutRules{
+            "%spellout-numbering-year:",
+            "Inf: \u00C9iwegkeet;",
+            "NaN: net eng Nummer;",
+            "-x: minus >>;",
+            "x.x: =0.0=;",
+            "0: =%spellout-cardinal-neuter=;",
+            "1010/100: <%spellout-cardinal-masculine<honnert[>%spellout-cardinal-neuter>];",
+            "2000: =%spellout-cardinal-neuter=;",
+            "2010/100: <%spellout-cardinal-masculine<honnert[>%spellout-cardinal-neuter>];",
+            "3000: =%spellout-cardinal-neuter=;",
+            "3010/100: <%spellout-cardinal-masculine<honnert[>%spellout-cardinal-neuter>];",
+            "4000: =%spellout-cardinal-neuter=;",
+            "4010/100: <%spellout-cardinal-masculine<honnert[>%spellout-cardinal-neuter>];",
+            "5000: =%spellout-cardinal-neuter=;",
+            "5010/100: <%spellout-cardinal-masculine<honnert[>%spellout-cardinal-neuter>];",
+            "6000: =%spellout-cardinal-neuter=;",
+            "6010/100: <%spellout-cardinal-masculine<honnert[>%spellout-cardinal-neuter>];",
+            "7000: =%spellout-cardinal-neuter=;",
+            "7010/100: <%spellout-cardinal-masculine<honnert[>%spellout-cardinal-neuter>];",
+            "8000: =%spellout-cardinal-neuter=;",
+            "8010/100: <%spellout-cardinal-masculine<honnert[>%spellout-cardinal-neuter>];",
+            "9000: =%spellout-cardinal-neuter=;",
+            "9010/100: <%spellout-cardinal-masculine<honnert[>%spellout-cardinal-neuter>];",
+            "10000: =%spellout-cardinal-neuter=;",
+            "%spellout-numbering:",
+            "0: =%spellout-cardinal-masculine=;",
+            "%spellout-cardinal-masculine:",
+            "Inf: Onendlechkeet;",
+            "NaN: net eng Nummer;",
+            "-x: minus >>;",
+            "x.x: << Komma >>;",
+            "0: null;",
+            "1: eent;",
+            "2: zwee;",
+            "3: dr\u00E4i;",
+            "4: v\u00E9ier;",
+            "5: f\u00EBnnef;",
+            "6: sechs;",
+            "7: siwen;",
+            "8: aacht;",
+            "9: n\u00E9ng;",
+            "10: z\u00E9ng;",
+            "11: eelef;",
+            "12: zwielef;",
+            "13: dr\u00E4iz\u00E9ng;",
+            "14: v\u00E9ierz\u00E9ng;",
+            "15: fofz\u00E9ng;",
+            "16: siechz\u00E9ng;",
+            "17: siwwenz\u00E9ng;",
+            "18: uechtz\u00E9ng;",
+            "19: nonz\u00E9ng;",
+            "20: [>%spellout-cardinal-neuter>an]zwanzeg;",
+            "30: [>%spellout-cardinal-neuter>an]dr\u00EBsseg;",
+            "40: [>%spellout-cardinal-neuter>an]v\u00E9ierzeg;",
+            "50: [>%spellout-cardinal-neuter>an]fofzeg;",
+            "60: [>%spellout-cardinal-neuter>an]siechzeg;",
+            "70: [>%spellout-cardinal-neuter>an]siwwenzeg;",
+            "80: [>%spellout-cardinal-neuter>an]achtzeg;",
+            "90: [>%spellout-cardinal-neuter>an]nonzeg;",
+            "100: \u00ADhonnert\u00AD[>>];",
+            "200: <%spellout-cardinal-masculine<\u00ADhonnert\u00AD[>>];",
+            "1000: \u00ADdausend\u00AD[>>];",
+            "2000: <%spellout-cardinal-masculine<\u00ADdausend\u00AD[>>];",
+            "1000000: <%spellout-cardinal-feminine< $(cardinal,one{Millioun}other{Milliounen})$[ >>];",
+            "1000000000: <%spellout-cardinal-feminine< $(cardinal,one{Milliard}other{Milliarden})$[ >>];",
+            "1000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billioun}other{Billiounen})$[ >>];",
+            "1000000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billiard}other{Billiarden})$[ >>];",
+            "1000000000000000000: =#,##0=;",
+            "%spellout-cardinal-feminine:",
+            "Inf: Onendlechkeet;",
+            "NaN: net eng Nummer;",
+            "-x: minus >>;",
+            "x.x: =%spellout-cardinal-masculine=;",
+            "0: null;",
+            "1: eng;",
+            "2: zwou;",
+            "3: =%spellout-cardinal-masculine=;",
+            "100: \u00ADhonnert\u00AD[>>];",
+            "200: <%spellout-cardinal-masculine<\u00ADhonnert\u00AD[>>];",
+            "1000: \u00ADdausend\u00AD[>>];",
+            "2000: <%spellout-cardinal-masculine<\u00ADdausend\u00AD[>>];",
+            "1000000: <%spellout-cardinal-feminine< $(cardinal,one{Millioun}other{Milliounen})$[ >>];",
+            "1000000000: <%spellout-cardinal-feminine< $(cardinal,one{Milliard}other{Milliarden})$[ >>];",
+            "1000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billioun}other{Billiounen})$[ >>];",
+            "1000000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billiard}other{Billiarden})$[ >>];",
+            "1000000000000000000: =#,##0=;",
+            "%spellout-cardinal-neuter:",
+            "Inf: Onendlechkeet;",
+            "NaN: net eng Nummer;",
+            "-x: minus >>;",
+            "x.x: =%spellout-cardinal-masculine=;",
+            "0: null;",
+            "1: een;",
+            "2: =%spellout-cardinal-masculine=;",
+            "100: \u00ADhonnert\u00AD[>>];",
+            "200: <%spellout-cardinal-masculine<\u00ADhonnert\u00AD[>>];",
+            "1000: \u00ADdausend\u00AD[>>];",
+            "2000: <%spellout-cardinal-masculine<\u00ADdausend\u00AD[>>];",
+            "1000000: <%spellout-cardinal-feminine< $(cardinal,one{Millioun}other{Milliounen})$[ >>];",
+            "1000000000: <%spellout-cardinal-feminine< $(cardinal,one{Milliard}other{Milliarden})$[ >>];",
+            "1000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billioun}other{Billiounen})$[ >>];",
+            "1000000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billiard}other{Billiarden})$[ >>];",
+            "1000000000000000000: =#,##0=;",
+            "%spellout-ordinal-masculine:",
+            "Inf: onendlechten;",
+            "NaN: net eng Nummer;",
+            "-x: minus >>;",
+            "x.x: =#,##0.0=.;",
+            "0: nullten;",
+            "1: \u00E9ischten;",
+            "2: zweeten;",
+            "3: dr\u00EBtten;",
+            "4: v\u00E9ierten;",
+            "5: f\u00EBnneften;",
+            "6: sechsten;",
+            "7: siwenten;",
+            "8: aachten;",
+            "9: =%spellout-cardinal-neuter=ten;",
+            "20: =%spellout-cardinal-neuter=sten;",
+            "100: \u00ADhonnert\u00AD>%%ord-t-masc>;",
+            "200: <%spellout-cardinal-masculine<\u00ADhonnert\u00AD>%%ord-t-masc>;",
+            "1000: \u00ADdausend\u00AD>%%ord-t-masc>;",
+            "2000: <%spellout-cardinal-masculine<\u00ADdausend\u00AD>%%ord-t-masc>;",
+            "1000000: <%spellout-cardinal-feminine< $(cardinal,one{Millioun}other{Milliounen})$>%%ord-M-masc>;",
+            "1000000000: <%spellout-cardinal-feminine< $(cardinal,one{Milliard}other{Milliarden})$>%%ord-M-masc>;",
+            "1000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billioun}other{Billiounen})$>%%ord-M-masc>;",
+            "1000000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billiard}other{Billiarden})$>%%ord-M-masc>;",
+            "1000000000000000000: =#,##0=.;",
+            "%%ord-t-masc:",
+            "0: en;",
+            "1: =%spellout-ordinal-masculine=;",
+            "%%ord-M-masc:",
+            "0: ten;",
+            "1: ' =%spellout-ordinal-masculine=;",
+            "%spellout-ordinal-feminine:",
+            "Inf: onendlechter;",
+            "NaN: net eng Nummer;",
+            "-x: minus >>;",
+            "x.x: =#,##0.0=.;",
+            "0: nullter;",
+            "1: \u00E9ischter;",
+            "2: zweeter;",
+            "3: dr\u00EBtter;",
+            "4: v\u00E9ierter;",
+            "5: f\u00EBnnefter;",
+            "6: sechster;",
+            "7: siwenter;",
+            "8: aachter;",
+            "9: =%spellout-cardinal-neuter=ter;",
+            "20: =%spellout-cardinal-neuter=ster;",
+            "100: \u00ADhonnert\u00AD>%%ord-t-fem>;",
+            "200: <%spellout-cardinal-masculine<\u00ADhonnert\u00AD>%%ord-t-fem>;",
+            "1000: \u00ADdausend\u00AD>%%ord-t-fem>;",
+            "2000: <%spellout-cardinal-masculine<\u00ADdausend\u00AD>%%ord-t-fem>;",
+            "1000000: <%spellout-cardinal-feminine< $(cardinal,one{Millioun}other{Milliounen})$>%%ord-M-fem>;",
+            "1000000000: <%spellout-cardinal-feminine< $(cardinal,one{Milliard}other{Milliarden})$>%%ord-M-fem>;",
+            "1000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billioun}other{Billiounen})$>%%ord-M-fem>;",
+            "1000000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billiard}other{Billiarden})$>%%ord-M-fem>;",
+            "1000000000000000000: =#,##0=.;",
+            "%%ord-t-fem:",
+            "0: er;",
+            "1: =%spellout-ordinal-feminine=;",
+            "%%ord-M-fem:",
+            "0: ter;",
+            "1: ' =%spellout-ordinal-feminine=;",
+            "%spellout-ordinal-neuter:",
+            "Inf: onendlecht;",
+            "NaN: net eng Nummer;",
+            "-x: minus >>;",
+            "x.x: =#,##0.0=.;",
+            "0: nullt;",
+            "1: \u00E9ischt;",
+            "2: zweet;",
+            "3: dr\u00EBtt;",
+            "4: v\u00E9iert;",
+            "5: f\u00EBnneft;",
+            "6: sechst;",
+            "7: siwent;",
+            "8: aacht;",
+            "9: =%spellout-cardinal-neuter=t;",
+            "20: =%spellout-cardinal-neuter=st;",
+            "100: \u00ADhonnert\u00AD>%%ord-t-neut>;",
+            "200: <%spellout-cardinal-masculine<\u00ADhonnert\u00AD>%%ord-t-neut>;",
+            "1000: \u00ADdausend\u00AD>%%ord-t-neut>;",
+            "2000: <%spellout-cardinal-masculine<\u00ADdausend\u00AD>%%ord-t-neut>;",
+            "1000000: <%spellout-cardinal-feminine< $(cardinal,one{Millioun}other{Milliounen})$>%%ord-M-neut>;",
+            "1000000000: <%spellout-cardinal-feminine< $(cardinal,one{Milliard}other{Milliarden})$>%%ord-M-neut>;",
+            "1000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billioun}other{Billiounen})$>%%ord-M-neut>;",
+            "1000000000000000: <%spellout-cardinal-feminine< $(cardinal,one{Billiard}other{Billiarden})$>%%ord-M-neut>;",
+            "1000000000000000000: =#,##0=.;",
+            "%%ord-t-neut:",
+            "0: et;",
+            "1: =%spellout-ordinal-neuter=;",
+            "%%ord-M-neut:",
+            "0: t;",
+            "1: ' =%spellout-ordinal-neuter=;",
+        }
+    }
+    Version{"2.1.38.68"}
+}
diff --git a/icu4c/source/data/rbnf/qu.txt b/icu4c/source/data/rbnf/qu.txt
new file mode 100644
index 0000000..e8797f6
--- /dev/null
+++ b/icu4c/source/data/rbnf/qu.txt
@@ -0,0 +1,46 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+qu{
+    RBNFRules{
+        SpelloutRules{
+            "%spellout-numbering-year:",
+            "x.x: =0.0=;",
+            "0: =%spellout-numbering=;",
+            "%spellout-numbering:",
+            "0: =%spellout-cardinal=;",
+            "%%spellout-cardinal-with:",
+            "0: =%spellout-cardinal=-ni-yuq;",
+            "3: =%spellout-cardinal=-yuq;",
+            "7: =%spellout-cardinal=-ni-yuq;",
+            "%spellout-cardinal:",
+            "NaN: mana yupay;",
+            "Inf: mana usay;",
+            "-x: minusu >>;",
+            "x.x: << comma >>;",
+            "0: chusaq;",
+            "1: huk;",
+            "2: iskay;",
+            "3: kinsa;",
+            "4: tawa;",
+            "5: phisqa;",
+            "6: suqta;",
+            "7: qanchis;",
+            "8: pusaq;",
+            "9: isqun;",
+            "10: chunka[ >%%spellout-cardinal-with>];",
+            "20: << chunka[ >%%spellout-cardinal-with>];",
+            "100: << pachak[ >>];",
+            "1000: << waranqa[ >>];",
+            "1000000: << hunu[ >>];",
+            "1000000000: << lluna[ >>];",
+            "1000000000000: << trilionu[ >>];",
+            "1000000000000000: << kvadrilionu[ >>];",
+            "1000000000000000000: =#,##0.#=;",
+            "%spellout-ordinal:",
+            "-x: minusu >>;",
+            "x.x: =0.0=;",
+            "0: =%spellout-cardinal=-\u00F1iqin;",
+        }
+    }
+    Version{"2.1.38.68"}
+}
diff --git a/icu4c/source/data/rbnf/rbnffiles.mk b/icu4c/source/data/rbnf/rbnffiles.mk
index bc99401..6f895b5 100644
--- a/icu4c/source/data/rbnf/rbnffiles.mk
+++ b/icu4c/source/data/rbnf/rbnffiles.mk
@@ -1,6 +1,6 @@
 # © 2016 and later: Unicode, Inc. and others.
 # License & terms of use: http://www.unicode.org/copyright.html#License
-RBNF_CLDR_VERSION = 32.0.1
+RBNF_CLDR_VERSION = 33
 # A list of txt's to build
 # Note:
 #
@@ -39,18 +39,19 @@
 # Ordinary resources
 RBNF_SOURCE = af.txt ak.txt am.txt ar.txt\
  az.txt be.txt bg.txt bs.txt ca.txt\
- chr.txt cs.txt cy.txt da.txt de.txt\
- de_CH.txt ee.txt el.txt en.txt en_001.txt\
- en_IN.txt eo.txt es.txt es_419.txt et.txt\
- fa.txt fa_AF.txt fi.txt fil.txt fo.txt\
- fr.txt fr_BE.txt fr_CH.txt ga.txt he.txt\
- hi.txt hr.txt hu.txt hy.txt id.txt\
- is.txt it.txt ja.txt ka.txt kl.txt\
- km.txt ko.txt ky.txt lo.txt lrc.txt\
- lt.txt lv.txt mk.txt ms.txt mt.txt\
- my.txt nb.txt nl.txt nn.txt pl.txt\
- pt.txt pt_PT.txt ro.txt ru.txt se.txt\
- sk.txt sl.txt sq.txt sr.txt sr_Latn.txt\
- sv.txt ta.txt th.txt tr.txt uk.txt\
+ ccp.txt chr.txt cs.txt cy.txt da.txt\
+ de.txt de_CH.txt ee.txt el.txt en.txt\
+ en_001.txt en_IN.txt eo.txt es.txt es_419.txt\
+ et.txt fa.txt fa_AF.txt ff.txt fi.txt\
+ fil.txt fo.txt fr.txt fr_BE.txt fr_CH.txt\
+ ga.txt he.txt hi.txt hr.txt hu.txt\
+ hy.txt id.txt is.txt it.txt ja.txt\
+ ka.txt kl.txt km.txt ko.txt ky.txt\
+ lb.txt lo.txt lrc.txt lt.txt lv.txt\
+ mk.txt ms.txt mt.txt my.txt nb.txt\
+ nl.txt nn.txt pl.txt pt.txt pt_PT.txt\
+ qu.txt ro.txt ru.txt se.txt sk.txt\
+ sl.txt sq.txt sr.txt sr_Latn.txt sv.txt\
+ sw.txt ta.txt th.txt tr.txt uk.txt\
  vi.txt yue.txt yue_Hans.txt zh.txt zh_Hant.txt
 
diff --git a/icu4c/source/data/rbnf/sw.txt b/icu4c/source/data/rbnf/sw.txt
new file mode 100644
index 0000000..463576d
--- /dev/null
+++ b/icu4c/source/data/rbnf/sw.txt
@@ -0,0 +1,52 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+sw{
+    RBNFRules{
+        SpelloutRules{
+            "%spellout-numbering-year:",
+            "x.x: =0.0=;",
+            "0: =%spellout-numbering=;",
+            "%spellout-numbering:",
+            "0: =%spellout-cardinal=;",
+            "%spellout-cardinal:",
+            "NaN: si nambari;",
+            "Inf: usio;",
+            "-x: kasoro >>;",
+            "x.x: << nukta >>;",
+            "0: sifuri;",
+            "1: moja;",
+            "2: mbili;",
+            "3: tatu;",
+            "4: nne;",
+            "5: tano;",
+            "6: sita;",
+            "7: saba;",
+            "8: nane;",
+            "9: tisa;",
+            "10: kumi[ na >>];",
+            "20: ishirini[ na >>];",
+            "30: thelathini[ na >>];",
+            "40: arobaini[ na >>];",
+            "50: hamsini[ na >>];",
+            "60: sitini[ na >>];",
+            "70: sabini[ na >>];",
+            "80: themanini[ na >>];",
+            "90: tisini[ na >>];",
+            "100: mia <<[ na >>];",
+            "1000: elfu <<[, >>];",
+            "1000000: milioni <<[, >>];",
+            "1000000000: bilioni <<[, >>];",
+            "1000000000000: trilioni <<[, >>];",
+            "1000000000000000: kvadrilioni <<[, >>];",
+            "1000000000000000000: =#,##0.#=;",
+            "%spellout-ordinal:",
+            "-x: wa kasoro >%spellout-cardinal>;",
+            "x.x: =0.0=;",
+            "0: wa sifuri;",
+            "1: kwanza;",
+            "2: pili;",
+            "3: wa =%spellout-cardinal=;",
+        }
+    }
+    Version{"2.1.38.68"}
+}
diff --git a/icu4c/source/data/region/af.txt b/icu4c/source/data/region/af.txt
index 5d06d60..b218809 100644
--- a/icu4c/source/data/region/af.txt
+++ b/icu4c/source/data/region/af.txt
@@ -31,6 +31,7 @@
         151{"Oos-Europa"}
         154{"Noord-Europa"}
         155{"Wes-Europa"}
+        202{"Afrika suid van die Sahara"}
         419{"Latyns-Amerika"}
         AC{"Ascensioneiland"}
         AD{"Andorra"}
@@ -304,5 +305,5 @@
         CG{"Kongo (Republiek die)"}
         CZ{"Tsjeggiese Republiek"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/agq.txt b/icu4c/source/data/region/agq.txt
index 87ff2f1..f6a66e4 100644
--- a/icu4c/source/data/region/agq.txt
+++ b/icu4c/source/data/region/agq.txt
@@ -227,5 +227,5 @@
         ZM{"Zambìa"}
         ZW{"Zìmbagbɛ̀"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ak.txt b/icu4c/source/data/region/ak.txt
index 867ba5e..9337beb 100644
--- a/icu4c/source/data/region/ak.txt
+++ b/icu4c/source/data/region/ak.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zembabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/am.txt b/icu4c/source/data/region/am.txt
index 48da451..b6cb462 100644
--- a/icu4c/source/data/region/am.txt
+++ b/icu4c/source/data/region/am.txt
@@ -31,6 +31,7 @@
         151{"ምዕራባዊ አውሮፓ"}
         154{"ሰሜናዊ አውሮፓ"}
         155{"ምስራቃዊ አውሮፓ"}
+        202{"ከሰሃራ በታች አፍሪካ"}
         419{"ላቲን አሜሪካ"}
         AC{"አሴንሽን ደሴት"}
         AD{"አንዶራ"}
@@ -306,5 +307,5 @@
         CZ{"ቼክ ሪፑብሊክ"}
         TL{"ምስራቅ ቲሞር"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ar.txt b/icu4c/source/data/region/ar.txt
index 0c4a35b..2f102ee 100644
--- a/icu4c/source/data/region/ar.txt
+++ b/icu4c/source/data/region/ar.txt
@@ -31,6 +31,7 @@
         151{"شرق أوروبا"}
         154{"شمال أوروبا"}
         155{"غرب أوروبا"}
+        202{"202"}
         419{"أمريكا اللاتينية"}
         AC{"جزيرة أسينشيون"}
         AD{"أندورا"}
@@ -306,5 +307,5 @@
         CZ{"جمهورية التشيك"}
         TL{"تيمور الشرقية"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/ar_AE.txt b/icu4c/source/data/region/ar_AE.txt
index 7e70bf2..7bd71b1 100644
--- a/icu4c/source/data/region/ar_AE.txt
+++ b/icu4c/source/data/region/ar_AE.txt
@@ -5,5 +5,5 @@
         CI{"ساحل العاج"}
         TL{"التيمور الشرقية"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/region/ar_LY.txt b/icu4c/source/data/region/ar_LY.txt
index 7c5f4f6..577b5fb 100644
--- a/icu4c/source/data/region/ar_LY.txt
+++ b/icu4c/source/data/region/ar_LY.txt
@@ -6,5 +6,5 @@
         MS{"مونتيسيرات"}
         UY{"أوروغواي"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/ar_SA.txt b/icu4c/source/data/region/ar_SA.txt
index babeab2..29e31c5 100644
--- a/icu4c/source/data/region/ar_SA.txt
+++ b/icu4c/source/data/region/ar_SA.txt
@@ -13,5 +13,5 @@
     Countries%variant{
         CZ{"التشيك"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.80"}
 }
diff --git a/icu4c/source/data/region/asa.txt b/icu4c/source/data/region/asa.txt
index 5414fca..66e92b3 100644
--- a/icu4c/source/data/region/asa.txt
+++ b/icu4c/source/data/region/asa.txt
@@ -225,5 +225,5 @@
         ZM{"Dhambia"}
         ZW{"Dhimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ast.txt b/icu4c/source/data/region/ast.txt
index e779661..aa06481 100644
--- a/icu4c/source/data/region/ast.txt
+++ b/icu4c/source/data/region/ast.txt
@@ -305,5 +305,5 @@
         CZ{"República Checa"}
         TL{"Timor Este"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/az.txt b/icu4c/source/data/region/az.txt
index 002683b..1fea903 100644
--- a/icu4c/source/data/region/az.txt
+++ b/icu4c/source/data/region/az.txt
@@ -31,6 +31,7 @@
         151{"Şərqi Avropa"}
         154{"Şimali Avropa"}
         155{"Qərbi Avropa"}
+        202{"Saharadan cənub"}
         419{"Latın Amerikası"}
         AC{"Askenson adası"}
         AD{"Andorra"}
@@ -306,5 +307,5 @@
         CZ{"Çex Respublikası"}
         TL{"Doğu Timor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/az_Cyrl.txt b/icu4c/source/data/region/az_Cyrl.txt
index fb99f93..9c24883 100644
--- a/icu4c/source/data/region/az_Cyrl.txt
+++ b/icu4c/source/data/region/az_Cyrl.txt
@@ -299,5 +299,5 @@
         CG{"Конго (Республика)"}
         CZ{"Чех Республикасы"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/az_Latn.txt b/icu4c/source/data/region/az_Latn.txt
index 9df6ff3..47ecb5c 100644
--- a/icu4c/source/data/region/az_Latn.txt
+++ b/icu4c/source/data/region/az_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/bas.txt b/icu4c/source/data/region/bas.txt
index f186147..aacbd84 100644
--- a/icu4c/source/data/region/bas.txt
+++ b/icu4c/source/data/region/bas.txt
@@ -224,5 +224,5 @@
         ZM{"Zàmbià"}
         ZW{"Zìmbàbwê"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/be.txt b/icu4c/source/data/region/be.txt
index 1230c84..4f4f884 100644
--- a/icu4c/source/data/region/be.txt
+++ b/icu4c/source/data/region/be.txt
@@ -31,6 +31,7 @@
         151{"Усходняя Еўропа"}
         154{"Паўночная Еўропа"}
         155{"Заходняя Еўропа"}
+        202{"Трапічная Афрыка"}
         419{"Лацінская Амерыка"}
         AC{"Востраў Узнясення"}
         AD{"Андора"}
@@ -305,5 +306,5 @@
         CZ{"Чэшская Рэспубліка"}
         TL{"Усходні Тымор"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/bem.txt b/icu4c/source/data/region/bem.txt
index c3ffcfe..7c15764 100644
--- a/icu4c/source/data/region/bem.txt
+++ b/icu4c/source/data/region/bem.txt
@@ -4,5 +4,5 @@
     Countries{
         ZM{"Zambia"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/bez.txt b/icu4c/source/data/region/bez.txt
index efafd76..189363d 100644
--- a/icu4c/source/data/region/bez.txt
+++ b/icu4c/source/data/region/bez.txt
@@ -227,5 +227,5 @@
         ZM{"Huzambia"}
         ZW{"Huzimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/bg.txt b/icu4c/source/data/region/bg.txt
index 1904b4f..8e11031 100644
--- a/icu4c/source/data/region/bg.txt
+++ b/icu4c/source/data/region/bg.txt
@@ -31,6 +31,7 @@
         151{"Източна Европа"}
         154{"Северна Европа"}
         155{"Западна Европа"}
+        202{"Субсахарска Африка"}
         419{"Латинска Америка"}
         AC{"остров Възнесение"}
         AD{"Андора"}
@@ -304,5 +305,5 @@
         CI{"Бряг на слоновата кост"}
         CZ{"Чешка република"}
     }
-    Version{"2.1.37.59"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/bm.txt b/icu4c/source/data/region/bm.txt
index 8156740..70e7d0c 100644
--- a/icu4c/source/data/region/bm.txt
+++ b/icu4c/source/data/region/bm.txt
@@ -227,5 +227,5 @@
         ZM{"Zanbi"}
         ZW{"Zimbabuwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/bn.txt b/icu4c/source/data/region/bn.txt
index f915171..ef8aa17 100644
--- a/icu4c/source/data/region/bn.txt
+++ b/icu4c/source/data/region/bn.txt
@@ -31,6 +31,7 @@
         151{"পূর্ব ইউরোপ"}
         154{"উত্তর ইউরোপ"}
         155{"পশ্চিম ইউরোপ"}
+        202{"উপ সাহারান আফ্রিকা"}
         419{"ল্যাটিন আমেরিকা"}
         AC{"অ্যাসসেনশন আইল্যান্ড"}
         AD{"আন্ডোরা"}
@@ -306,5 +307,5 @@
         CZ{"চেক প্রজাতন্ত্র"}
         TL{"পূর্ব তিমুর"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/bn_IN.txt b/icu4c/source/data/region/bn_IN.txt
index 988ce1c..26bbd86 100644
--- a/icu4c/source/data/region/bn_IN.txt
+++ b/icu4c/source/data/region/bn_IN.txt
@@ -8,5 +8,5 @@
     Countries%variant{
         CD{"কঙ্গো (DRC)"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/bo.txt b/icu4c/source/data/region/bo.txt
index b7aee05..a16e7dd 100644
--- a/icu4c/source/data/region/bo.txt
+++ b/icu4c/source/data/region/bo.txt
@@ -15,5 +15,5 @@
         US{"ཨ་མེ་རི་ཀ།"}
         ZZ{"མིའི་ཤེས་རྟོགས་མ་བྱུང་བའི་ཁོར་ཡུག"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/bo_IN.txt b/icu4c/source/data/region/bo_IN.txt
index 7389294..2163f77 100644
--- a/icu4c/source/data/region/bo_IN.txt
+++ b/icu4c/source/data/region/bo_IN.txt
@@ -4,5 +4,5 @@
     Countries{
         009{"ཨོཤི་ཡཱན་ན།"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/br.txt b/icu4c/source/data/region/br.txt
index 8c900a0..93efdfb 100644
--- a/icu4c/source/data/region/br.txt
+++ b/icu4c/source/data/region/br.txt
@@ -31,6 +31,7 @@
         151{"Europa ar Reter"}
         154{"Europa an Norzh"}
         155{"Europa ar Cʼhornôg"}
+        202{"Afrika issaharat"}
         419{"Amerika Latin"}
         AC{"Enez Ascension"}
         AD{"Andorra"}
@@ -89,7 +90,7 @@
         CW{"Curaçao"}
         CX{"Enez Christmas"}
         CY{"Kiprenez"}
-        CZ{"Republik Tchek"}
+        CZ{"Tchekia"}
         DE{"Alamagn"}
         DG{"Diego Garcia"}
         DJ{"Djibouti"}
@@ -106,6 +107,7 @@
         ES{"Spagn"}
         ET{"Etiopia"}
         EU{"Unaniezh Europa"}
+        EZ{"takad an euro"}
         FI{"Finland"}
         FJ{"Fidji"}
         FK{"Inizi Falkland (Inizi Maloù)"}
@@ -272,6 +274,7 @@
         UA{"Ukraina"}
         UG{"Ouganda"}
         UM{"Inizi diabell ar Stadoù-Unanet"}
+        UN{"Broadoù unanet"}
         US{"Stadoù-Unanet"}
         UY{"Uruguay"}
         UZ{"Ouzbekistan"}
@@ -300,7 +303,8 @@
         CD{"Kongo (RDK)"}
         CG{"Kongo (Republik)"}
         CI{"Aod Olifant"}
+        CZ{"Republik Tchek"}
         TL{"Timor ar Reter"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/brx.txt b/icu4c/source/data/region/brx.txt
index 32a823d..38158f4 100644
--- a/icu4c/source/data/region/brx.txt
+++ b/icu4c/source/data/region/brx.txt
@@ -281,5 +281,5 @@
         ZW{"ज़ीम्बाब्वे"}
         ZZ{"अज्ञात या अवैध प्रदेश"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/bs.txt b/icu4c/source/data/region/bs.txt
index 496b0f3..40535c3 100644
--- a/icu4c/source/data/region/bs.txt
+++ b/icu4c/source/data/region/bs.txt
@@ -31,6 +31,7 @@
         151{"Istočna Evropa"}
         154{"Sjeverna Evropa"}
         155{"Zapadna Evropa"}
+        202{"Subsaharska Afrika"}
         419{"Latinska Amerika"}
         AC{"Ostrvo Ascension"}
         AD{"Andora"}
@@ -306,5 +307,5 @@
         CZ{"Češka Republika"}
         TL{"TL"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/bs_Cyrl.txt b/icu4c/source/data/region/bs_Cyrl.txt
index 8be1a20..3bc9730 100644
--- a/icu4c/source/data/region/bs_Cyrl.txt
+++ b/icu4c/source/data/region/bs_Cyrl.txt
@@ -304,5 +304,5 @@
         CI{"Обала Бјелокости"}
         CZ{"Чешка Република"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/bs_Latn.txt b/icu4c/source/data/region/bs_Latn.txt
index 5e72765..0ac3778 100644
--- a/icu4c/source/data/region/bs_Latn.txt
+++ b/icu4c/source/data/region/bs_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/ca.txt b/icu4c/source/data/region/ca.txt
index 7146af5..3f6b5e7 100644
--- a/icu4c/source/data/region/ca.txt
+++ b/icu4c/source/data/region/ca.txt
@@ -31,6 +31,7 @@
         151{"Europa oriental"}
         154{"Europa septentrional"}
         155{"Europa occidental"}
+        202{"Àfrica subsahariana"}
         419{"Amèrica Llatina"}
         AC{"Illa de l’Ascensió"}
         AD{"Andorra"}
@@ -304,5 +305,5 @@
         CG{"Congo (República del Congo)"}
         CZ{"República Txeca"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/ccp.txt b/icu4c/source/data/region/ccp.txt
index 70d6c5e..efba8aa 100644
--- a/icu4c/source/data/region/ccp.txt
+++ b/icu4c/source/data/region/ccp.txt
@@ -317,5 +317,5 @@
         CZ{"𑄌𑄬𑄇𑄴 𑄛𑄳𑄢𑄎𑄖𑄧𑄚𑄴𑄖𑄳𑄢𑄧"}
         TL{"𑄛𑄪𑄉𑄮 𑄖𑄨𑄟𑄪𑄢𑄴"}
     }
-    Version{"2.1.37.51"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ce.txt b/icu4c/source/data/region/ce.txt
index 2f8f8a9..49292b0 100644
--- a/icu4c/source/data/region/ce.txt
+++ b/icu4c/source/data/region/ce.txt
@@ -304,5 +304,5 @@
         CI{"Кот-д’Ивуар"}
         TL{"Тимор-Лесте"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/cgg.txt b/icu4c/source/data/region/cgg.txt
index 3f5aa35..29e4564 100644
--- a/icu4c/source/data/region/cgg.txt
+++ b/icu4c/source/data/region/cgg.txt
@@ -225,5 +225,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/chr.txt b/icu4c/source/data/region/chr.txt
index 9eacb19..1fb6607 100644
--- a/icu4c/source/data/region/chr.txt
+++ b/icu4c/source/data/region/chr.txt
@@ -31,12 +31,13 @@
         151{"ᏗᎧᎸᎬ ᏗᏜ ᏳᎳᏛ"}
         154{"ᏧᏴᏢ ᏗᏜ ᏳᎳᏛ"}
         155{"ᏭᏕᎵᎬ ᏗᏜ ᏳᎳᏛ"}
+        202{"ᎭᏫᏂ-ᏌᎭᏩ ᎬᎿᎨᏍᏛ"}
         419{"ᎳᏘᏂ ᎠᎹᏰᏟ"}
         AC{"ᎤᎵᏌᎳᏓᏅ ᎤᎦᏚᏛᎢ"}
         AD{"ᎠᏂᏙᎳ"}
         AE{"ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᎡᎳᏈ ᎢᎹᎵᏘᏏ"}
         AF{"ᎠᏫᎨᏂᏍᏖᏂ"}
-        AG{"ᎤᏪᏘ ᎠᎴ ᏆᏊᏓ"}
+        AG{"ᎤᏪᏘ & ᏆᏊᏓ"}
         AI{"ᎠᏂᎩᎳ"}
         AL{"ᎠᎵᏇᏂᏯ"}
         AM{"ᎠᎵᎻᏂᎠ"}
@@ -49,7 +50,7 @@
         AW{"ᎠᎷᏆ"}
         AX{"ᎣᎴᏅᏓ ᏚᎦᏚᏛᎢ"}
         AZ{"ᎠᏎᏆᏣᏂ"}
-        BA{"ᏉᏏᏂᎠ ᎠᎴ ᎲᏤᎪᏫ"}
+        BA{"ᏉᏏᏂᎠ & ᎲᏤᎪᏫ"}
         BB{"ᏆᏇᏙᏍ"}
         BD{"ᏆᏂᎦᎵᏕᏍ"}
         BE{"ᏇᎵᏥᎥᎻ"}
@@ -184,7 +185,7 @@
         MH{"ᎹᏌᎵ ᏚᎦᏚᏛᎢ"}
         MK{"ᎹᏎᏙᏂᏯ (FYROM)"}
         ML{"ᎹᎵ"}
-        MM{"ᎹᏯᎹᎵ"}
+        MM{"ᎹᏯᎹᎵ (ᏇᎵᎹ)"}
         MN{"ᎹᏂᎪᎵᎠ"}
         MO{"ᎹᎧᎣ"}
         MP{"ᏧᏴᏢ ᏗᏜ ᎹᎵᎠᎾ ᏚᎦᏚᏛᎢ"}
@@ -305,5 +306,5 @@
         CZ{"ᏤᎩ ᏍᎦᏚᎩ"}
         TL{"ᏗᎧᎸᎬᎢ ᏘᎼᎵ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ckb.txt b/icu4c/source/data/region/ckb.txt
index bc94a44..f2de435 100644
--- a/icu4c/source/data/region/ckb.txt
+++ b/icu4c/source/data/region/ckb.txt
@@ -197,5 +197,5 @@
         CD{"کۆماری دیموکراتیکی کۆنگۆ"}
         CG{"کۆماری کۆنگۆ"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.71"}
 }
diff --git a/icu4c/source/data/region/cs.txt b/icu4c/source/data/region/cs.txt
index d6f6c91..ab7f679 100644
--- a/icu4c/source/data/region/cs.txt
+++ b/icu4c/source/data/region/cs.txt
@@ -31,6 +31,7 @@
         151{"východní Evropa"}
         154{"severní Evropa"}
         155{"západní Evropa"}
+        202{"subsaharská Afrika"}
         419{"Latinská Amerika"}
         AC{"Ascension"}
         AD{"Andorra"}
@@ -305,5 +306,5 @@
         CI{"Côte d’Ivoire"}
         CZ{"Česká republika"}
     }
-    Version{"2.1.37.11"}
+    Version{"2.1.39.15"}
 }
diff --git a/icu4c/source/data/region/cy.txt b/icu4c/source/data/region/cy.txt
index 7899632..7e998ff 100644
--- a/icu4c/source/data/region/cy.txt
+++ b/icu4c/source/data/region/cy.txt
@@ -31,6 +31,7 @@
         151{"Dwyrain Ewrop"}
         154{"Gogledd Ewrop"}
         155{"Gorllewin Ewrop"}
+        202{"Affrica Is-Sahara"}
         419{"America Ladin"}
         AC{"Ynys Ascension"}
         AD{"Andorra"}
@@ -49,7 +50,7 @@
         AW{"Aruba"}
         AX{"Ynysoedd Åland"}
         AZ{"Azerbaijan"}
-        BA{"Bosnia a Herzegovina"}
+        BA{"Bosnia & Herzegovina"}
         BB{"Barbados"}
         BD{"Bangladesh"}
         BE{"Gwlad Belg"}
@@ -306,5 +307,5 @@
         CZ{"Gweriniaeth Tsiec"}
         TL{"Dwyrain Timor"}
     }
-    Version{"2.1.37.17"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/da.txt b/icu4c/source/data/region/da.txt
index 777aa4b..8416820 100644
--- a/icu4c/source/data/region/da.txt
+++ b/icu4c/source/data/region/da.txt
@@ -31,6 +31,7 @@
         151{"Østeuropa"}
         154{"Nordeuropa"}
         155{"Vesteuropa"}
+        202{"Afrika syd for Sahara"}
         419{"Latinamerika"}
         AC{"Ascensionøen"}
         AD{"Andorra"}
@@ -305,5 +306,5 @@
         CZ{"Den Tjekkiske Republik"}
         TL{"Østtimor"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/dav.txt b/icu4c/source/data/region/dav.txt
index d090bf5..71e6c1a 100644
--- a/icu4c/source/data/region/dav.txt
+++ b/icu4c/source/data/region/dav.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/de.txt b/icu4c/source/data/region/de.txt
index a7f1bca..9404c7e 100644
--- a/icu4c/source/data/region/de.txt
+++ b/icu4c/source/data/region/de.txt
@@ -306,5 +306,5 @@
         CZ{"Tschechische Republik"}
         TL{"Osttimor"}
     }
-    Version{"2.1.37.96"}
+    Version{"2.1.39.41"}
 }
diff --git a/icu4c/source/data/region/de_AT.txt b/icu4c/source/data/region/de_AT.txt
index 61693a4..c4b626a 100644
--- a/icu4c/source/data/region/de_AT.txt
+++ b/icu4c/source/data/region/de_AT.txt
@@ -4,5 +4,5 @@
     Countries{
         SJ{"Svalbard und Jan Mayen"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/de_CH.txt b/icu4c/source/data/region/de_CH.txt
index e6ceb2f..5a714ce 100644
--- a/icu4c/source/data/region/de_CH.txt
+++ b/icu4c/source/data/region/de_CH.txt
@@ -12,5 +12,5 @@
         TL{"Osttimor"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
 }
diff --git a/icu4c/source/data/region/dje.txt b/icu4c/source/data/region/dje.txt
index a96ae39..366e9e9 100644
--- a/icu4c/source/data/region/dje.txt
+++ b/icu4c/source/data/region/dje.txt
@@ -226,5 +226,5 @@
         ZM{"Zambi"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/dsb.txt b/icu4c/source/data/region/dsb.txt
index c9c2477..787c94b 100644
--- a/icu4c/source/data/region/dsb.txt
+++ b/icu4c/source/data/region/dsb.txt
@@ -302,5 +302,5 @@
         CI{"Słonowokósćowy pśibrjog"}
         TL{"Pódzajtšny Timor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/dua.txt b/icu4c/source/data/region/dua.txt
index 142ea9a..28404ee 100644
--- a/icu4c/source/data/region/dua.txt
+++ b/icu4c/source/data/region/dua.txt
@@ -4,5 +4,5 @@
     Countries{
         CM{"Cameroun"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/dyo.txt b/icu4c/source/data/region/dyo.txt
index 0c57f4c..3aee65d 100644
--- a/icu4c/source/data/region/dyo.txt
+++ b/icu4c/source/data/region/dyo.txt
@@ -111,5 +111,5 @@
         TG{"Togo"}
         TH{"Tailand"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/dz.txt b/icu4c/source/data/region/dz.txt
index 6de27e2..def7d89 100644
--- a/icu4c/source/data/region/dz.txt
+++ b/icu4c/source/data/region/dz.txt
@@ -297,5 +297,5 @@
         CI{"ཨི་ཝོ་རི་ཀོསཊ"}
         TL{"ཤར་ཕྱོགས་ཏི་་མོར"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/ebu.txt b/icu4c/source/data/region/ebu.txt
index 4bc8123..f34c9eb 100644
--- a/icu4c/source/data/region/ebu.txt
+++ b/icu4c/source/data/region/ebu.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ee.txt b/icu4c/source/data/region/ee.txt
index 4ced444..c36c823 100644
--- a/icu4c/source/data/region/ee.txt
+++ b/icu4c/source/data/region/ee.txt
@@ -292,5 +292,5 @@
         CI{"Ivory Kost nutome"}
         TL{"Ɣedzeƒe Timɔ nutome"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/el.txt b/icu4c/source/data/region/el.txt
index 7118f59..2ad349b4 100644
--- a/icu4c/source/data/region/el.txt
+++ b/icu4c/source/data/region/el.txt
@@ -31,6 +31,7 @@
         151{"Ανατολική Ευρώπη"}
         154{"Βόρεια Ευρώπη"}
         155{"Δυτική Ευρώπη"}
+        202{"202"}
         419{"Λατινική Αμερική"}
         AC{"Νήσος Ασενσιόν"}
         AD{"Ανδόρα"}
@@ -302,8 +303,9 @@
     Countries%variant{
         CD{"Κονγκό (DRC)"}
         CG{"Κονγκό (Δημοκρατία)"}
+        CI{"CI"}
         CZ{"Τσεχική Δημοκρατία"}
         TL{"Ανατολικό Τιμόρ"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/en.txt b/icu4c/source/data/region/en.txt
index 6523bde..ae9d502 100644
--- a/icu4c/source/data/region/en.txt
+++ b/icu4c/source/data/region/en.txt
@@ -309,5 +309,5 @@
         CZ{"Czech Republic"}
         TL{"East Timor"}
     }
-    Version{"2.1.37.44"}
+    Version{"2.1.39.27"}
 }
diff --git a/icu4c/source/data/region/en_150.txt b/icu4c/source/data/region/en_150.txt
index 564d55e..c7bcd83 100644
--- a/icu4c/source/data/region/en_150.txt
+++ b/icu4c/source/data/region/en_150.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_150{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_AG.txt b/icu4c/source/data/region/en_AG.txt
index ed7f63d..dab34a4 100644
--- a/icu4c/source/data/region/en_AG.txt
+++ b/icu4c/source/data/region/en_AG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_AI.txt b/icu4c/source/data/region/en_AI.txt
index a92294b..e77964d 100644
--- a/icu4c/source/data/region/en_AI.txt
+++ b/icu4c/source/data/region/en_AI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_AT.txt b/icu4c/source/data/region/en_AT.txt
index 0bca0cd..c955b37 100644
--- a/icu4c/source/data/region/en_AT.txt
+++ b/icu4c/source/data/region/en_AT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AT{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_AU.txt b/icu4c/source/data/region/en_AU.txt
index decf9b8..c9aab67 100644
--- a/icu4c/source/data/region/en_AU.txt
+++ b/icu4c/source/data/region/en_AU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AU{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/region/en_BB.txt b/icu4c/source/data/region/en_BB.txt
index 2c2c05e..a3a8e74 100644
--- a/icu4c/source/data/region/en_BB.txt
+++ b/icu4c/source/data/region/en_BB.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BB{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_BE.txt b/icu4c/source/data/region/en_BE.txt
index 6c7e5ab..c0eab02 100644
--- a/icu4c/source/data/region/en_BE.txt
+++ b/icu4c/source/data/region/en_BE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BE{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_BM.txt b/icu4c/source/data/region/en_BM.txt
index a07478e..dfb1e87 100644
--- a/icu4c/source/data/region/en_BM.txt
+++ b/icu4c/source/data/region/en_BM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_BS.txt b/icu4c/source/data/region/en_BS.txt
index 3457002..2d87547 100644
--- a/icu4c/source/data/region/en_BS.txt
+++ b/icu4c/source/data/region/en_BS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_BW.txt b/icu4c/source/data/region/en_BW.txt
index e9eeab0..63e350b 100644
--- a/icu4c/source/data/region/en_BW.txt
+++ b/icu4c/source/data/region/en_BW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_BZ.txt b/icu4c/source/data/region/en_BZ.txt
index 8807b66..8a36306 100644
--- a/icu4c/source/data/region/en_BZ.txt
+++ b/icu4c/source/data/region/en_BZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_CA.txt b/icu4c/source/data/region/en_CA.txt
index 4688f87..8541441 100644
--- a/icu4c/source/data/region/en_CA.txt
+++ b/icu4c/source/data/region/en_CA.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CA{
     %%Parent{"en_001"}
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/region/en_CC.txt b/icu4c/source/data/region/en_CC.txt
index 67fe580..e8c2d33 100644
--- a/icu4c/source/data/region/en_CC.txt
+++ b/icu4c/source/data/region/en_CC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_CH.txt b/icu4c/source/data/region/en_CH.txt
index 1bbe260..745eed0 100644
--- a/icu4c/source/data/region/en_CH.txt
+++ b/icu4c/source/data/region/en_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CH{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_CK.txt b/icu4c/source/data/region/en_CK.txt
index 8f3b9a4..a6909b9 100644
--- a/icu4c/source/data/region/en_CK.txt
+++ b/icu4c/source/data/region/en_CK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_CM.txt b/icu4c/source/data/region/en_CM.txt
index e3da63d..9cb94c0 100644
--- a/icu4c/source/data/region/en_CM.txt
+++ b/icu4c/source/data/region/en_CM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_CX.txt b/icu4c/source/data/region/en_CX.txt
index 4e3c98e..7166f9d 100644
--- a/icu4c/source/data/region/en_CX.txt
+++ b/icu4c/source/data/region/en_CX.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CX{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_CY.txt b/icu4c/source/data/region/en_CY.txt
index 4fa4a14..6e80705 100644
--- a/icu4c/source/data/region/en_CY.txt
+++ b/icu4c/source/data/region/en_CY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_DE.txt b/icu4c/source/data/region/en_DE.txt
index fd11453..9631682 100644
--- a/icu4c/source/data/region/en_DE.txt
+++ b/icu4c/source/data/region/en_DE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DE{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_DG.txt b/icu4c/source/data/region/en_DG.txt
index bd59dcb..a185284 100644
--- a/icu4c/source/data/region/en_DG.txt
+++ b/icu4c/source/data/region/en_DG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_DK.txt b/icu4c/source/data/region/en_DK.txt
index 9f596cd..342c391 100644
--- a/icu4c/source/data/region/en_DK.txt
+++ b/icu4c/source/data/region/en_DK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DK{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_DM.txt b/icu4c/source/data/region/en_DM.txt
index 067f54d..ead644c 100644
--- a/icu4c/source/data/region/en_DM.txt
+++ b/icu4c/source/data/region/en_DM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_ER.txt b/icu4c/source/data/region/en_ER.txt
index dac4b71..9809fe6 100644
--- a/icu4c/source/data/region/en_ER.txt
+++ b/icu4c/source/data/region/en_ER.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ER{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_FI.txt b/icu4c/source/data/region/en_FI.txt
index 0940644..8626b24 100644
--- a/icu4c/source/data/region/en_FI.txt
+++ b/icu4c/source/data/region/en_FI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FI{
     %%Parent{"en_150"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_FJ.txt b/icu4c/source/data/region/en_FJ.txt
index 17022d5..32898fb 100644
--- a/icu4c/source/data/region/en_FJ.txt
+++ b/icu4c/source/data/region/en_FJ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FJ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_FK.txt b/icu4c/source/data/region/en_FK.txt
index edbb4d8..7551e65 100644
--- a/icu4c/source/data/region/en_FK.txt
+++ b/icu4c/source/data/region/en_FK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_FM.txt b/icu4c/source/data/region/en_FM.txt
index 9b1d31f..e4a293d 100644
--- a/icu4c/source/data/region/en_FM.txt
+++ b/icu4c/source/data/region/en_FM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_GB.txt b/icu4c/source/data/region/en_GB.txt
index e8459ff..9986ea2 100644
--- a/icu4c/source/data/region/en_GB.txt
+++ b/icu4c/source/data/region/en_GB.txt
@@ -16,5 +16,5 @@
     Countries%short{
         US{"US"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/region/en_GD.txt b/icu4c/source/data/region/en_GD.txt
index a006727..9ad43f3 100644
--- a/icu4c/source/data/region/en_GD.txt
+++ b/icu4c/source/data/region/en_GD.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_GG.txt b/icu4c/source/data/region/en_GG.txt
index b91b6b8..6e3d4df 100644
--- a/icu4c/source/data/region/en_GG.txt
+++ b/icu4c/source/data/region/en_GG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_GH.txt b/icu4c/source/data/region/en_GH.txt
index 50a4429..d244565 100644
--- a/icu4c/source/data/region/en_GH.txt
+++ b/icu4c/source/data/region/en_GH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_GI.txt b/icu4c/source/data/region/en_GI.txt
index e19c4d8..fc5f7d7 100644
--- a/icu4c/source/data/region/en_GI.txt
+++ b/icu4c/source/data/region/en_GI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_GM.txt b/icu4c/source/data/region/en_GM.txt
index 9448c85..807df46 100644
--- a/icu4c/source/data/region/en_GM.txt
+++ b/icu4c/source/data/region/en_GM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_GY.txt b/icu4c/source/data/region/en_GY.txt
index 7c5333b..4971e6d 100644
--- a/icu4c/source/data/region/en_GY.txt
+++ b/icu4c/source/data/region/en_GY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_HK.txt b/icu4c/source/data/region/en_HK.txt
index d43b56c..78bb499 100644
--- a/icu4c/source/data/region/en_HK.txt
+++ b/icu4c/source/data/region/en_HK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_HK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_IE.txt b/icu4c/source/data/region/en_IE.txt
index 94ab93c..7cb27d7 100644
--- a/icu4c/source/data/region/en_IE.txt
+++ b/icu4c/source/data/region/en_IE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_IL.txt b/icu4c/source/data/region/en_IL.txt
index 55a5091..df09f53d 100644
--- a/icu4c/source/data/region/en_IL.txt
+++ b/icu4c/source/data/region/en_IL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_IM.txt b/icu4c/source/data/region/en_IM.txt
index 3ccab11..2af0241 100644
--- a/icu4c/source/data/region/en_IM.txt
+++ b/icu4c/source/data/region/en_IM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_IN.txt b/icu4c/source/data/region/en_IN.txt
index a2978db..428b860 100644
--- a/icu4c/source/data/region/en_IN.txt
+++ b/icu4c/source/data/region/en_IN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IN{
     %%Parent{"en_001"}
-    Version{"2.1.37.11"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/region/en_IO.txt b/icu4c/source/data/region/en_IO.txt
index 3f89192..d87cdff 100644
--- a/icu4c/source/data/region/en_IO.txt
+++ b/icu4c/source/data/region/en_IO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_JE.txt b/icu4c/source/data/region/en_JE.txt
index 66de22d..2d50f0a 100644
--- a/icu4c/source/data/region/en_JE.txt
+++ b/icu4c/source/data/region/en_JE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_JE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_JM.txt b/icu4c/source/data/region/en_JM.txt
index ad3c905..c7e0fef 100644
--- a/icu4c/source/data/region/en_JM.txt
+++ b/icu4c/source/data/region/en_JM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_JM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_KE.txt b/icu4c/source/data/region/en_KE.txt
index 0af301a..4e7344a 100644
--- a/icu4c/source/data/region/en_KE.txt
+++ b/icu4c/source/data/region/en_KE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_KI.txt b/icu4c/source/data/region/en_KI.txt
index f671853..74349d3 100644
--- a/icu4c/source/data/region/en_KI.txt
+++ b/icu4c/source/data/region/en_KI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_KN.txt b/icu4c/source/data/region/en_KN.txt
index 573c389..3accb4c 100644
--- a/icu4c/source/data/region/en_KN.txt
+++ b/icu4c/source/data/region/en_KN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KN{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_KY.txt b/icu4c/source/data/region/en_KY.txt
index 0d60082..dfde982 100644
--- a/icu4c/source/data/region/en_KY.txt
+++ b/icu4c/source/data/region/en_KY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_LC.txt b/icu4c/source/data/region/en_LC.txt
index 7033a6a..9c2e8c4 100644
--- a/icu4c/source/data/region/en_LC.txt
+++ b/icu4c/source/data/region/en_LC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_LR.txt b/icu4c/source/data/region/en_LR.txt
index 8d60973..3b6da71 100644
--- a/icu4c/source/data/region/en_LR.txt
+++ b/icu4c/source/data/region/en_LR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LR{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_LS.txt b/icu4c/source/data/region/en_LS.txt
index 61d557f..644ca26 100644
--- a/icu4c/source/data/region/en_LS.txt
+++ b/icu4c/source/data/region/en_LS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_MG.txt b/icu4c/source/data/region/en_MG.txt
index f5b2bfd..500786d 100644
--- a/icu4c/source/data/region/en_MG.txt
+++ b/icu4c/source/data/region/en_MG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_MO.txt b/icu4c/source/data/region/en_MO.txt
index 7c06497..5b0cc9a 100644
--- a/icu4c/source/data/region/en_MO.txt
+++ b/icu4c/source/data/region/en_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_MS.txt b/icu4c/source/data/region/en_MS.txt
index 28ef10d..31e4995 100644
--- a/icu4c/source/data/region/en_MS.txt
+++ b/icu4c/source/data/region/en_MS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_MT.txt b/icu4c/source/data/region/en_MT.txt
index 0d4bc8b..5ae61e8 100644
--- a/icu4c/source/data/region/en_MT.txt
+++ b/icu4c/source/data/region/en_MT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MT{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_MU.txt b/icu4c/source/data/region/en_MU.txt
index f36ff7e..70f4a69 100644
--- a/icu4c/source/data/region/en_MU.txt
+++ b/icu4c/source/data/region/en_MU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_MW.txt b/icu4c/source/data/region/en_MW.txt
index 8f5bed0..f0fe526 100644
--- a/icu4c/source/data/region/en_MW.txt
+++ b/icu4c/source/data/region/en_MW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_MY.txt b/icu4c/source/data/region/en_MY.txt
index fc723c2..4fa38e5 100644
--- a/icu4c/source/data/region/en_MY.txt
+++ b/icu4c/source/data/region/en_MY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_NA.txt b/icu4c/source/data/region/en_NA.txt
index 17f6b27..a07f557 100644
--- a/icu4c/source/data/region/en_NA.txt
+++ b/icu4c/source/data/region/en_NA.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NA{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_NF.txt b/icu4c/source/data/region/en_NF.txt
index 56b1a98..b1e3b07 100644
--- a/icu4c/source/data/region/en_NF.txt
+++ b/icu4c/source/data/region/en_NF.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NF{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_NG.txt b/icu4c/source/data/region/en_NG.txt
index 8102534..b302284 100644
--- a/icu4c/source/data/region/en_NG.txt
+++ b/icu4c/source/data/region/en_NG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_NL.txt b/icu4c/source/data/region/en_NL.txt
index 4566eb3..d27f8a3 100644
--- a/icu4c/source/data/region/en_NL.txt
+++ b/icu4c/source/data/region/en_NL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NL{
     %%Parent{"en_150"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_NR.txt b/icu4c/source/data/region/en_NR.txt
index a66b87f..7e1b070 100644
--- a/icu4c/source/data/region/en_NR.txt
+++ b/icu4c/source/data/region/en_NR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NR{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_NU.txt b/icu4c/source/data/region/en_NU.txt
index 86aa256..d79dc18 100644
--- a/icu4c/source/data/region/en_NU.txt
+++ b/icu4c/source/data/region/en_NU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_NZ.txt b/icu4c/source/data/region/en_NZ.txt
index 55787c8..e077345 100644
--- a/icu4c/source/data/region/en_NZ.txt
+++ b/icu4c/source/data/region/en_NZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NZ{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/region/en_PG.txt b/icu4c/source/data/region/en_PG.txt
index 6146600..b0aa15c 100644
--- a/icu4c/source/data/region/en_PG.txt
+++ b/icu4c/source/data/region/en_PG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_PH.txt b/icu4c/source/data/region/en_PH.txt
index 04ac66a..94d6d4c 100644
--- a/icu4c/source/data/region/en_PH.txt
+++ b/icu4c/source/data/region/en_PH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_PK.txt b/icu4c/source/data/region/en_PK.txt
index 3d5d2f6..ae335ca 100644
--- a/icu4c/source/data/region/en_PK.txt
+++ b/icu4c/source/data/region/en_PK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_PN.txt b/icu4c/source/data/region/en_PN.txt
index 8b83a8d..907c98b 100644
--- a/icu4c/source/data/region/en_PN.txt
+++ b/icu4c/source/data/region/en_PN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PN{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_PW.txt b/icu4c/source/data/region/en_PW.txt
index 43ec73a..14fe4d0 100644
--- a/icu4c/source/data/region/en_PW.txt
+++ b/icu4c/source/data/region/en_PW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_RW.txt b/icu4c/source/data/region/en_RW.txt
index 1323a28..b5bd04c 100644
--- a/icu4c/source/data/region/en_RW.txt
+++ b/icu4c/source/data/region/en_RW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_RW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SB.txt b/icu4c/source/data/region/en_SB.txt
index 08287c0..135fc64 100644
--- a/icu4c/source/data/region/en_SB.txt
+++ b/icu4c/source/data/region/en_SB.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SB{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SC.txt b/icu4c/source/data/region/en_SC.txt
index 9c80308..9026bef 100644
--- a/icu4c/source/data/region/en_SC.txt
+++ b/icu4c/source/data/region/en_SC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SD.txt b/icu4c/source/data/region/en_SD.txt
index 8fef005..e3323d7 100644
--- a/icu4c/source/data/region/en_SD.txt
+++ b/icu4c/source/data/region/en_SD.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SE.txt b/icu4c/source/data/region/en_SE.txt
index 35978fe..fa6772c 100644
--- a/icu4c/source/data/region/en_SE.txt
+++ b/icu4c/source/data/region/en_SE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SE{
     %%Parent{"en_150"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SG.txt b/icu4c/source/data/region/en_SG.txt
index 904e860..c0e7458 100644
--- a/icu4c/source/data/region/en_SG.txt
+++ b/icu4c/source/data/region/en_SG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SH.txt b/icu4c/source/data/region/en_SH.txt
index dbaac39..46006e9 100644
--- a/icu4c/source/data/region/en_SH.txt
+++ b/icu4c/source/data/region/en_SH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SI.txt b/icu4c/source/data/region/en_SI.txt
index c6837fe..8dc7c6a 100644
--- a/icu4c/source/data/region/en_SI.txt
+++ b/icu4c/source/data/region/en_SI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SI{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SL.txt b/icu4c/source/data/region/en_SL.txt
index f3ff3f7..627e073 100644
--- a/icu4c/source/data/region/en_SL.txt
+++ b/icu4c/source/data/region/en_SL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SS.txt b/icu4c/source/data/region/en_SS.txt
index 1b9c52e..fac8b78 100644
--- a/icu4c/source/data/region/en_SS.txt
+++ b/icu4c/source/data/region/en_SS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SX.txt b/icu4c/source/data/region/en_SX.txt
index c619269..e6eb9bb 100644
--- a/icu4c/source/data/region/en_SX.txt
+++ b/icu4c/source/data/region/en_SX.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SX{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_SZ.txt b/icu4c/source/data/region/en_SZ.txt
index 734e744..650774b 100644
--- a/icu4c/source/data/region/en_SZ.txt
+++ b/icu4c/source/data/region/en_SZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_TC.txt b/icu4c/source/data/region/en_TC.txt
index 31b22e7..6d30689 100644
--- a/icu4c/source/data/region/en_TC.txt
+++ b/icu4c/source/data/region/en_TC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_TK.txt b/icu4c/source/data/region/en_TK.txt
index 380b9d9..a102a8c 100644
--- a/icu4c/source/data/region/en_TK.txt
+++ b/icu4c/source/data/region/en_TK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_TO.txt b/icu4c/source/data/region/en_TO.txt
index 426b5d6..3f82fa0 100644
--- a/icu4c/source/data/region/en_TO.txt
+++ b/icu4c/source/data/region/en_TO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_TT.txt b/icu4c/source/data/region/en_TT.txt
index 4d6d39d..284f5f7 100644
--- a/icu4c/source/data/region/en_TT.txt
+++ b/icu4c/source/data/region/en_TT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TT{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_TV.txt b/icu4c/source/data/region/en_TV.txt
index debe076..7ad38cb 100644
--- a/icu4c/source/data/region/en_TV.txt
+++ b/icu4c/source/data/region/en_TV.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TV{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_TZ.txt b/icu4c/source/data/region/en_TZ.txt
index 25e40bf..ed8f720 100644
--- a/icu4c/source/data/region/en_TZ.txt
+++ b/icu4c/source/data/region/en_TZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_UG.txt b/icu4c/source/data/region/en_UG.txt
index d28e107..6d41671 100644
--- a/icu4c/source/data/region/en_UG.txt
+++ b/icu4c/source/data/region/en_UG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_UG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_VC.txt b/icu4c/source/data/region/en_VC.txt
index dc17ae0..7f5fda9 100644
--- a/icu4c/source/data/region/en_VC.txt
+++ b/icu4c/source/data/region/en_VC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_VG.txt b/icu4c/source/data/region/en_VG.txt
index 995ae52..0e708c0 100644
--- a/icu4c/source/data/region/en_VG.txt
+++ b/icu4c/source/data/region/en_VG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_VU.txt b/icu4c/source/data/region/en_VU.txt
index 433c4c9..5fe2f2a 100644
--- a/icu4c/source/data/region/en_VU.txt
+++ b/icu4c/source/data/region/en_VU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_WS.txt b/icu4c/source/data/region/en_WS.txt
index 0697889..00ce51e 100644
--- a/icu4c/source/data/region/en_WS.txt
+++ b/icu4c/source/data/region/en_WS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_WS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_ZA.txt b/icu4c/source/data/region/en_ZA.txt
index 844f02c..41c2c2e 100644
--- a/icu4c/source/data/region/en_ZA.txt
+++ b/icu4c/source/data/region/en_ZA.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZA{
     %%Parent{"en_001"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_ZM.txt b/icu4c/source/data/region/en_ZM.txt
index 3e9be74..b330b46 100644
--- a/icu4c/source/data/region/en_ZM.txt
+++ b/icu4c/source/data/region/en_ZM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/en_ZW.txt b/icu4c/source/data/region/en_ZW.txt
index 5fb189a..f20fa35 100644
--- a/icu4c/source/data/region/en_ZW.txt
+++ b/icu4c/source/data/region/en_ZW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/eo.txt b/icu4c/source/data/region/eo.txt
index 3630f02..6c45ef8 100644
--- a/icu4c/source/data/region/eo.txt
+++ b/icu4c/source/data/region/eo.txt
@@ -226,5 +226,5 @@
         ZM{"Zambio"}
         ZW{"Zimbabvo"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/es.txt b/icu4c/source/data/region/es.txt
index b6479fd..4cff607 100644
--- a/icu4c/source/data/region/es.txt
+++ b/icu4c/source/data/region/es.txt
@@ -31,6 +31,7 @@
         151{"Europa oriental"}
         154{"Europa septentrional"}
         155{"Europa occidental"}
+        202{"África subsahariana"}
         419{"Latinoamérica"}
         AC{"Isla de la Ascensión"}
         AD{"Andorra"}
@@ -305,5 +306,5 @@
         CZ{"República Checa"}
         TL{"Timor Oriental"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/es_419.txt b/icu4c/source/data/region/es_419.txt
index 9495a29..53bba86 100644
--- a/icu4c/source/data/region/es_419.txt
+++ b/icu4c/source/data/region/es_419.txt
@@ -30,5 +30,5 @@
     Countries%short{
         GB{"R. U."}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_AR.txt b/icu4c/source/data/region/es_AR.txt
index 16d3beb..6442e81 100644
--- a/icu4c/source/data/region/es_AR.txt
+++ b/icu4c/source/data/region/es_AR.txt
@@ -12,5 +12,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_BO.txt b/icu4c/source/data/region/es_BO.txt
index 1246b4f..31ff3d4 100644
--- a/icu4c/source/data/region/es_BO.txt
+++ b/icu4c/source/data/region/es_BO.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_BR.txt b/icu4c/source/data/region/es_BR.txt
index ee8a444..1115ce9 100644
--- a/icu4c/source/data/region/es_BR.txt
+++ b/icu4c/source/data/region/es_BR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BR{
     %%Parent{"es_419"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_BZ.txt b/icu4c/source/data/region/es_BZ.txt
index 7734598..3d2302c 100644
--- a/icu4c/source/data/region/es_BZ.txt
+++ b/icu4c/source/data/region/es_BZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BZ{
     %%Parent{"es_419"}
-    Version{"2.1.32.37"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_CL.txt b/icu4c/source/data/region/es_CL.txt
index a0b6d49..622f036 100644
--- a/icu4c/source/data/region/es_CL.txt
+++ b/icu4c/source/data/region/es_CL.txt
@@ -12,5 +12,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_CO.txt b/icu4c/source/data/region/es_CO.txt
index 832593a..276f9a9 100644
--- a/icu4c/source/data/region/es_CO.txt
+++ b/icu4c/source/data/region/es_CO.txt
@@ -12,5 +12,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_CR.txt b/icu4c/source/data/region/es_CR.txt
index c060627..82873fa 100644
--- a/icu4c/source/data/region/es_CR.txt
+++ b/icu4c/source/data/region/es_CR.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_CU.txt b/icu4c/source/data/region/es_CU.txt
index f75d29f..3fb6de1 100644
--- a/icu4c/source/data/region/es_CU.txt
+++ b/icu4c/source/data/region/es_CU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CU{
     %%Parent{"es_419"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_DO.txt b/icu4c/source/data/region/es_DO.txt
index 1dfaff2..2a3806c 100644
--- a/icu4c/source/data/region/es_DO.txt
+++ b/icu4c/source/data/region/es_DO.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_EC.txt b/icu4c/source/data/region/es_EC.txt
index ff77ed2..149728c 100644
--- a/icu4c/source/data/region/es_EC.txt
+++ b/icu4c/source/data/region/es_EC.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_GT.txt b/icu4c/source/data/region/es_GT.txt
index 42795ce..7218143 100644
--- a/icu4c/source/data/region/es_GT.txt
+++ b/icu4c/source/data/region/es_GT.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_HN.txt b/icu4c/source/data/region/es_HN.txt
index e406615..49e2555 100644
--- a/icu4c/source/data/region/es_HN.txt
+++ b/icu4c/source/data/region/es_HN.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_MX.txt b/icu4c/source/data/region/es_MX.txt
index f937a9b..65aa272 100644
--- a/icu4c/source/data/region/es_MX.txt
+++ b/icu4c/source/data/region/es_MX.txt
@@ -29,5 +29,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.32"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/region/es_NI.txt b/icu4c/source/data/region/es_NI.txt
index e63cd73..b86ffb2 100644
--- a/icu4c/source/data/region/es_NI.txt
+++ b/icu4c/source/data/region/es_NI.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_PA.txt b/icu4c/source/data/region/es_PA.txt
index 5910e9d..d0c712d 100644
--- a/icu4c/source/data/region/es_PA.txt
+++ b/icu4c/source/data/region/es_PA.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_PE.txt b/icu4c/source/data/region/es_PE.txt
index 5f27bf8..44b6b11 100644
--- a/icu4c/source/data/region/es_PE.txt
+++ b/icu4c/source/data/region/es_PE.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_PR.txt b/icu4c/source/data/region/es_PR.txt
index 80c30d9..81693df 100644
--- a/icu4c/source/data/region/es_PR.txt
+++ b/icu4c/source/data/region/es_PR.txt
@@ -5,5 +5,5 @@
     Countries{
         UM{"Islas menores alejadas de EE. UU."}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_PY.txt b/icu4c/source/data/region/es_PY.txt
index ebdc004..5821b07 100644
--- a/icu4c/source/data/region/es_PY.txt
+++ b/icu4c/source/data/region/es_PY.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_SV.txt b/icu4c/source/data/region/es_SV.txt
index 6355603..8addad6 100644
--- a/icu4c/source/data/region/es_SV.txt
+++ b/icu4c/source/data/region/es_SV.txt
@@ -5,5 +5,5 @@
     Countries{
         UM{"Islas menores alejadas de EE. UU."}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_US.txt b/icu4c/source/data/region/es_US.txt
index e340d07..cf4f04d 100644
--- a/icu4c/source/data/region/es_US.txt
+++ b/icu4c/source/data/region/es_US.txt
@@ -32,5 +32,5 @@
         CI{"CI"}
         TL{"TL"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/region/es_UY.txt b/icu4c/source/data/region/es_UY.txt
index cde08bb..8898960 100644
--- a/icu4c/source/data/region/es_UY.txt
+++ b/icu4c/source/data/region/es_UY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_UY{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/es_VE.txt b/icu4c/source/data/region/es_VE.txt
index e8ac9e7..d964094 100644
--- a/icu4c/source/data/region/es_VE.txt
+++ b/icu4c/source/data/region/es_VE.txt
@@ -11,5 +11,5 @@
     Countries%short{
         GB{"RU"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/et.txt b/icu4c/source/data/region/et.txt
index bd55c4d..85093c7 100644
--- a/icu4c/source/data/region/et.txt
+++ b/icu4c/source/data/region/et.txt
@@ -31,6 +31,7 @@
         151{"Ida-Euroopa"}
         154{"Põhja-Euroopa"}
         155{"Lääne-Euroopa"}
+        202{"Sahara-tagune Aafrika"}
         419{"Ladina-Ameerika"}
         AC{"Ascensioni saar"}
         AD{"Andorra"}
@@ -306,5 +307,5 @@
         CZ{"Tšehhia"}
         TL{"Timor-Leste"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/eu.txt b/icu4c/source/data/region/eu.txt
index 21c6c61..cbb545f 100644
--- a/icu4c/source/data/region/eu.txt
+++ b/icu4c/source/data/region/eu.txt
@@ -31,6 +31,7 @@
         151{"Europa ekialdea"}
         154{"Europa iparraldea"}
         155{"Europa mendebaldea"}
+        202{"Saharaz hegoaldeko Afrika"}
         419{"Latinoamerika"}
         AC{"Ascension uhartea"}
         AD{"Andorra"}
@@ -301,7 +302,9 @@
     Countries%variant{
         CD{"Kongo (DR)"}
         CG{"Kongoko Errepublika"}
+        CI{"CI"}
         CZ{"Txekiar Errepublika"}
+        TL{"TL"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ewo.txt b/icu4c/source/data/region/ewo.txt
index f9047f2..cfbdc06 100644
--- a/icu4c/source/data/region/ewo.txt
+++ b/icu4c/source/data/region/ewo.txt
@@ -227,5 +227,5 @@
         ZM{"Zambí"}
         ZW{"Zimbabwé"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/fa.txt b/icu4c/source/data/region/fa.txt
index c487b2d..d1df6ce 100644
--- a/icu4c/source/data/region/fa.txt
+++ b/icu4c/source/data/region/fa.txt
@@ -31,6 +31,7 @@
         151{"شرق اروپا"}
         154{"شمال اروپا"}
         155{"غرب اروپا"}
+        202{"افریقای سیاه"}
         419{"امریکای لاتین"}
         AC{"جزایر آسنسیون"}
         AD{"آندورا"}
@@ -305,5 +306,5 @@
         CG{"کنگو (جمهوری)"}
         TL{"تیمور شرقی"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/fa_AF.txt b/icu4c/source/data/region/fa_AF.txt
index c54e043..dd5a94d 100644
--- a/icu4c/source/data/region/fa_AF.txt
+++ b/icu4c/source/data/region/fa_AF.txt
@@ -94,5 +94,5 @@
         XK{"کوسوا"}
         ZW{"زیمبابوی"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/ff.txt b/icu4c/source/data/region/ff.txt
index 5bea944..7a157a1 100644
--- a/icu4c/source/data/region/ff.txt
+++ b/icu4c/source/data/region/ff.txt
@@ -227,5 +227,5 @@
         ZM{"Sammbi"}
         ZW{"Simbaabuwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/fi.txt b/icu4c/source/data/region/fi.txt
index 1677c66..4ffef6d 100644
--- a/icu4c/source/data/region/fi.txt
+++ b/icu4c/source/data/region/fi.txt
@@ -31,6 +31,7 @@
         151{"Itä-Eurooppa"}
         154{"Pohjois-Eurooppa"}
         155{"Länsi-Eurooppa"}
+        202{"Saharan eteläpuolinen Afrikka"}
         419{"Latinalainen Amerikka"}
         AC{"Ascension-saari"}
         AD{"Andorra"}
@@ -306,5 +307,5 @@
         CZ{"Tšekin tasavalta"}
         TL{"Timor-Leste"}
     }
-    Version{"2.1.37.67"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/fil.txt b/icu4c/source/data/region/fil.txt
index 2c3111f..4a81821 100644
--- a/icu4c/source/data/region/fil.txt
+++ b/icu4c/source/data/region/fil.txt
@@ -31,6 +31,7 @@
         151{"Silangang Europe"}
         154{"Hilagang Europe"}
         155{"Kanlurang Europe"}
+        202{"Sub-Saharan Africa"}
         419{"Latin America"}
         AC{"Acsencion island"}
         AD{"Andorra"}
@@ -306,5 +307,5 @@
         CZ{"Czech Republic"}
         TL{"East Timor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/fo.txt b/icu4c/source/data/region/fo.txt
index cbf8655..fe92a0b 100644
--- a/icu4c/source/data/region/fo.txt
+++ b/icu4c/source/data/region/fo.txt
@@ -31,6 +31,7 @@
         151{"Eysturevropa"}
         154{"Norðurevropa"}
         155{"Vesturevropa"}
+        202{"Afrika sunnanfyri Sahara"}
         419{"Latínamerika"}
         AC{"Ascension"}
         AD{"Andorra"}
@@ -58,7 +59,7 @@
         BH{"Barein"}
         BI{"Burundi"}
         BJ{"Benin"}
-        BL{"St-Barthélemy"}
+        BL{"St. Barthélemy"}
         BM{"Bermuda"}
         BN{"Brunei"}
         BO{"Bolivia"}
@@ -97,7 +98,7 @@
         DM{"Dominika"}
         DO{"Dominikalýðveldið"}
         DZ{"Algeria"}
-        EA{"Ceuta og Melilla"}
+        EA{"Ceuta & Melilla"}
         EC{"Ekvador"}
         EE{"Estland"}
         EG{"Egyptaland"}
@@ -109,7 +110,7 @@
         EZ{"Evrasona"}
         FI{"Finnland"}
         FJ{"Fiji"}
-        FK{"Falklandsoyggjar"}
+        FK{"Falklandsoyggjar (Islas Malvinas)"}
         FM{"Mikronesiasamveldið"}
         FO{"Føroyar"}
         FR{"Frakland"}
@@ -218,7 +219,7 @@
         PH{"Filipsoyggjar"}
         PK{"Pakistan"}
         PL{"Pólland"}
-        PM{"Saint Pierre og Miquelon"}
+        PM{"Saint Pierre & Miquelon"}
         PN{"Pitcairnoyggjar"}
         PR{"Puerto Riko"}
         PS{"Palestina"}
@@ -298,5 +299,5 @@
         GB{"UK"}
         US{"USA"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/fr.txt b/icu4c/source/data/region/fr.txt
index 9cbf182..cd9fd31 100644
--- a/icu4c/source/data/region/fr.txt
+++ b/icu4c/source/data/region/fr.txt
@@ -31,6 +31,7 @@
         151{"Europe de l’Est"}
         154{"Europe septentrionale"}
         155{"Europe occidentale"}
+        202{"Afrique subsaharienne"}
         419{"Amérique latine"}
         AC{"Île de l’Ascension"}
         AD{"Andorre"}
@@ -306,5 +307,5 @@
         CZ{"République tchèque"}
         TL{"Timor-Oriental"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/fr_BE.txt b/icu4c/source/data/region/fr_BE.txt
index 8da4e47..20228ab 100644
--- a/icu4c/source/data/region/fr_BE.txt
+++ b/icu4c/source/data/region/fr_BE.txt
@@ -5,5 +5,5 @@
         BN{"Brunei"}
         GS{"Îles Géorgie du Sud et Sandwich du Sud"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/fr_CA.txt b/icu4c/source/data/region/fr_CA.txt
index 381ad2f..e14350c 100644
--- a/icu4c/source/data/region/fr_CA.txt
+++ b/icu4c/source/data/region/fr_CA.txt
@@ -38,5 +38,5 @@
         CI{"République de Côte d’Ivoire"}
         TL{"Timor oriental"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/region/fur.txt b/icu4c/source/data/region/fur.txt
index 5e9b12d..8ebece6 100644
--- a/icu4c/source/data/region/fur.txt
+++ b/icu4c/source/data/region/fur.txt
@@ -290,5 +290,5 @@
         CD{"Congo (RDC)"}
         CG{"Congo (Republiche)"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/fy.txt b/icu4c/source/data/region/fy.txt
index 892fe90..a469a74 100644
--- a/icu4c/source/data/region/fy.txt
+++ b/icu4c/source/data/region/fy.txt
@@ -300,5 +300,5 @@
         CD{"Congo (DRC)"}
         CG{"Congo (Republyk)"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ga.txt b/icu4c/source/data/region/ga.txt
index 147bc07..0268d41 100644
--- a/icu4c/source/data/region/ga.txt
+++ b/icu4c/source/data/region/ga.txt
@@ -31,6 +31,7 @@
         151{"Oirthear na hEorpa"}
         154{"Tuaisceart na hEorpa"}
         155{"Iarthar na hEorpa"}
+        202{"an Afraic fho-Shahárach"}
         419{"Meiriceá Laidineach"}
         AC{"Oileán na Deascabhála"}
         AD{"Andóra"}
@@ -302,7 +303,8 @@
     Countries%variant{
         CD{"an Congó (PDC)"}
         CG{"an Congó (Poblacht)"}
+        CI{"Côte d’Ivoire"}
         CZ{"Poblacht na Seice"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/gd.txt b/icu4c/source/data/region/gd.txt
index 4e46950..045ecf0 100644
--- a/icu4c/source/data/region/gd.txt
+++ b/icu4c/source/data/region/gd.txt
@@ -305,5 +305,5 @@
         CZ{"Poblachd na Seice"}
         TL{"Tìomor an Ear"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/gl.txt b/icu4c/source/data/region/gl.txt
index 39d8641..f8ca35a 100644
--- a/icu4c/source/data/region/gl.txt
+++ b/icu4c/source/data/region/gl.txt
@@ -31,6 +31,7 @@
         151{"Europa do Leste"}
         154{"Europa Setentrional"}
         155{"Europa Occidental"}
+        202{"África subsahariana"}
         419{"América Latina"}
         AC{"Illa de Ascensión"}
         AD{"Andorra"}
@@ -306,5 +307,5 @@
         CZ{"República Checa"}
         TL{"TL"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/gsw.txt b/icu4c/source/data/region/gsw.txt
index b20b72c..27ab602 100644
--- a/icu4c/source/data/region/gsw.txt
+++ b/icu4c/source/data/region/gsw.txt
@@ -281,5 +281,5 @@
         ZW{"Simbabwe"}
         ZZ{"Unbekannti oder ungültigi Regioon"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/gu.txt b/icu4c/source/data/region/gu.txt
index 20150a1..d2ecae2 100644
--- a/icu4c/source/data/region/gu.txt
+++ b/icu4c/source/data/region/gu.txt
@@ -31,6 +31,7 @@
         151{"પૂર્વીય યુરોપ"}
         154{"ઉત્તરીય યુરોપ"}
         155{"પશ્ચિમી યુરોપ"}
+        202{"સબ-સહારન આફ્રિકા"}
         419{"લેટિન અમેરિકા"}
         AC{"એસેન્શન આઇલેન્ડ"}
         AD{"ઍંડોરા"}
@@ -306,5 +307,5 @@
         CZ{"ચેક રિપબ્લિક"}
         TL{"પૂર્વ તિમોર"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/guz.txt b/icu4c/source/data/region/guz.txt
index 69a6f1d..5a28112 100644
--- a/icu4c/source/data/region/guz.txt
+++ b/icu4c/source/data/region/guz.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/gv.txt b/icu4c/source/data/region/gv.txt
index 5976213..cd9c262 100644
--- a/icu4c/source/data/region/gv.txt
+++ b/icu4c/source/data/region/gv.txt
@@ -5,5 +5,5 @@
         GB{"Rywvaneth Unys"}
         IM{"Ellan Vannin"}
     }
-    Version{"2.1.34.91"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/ha.txt b/icu4c/source/data/region/ha.txt
index 85449ae..c924bc2 100644
--- a/icu4c/source/data/region/ha.txt
+++ b/icu4c/source/data/region/ha.txt
@@ -227,5 +227,5 @@
         ZM{"Zambiya"}
         ZW{"Zimbabuwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/haw.txt b/icu4c/source/data/region/haw.txt
index 1a1eaa6..3609809 100644
--- a/icu4c/source/data/region/haw.txt
+++ b/icu4c/source/data/region/haw.txt
@@ -23,5 +23,5 @@
         RU{"Lūkia"}
         US{"ʻAmelika Hui Pū ʻIa"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/he.txt b/icu4c/source/data/region/he.txt
index b4c8ecc..f938691 100644
--- a/icu4c/source/data/region/he.txt
+++ b/icu4c/source/data/region/he.txt
@@ -31,6 +31,7 @@
         151{"מזרח אירופה"}
         154{"צפון אירופה"}
         155{"מערב אירופה"}
+        202{"אפריקה שמדרום לסהרה"}
         419{"אמריקה הלטינית"}
         AC{"האי אסנשן"}
         AD{"אנדורה"}
@@ -304,5 +305,5 @@
         CZ{"הרפובליקה הצ׳כית"}
         TL{"מזרח טימור"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/hi.txt b/icu4c/source/data/region/hi.txt
index 85b9aaa..2841bfc 100644
--- a/icu4c/source/data/region/hi.txt
+++ b/icu4c/source/data/region/hi.txt
@@ -31,6 +31,7 @@
         151{"पूर्वी यूरोप"}
         154{"उत्तरी यूरोप"}
         155{"पश्चिमी यूरोप"}
+        202{"उप-सहारा अफ़्रीका"}
         419{"लैटिन अमेरिका"}
         AC{"असेंशन द्वीप"}
         AD{"एंडोरा"}
@@ -306,5 +307,5 @@
         CZ{"चेक गणराज्य"}
         TL{"पूर्वी तिमोर"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/hr.txt b/icu4c/source/data/region/hr.txt
index 958f9c2..1617599 100644
--- a/icu4c/source/data/region/hr.txt
+++ b/icu4c/source/data/region/hr.txt
@@ -31,6 +31,7 @@
         151{"Istočna Europa"}
         154{"Sjeverna Europa"}
         155{"Zapadna Europa"}
+        202{"Subsaharska Afrika"}
         419{"Latinska Amerika"}
         AC{"Otok Ascension"}
         AD{"Andora"}
@@ -306,5 +307,5 @@
         CZ{"Češka Republika"}
         TL{"Istočni Timor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/hsb.txt b/icu4c/source/data/region/hsb.txt
index 4c229a3..4b81e32 100644
--- a/icu4c/source/data/region/hsb.txt
+++ b/icu4c/source/data/region/hsb.txt
@@ -302,5 +302,5 @@
         CI{"Słonowinowy pobrjóh"}
         TL{"Wuchodny Timor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/hu.txt b/icu4c/source/data/region/hu.txt
index e2321f2..72f55d7 100644
--- a/icu4c/source/data/region/hu.txt
+++ b/icu4c/source/data/region/hu.txt
@@ -31,6 +31,7 @@
         151{"Kelet-Európa"}
         154{"Észak-Európa"}
         155{"Nyugat-Európa"}
+        202{"Szubszaharai Afrika"}
         419{"Latin-Amerika"}
         AC{"Ascension-sziget"}
         AD{"Andorra"}
@@ -306,5 +307,5 @@
         CZ{"Cseh Köztársaság"}
         TL{"Timor-Leste"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/hy.txt b/icu4c/source/data/region/hy.txt
index 64bdc6c..cf53b38 100644
--- a/icu4c/source/data/region/hy.txt
+++ b/icu4c/source/data/region/hy.txt
@@ -31,6 +31,7 @@
         151{"Արևելյան Եվրոպա"}
         154{"Հյուսիսային Եվրոպա"}
         155{"Արևմտյան Եվրոպա"}
+        202{"Արևադարձային Աֆրիկա"}
         419{"Լատինական Ամերիկա"}
         AC{"Համբարձման կղզի"}
         AD{"Անդորրա"}
@@ -306,5 +307,5 @@
         CZ{"Չեխիայի Հանրապետություն"}
         TL{"Արևելյան Թիմոր"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/id.txt b/icu4c/source/data/region/id.txt
index d3232b1..7074406 100644
--- a/icu4c/source/data/region/id.txt
+++ b/icu4c/source/data/region/id.txt
@@ -31,6 +31,7 @@
         151{"Eropa Bagian Timur"}
         154{"Eropa Bagian Utara"}
         155{"Eropa Bagian Barat"}
+        202{"Afrika Sub-Sahara"}
         419{"Amerika Latin"}
         AC{"Pulau Ascension"}
         AD{"Andorra"}
@@ -304,5 +305,5 @@
         CG{"Kongo (Republik)"}
         CZ{"Republik Ceko"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/ig.txt b/icu4c/source/data/region/ig.txt
index 2103076..8d6cdff 100644
--- a/icu4c/source/data/region/ig.txt
+++ b/icu4c/source/data/region/ig.txt
@@ -11,5 +11,5 @@
         MV{"Maldivesa"}
         NG{"Naịjịrịa"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/ii.txt b/icu4c/source/data/region/ii.txt
index d78fba6..b1d6559 100644
--- a/icu4c/source/data/region/ii.txt
+++ b/icu4c/source/data/region/ii.txt
@@ -14,5 +14,5 @@
         US{"ꂰꇩ"}
         ZZ{"ꃅꄷꅉꀋꐚꌠ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/is.txt b/icu4c/source/data/region/is.txt
index 59a6bbf..688aa04 100644
--- a/icu4c/source/data/region/is.txt
+++ b/icu4c/source/data/region/is.txt
@@ -31,6 +31,7 @@
         151{"Austur-Evrópa"}
         154{"Norður-Evrópa"}
         155{"Vestur-Evrópa"}
+        202{"Afríka sunnan Sahara"}
         419{"Rómanska Ameríka"}
         AC{"Ascension-eyja"}
         AD{"Andorra"}
@@ -76,7 +77,7 @@
         CF{"Mið-Afríkulýðveldið"}
         CG{"Kongó-Brazzaville"}
         CH{"Sviss"}
-        CI{"Fílabeinsströndin"}
+        CI{"Côte d’Ivoire"}
         CK{"Cooks-eyjar"}
         CL{"Síle"}
         CM{"Kamerún"}
@@ -302,7 +303,8 @@
     Countries%variant{
         CD{"Kongó (Lýðstjórnarlýðveldið)"}
         CG{"Kongó (Lýðveldið)"}
+        CI{"Fílabeinsströndin"}
         TL{"Austur-Tímor"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/it.txt b/icu4c/source/data/region/it.txt
index ca538c3..d2c5089 100644
--- a/icu4c/source/data/region/it.txt
+++ b/icu4c/source/data/region/it.txt
@@ -31,6 +31,7 @@
         151{"Europa orientale"}
         154{"Europa settentrionale"}
         155{"Europa occidentale"}
+        202{"Africa subsahariana"}
         419{"America Latina"}
         AC{"Isola Ascensione"}
         AD{"Andorra"}
@@ -306,5 +307,5 @@
         CZ{"Repubblica Ceca"}
         TL{"Timor Leste"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.40"}
 }
diff --git a/icu4c/source/data/region/ja.txt b/icu4c/source/data/region/ja.txt
index 6cc67ad..edf5d5d 100644
--- a/icu4c/source/data/region/ja.txt
+++ b/icu4c/source/data/region/ja.txt
@@ -31,6 +31,7 @@
         151{"東ヨーロッパ"}
         154{"北ヨーロッパ"}
         155{"西ヨーロッパ"}
+        202{"サブサハラアフリカ"}
         419{"ラテンアメリカ"}
         AC{"アセンション島"}
         AD{"アンドラ"}
@@ -306,5 +307,5 @@
         CZ{"チェコ共和国"}
         TL{"東チモール"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/jgo.txt b/icu4c/source/data/region/jgo.txt
index 8ada64c..d68fd2f 100644
--- a/icu4c/source/data/region/jgo.txt
+++ b/icu4c/source/data/region/jgo.txt
@@ -85,5 +85,5 @@
         ZW{"Zimbámbwɛ"}
         ZZ{"ŋgɔŋ yi pɛ́ ká kɛ́ jʉɔ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/jmc.txt b/icu4c/source/data/region/jmc.txt
index 5e6a86d..2cc41eb 100644
--- a/icu4c/source/data/region/jmc.txt
+++ b/icu4c/source/data/region/jmc.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ka.txt b/icu4c/source/data/region/ka.txt
index c5c9d30..c706439 100644
--- a/icu4c/source/data/region/ka.txt
+++ b/icu4c/source/data/region/ka.txt
@@ -31,6 +31,7 @@
         151{"აღმოსავლეთ ევროპა"}
         154{"ჩრდილოეთ ევროპა"}
         155{"დასავლეთ ევროპა"}
+        202{"სუბსაჰარული აფრიკა"}
         419{"ლათინური ამერიკა"}
         AC{"ამაღლების კუნძული"}
         AD{"ანდორა"}
@@ -306,5 +307,5 @@
         CZ{"ჩეხეთის რესპუბლიკა"}
         TL{"აღმოსავლეთ ტიმორი"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/kab.txt b/icu4c/source/data/region/kab.txt
index 60dc9ed..d88fc7f 100644
--- a/icu4c/source/data/region/kab.txt
+++ b/icu4c/source/data/region/kab.txt
@@ -227,5 +227,5 @@
         ZM{"Zambya"}
         ZW{"Zimbabwi"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/kam.txt b/icu4c/source/data/region/kam.txt
index edf3927..095dc22 100644
--- a/icu4c/source/data/region/kam.txt
+++ b/icu4c/source/data/region/kam.txt
@@ -227,5 +227,5 @@
         ZM{"Nzambia"}
         ZW{"Nzimbambwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/kde.txt b/icu4c/source/data/region/kde.txt
index 7bc9581..7285fa1 100644
--- a/icu4c/source/data/region/kde.txt
+++ b/icu4c/source/data/region/kde.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/kea.txt b/icu4c/source/data/region/kea.txt
index 5f2deab..b520f1c 100644
--- a/icu4c/source/data/region/kea.txt
+++ b/icu4c/source/data/region/kea.txt
@@ -302,5 +302,5 @@
         CI{"Kosta di Marfin (Côte d’Ivoire)"}
         CZ{"Repúblika Txeka"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/khq.txt b/icu4c/source/data/region/khq.txt
index afd19b0..3b2af5d 100644
--- a/icu4c/source/data/region/khq.txt
+++ b/icu4c/source/data/region/khq.txt
@@ -227,5 +227,5 @@
         ZM{"Zambi"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ki.txt b/icu4c/source/data/region/ki.txt
index 20ddd8a..53ca284 100644
--- a/icu4c/source/data/region/ki.txt
+++ b/icu4c/source/data/region/ki.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/kk.txt b/icu4c/source/data/region/kk.txt
index 2e04ec9..2ebd3a2 100644
--- a/icu4c/source/data/region/kk.txt
+++ b/icu4c/source/data/region/kk.txt
@@ -31,6 +31,7 @@
         151{"Шығыс Еуропа"}
         154{"Солтүстік Еуропа"}
         155{"Батыс Еуропа"}
+        202{"Субсахаралық Африка"}
         419{"Латын Америкасы"}
         AC{"Әскенжін аралы"}
         AD{"Андорра"}
@@ -302,8 +303,9 @@
     Countries%variant{
         CD{"Конго Демократиялық Республикасы"}
         CG{"Конго Республикасы"}
+        CI{"Піл Сүйегі жағалауы"}
         CZ{"Чех Республикасы"}
         TL{"Шығыс Тимор"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/kkj.txt b/icu4c/source/data/region/kkj.txt
index 45df06f..06cb3cc 100644
--- a/icu4c/source/data/region/kkj.txt
+++ b/icu4c/source/data/region/kkj.txt
@@ -4,5 +4,5 @@
     Countries{
         CM{"Kamɛrun"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/kl.txt b/icu4c/source/data/region/kl.txt
index b791f7a..148178c 100644
--- a/icu4c/source/data/region/kl.txt
+++ b/icu4c/source/data/region/kl.txt
@@ -4,5 +4,5 @@
     Countries{
         GL{"Kalaallit Nunaat"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/kln.txt b/icu4c/source/data/region/kln.txt
index 34bb184..2a6f92e 100644
--- a/icu4c/source/data/region/kln.txt
+++ b/icu4c/source/data/region/kln.txt
@@ -227,5 +227,5 @@
         ZM{"Emetab Zambia"}
         ZW{"Emetab Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/km.txt b/icu4c/source/data/region/km.txt
index 250f6dc..585472c 100644
--- a/icu4c/source/data/region/km.txt
+++ b/icu4c/source/data/region/km.txt
@@ -31,6 +31,7 @@
         151{"អឺរ៉ុប​ខាង​កើត"}
         154{"អឺរ៉ុប​ខាង​ជើង"}
         155{"អឺរ៉ុប​ខាង​លិច"}
+        202{"អនុតំបន់សាហារ៉ាអាហ្វ្រិក"}
         419{"អាមេរិក​ឡាទីន"}
         AC{"កោះ​អាសេនសិន"}
         AD{"អង់ដូរ៉ា"}
@@ -302,8 +303,9 @@
     Countries%variant{
         CD{"កុងហ្គោ (សាធារណរដ្ឋ​ប្រជាធិបតេយ្យ)"}
         CG{"កុងហ្គោ (សធារណរដ្ឋ)"}
+        CI{"អាយវ៉ូរី ខូសថ៍"}
         CZ{"សាធារណរដ្ឋឆេក"}
         TL{"ទីម័រ​ខាង​កើត"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/kn.txt b/icu4c/source/data/region/kn.txt
index 8261b79..85e2662 100644
--- a/icu4c/source/data/region/kn.txt
+++ b/icu4c/source/data/region/kn.txt
@@ -306,5 +306,5 @@
         CZ{"ಜೆಕ್ ಗಣರಾಜ್ಯ"}
         TL{"ಪೂರ್ವ ಟಿಮೋರ್"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ko.txt b/icu4c/source/data/region/ko.txt
index 6a1db2d..dd03465 100644
--- a/icu4c/source/data/region/ko.txt
+++ b/icu4c/source/data/region/ko.txt
@@ -31,6 +31,7 @@
         151{"동유럽"}
         154{"북유럽"}
         155{"서유럽"}
+        202{"사하라 사막 이남 아프리카"}
         419{"라틴 아메리카"}
         AC{"어센션 섬"}
         AD{"안도라"}
@@ -303,6 +304,7 @@
         CD{"콩고민주공화국"}
         CG{"콩고 공화국"}
         CI{"아이보리 코스트"}
+        CZ{"체코 공화국"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/ko_KP.txt b/icu4c/source/data/region/ko_KP.txt
index b055bc0..54efce4 100644
--- a/icu4c/source/data/region/ko_KP.txt
+++ b/icu4c/source/data/region/ko_KP.txt
@@ -4,5 +4,5 @@
     Countries{
         KP{"조선민주주의인민공화국"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/kok.txt b/icu4c/source/data/region/kok.txt
index 396bc9c..8b67b9c 100644
--- a/icu4c/source/data/region/kok.txt
+++ b/icu4c/source/data/region/kok.txt
@@ -305,5 +305,5 @@
         CZ{"चेक लोकसत्ताक"}
         TL{"ईस्ट तिमूर"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/ks.txt b/icu4c/source/data/region/ks.txt
index 19cd518..7bcd867 100644
--- a/icu4c/source/data/region/ks.txt
+++ b/icu4c/source/data/region/ks.txt
@@ -278,5 +278,5 @@
         ZW{"زِمبابے"}
         ZZ{"نامعلوٗم تہٕ نالَگہار عَلاقہٕ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ksb.txt b/icu4c/source/data/region/ksb.txt
index b270430..ef55793 100644
--- a/icu4c/source/data/region/ksb.txt
+++ b/icu4c/source/data/region/ksb.txt
@@ -226,5 +226,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ksf.txt b/icu4c/source/data/region/ksf.txt
index 8241475..1f3a123 100644
--- a/icu4c/source/data/region/ksf.txt
+++ b/icu4c/source/data/region/ksf.txt
@@ -227,5 +227,5 @@
         ZM{"zambí"}
         ZW{"zimbabwɛ́"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ksh.txt b/icu4c/source/data/region/ksh.txt
index 869b1ce..c898b1d 100644
--- a/icu4c/source/data/region/ksh.txt
+++ b/icu4c/source/data/region/ksh.txt
@@ -301,5 +301,5 @@
         CG{"de Republik Konggo"}
         CI{"de Älfebeijnköß"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/kw.txt b/icu4c/source/data/region/kw.txt
index 903ddc5..b09e8cf 100644
--- a/icu4c/source/data/region/kw.txt
+++ b/icu4c/source/data/region/kw.txt
@@ -4,5 +4,5 @@
     Countries{
         GB{"Rywvaneth Unys"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/ky.txt b/icu4c/source/data/region/ky.txt
index ec20b8b..c48ecbb 100644
--- a/icu4c/source/data/region/ky.txt
+++ b/icu4c/source/data/region/ky.txt
@@ -305,5 +305,5 @@
         CZ{"Чех Республикасы"}
         TL{"Чыгыш Тимор"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/lag.txt b/icu4c/source/data/region/lag.txt
index 5976adb..d9d9010 100644
--- a/icu4c/source/data/region/lag.txt
+++ b/icu4c/source/data/region/lag.txt
@@ -227,5 +227,5 @@
         ZM{"Sámbia"}
         ZW{"Simbáabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/lb.txt b/icu4c/source/data/region/lb.txt
index 7d84ff2..0074f4b 100644
--- a/icu4c/source/data/region/lb.txt
+++ b/icu4c/source/data/region/lb.txt
@@ -301,5 +301,5 @@
         CG{"Kongo (Republik)"}
         CI{"Elfebeeküst"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/lg.txt b/icu4c/source/data/region/lg.txt
index b766c2e..556fdd5 100644
--- a/icu4c/source/data/region/lg.txt
+++ b/icu4c/source/data/region/lg.txt
@@ -227,5 +227,5 @@
         ZM{"Zambya"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/lkt.txt b/icu4c/source/data/region/lkt.txt
index bf7e36f..0c1eebf 100644
--- a/icu4c/source/data/region/lkt.txt
+++ b/icu4c/source/data/region/lkt.txt
@@ -15,5 +15,5 @@
         MX{"Spayóla Makȟóčhe"}
         US{"Mílahaŋska Tȟamákȟočhe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/ln.txt b/icu4c/source/data/region/ln.txt
index 5925c57..f61ebe4 100644
--- a/icu4c/source/data/region/ln.txt
+++ b/icu4c/source/data/region/ln.txt
@@ -237,5 +237,5 @@
     Countries%variant{
         CZ{"Repibiki Tsekɛ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/lo.txt b/icu4c/source/data/region/lo.txt
index 5c66d4a..258bd02 100644
--- a/icu4c/source/data/region/lo.txt
+++ b/icu4c/source/data/region/lo.txt
@@ -31,6 +31,7 @@
         151{"ຢູໂຣບຕາເວັນອອກ"}
         154{"ຢູໂຣບເໜືອ"}
         155{"ຢູໂຣບຕາເວັນຕົກ"}
+        202{"ຊັບ ຊາຮາຣານ ອາຟຣິກາ"}
         419{"ລາຕິນ ອາເມລິກາ"}
         AC{"ເກາະອາເຊນຊັນ"}
         AD{"ອັນດໍຣາ"}
@@ -306,5 +307,5 @@
         CZ{"ສາທາລະນະລັດເຊັກ"}
         TL{"ທິມໍ ຕາເວັນອອກ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/lrc.txt b/icu4c/source/data/region/lrc.txt
index cdc260c..b706700 100644
--- a/icu4c/source/data/region/lrc.txt
+++ b/icu4c/source/data/region/lrc.txt
@@ -26,5 +26,5 @@
         US{"ڤولاتیا یأکاگئرتە"}
         ZZ{"راساگە نادیار"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/lt.txt b/icu4c/source/data/region/lt.txt
index d2be2d9..19035d7 100644
--- a/icu4c/source/data/region/lt.txt
+++ b/icu4c/source/data/region/lt.txt
@@ -31,6 +31,7 @@
         151{"Rytų Europa"}
         154{"Šiaurės Europa"}
         155{"Vakarų Europa"}
+        202{"Užsachario Afrika"}
         419{"Lotynų Amerika"}
         AC{"Dangun Žengimo sala"}
         AD{"Andora"}
@@ -305,5 +306,5 @@
         CI{"Dramblio Kaulo Kranto Respublika"}
         CZ{"Čekijos Respublika"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/lu.txt b/icu4c/source/data/region/lu.txt
index ca24a51..0ec94b5 100644
--- a/icu4c/source/data/region/lu.txt
+++ b/icu4c/source/data/region/lu.txt
@@ -227,5 +227,5 @@
         ZM{"Zambi"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/luo.txt b/icu4c/source/data/region/luo.txt
index d51a4d5..6791993 100644
--- a/icu4c/source/data/region/luo.txt
+++ b/icu4c/source/data/region/luo.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/luy.txt b/icu4c/source/data/region/luy.txt
index bd6b632..5f1485e 100644
--- a/icu4c/source/data/region/luy.txt
+++ b/icu4c/source/data/region/luy.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/lv.txt b/icu4c/source/data/region/lv.txt
index 20caf12..66be3bb 100644
--- a/icu4c/source/data/region/lv.txt
+++ b/icu4c/source/data/region/lv.txt
@@ -31,6 +31,7 @@
         151{"Austrumeiropa"}
         154{"Ziemeļeiropa"}
         155{"Rietumeiropa"}
+        202{"Subsahāras Āfrika"}
         419{"Latīņamerika"}
         AC{"Debesbraukšanas sala"}
         AD{"Andora"}
@@ -305,5 +306,5 @@
         CI{"Ziloņkaula krasts"}
         CZ{"Čehijas Republika"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/mas.txt b/icu4c/source/data/region/mas.txt
index 259e0f1..4e33798 100644
--- a/icu4c/source/data/region/mas.txt
+++ b/icu4c/source/data/region/mas.txt
@@ -227,5 +227,5 @@
         ZM{"Sambia"}
         ZW{"Simbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/mer.txt b/icu4c/source/data/region/mer.txt
index d24e774..4dc6689 100644
--- a/icu4c/source/data/region/mer.txt
+++ b/icu4c/source/data/region/mer.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/mfe.txt b/icu4c/source/data/region/mfe.txt
index 5edabcf..d64fa3a 100644
--- a/icu4c/source/data/region/mfe.txt
+++ b/icu4c/source/data/region/mfe.txt
@@ -227,5 +227,5 @@
         ZM{"Zambi"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/mg.txt b/icu4c/source/data/region/mg.txt
index 4b23433..470af95 100644
--- a/icu4c/source/data/region/mg.txt
+++ b/icu4c/source/data/region/mg.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbaboe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/mgh.txt b/icu4c/source/data/region/mgh.txt
index ebbc816..6599905 100644
--- a/icu4c/source/data/region/mgh.txt
+++ b/icu4c/source/data/region/mgh.txt
@@ -140,5 +140,5 @@
         ZM{"Uzambia"}
         ZW{"Uzimbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/mgo.txt b/icu4c/source/data/region/mgo.txt
index c02ef97..f69c6d1 100644
--- a/icu4c/source/data/region/mgo.txt
+++ b/icu4c/source/data/region/mgo.txt
@@ -5,5 +5,5 @@
         CM{"Kamalun"}
         ZZ{"aba aben tisɔ̀"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/mk.txt b/icu4c/source/data/region/mk.txt
index ccfcb58..0b1d97f 100644
--- a/icu4c/source/data/region/mk.txt
+++ b/icu4c/source/data/region/mk.txt
@@ -31,6 +31,7 @@
         151{"Источна Европа"}
         154{"Северна Европа"}
         155{"Западна Европа"}
+        202{"Супсахарска Африка"}
         419{"Латинска Америка"}
         AC{"Остров Асенсион"}
         AD{"Андора"}
@@ -306,5 +307,5 @@
         CZ{"Република Чешка"}
         TL{"Источен Тимор"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ml.txt b/icu4c/source/data/region/ml.txt
index 291225c..88e61b0 100644
--- a/icu4c/source/data/region/ml.txt
+++ b/icu4c/source/data/region/ml.txt
@@ -31,6 +31,7 @@
         151{"കിഴക്കൻ യൂറോപ്പ്"}
         154{"വടക്കേ യൂറോപ്പ്"}
         155{"പശ്ചിമ യൂറോപ്പ്"}
+        202{"202"}
         419{"ലാറ്റിനമേരിക്ക"}
         AC{"അസൻഷൻ ദ്വീപ്"}
         AD{"അൻഡോറ"}
@@ -306,5 +307,5 @@
         CZ{"ചെക്ക് റിപ്പബ്ലിക്ക്"}
         TL{"കിഴക്കൻ തിമോർ"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/mn.txt b/icu4c/source/data/region/mn.txt
index c7a0710..d94b09c 100644
--- a/icu4c/source/data/region/mn.txt
+++ b/icu4c/source/data/region/mn.txt
@@ -31,6 +31,7 @@
         151{"Зүүн Европ"}
         154{"Хойд Европ"}
         155{"Баруун Европ"}
+        202{"Сахарын цөлийн урд хэсгийн Африк"}
         419{"Латин Америк"}
         AC{"Асенсион арал"}
         AD{"Андорра"}
@@ -248,7 +249,7 @@
         SO{"Сомали"}
         SR{"Суринам"}
         SS{"Өмнөд Судан"}
-        ST{"Сан-Томе ба Принсипи"}
+        ST{"Сан-Томе Принсипи"}
         SV{"Эль Сальвадор"}
         SX{"Синт Мартен"}
         SY{"Сири"}
@@ -306,5 +307,5 @@
         CZ{"Бүгд Найрамдах Чех Улс"}
         TL{"Зүүн Тимор"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/mr.txt b/icu4c/source/data/region/mr.txt
index bd608fa..2f188bc 100644
--- a/icu4c/source/data/region/mr.txt
+++ b/icu4c/source/data/region/mr.txt
@@ -31,6 +31,7 @@
         151{"पूर्व युरोप"}
         154{"उत्तर युरोप"}
         155{"पश्चिम युरोप"}
+        202{"उप-सहारा आफ्रिका"}
         419{"लॅटिन अमेरिका"}
         AC{"अ‍ॅसेन्शियन बेट"}
         AD{"अँडोरा"}
@@ -305,5 +306,5 @@
         CZ{"झेक प्रजासत्ताक"}
         TL{"पूर्व तिमोर"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ms.txt b/icu4c/source/data/region/ms.txt
index da73994..c6b7dd4 100644
--- a/icu4c/source/data/region/ms.txt
+++ b/icu4c/source/data/region/ms.txt
@@ -31,6 +31,7 @@
         151{"Eropah Timur"}
         154{"Eropah Utara"}
         155{"Eropah Barat"}
+        202{"Afrika Sub-Sahara"}
         419{"Amerika Latin"}
         AC{"Pulau Ascension"}
         AD{"Andorra"}
@@ -306,5 +307,5 @@
         CZ{"Republik Czech"}
         TL{"Timor Timur"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/mt.txt b/icu4c/source/data/region/mt.txt
index 86b09a2..3ef59fd 100644
--- a/icu4c/source/data/region/mt.txt
+++ b/icu4c/source/data/region/mt.txt
@@ -298,5 +298,5 @@
         CG{"ir-Repubblika tal-Kongo"}
         TL{"Timor tal-Lvant"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/mua.txt b/icu4c/source/data/region/mua.txt
index 2ba844f..1d03d08 100644
--- a/icu4c/source/data/region/mua.txt
+++ b/icu4c/source/data/region/mua.txt
@@ -227,5 +227,5 @@
         ZM{"Zambiya"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/my.txt b/icu4c/source/data/region/my.txt
index ae6ca51..eea55c3 100644
--- a/icu4c/source/data/region/my.txt
+++ b/icu4c/source/data/region/my.txt
@@ -31,6 +31,7 @@
         151{"အရှေ့ ဥရောပ"}
         154{"မြောက် ဥရောပ"}
         155{"အနောက် ဥရောပ"}
+        202{"ဆာဟာရ-အောက်ပိုင်း အာဖရိက"}
         419{"လက်တင်အမေရိက"}
         AC{"အဆန်းရှင်းကျွန်း"}
         AD{"အန်ဒိုရာ"}
@@ -305,5 +306,5 @@
         CI{"အိုင်ဗရီကို့စ်"}
         CZ{"ချက် ပြည်ထောင်စု"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/mzn.txt b/icu4c/source/data/region/mzn.txt
index fd2276e..344a822 100644
--- a/icu4c/source/data/region/mzn.txt
+++ b/icu4c/source/data/region/mzn.txt
@@ -302,5 +302,5 @@
         CI{"عاج ساحل"}
         TL{"شرقی تیمور"}
     }
-    Version{"2.1.31.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/naq.txt b/icu4c/source/data/region/naq.txt
index c5a09ab..56e8d33 100644
--- a/icu4c/source/data/region/naq.txt
+++ b/icu4c/source/data/region/naq.txt
@@ -227,5 +227,5 @@
         ZM{"Zambiab"}
         ZW{"Zimbabweb"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/nb.txt b/icu4c/source/data/region/nb.txt
index 56b5dd8..2df0a37 100644
--- a/icu4c/source/data/region/nb.txt
+++ b/icu4c/source/data/region/nb.txt
@@ -31,6 +31,7 @@
         151{"Øst-Europa"}
         154{"Nord-Europa"}
         155{"Vest-Europa"}
+        202{"Afrika sør for Sahara"}
         419{"Latin-Amerika"}
         AC{"Ascension"}
         AD{"Andorra"}
@@ -303,5 +304,5 @@
         CD{"Den demokratiske republikken Kongo"}
         CG{"Republikken Kongo"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/nd.txt b/icu4c/source/data/region/nd.txt
index 5420a1a..67896d1 100644
--- a/icu4c/source/data/region/nd.txt
+++ b/icu4c/source/data/region/nd.txt
@@ -227,5 +227,5 @@
         ZM{"Zambiya"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/nds.txt b/icu4c/source/data/region/nds.txt
index d293203..0f3ddc3 100644
--- a/icu4c/source/data/region/nds.txt
+++ b/icu4c/source/data/region/nds.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nds{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/ne.txt b/icu4c/source/data/region/ne.txt
index 330a1c4..9b452b3 100644
--- a/icu4c/source/data/region/ne.txt
+++ b/icu4c/source/data/region/ne.txt
@@ -31,6 +31,7 @@
         151{"पूर्वी युरोप"}
         154{"उत्तरी युरोप"}
         155{"पश्चिमी युरोप"}
+        202{"उप-साहारा अफ्रिका"}
         419{"ल्याटिन अमेरिका"}
         AC{"एस्केन्सन टापु"}
         AD{"अन्डोर्रा"}
@@ -306,5 +307,5 @@
         CZ{"चेक गणतन्त्र"}
         TL{"पृर्वी टीमोर"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/nl.txt b/icu4c/source/data/region/nl.txt
index 8bf94de..4d3c9f1 100644
--- a/icu4c/source/data/region/nl.txt
+++ b/icu4c/source/data/region/nl.txt
@@ -31,6 +31,7 @@
         151{"Oost-Europa"}
         154{"Noord-Europa"}
         155{"West-Europa"}
+        202{"Sub-Saharaans Afrika"}
         419{"Latijns-Amerika"}
         AC{"Ascension"}
         AD{"Andorra"}
@@ -306,5 +307,5 @@
         CZ{"Tsjechische Republiek"}
         TL{"Democratische Republiek Oost-Timor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/nmg.txt b/icu4c/source/data/region/nmg.txt
index c2e8dab..b3f7451 100644
--- a/icu4c/source/data/region/nmg.txt
+++ b/icu4c/source/data/region/nmg.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwǝ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/nn.txt b/icu4c/source/data/region/nn.txt
index bdff649..d0637de 100644
--- a/icu4c/source/data/region/nn.txt
+++ b/icu4c/source/data/region/nn.txt
@@ -303,5 +303,5 @@
         CG{"Republikken Kongo"}
         TL{"Aust-Timor"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/nnh.txt b/icu4c/source/data/region/nnh.txt
index 2b2556d..474de41 100644
--- a/icu4c/source/data/region/nnh.txt
+++ b/icu4c/source/data/region/nnh.txt
@@ -4,5 +4,5 @@
     Countries{
         CM{"Kàmalûm"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/nus.txt b/icu4c/source/data/region/nus.txt
index 21060a5..ad053ab 100644
--- a/icu4c/source/data/region/nus.txt
+++ b/icu4c/source/data/region/nus.txt
@@ -54,5 +54,5 @@
         TD{"Ca̱d"}
         VG{"Burutic dhuɔ̱ɔ̱l be̱rgin"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/nyn.txt b/icu4c/source/data/region/nyn.txt
index e517c65..091187e 100644
--- a/icu4c/source/data/region/nyn.txt
+++ b/icu4c/source/data/region/nyn.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/om.txt b/icu4c/source/data/region/om.txt
index 81f77b3..e1f90a8 100644
--- a/icu4c/source/data/region/om.txt
+++ b/icu4c/source/data/region/om.txt
@@ -15,5 +15,5 @@
         RU{"Russia"}
         US{"United States"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/os.txt b/icu4c/source/data/region/os.txt
index bbd0eef..5c50a92 100644
--- a/icu4c/source/data/region/os.txt
+++ b/icu4c/source/data/region/os.txt
@@ -21,5 +21,5 @@
         US{"АИШ"}
         ZZ{"Нӕзонгӕ бӕстӕ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/pa.txt b/icu4c/source/data/region/pa.txt
index dae005b..8092836 100644
--- a/icu4c/source/data/region/pa.txt
+++ b/icu4c/source/data/region/pa.txt
@@ -31,6 +31,7 @@
         151{"ਪੂਰਬੀ ਯੂਰਪ"}
         154{"ਉੱਤਰੀ ਯੂਰਪ"}
         155{"ਪੱਛਮੀ ਯੂਰਪ"}
+        202{"ਉਪ-ਸਹਾਰਾ ਅਫ਼ਰੀਕਾ"}
         419{"ਲਾਤੀਨੀ ਅਮਰੀਕਾ"}
         AC{"ਅਸੈਂਸ਼ਨ ਟਾਪੂ"}
         AD{"ਅੰਡੋਰਾ"}
@@ -306,5 +307,5 @@
         CZ{"ਚੈੱਕ ਗਣਰਾਜ"}
         TL{"ਪੂਰਬ ਤਿਮੋਰ"}
     }
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/pa_Arab.txt b/icu4c/source/data/region/pa_Arab.txt
index 09a84c2..8452a42 100644
--- a/icu4c/source/data/region/pa_Arab.txt
+++ b/icu4c/source/data/region/pa_Arab.txt
@@ -5,5 +5,5 @@
     Countries{
         PK{"پاکستان"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/pa_Guru.txt b/icu4c/source/data/region/pa_Guru.txt
index a731d5e..e558d24 100644
--- a/icu4c/source/data/region/pa_Guru.txt
+++ b/icu4c/source/data/region/pa_Guru.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa_Guru{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/pl.txt b/icu4c/source/data/region/pl.txt
index 79026e2..79945f2 100644
--- a/icu4c/source/data/region/pl.txt
+++ b/icu4c/source/data/region/pl.txt
@@ -31,6 +31,7 @@
         151{"Europa Wschodnia"}
         154{"Europa Północna"}
         155{"Europa Zachodnia"}
+        202{"Afryka Subsaharyjska"}
         419{"Ameryka Łacińska"}
         AC{"Wyspa Wniebowstąpienia"}
         AD{"Andora"}
@@ -300,10 +301,11 @@
         US{"USA"}
     }
     Countries%variant{
+        CD{"Kongo (DRK)"}
         CG{"Republika Konga"}
         CI{"Wybrzeże Kości Słoniowej"}
         CZ{"Republika Czeska"}
         TL{"Timor-Leste"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.15"}
 }
diff --git a/icu4c/source/data/region/pool.res b/icu4c/source/data/region/pool.res
index 0db5129..7bc6dd5 100644
--- a/icu4c/source/data/region/pool.res
+++ b/icu4c/source/data/region/pool.res
Binary files differ
diff --git a/icu4c/source/data/region/ps.txt b/icu4c/source/data/region/ps.txt
index e15c91f..0f9bae9 100644
--- a/icu4c/source/data/region/ps.txt
+++ b/icu4c/source/data/region/ps.txt
@@ -31,6 +31,7 @@
         151{"ختيځه اروپا"}
         154{"شمالي اروپا"}
         155{"لویدیځه اروپا"}
+        202{"د افریقا جنوب-صحرا"}
         419{"لاتیني امریکا"}
         AC{"د توغندیو ټاپو"}
         AD{"اندورا"}
@@ -305,5 +306,5 @@
         CZ{"چک جمهوريت"}
         TL{"ختيځ تيمور"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/pt.txt b/icu4c/source/data/region/pt.txt
index 4794761..fb40909 100644
--- a/icu4c/source/data/region/pt.txt
+++ b/icu4c/source/data/region/pt.txt
@@ -306,5 +306,5 @@
         CZ{"República Tcheca"}
         TL{"República Democrática de Timor-Leste"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/pt_AO.txt b/icu4c/source/data/region/pt_AO.txt
index 5a8f6f2..4a41792 100644
--- a/icu4c/source/data/region/pt_AO.txt
+++ b/icu4c/source/data/region/pt_AO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_AO{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/pt_CH.txt b/icu4c/source/data/region/pt_CH.txt
index 90d6a1e..acd87d8 100644
--- a/icu4c/source/data/region/pt_CH.txt
+++ b/icu4c/source/data/region/pt_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CH{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/pt_CV.txt b/icu4c/source/data/region/pt_CV.txt
index 6b3cbbb..a42064f 100644
--- a/icu4c/source/data/region/pt_CV.txt
+++ b/icu4c/source/data/region/pt_CV.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CV{
     %%Parent{"pt_PT"}
-    Version{"2.1.35.71"}
+    Version{"2.1.39.12"}
 }
diff --git a/icu4c/source/data/region/pt_GQ.txt b/icu4c/source/data/region/pt_GQ.txt
index 793e060..8a8947f 100644
--- a/icu4c/source/data/region/pt_GQ.txt
+++ b/icu4c/source/data/region/pt_GQ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GQ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/pt_GW.txt b/icu4c/source/data/region/pt_GW.txt
index e137e51..f131573 100644
--- a/icu4c/source/data/region/pt_GW.txt
+++ b/icu4c/source/data/region/pt_GW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GW{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/pt_LU.txt b/icu4c/source/data/region/pt_LU.txt
index e6d1c60..d30ba91 100644
--- a/icu4c/source/data/region/pt_LU.txt
+++ b/icu4c/source/data/region/pt_LU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_LU{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/pt_MO.txt b/icu4c/source/data/region/pt_MO.txt
index 76fe46e..fb39284 100644
--- a/icu4c/source/data/region/pt_MO.txt
+++ b/icu4c/source/data/region/pt_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_MO{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/pt_MZ.txt b/icu4c/source/data/region/pt_MZ.txt
index b86fd1e..1274cac 100644
--- a/icu4c/source/data/region/pt_MZ.txt
+++ b/icu4c/source/data/region/pt_MZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_MZ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/pt_PT.txt b/icu4c/source/data/region/pt_PT.txt
index 2045014..f3a2af0 100644
--- a/icu4c/source/data/region/pt_PT.txt
+++ b/icu4c/source/data/region/pt_PT.txt
@@ -9,6 +9,7 @@
         034{"Ásia do Sul"}
         039{"Europa do Sul"}
         154{"Europa do Norte"}
+        202{"África subsariana"}
         AI{"Anguila"}
         AM{"Arménia"}
         AX{"Alanda"}
@@ -79,5 +80,5 @@
         CI{"Costa do Marfim"}
         CZ{"República Checa"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/pt_ST.txt b/icu4c/source/data/region/pt_ST.txt
index 95f596c..3d6d885 100644
--- a/icu4c/source/data/region/pt_ST.txt
+++ b/icu4c/source/data/region/pt_ST.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_ST{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/pt_TL.txt b/icu4c/source/data/region/pt_TL.txt
index 786b602..0f0ddb9 100644
--- a/icu4c/source/data/region/pt_TL.txt
+++ b/icu4c/source/data/region/pt_TL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_TL{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/qu.txt b/icu4c/source/data/region/qu.txt
index aa89ec7..81df016 100644
--- a/icu4c/source/data/region/qu.txt
+++ b/icu4c/source/data/region/qu.txt
@@ -193,5 +193,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabue"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/region/resfiles.mk b/icu4c/source/data/region/resfiles.mk
index 3a4e5dc..7a50312 100644
--- a/icu4c/source/data/region/resfiles.mk
+++ b/icu4c/source/data/region/resfiles.mk
@@ -1,6 +1,6 @@
 # © 2016 and later: Unicode, Inc. and others.
 # License & terms of use: http://www.unicode.org/copyright.html#License
-REGION_CLDR_VERSION = 32.0.1
+REGION_CLDR_VERSION = 33
 # A list of txt's to build
 # Note:
 #
diff --git a/icu4c/source/data/region/rm.txt b/icu4c/source/data/region/rm.txt
index f095175..c12d76c 100644
--- a/icu4c/source/data/region/rm.txt
+++ b/icu4c/source/data/region/rm.txt
@@ -280,5 +280,5 @@
         ZW{"Simbabwe"}
         ZZ{"Regiun betg encouschenta u nunvalaivla"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/rn.txt b/icu4c/source/data/region/rn.txt
index 61df0c1..6ec6209 100644
--- a/icu4c/source/data/region/rn.txt
+++ b/icu4c/source/data/region/rn.txt
@@ -227,5 +227,5 @@
         ZM{"Zambiya"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ro.txt b/icu4c/source/data/region/ro.txt
index a22d1f9..ccec749 100644
--- a/icu4c/source/data/region/ro.txt
+++ b/icu4c/source/data/region/ro.txt
@@ -31,6 +31,7 @@
         151{"Europa Orientală"}
         154{"Europa Septentrională"}
         155{"Europa Occidentală"}
+        202{"Africa Subsahariană"}
         419{"America Latină"}
         AC{"Insula Ascension"}
         AD{"Andorra"}
@@ -304,6 +305,7 @@
         CG{"Congo (Republica)"}
         CI{"Coasta de Fildeș"}
         CZ{"Republica Cehă"}
+        TL{"TL"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/ro_MD.txt b/icu4c/source/data/region/ro_MD.txt
index e130440..f6759ad 100644
--- a/icu4c/source/data/region/ro_MD.txt
+++ b/icu4c/source/data/region/ro_MD.txt
@@ -4,5 +4,5 @@
     Countries{
         MM{"Myanmar"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/rof.txt b/icu4c/source/data/region/rof.txt
index a9266c4..f575ef9 100644
--- a/icu4c/source/data/region/rof.txt
+++ b/icu4c/source/data/region/rof.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/root.txt b/icu4c/source/data/region/root.txt
index fc26ec9..125472c 100644
--- a/icu4c/source/data/region/root.txt
+++ b/icu4c/source/data/region/root.txt
@@ -4,5 +4,5 @@
  * ICU <specials> source: <path>/common/main/root.xml
  */
 root{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.27"}
 }
diff --git a/icu4c/source/data/region/ru.txt b/icu4c/source/data/region/ru.txt
index a50ae06..0630363 100644
--- a/icu4c/source/data/region/ru.txt
+++ b/icu4c/source/data/region/ru.txt
@@ -31,6 +31,7 @@
         151{"Восточная Европа"}
         154{"Северная Европа"}
         155{"Западная Европа"}
+        202{"Африка к югу от Сахары"}
         419{"Латинская Америка"}
         AC{"о-в Вознесения"}
         AD{"Андорра"}
@@ -219,7 +220,7 @@
         PK{"Пакистан"}
         PL{"Польша"}
         PM{"Сен-Пьер и Микелон"}
-        PN{"острова Питкэрн"}
+        PN{"о-ва Питкэрн"}
         PR{"Пуэрто-Рико"}
         PS{"Палестина"}
         PT{"Португалия"}
@@ -304,5 +305,5 @@
         CG{"Республика Конго"}
         TL{"Тимор-Лесте"}
     }
-    Version{"2.1.37.58"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/ru_UA.txt b/icu4c/source/data/region/ru_UA.txt
index 68306ff..69cdcb7 100644
--- a/icu4c/source/data/region/ru_UA.txt
+++ b/icu4c/source/data/region/ru_UA.txt
@@ -13,5 +13,5 @@
         TL{"Тимор-Лесте"}
         UM{"Малые Тихоокеанские Отдаленные Острова США"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/rw.txt b/icu4c/source/data/region/rw.txt
index 9635907..9706153 100644
--- a/icu4c/source/data/region/rw.txt
+++ b/icu4c/source/data/region/rw.txt
@@ -5,5 +5,5 @@
         RW{"U Rwanda"}
         TO{"Tonga"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/region/rwk.txt b/icu4c/source/data/region/rwk.txt
index 9ef2efa..bcfe9d7 100644
--- a/icu4c/source/data/region/rwk.txt
+++ b/icu4c/source/data/region/rwk.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/sah.txt b/icu4c/source/data/region/sah.txt
index 0fc42aa..01dc96e 100644
--- a/icu4c/source/data/region/sah.txt
+++ b/icu4c/source/data/region/sah.txt
@@ -31,5 +31,5 @@
     Countries%short{
         US{"АХШ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/saq.txt b/icu4c/source/data/region/saq.txt
index 5881bbb..f4d6eca 100644
--- a/icu4c/source/data/region/saq.txt
+++ b/icu4c/source/data/region/saq.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/sbp.txt b/icu4c/source/data/region/sbp.txt
index 5c4ff8a..32973fa 100644
--- a/icu4c/source/data/region/sbp.txt
+++ b/icu4c/source/data/region/sbp.txt
@@ -227,5 +227,5 @@
         ZM{"Sambiya"}
         ZW{"Simbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/se.txt b/icu4c/source/data/region/se.txt
index 74f7f29..1d3c69e 100644
--- a/icu4c/source/data/region/se.txt
+++ b/icu4c/source/data/region/se.txt
@@ -291,5 +291,5 @@
         GB{"Stuorra-Británnia"}
         US{"USA"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/se_FI.txt b/icu4c/source/data/region/se_FI.txt
index 7eaf2f4..61b9fbb 100644
--- a/icu4c/source/data/region/se_FI.txt
+++ b/icu4c/source/data/region/se_FI.txt
@@ -26,5 +26,5 @@
     Countries%variant{
         CI{"Côte d’Ivoire"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/region/seh.txt b/icu4c/source/data/region/seh.txt
index 2cdd8ce..c57de64 100644
--- a/icu4c/source/data/region/seh.txt
+++ b/icu4c/source/data/region/seh.txt
@@ -226,5 +226,5 @@
         ZM{"Zâmbia"}
         ZW{"Zimbábue"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ses.txt b/icu4c/source/data/region/ses.txt
index ee6be3c..6be721c 100644
--- a/icu4c/source/data/region/ses.txt
+++ b/icu4c/source/data/region/ses.txt
@@ -227,5 +227,5 @@
         ZM{"Zambi"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/sg.txt b/icu4c/source/data/region/sg.txt
index 12b462d..4bdfc70 100644
--- a/icu4c/source/data/region/sg.txt
+++ b/icu4c/source/data/region/sg.txt
@@ -227,5 +227,5 @@
         ZM{"Zambïi"}
         ZW{"Zimbäbwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/shi.txt b/icu4c/source/data/region/shi.txt
index 6032a9d..f64b1ca 100644
--- a/icu4c/source/data/region/shi.txt
+++ b/icu4c/source/data/region/shi.txt
@@ -227,5 +227,5 @@
         ZM{"ⵣⴰⵎⴱⵢⴰ"}
         ZW{"ⵣⵉⵎⴱⴰⴱⵡⵉ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/shi_Latn.txt b/icu4c/source/data/region/shi_Latn.txt
index af3f484..bde2a98 100644
--- a/icu4c/source/data/region/shi_Latn.txt
+++ b/icu4c/source/data/region/shi_Latn.txt
@@ -228,5 +228,5 @@
         ZM{"zambya"}
         ZW{"zimbabwi"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/shi_Tfng.txt b/icu4c/source/data/region/shi_Tfng.txt
index ba03fa3..aaf5c7b 100644
--- a/icu4c/source/data/region/shi_Tfng.txt
+++ b/icu4c/source/data/region/shi_Tfng.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi_Tfng{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/si.txt b/icu4c/source/data/region/si.txt
index 1bc4b26..e6f0e23 100644
--- a/icu4c/source/data/region/si.txt
+++ b/icu4c/source/data/region/si.txt
@@ -305,5 +305,5 @@
         CI{"අයිවරි කෝස්ට්"}
         TL{"නැගෙනහිර ටිමෝරය"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/sk.txt b/icu4c/source/data/region/sk.txt
index c8c19a2..ae5ec3f 100644
--- a/icu4c/source/data/region/sk.txt
+++ b/icu4c/source/data/region/sk.txt
@@ -31,6 +31,7 @@
         151{"východná Európa"}
         154{"severná Európa"}
         155{"západná Európa"}
+        202{"subsaharská Afrika"}
         419{"Latinská Amerika"}
         AC{"Ascension"}
         AD{"Andorra"}
@@ -302,5 +303,5 @@
     Countries%variant{
         CZ{"Česká republika"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/sl.txt b/icu4c/source/data/region/sl.txt
index 9f6cdfc..c7b65bb 100644
--- a/icu4c/source/data/region/sl.txt
+++ b/icu4c/source/data/region/sl.txt
@@ -31,6 +31,7 @@
         151{"Vzhodna Evropa"}
         154{"Severna Evropa"}
         155{"Zahodna Evropa"}
+        202{"podsaharska Afrika"}
         419{"Latinska Amerika"}
         AC{"Otok Ascension"}
         AD{"Andora"}
@@ -306,5 +307,5 @@
         CZ{"Češka republika"}
         TL{"Vzhodni Timor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/smn.txt b/icu4c/source/data/region/smn.txt
index c3c91ad..e41a725 100644
--- a/icu4c/source/data/region/smn.txt
+++ b/icu4c/source/data/region/smn.txt
@@ -262,5 +262,5 @@
         CD{"Kongo demokraattisâš täsiväldi"}
         CG{"Kongo täsiväldi"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/sn.txt b/icu4c/source/data/region/sn.txt
index 4e99ef8..bb2870f 100644
--- a/icu4c/source/data/region/sn.txt
+++ b/icu4c/source/data/region/sn.txt
@@ -226,5 +226,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/so.txt b/icu4c/source/data/region/so.txt
index ee21c63..ec589b4 100644
--- a/icu4c/source/data/region/so.txt
+++ b/icu4c/source/data/region/so.txt
@@ -228,5 +228,5 @@
         ZW{"Simbaabwe"}
         ZZ{"Far aan la aqoon amase aan saxnayn"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/sq.txt b/icu4c/source/data/region/sq.txt
index 8f5f735..b0e4ca3 100644
--- a/icu4c/source/data/region/sq.txt
+++ b/icu4c/source/data/region/sq.txt
@@ -31,6 +31,7 @@
         151{"Europa Lindore"}
         154{"Europa Veriore"}
         155{"Europa Perëndimore"}
+        202{"Afrika Subsahariane"}
         419{"Amerika Latine"}
         AC{"Ishulli Asenshion"}
         AD{"Andorrë"}
@@ -58,7 +59,7 @@
         BH{"Bahrejn"}
         BI{"Burundi"}
         BJ{"Benin"}
-        BL{"Shën Bartolomeu"}
+        BL{"Shën-Bartolome"}
         BM{"Bermudë"}
         BN{"Brunei"}
         BO{"Bolivi"}
@@ -133,7 +134,7 @@
         GW{"Guine-Bisau"}
         GY{"Guajanë"}
         HK{"Hong-Kong"}
-        HM{"Ishulli Hërd dhe Ishujt Mekdonald"}
+        HM{"Ishujt Hërd e Mekdonald"}
         HN{"Honduras"}
         HR{"Kroaci"}
         HT{"Haiti"}
@@ -218,7 +219,7 @@
         PH{"Filipine"}
         PK{"Pakistan"}
         PL{"Poloni"}
-        PM{"Shën Pier dhe Mikelon"}
+        PM{"Shën-Pier dhe Mikelon"}
         PN{"Ishujt Pitkern"}
         PR{"Porto-Riko"}
         PS{"Palestinë"}
@@ -240,7 +241,7 @@
         SG{"Singapor"}
         SH{"Shën-Helenë"}
         SI{"Slloveni"}
-        SJ{"Svalbard dhe Jan-Majen"}
+        SJ{"Svalbard e Jan-Majen"}
         SK{"Sllovaki"}
         SL{"Siera-Leone"}
         SM{"San-Marino"}
@@ -248,7 +249,7 @@
         SO{"Somali"}
         SR{"Surinami"}
         SS{"Sudani i Jugut"}
-        ST{"Sao Tome dhe Principe"}
+        ST{"Sao-Tome e Principe"}
         SV{"Salvador"}
         SX{"Sint-Marten"}
         SY{"Siri"}
@@ -306,5 +307,5 @@
         CZ{"Republika Çeke"}
         TL{"Timori Lindor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/sr.txt b/icu4c/source/data/region/sr.txt
index 7df655a..6e9b1bc 100644
--- a/icu4c/source/data/region/sr.txt
+++ b/icu4c/source/data/region/sr.txt
@@ -31,6 +31,7 @@
         151{"Источна Европа"}
         154{"Северна Европа"}
         155{"Западна Европа"}
+        202{"Африка јужно од Сахаре"}
         419{"Латинска Америка"}
         AC{"Острво Асенсион"}
         AD{"Андора"}
@@ -306,5 +307,5 @@
         CZ{"Чешка Република"}
         TL{"Источни Тимор"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/sr_Cyrl.txt b/icu4c/source/data/region/sr_Cyrl.txt
index cac24ec..1d0d0a9 100644
--- a/icu4c/source/data/region/sr_Cyrl.txt
+++ b/icu4c/source/data/region/sr_Cyrl.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Cyrl{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/sr_Cyrl_BA.txt b/icu4c/source/data/region/sr_Cyrl_BA.txt
index c268632..d785db6 100644
--- a/icu4c/source/data/region/sr_Cyrl_BA.txt
+++ b/icu4c/source/data/region/sr_Cyrl_BA.txt
@@ -17,5 +17,5 @@
         VG{"Британска Дјевичанска Острва"}
         VI{"Америчка Дјевичанска Острва"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/sr_Cyrl_ME.txt b/icu4c/source/data/region/sr_Cyrl_ME.txt
index 2ff5ce2..75fc7e3 100644
--- a/icu4c/source/data/region/sr_Cyrl_ME.txt
+++ b/icu4c/source/data/region/sr_Cyrl_ME.txt
@@ -15,5 +15,5 @@
         VG{"Британска Дјевичанска Острва"}
         VI{"Америчка Дјевичанска Острва"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/sr_Cyrl_XK.txt b/icu4c/source/data/region/sr_Cyrl_XK.txt
index 070fb67..14724f7 100644
--- a/icu4c/source/data/region/sr_Cyrl_XK.txt
+++ b/icu4c/source/data/region/sr_Cyrl_XK.txt
@@ -14,5 +14,5 @@
         UM{"Мања удаљена острва САД"}
         VC{"Свети Винсент и Гренадини"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/sr_Latn.txt b/icu4c/source/data/region/sr_Latn.txt
index 72acea8..59f9573 100644
--- a/icu4c/source/data/region/sr_Latn.txt
+++ b/icu4c/source/data/region/sr_Latn.txt
@@ -32,6 +32,7 @@
         151{"Istočna Evropa"}
         154{"Severna Evropa"}
         155{"Zapadna Evropa"}
+        202{"Afrika južno od Sahare"}
         419{"Latinska Amerika"}
         AC{"Ostrvo Asension"}
         AD{"Andora"}
@@ -307,5 +308,5 @@
         CZ{"Češka Republika"}
         TL{"Istočni Timor"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
 }
diff --git a/icu4c/source/data/region/sr_Latn_BA.txt b/icu4c/source/data/region/sr_Latn_BA.txt
index ce5e63f..4803204 100644
--- a/icu4c/source/data/region/sr_Latn_BA.txt
+++ b/icu4c/source/data/region/sr_Latn_BA.txt
@@ -17,5 +17,5 @@
         VG{"Britanska Djevičanska Ostrva"}
         VI{"Američka Djevičanska Ostrva"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/sr_Latn_ME.txt b/icu4c/source/data/region/sr_Latn_ME.txt
index 1e10a6b..17ba05d 100644
--- a/icu4c/source/data/region/sr_Latn_ME.txt
+++ b/icu4c/source/data/region/sr_Latn_ME.txt
@@ -15,5 +15,5 @@
         VG{"Britanska Djevičanska Ostrva"}
         VI{"Američka Djevičanska Ostrva"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/sr_Latn_XK.txt b/icu4c/source/data/region/sr_Latn_XK.txt
index a4c2de5..ba8b382 100644
--- a/icu4c/source/data/region/sr_Latn_XK.txt
+++ b/icu4c/source/data/region/sr_Latn_XK.txt
@@ -14,5 +14,5 @@
         UM{"Manja udaljena ostrva SAD"}
         VC{"Sveti Vinsent i Grenadini"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/sv.txt b/icu4c/source/data/region/sv.txt
index 8ce1521..2c325fc 100644
--- a/icu4c/source/data/region/sv.txt
+++ b/icu4c/source/data/region/sv.txt
@@ -31,6 +31,7 @@
         151{"Östeuropa"}
         154{"Nordeuropa"}
         155{"Västeuropa"}
+        202{"202"}
         419{"Latinamerika"}
         AC{"Ascension"}
         AD{"Andorra"}
@@ -109,7 +110,7 @@
         EZ{"eurozonen"}
         FI{"Finland"}
         FJ{"Fiji"}
-        FK{"Falklandsöarna"}
+        FK{"FK"}
         FM{"Mikronesien"}
         FO{"Färöarna"}
         FR{"Frankrike"}
@@ -302,6 +303,9 @@
     Countries%variant{
         CD{"Demokratiska republiken Kongo"}
         CG{"Republiken Kongo"}
+        CI{"CI"}
+        CZ{"CZ"}
+        TL{"TL"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/sw.txt b/icu4c/source/data/region/sw.txt
index 0f98519..1fbaeec 100644
--- a/icu4c/source/data/region/sw.txt
+++ b/icu4c/source/data/region/sw.txt
@@ -306,5 +306,5 @@
         CZ{"Jamhuri ya Cheki"}
         TL{"Timor ya Mashariki"}
     }
-    Version{"2.1.37.34"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/sw_CD.txt b/icu4c/source/data/region/sw_CD.txt
index beee33f..f27ec5d 100644
--- a/icu4c/source/data/region/sw_CD.txt
+++ b/icu4c/source/data/region/sw_CD.txt
@@ -32,5 +32,5 @@
         TL{"Timori ya Mashariki"}
         VN{"Vietnamu"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/sw_KE.txt b/icu4c/source/data/region/sw_KE.txt
index b0a4a44..32a6770 100644
--- a/icu4c/source/data/region/sw_KE.txt
+++ b/icu4c/source/data/region/sw_KE.txt
@@ -29,5 +29,5 @@
         TD{"Chadi"}
         VN{"Vietnamu"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/ta.txt b/icu4c/source/data/region/ta.txt
index 629513a..22ab5ee 100644
--- a/icu4c/source/data/region/ta.txt
+++ b/icu4c/source/data/region/ta.txt
@@ -31,6 +31,7 @@
         151{"கிழக்கு ஐரோப்பா"}
         154{"வடக்கு ஐரோப்பா"}
         155{"மேற்கு ஐரோப்பா"}
+        202{"சப்-சஹாரன் ஆப்ரிக்கா"}
         419{"லத்தீன் அமெரிக்கா"}
         AC{"அஷன்ஷியன் தீவு"}
         AD{"அன்டோரா"}
@@ -306,5 +307,5 @@
         CZ{"செக் குடியரசு"}
         TL{"கிழக்கு தைமூர்"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/te.txt b/icu4c/source/data/region/te.txt
index 6c9254d..dab4ecf 100644
--- a/icu4c/source/data/region/te.txt
+++ b/icu4c/source/data/region/te.txt
@@ -31,6 +31,7 @@
         151{"తూర్పు యూరోప్"}
         154{"ఉత్తర యూరోప్"}
         155{"పశ్చిమ యూరోప్"}
+        202{"ఉప సెహరన్ ఆఫ్రికా"}
         419{"లాటిన్ అమెరికా"}
         AC{"అసెన్షన్ దీవి"}
         AD{"ఆండోరా"}
@@ -306,5 +307,5 @@
         CZ{"చెక్ రిపబ్లిక్"}
         TL{"తూర్పు టిమోర్"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/teo.txt b/icu4c/source/data/region/teo.txt
index 0de860a..5b64678 100644
--- a/icu4c/source/data/region/teo.txt
+++ b/icu4c/source/data/region/teo.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/tg.txt b/icu4c/source/data/region/tg.txt
index 14b6e57..1a6360d 100644
--- a/icu4c/source/data/region/tg.txt
+++ b/icu4c/source/data/region/tg.txt
@@ -257,5 +257,5 @@
         CD{"Конго (ҶДК)"}
         CG{"Конго"}
     }
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
 }
diff --git a/icu4c/source/data/region/th.txt b/icu4c/source/data/region/th.txt
index 31ec1b3..7891272 100644
--- a/icu4c/source/data/region/th.txt
+++ b/icu4c/source/data/region/th.txt
@@ -31,6 +31,7 @@
         151{"ยุโรปตะวันออก"}
         154{"ยุโรปเหนือ"}
         155{"ยุโรปตะวันตก"}
+        202{"แอฟริกาใต้สะฮารา"}
         419{"ละตินอเมริกา"}
         AC{"เกาะแอสเซนชัน"}
         AD{"อันดอร์รา"}
@@ -306,5 +307,5 @@
         CZ{"สาธารณรัฐเช็ก"}
         TL{"ติมอร์ตะวันออก"}
     }
-    Version{"2.1.37.56"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/ti.txt b/icu4c/source/data/region/ti.txt
index 4394494..b26b0bf 100644
--- a/icu4c/source/data/region/ti.txt
+++ b/icu4c/source/data/region/ti.txt
@@ -267,5 +267,5 @@
         CI{"አይቮሪ ኮስት"}
         CZ{"CZ"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/region/to.txt b/icu4c/source/data/region/to.txt
index 70a8710..f797e31 100644
--- a/icu4c/source/data/region/to.txt
+++ b/icu4c/source/data/region/to.txt
@@ -303,5 +303,5 @@
         CG{"Kongo (Lepupelika)"}
         CZ{"Lepupelika Seki"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/tr.txt b/icu4c/source/data/region/tr.txt
index ebdc048..6d2d457 100644
--- a/icu4c/source/data/region/tr.txt
+++ b/icu4c/source/data/region/tr.txt
@@ -31,6 +31,7 @@
         151{"Doğu Avrupa"}
         154{"Kuzey Avrupa"}
         155{"Batı Avrupa"}
+        202{"Sahra Altı Afrika"}
         419{"Latin Amerika"}
         AC{"Ascension Adası"}
         AD{"Andorra"}
@@ -305,5 +306,5 @@
         CZ{"Çek Cumhuriyeti"}
         TL{"Doğu Timor"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/tt.txt b/icu4c/source/data/region/tt.txt
index c95b68a..e82afb1 100644
--- a/icu4c/source/data/region/tt.txt
+++ b/icu4c/source/data/region/tt.txt
@@ -248,5 +248,5 @@
     Countries%variant{
         CD{"Конго (КДР)"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/region/twq.txt b/icu4c/source/data/region/twq.txt
index b6a0233..08afdb7 100644
--- a/icu4c/source/data/region/twq.txt
+++ b/icu4c/source/data/region/twq.txt
@@ -227,5 +227,5 @@
         ZM{"Zambi"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/tzm.txt b/icu4c/source/data/region/tzm.txt
index 328e0b3..1e8b226 100644
--- a/icu4c/source/data/region/tzm.txt
+++ b/icu4c/source/data/region/tzm.txt
@@ -227,5 +227,5 @@
         ZM{"Zambya"}
         ZW{"Zimbabwi"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ug.txt b/icu4c/source/data/region/ug.txt
index 480cab0..a99422f 100644
--- a/icu4c/source/data/region/ug.txt
+++ b/icu4c/source/data/region/ug.txt
@@ -301,5 +301,5 @@
         CG{"كونگو (جۇمھۇرىيىتى)"}
         CI{"پىل چىشى قىرغىقى"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/uk.txt b/icu4c/source/data/region/uk.txt
index 6dfdd06..5fcef30 100644
--- a/icu4c/source/data/region/uk.txt
+++ b/icu4c/source/data/region/uk.txt
@@ -31,6 +31,7 @@
         151{"Східна Європа"}
         154{"Північна Європа"}
         155{"Західна Європа"}
+        202{"Африка на південь від Сахари"}
         419{"Латинська Америка"}
         AC{"Острів Вознесіння"}
         AD{"Андорра"}
@@ -307,5 +308,5 @@
         FM{"Федеративні Штати Мікронезії"}
         TL{"Східний Тимор"}
     }
-    Version{"2.1.37.12"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/ur.txt b/icu4c/source/data/region/ur.txt
index 2853bff..5f1d2bb 100644
--- a/icu4c/source/data/region/ur.txt
+++ b/icu4c/source/data/region/ur.txt
@@ -31,6 +31,7 @@
         151{"مشرقی یورپ"}
         154{"شمالی یورپ"}
         155{"مغربی یورپ"}
+        202{"سَب صحارن افریقہ"}
         419{"لاطینی امریکہ"}
         AC{"اسینشن آئلینڈ"}
         AD{"انڈورا"}
@@ -306,5 +307,5 @@
         CZ{"چیک جمہوریہ"}
         TL{"مشرقی تیمور"}
     }
-    Version{"2.1.37.69"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/ur_IN.txt b/icu4c/source/data/region/ur_IN.txt
index bdd6b36..8562762 100644
--- a/icu4c/source/data/region/ur_IN.txt
+++ b/icu4c/source/data/region/ur_IN.txt
@@ -26,5 +26,5 @@
         VG{"برطانوی جزائر ورجن"}
         VI{"امریکی جزائر ورجن"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/uz.txt b/icu4c/source/data/region/uz.txt
index 8df8a15..cd44f64 100644
--- a/icu4c/source/data/region/uz.txt
+++ b/icu4c/source/data/region/uz.txt
@@ -31,6 +31,7 @@
         151{"Sharqiy Yevropa"}
         154{"Shimoliy Yevropa"}
         155{"G‘arbiy Yevropa"}
+        202{"Sahro janubidagi Afrika"}
         419{"Lotin Amerikasi"}
         AC{"Me’roj oroli"}
         AD{"Andorra"}
@@ -306,5 +307,5 @@
         CZ{"Chexiya Respublikasi"}
         TL{"Sharqiy Timor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/uz_Arab.txt b/icu4c/source/data/region/uz_Arab.txt
index 724a4b7..920a79e 100644
--- a/icu4c/source/data/region/uz_Arab.txt
+++ b/icu4c/source/data/region/uz_Arab.txt
@@ -5,5 +5,5 @@
     Countries{
         AF{"افغانستان"}
     }
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/uz_Cyrl.txt b/icu4c/source/data/region/uz_Cyrl.txt
index a187091..ce1335a 100644
--- a/icu4c/source/data/region/uz_Cyrl.txt
+++ b/icu4c/source/data/region/uz_Cyrl.txt
@@ -304,5 +304,5 @@
         CZ{"Чехия Республикаси"}
         TL{"Шарқий Тимор"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/uz_Latn.txt b/icu4c/source/data/region/uz_Latn.txt
index 36553da..66698d6 100644
--- a/icu4c/source/data/region/uz_Latn.txt
+++ b/icu4c/source/data/region/uz_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/vai.txt b/icu4c/source/data/region/vai.txt
index 99cc756..cc0d2b0 100644
--- a/icu4c/source/data/region/vai.txt
+++ b/icu4c/source/data/region/vai.txt
@@ -258,5 +258,5 @@
         ZM{"ꕤꔭꕩ"}
         ZW{"ꔽꕓꖜꔃ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/vai_Latn.txt b/icu4c/source/data/region/vai_Latn.txt
index 7d7b293..67e2e3f 100644
--- a/icu4c/source/data/region/vai_Latn.txt
+++ b/icu4c/source/data/region/vai_Latn.txt
@@ -227,5 +227,5 @@
         ZM{"Zambiya"}
         ZW{"Zimbabhuwe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/vai_Vaii.txt b/icu4c/source/data/region/vai_Vaii.txt
index 487dfa9..6ef4517 100644
--- a/icu4c/source/data/region/vai_Vaii.txt
+++ b/icu4c/source/data/region/vai_Vaii.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai_Vaii{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/vi.txt b/icu4c/source/data/region/vi.txt
index 1835be7..12fa383 100644
--- a/icu4c/source/data/region/vi.txt
+++ b/icu4c/source/data/region/vi.txt
@@ -31,6 +31,7 @@
         151{"Đông Âu"}
         154{"Bắc Âu"}
         155{"Tây Âu"}
+        202{"Châu Phi hạ Sahara"}
         419{"Châu Mỹ La-tinh"}
         AC{"Đảo Ascension"}
         AD{"Andorra"}
@@ -43,7 +44,7 @@
         AO{"Angola"}
         AQ{"Nam Cực"}
         AR{"Argentina"}
-        AS{"Đảo Somoa thuộc Mỹ"}
+        AS{"Samoa thuộc Mỹ"}
         AT{"Áo"}
         AU{"Australia"}
         AW{"Aruba"}
@@ -306,5 +307,5 @@
         CZ{"Cộng hòa Séc"}
         TL{"Đông Timor"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/vun.txt b/icu4c/source/data/region/vun.txt
index b4dbb6d..0f757eb 100644
--- a/icu4c/source/data/region/vun.txt
+++ b/icu4c/source/data/region/vun.txt
@@ -227,5 +227,5 @@
         ZM{"Zambia"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/wae.txt b/icu4c/source/data/region/wae.txt
index 731de97..4f0d835 100644
--- a/icu4c/source/data/region/wae.txt
+++ b/icu4c/source/data/region/wae.txt
@@ -293,5 +293,5 @@
         CI{"Côte d’Ivoire"}
         TL{"Wešttimor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/wo.txt b/icu4c/source/data/region/wo.txt
index 52df5b7..67226b0 100644
--- a/icu4c/source/data/region/wo.txt
+++ b/icu4c/source/data/region/wo.txt
@@ -252,5 +252,5 @@
         CD{"Kongo (R K D)"}
         CG{"Réewum Kongo"}
     }
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
 }
diff --git a/icu4c/source/data/region/xog.txt b/icu4c/source/data/region/xog.txt
index 11f2672..d45769e 100644
--- a/icu4c/source/data/region/xog.txt
+++ b/icu4c/source/data/region/xog.txt
@@ -226,5 +226,5 @@
         ZM{"Zambya"}
         ZW{"Zimbabwe"}
     }
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/yav.txt b/icu4c/source/data/region/yav.txt
index 81d13a4..5f36093 100644
--- a/icu4c/source/data/region/yav.txt
+++ b/icu4c/source/data/region/yav.txt
@@ -226,5 +226,5 @@
         ZM{"saambíi"}
         ZW{"simbapuwé"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/yi.txt b/icu4c/source/data/region/yi.txt
index 95b913b..334b32f 100644
--- a/icu4c/source/data/region/yi.txt
+++ b/icu4c/source/data/region/yi.txt
@@ -231,5 +231,5 @@
     Countries%variant{
         TL{"מזרח טימאר"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/yo.txt b/icu4c/source/data/region/yo.txt
index 89dd5d7..2df789c 100644
--- a/icu4c/source/data/region/yo.txt
+++ b/icu4c/source/data/region/yo.txt
@@ -227,5 +227,5 @@
         ZM{"Orílẹ́ède ṣamibia"}
         ZW{"Orílẹ́ède ṣimibabe"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/yo_BJ.txt b/icu4c/source/data/region/yo_BJ.txt
index f8c1cab..68522a9 100644
--- a/icu4c/source/data/region/yo_BJ.txt
+++ b/icu4c/source/data/region/yo_BJ.txt
@@ -226,5 +226,5 @@
         ZM{"Orílɛ́ède shamibia"}
         ZW{"Orílɛ́ède shimibabe"}
     }
-    Version{"2.1.37.9"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/yue.txt b/icu4c/source/data/region/yue.txt
index 2ba643c..168ce37 100644
--- a/icu4c/source/data/region/yue.txt
+++ b/icu4c/source/data/region/yue.txt
@@ -303,5 +303,5 @@
         CG{"剛果共和國"}
         CZ{"捷克共和國"}
     }
-    Version{"2.1.37.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/yue_Hans.txt b/icu4c/source/data/region/yue_Hans.txt
index 98704db..061366b 100644
--- a/icu4c/source/data/region/yue_Hans.txt
+++ b/icu4c/source/data/region/yue_Hans.txt
@@ -304,5 +304,5 @@
         CG{"刚果共和国"}
         CZ{"捷克共和国"}
     }
-    Version{"2.1.37.8"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/yue_Hant.txt b/icu4c/source/data/region/yue_Hant.txt
index b8cde82..a263f97 100644
--- a/icu4c/source/data/region/yue_Hant.txt
+++ b/icu4c/source/data/region/yue_Hant.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue_Hant{
-    Version{"2.1.36.80"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/region/zgh.txt b/icu4c/source/data/region/zgh.txt
index 681f1b9..c1d9dde 100644
--- a/icu4c/source/data/region/zgh.txt
+++ b/icu4c/source/data/region/zgh.txt
@@ -230,5 +230,5 @@
         ZM{"ⵣⴰⵎⴱⵢⴰ"}
         ZW{"ⵣⵉⵎⴱⴰⴱⵡⵉ"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/zh.txt b/icu4c/source/data/region/zh.txt
index 0602317..57c454b 100644
--- a/icu4c/source/data/region/zh.txt
+++ b/icu4c/source/data/region/zh.txt
@@ -31,6 +31,7 @@
         151{"东欧"}
         154{"北欧"}
         155{"西欧"}
+        202{"撒哈拉以南非洲"}
         419{"拉丁美洲"}
         AC{"阿森松岛"}
         AD{"安道尔"}
@@ -305,5 +306,5 @@
         CI{"象牙海岸"}
         CZ{"捷克共和国"}
     }
-    Version{"2.1.37.42"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/zh_Hans.txt b/icu4c/source/data/region/zh_Hans.txt
index e2e6871..a37beac 100644
--- a/icu4c/source/data/region/zh_Hans.txt
+++ b/icu4c/source/data/region/zh_Hans.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/zh_Hant.txt b/icu4c/source/data/region/zh_Hant.txt
index e47ce8b..ab6271e 100644
--- a/icu4c/source/data/region/zh_Hant.txt
+++ b/icu4c/source/data/region/zh_Hant.txt
@@ -32,6 +32,7 @@
         151{"東歐"}
         154{"北歐"}
         155{"西歐"}
+        202{"撒哈拉撒沙漠以南非洲"}
         419{"拉丁美洲"}
         AC{"阿森松島"}
         AD{"安道爾"}
@@ -305,5 +306,5 @@
         CG{"剛果共和國"}
         CZ{"捷克共和國"}
     }
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
 }
diff --git a/icu4c/source/data/region/zh_Hant_HK.txt b/icu4c/source/data/region/zh_Hant_HK.txt
index e6adba3..034a156 100644
--- a/icu4c/source/data/region/zh_Hant_HK.txt
+++ b/icu4c/source/data/region/zh_Hant_HK.txt
@@ -98,5 +98,5 @@
     Countries%variant{
         CI{"象牙海岸"}
     }
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/region/zh_Hant_MO.txt b/icu4c/source/data/region/zh_Hant_MO.txt
index 78fdee5..f61452c 100644
--- a/icu4c/source/data/region/zh_Hant_MO.txt
+++ b/icu4c/source/data/region/zh_Hant_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hant_MO{
     %%Parent{"zh_Hant_HK"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/region/zu.txt b/icu4c/source/data/region/zu.txt
index 8792569..afc11dc 100644
--- a/icu4c/source/data/region/zu.txt
+++ b/icu4c/source/data/region/zu.txt
@@ -31,6 +31,7 @@
         151{"i-Eastern Europe"}
         154{"i-Northern Europe"}
         155{"i-Western Europe"}
+        202{"Sub-Saharan Africa"}
         419{"i-Latin America"}
         AC{"i-Ascension Island"}
         AD{"i-Andorra"}
@@ -306,5 +307,5 @@
         CZ{"i-Czech Republic"}
         TL{"i-East Timor"}
     }
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/translit/Syrc_Latn.txt b/icu4c/source/data/translit/Syrc_Latn.txt
new file mode 100644
index 0000000..94605e0
--- /dev/null
+++ b/icu4c/source/data/translit/Syrc_Latn.txt
@@ -0,0 +1,58 @@
+# © 2016 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html#License
+#
+# File: Syrc_Latn.txt
+# Generated from CLDR
+#
+
+# Consonants
+ܫ ↔ sh;
+ܞ → yh;
+ܖ ↔ dr;
+ܐ ↔ ʾ;
+\u0711  → ʾ;
+ܒ ↔ b;
+ܓ ↔ g;
+ܔ → g;
+ܕ ↔ d;
+ܗ ↔ h;
+ܘ ↔ w;
+ܙ ↔ z;
+ܚ ↔ ḥ;
+ܛ ↔ t\u0323;
+ܜ → t\u0323;
+ܝ ↔ y;
+ܟ ↔ k;
+ܠ ↔ l;
+ܡ ↔ m;
+ܢ ↔ n;
+ܣ ↔ s;
+ܤ → s;
+ܥ → ʿ;
+ܦ ↔ p;
+ܧ → p;
+ܨ ↔ ṣ;
+ܩ ↔ q;
+ܪ ↔ r;
+ܬ ↔ t;
+# Vowels
+\u0730 → a;
+\u0731 → a;
+\u0732 ↔ a;
+\u0733 → o;
+\u0734 → o;
+\u0735 → a;
+\u0736 → e;
+\u0737 → e;
+\u0738 ↔ e;
+\u0739 ↔ ē;
+\u073A → i;
+\u073B → i;
+\u0742 ↔ i;
+\u073D → u;
+\u073E → u;
+\u073C ↔ u;
+\u073F ↔ o;
+# Punctuation
+܍ → \*;
+
diff --git a/icu4c/source/data/translit/fa_fa_FONIPA.txt b/icu4c/source/data/translit/fa_fa_FONIPA.txt
new file mode 100644
index 0000000..d0f8097
--- /dev/null
+++ b/icu4c/source/data/translit/fa_fa_FONIPA.txt
@@ -0,0 +1,82 @@
+# © 2016 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html#License
+#
+# File: fa_fa_FONIPA.txt
+# Generated from CLDR
+#
+
+[\u200c \u200d] → ;  # Strip off ZWJ and ZWNJ.
+::NFD;
+# Rewrite similarly-looking Arabic letters to Persian.
+ي → ی;
+ى → ی;
+ك → ک;
+ە → ه;
+::NULL;
+$VOWEL = [ \u064E \u0650  \u064F  \u0653 ا و ی];
+$BOUNDARY = [^[:L:][:M:][:N:]];
+$IPA_CONSONANT = [ m n p b t d k ɡ ʔ f v s z ʃ ʒ ʁ ɢ h χ {t\u0361ʃ} {d\u0361ʒ} l ɾ ];
+# Vowels
+ی\u0651 → jj;
+($VOWEL)\u0651 → \u0651 | $1;
+\u064Eی\u0652 → æj;
+\u0650ی\u0652 → ej;
+\u064Eو\u0652 → ov;
+\u0650ی → iː;
+\u064Eه → æ;
+[^ːeoæ] {ه} $BOUNDARY → e;
+[e] {ه} $BOUNDARY → ;
+ا\u064E → æ;
+ا\u064B $BOUNDARY → æn;
+\u064E → æ;
+یه → je;
+{ه\u0654} $BOUNDARY → jæ;
+ی\u0670 → ɒː;
+{ی} $VOWEL → j;
+ی → iː;
+$BOUNDARY {ای} → iː;
+ا\u0653 → ɒː;
+آ → ɒː;
+ا\u0650 → e;
+ا\u064F → o;
+او → uː;
+ا → ɒː; # Probably [^$BOUNDARY]
+\u0650 → e;
+ه\u0650 → e;
+{و} $VOWEL → v;
+$IPA_CONSONANT {و} → uː;
+\u064F{و} $IPA_CONSONANT → uː;
+$BOUNDARY {و} $BOUNDARY → va;
+و → ;
+\u064F → o;
+# Consonants
+پ → p;
+ب → b;
+[ت ط] → t;
+د → d;
+ک → k;
+گ → ɡ;
+[ع ء] → ʔ;
+چ → t\u0361ʃ;
+ج → d\u0361ʒ;
+ف → f;
+[س ص ث] → s;
+[ز ذ ض ظ] → z;
+ش → ʃ;
+ژ → ʒ;
+خ → χ;
+غ → ʁ;
+ق → ɢ;
+ح → h;
+م → m;
+ن → n;
+ه → h;
+ل → l;
+ر → ɾ;
+\u0652 → ;
+::NULL;
+# TODO: How to handle these?
+([$IPA_CONSONANT|$VOWEL]){\u0651} → $1;
+[ \u0651 \u0654 \u064B \u0670 ] → ;
+::NFC;
+
diff --git a/icu4c/source/data/translit/ha_ha_NE.txt b/icu4c/source/data/translit/ha_ha_NE.txt
new file mode 100644
index 0000000..92aa80d
--- /dev/null
+++ b/icu4c/source/data/translit/ha_ha_NE.txt
@@ -0,0 +1,12 @@
+# © 2016 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html#License
+#
+# File: ha_ha_NE.txt
+# Generated from CLDR
+#
+
+:: [yYƴƳʼ] ;
+:: NFC ;
+ʼy→ƴ ;
+ʼY→Ƴ ;
+
diff --git a/icu4c/source/data/translit/ja_Hrkt_ja_Latn_BGN.txt b/icu4c/source/data/translit/ja_Hrkt_ja_Latn_BGN.txt
index 04040d0..cb1e87b 100644
--- a/icu4c/source/data/translit/ja_Hrkt_ja_Latn_BGN.txt
+++ b/icu4c/source/data/translit/ja_Hrkt_ja_Latn_BGN.txt
@@ -5,55 +5,26 @@
 # Generated from CLDR
 #
 
+# Romanization and Roman-Script Spelling Conventions.
+# Prepared by the U.S. Board on Geographic Names, Foreign Names Committee Staff
+# Published by the Defense Mapping Agency, 1994.
+# Chapter “Romanization System for Japanese Kana, Modified Hebpurn System,
+# BGN/PCGN Agreement”, pages 39 to 45.
 #
-########################################################################
-# BGN/PCGN Agreement
+# http://libraries.ucsd.edu/bib/fed/USBGN_romanization.pdf
 #
-# The modified Hepburn system for the romanization of Japanese has been
-# in use by the U.S. Board on Geographic Names since about 1930 and has
-# been used extensively in the romanization of Japanese geographic names.
-# The system is well adapted to the general needs of speakers of English
-# and is the most widely used system for the romanization of Japanese.
-#
-# Originally prepared by Michael Everson <everson@evertype.com>
-########################################################################
-#
-# MINIMAL FILTER: Japanese-Latin
-#
-:: [あいうえおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろわゐゑをんゔアイウエオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロワヰヱヲンヴ] ;
-:: NFD (NFC) ;
-#
-#
-########################################################################
-#
-########################################################################
-#
-# Define All Transformation Variables
-#
-########################################################################
-$apostrophe  = ’;
-#
+# https://commons.wikimedia.org/w/index.php?title=File%3ARomanization_Systems_and_Roman-Script_Spelling_Conventions.djvu
+:: [あいうえおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろわゐゑをんゔアイウエオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロワヰヱヲンヴ\u3099\u309Aー \uFF61-\uFF9F];
+::NFC;
+::[\uFF61-\uFF9F] Halfwidth-Fullwidth;
 # Use this $wordBoundary until bug 2034 is fixed in ICU:
 # http://bugs.icu-project.org/cgi-bin/icu-bugs/transliterate?id=2034;expression=boundary;user=guest
-#
 $wordBoundary =  [^[:L:][:M:][:N:]] ;
-#
-########################################################################
-#
-# Rules moved to front to avoid masking
-#
-########################################################################
-#
-########################################################################
-#
 # BGN Page 45 Rule 2:
 #
 # A small-script tsu form (ッ or っ) is inserted between kana symbols
 # to indicate a double consonant and is romanized as k before k;
 # as s before s or sh; as t before t, ts, or ch; and as p before p.
-#
-########################################################################
-#
 ッ}[カキクケコ] → k ; # KATAKANA LETTER SMALL TU
 っ}[かきくけこ] → k ; # HIRAGANA LETTER SMALL TU
 ッ}[サシスセソ] → s ; # KATAKANA LETTER SMALL TU
@@ -62,20 +33,7 @@
 っ}[たちつてと] → t ; # HIRAGANA LETTER SMALL TU
 ッ}[パピプペポ] → p ; # KATAKANA LETTER SMALL TU
 っ}[ぱぴぷぺぽ] → p ; # HIRAGANA LETTER SMALL TU
-#
-#
-########################################################################
-#
-# End of Rule 2
-#
-########################################################################
-#
-########################################################################
-#
 # Start of Syllabic Transformations
-#
-########################################################################
-#
 ア → a ; # KATAKANA LETTER A
 イ → i ; # KATAKANA LETTER I
 ウ → u ; # KATAKANA LETTER U
@@ -138,11 +96,11 @@
 ホウ → hō ; # KATAKANA LETTER HO + U
 ホ → ho ; # KATAKANA LETTER HO
 マ → ma ; # KATAKANA LETTER MA
-ミョウ → hyō ; # KATAKANA LETTER MI + SMALL YO + U
-ミュウ → hyū ; # KATAKANA LETTER MI + SMALL YU + U
-ミャ → hya ; # KATAKANA LETTER MI + SMALL YA
-ミョ → hyo ; # KATAKANA LETTER MI + SMALL YO
-ミュ → hyu ; # KATAKANA LETTER MI + SMALL YU
+ミョウ → myō ; # KATAKANA LETTER MI + SMALL YO + U
+ミュウ → myū ; # KATAKANA LETTER MI + SMALL YU + U
+ミャ → mya ; # KATAKANA LETTER MI + SMALL YA
+ミョ → myo ; # KATAKANA LETTER MI + SMALL YO
+ミュ → myu ; # KATAKANA LETTER MI + SMALL YU
 ミ → mi ; # KATAKANA LETTER MI
 ム → mu ; # KATAKANA LETTER MU
 メ → me ; # KATAKANA LETTER ME
@@ -167,31 +125,16 @@
 ヰ → i ; # KATAKANA LETTER WI
 ヱ → e ; # KATAKANA LETTER WE
 ヲ → o ; # KATAKANA LETTER WO
-#
-#
-########################################################################
-#
 # BGN Page 45 Rule 3:
 #
 # The character ン should be romanized m before b, p, or m.
 # The character ん should be romanized m before b, p, or m.
 # The character ン should be romanized n’ before y or a vowel letter.
 # The character ん should be romanized n’ before y or a vowel letter.
-#
-########################################################################
-#
 ン}[バビブベボパピプペポマミムメモ] → m ; # KATAKANA LETTER N
 ん}[ばびぶべぼぱぴぷぺぽまみむめも] → m ; # HIRAGANA LETTER N
-ン}[ヤユヨアイウエオ] → n $apostrophe ; # KATAKANA LETTER N
-ん}[やゆよあいうえお] → n $apostrophe ; # HIRAGANA LETTER N
-#
-#
-########################################################################
-#
-# End of Rule 3
-#
-########################################################################
-#
+ン}[ヤユヨアイウエオ] → n’ ; # KATAKANA LETTER N
+ん}[やゆよあいうえお] → n’ ; # HIRAGANA LETTER N
 ン → n ; # KATAKANA LETTER N
 ガ → ga ; # KATAKANA LETTER GA
 ギョウ → gyō ; # KATAKANA LETTER GI + SMALL YO + U
@@ -306,11 +249,11 @@
 ほう → hō ; # HIRAGANA LETTER HO + U
 ほ → ho ; # HIRAGANA LETTER HO
 ま → ma ; # HIRAGANA LETTER MA
-みょう → hyō ; # HIRAGANA LETTER MI + SMALL YO + U
-みゅう → hyū ; # HIRAGANA LETTER MI + SMALL YU + U
-みゃ → hya ; # HIRAGANA LETTER MI + SMALL YA
-みょ → hyo ; # HIRAGANA LETTER MI + SMALL YO
-みゅ → hyu ; # HIRAGANA LETTER MI + SMALL YU
+みょう → myō ; # HIRAGANA LETTER MI + SMALL YO + U
+みゅう → myū ; # HIRAGANA LETTER MI + SMALL YU + U
+みゃ → mya ; # HIRAGANA LETTER MI + SMALL YA
+みょ → myo ; # HIRAGANA LETTER MI + SMALL YO
+みゅ → myu ; # HIRAGANA LETTER MI + SMALL YU
 み → mi ; # HIRAGANA LETTER MI
 む → mu ; # HIRAGANA LETTER MU
 め → me ; # HIRAGANA LETTER ME
@@ -387,7 +330,12 @@
 ぽう → pō ; # HIRAGANA LETTER PO + U
 ぽ → po ; # HIRAGANA LETTER PO
 ゔ → v ; # HIRAGANA LETTER VU
-#
-#
-########################################################################
+::NULL;
+aー → ā;
+iー → ī;
+uー → ū;
+eー → ē;
+oー → ō;
+vー → vū;  # ヴーゔー
+ー →;
 
diff --git a/icu4c/source/data/translit/nv_nv_FONIPA.txt b/icu4c/source/data/translit/nv_nv_FONIPA.txt
new file mode 100644
index 0000000..0d882bc
--- /dev/null
+++ b/icu4c/source/data/translit/nv_nv_FONIPA.txt
@@ -0,0 +1,80 @@
+# © 2016 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html#License
+#
+# File: nv_nv_FONIPA.txt
+# Generated from CLDR
+#
+
+::Lower;
+::NFC;
+# References
+# [1] https://en.wikipedia.org/wiki/Navajo_language#Orthography
+# [2] https://en.wikipedia.org/wiki/Navajo_phonology
+$apostrophe = [’ ʼ \'];
+ą\u0301ą\u0301 → ɑ\u0303\u0301ː;
+áá → ɑ\u0301ː;
+ąą → ɑ\u0303ː;
+aa → ɑː;
+ą\u0301 → ɑ\u0303\u0301;
+á → ɑ\u0301;
+ą → ɑ\u0303;
+a → ɑ;
+ę\u0301ę\u0301 → ẽ\u0301ː;
+éé → éː;
+ęę → ẽː;
+ee → eː;
+ę\u0301 → ẽ\u0301;
+é → é;
+ę → ẽ;
+e → e;
+į\u0301į\u0301 → ɪ\u0303\u0301ː;
+íí → ɪ\u0301ː;
+įį → ɪ\u0303ː;
+ii → ɪː;
+į\u0301 → ɪ\u0303\u0301;
+í → ɪ\u0301;
+į → ɪ\u0303;
+i → ɪ;
+ǫ\u0301ǫ\u0301 → ṍː;
+óó → óː;
+ǫǫ → õː;
+oo → oː;
+ǫ\u0301 → ṍ;
+ó → ó;
+ǫ → õ;
+o → o;
+$apostrophe → ʔ;
+b → p;
+ch $apostrophe → t\u0361ʃʼ;
+ch → t\u0361ʃʰ;
+dl → tˡ;
+dz → t\u0361s;
+d → t;
+gh → ɣ;
+g → k;
+hw → xʷ;
+h → h;
+j → t\u0361ʃ;
+k $apostrophe → kʼ;
+kw → k\u0361xʷ;
+k → k\u0361x;
+l → l;
+ł → ɬ;
+m → m;
+n → n;
+sh → ʃ;
+s → s;
+tł $apostrophe → t\u0361ɬʼ;
+tł → t\u0361ɬʰ;
+ts $apostrophe → t\u0361sʼ;
+ts → t\u0361sʰ;
+t $apostrophe → tʼ;
+t → t\u0361x;
+w → w;
+x → x;
+y → j;
+zh → ʒ;
+z → z;
+::NULL;
+{ɣ} [{ṍ} {ó} {õ} {o}] → ɣʷ;
+
diff --git a/icu4c/source/data/translit/root.txt b/icu4c/source/data/translit/root.txt
index 0c8afd5..921637e 100644
--- a/icu4c/source/data/translit/root.txt
+++ b/icu4c/source/data/translit/root.txt
@@ -2069,6 +2069,31 @@
             }
         }
 
+        Syriac-Latin {
+            alias {"Syrc-Latn"}
+        }
+        und-Latn-t-und-syrc {
+            alias {"Syrc-Latn"}
+        }
+        Syrc-Latn {
+            file {
+                resource:process(transliterator) {"Syrc_Latn.txt"}
+                direction {"FORWARD"}
+            }
+        }
+        Latin-Syriac {
+            alias {"Latn-Syrc"}
+        }
+        und-Syrc-t-und-latn {
+            alias {"Latn-Syrc"}
+        }
+        Latn-Syrc {
+            file {
+                resource:process(transliterator) {"Syrc_Latn.txt"}
+                direction {"REVERSE"}
+            }
+        }
+
         Tamil-Arabic {
             alias {"Taml-Arab"}
         }
@@ -2998,6 +3023,26 @@
             }
         }
 
+        fa-fonipa-t-fa {
+            alias {"fa-fa_FONIPA"}
+        }
+        fa-fa_FONIPA {
+            file {
+                resource:process(transliterator) {"fa_fa_FONIPA.txt"}
+                direction {"FORWARD"}
+            }
+        }
+
+        ha-NE-t-ha {
+            alias {"ha-ha_NE"}
+        }
+        ha-ha_NE {
+            file {
+                resource:process(transliterator) {"ha_ha_NE.txt"}
+                direction {"FORWARD"}
+            }
+        }
+
         am-t-hy {
             alias {"hy-am"}
         }
@@ -3408,6 +3453,16 @@
             }
         }
 
+        nv-fonipa-t-nv {
+            alias {"nv-nv_FONIPA"}
+        }
+        nv-nv_FONIPA {
+            file {
+                resource:process(transliterator) {"nv_nv_FONIPA.txt"}
+                direction {"FORWARD"}
+            }
+        }
+
         am-t-pl {
             alias {"pl-am"}
         }
@@ -3950,6 +4005,16 @@
             }
         }
 
+        vec-fonipa-t-vec {
+            alias {"vec-vec_FONIPA"}
+        }
+        vec-vec_FONIPA {
+            file {
+                resource:process(transliterator) {"vec_vec_FONIPA.txt"}
+                direction {"FORWARD"}
+            }
+        }
+
         am-t-xh {
             alias {"xh-am"}
         }
diff --git a/icu4c/source/data/translit/vec_vec_FONIPA.txt b/icu4c/source/data/translit/vec_vec_FONIPA.txt
new file mode 100644
index 0000000..8920ee4
--- /dev/null
+++ b/icu4c/source/data/translit/vec_vec_FONIPA.txt
@@ -0,0 +1,91 @@
+# © 2016 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html#License
+#
+# File: vec_vec_FONIPA.txt
+# Generated from CLDR
+#
+
+# References
+# ----------
+# [1] Personal communication with Academia de ła Bona Creansa, Venice
+# [2] https://en.wikipedia.org/wiki/Venetian_language#Phonology
+# [3] https://en.wikipedia.org/wiki/Help:IPA/Venetian (mixed with Ladin)
+#
+# Output phonemes
+# ---------------
+#   m n ɲ ŋ
+#   p b t d k ɡ
+#   f v ɾ s z
+#   l ʎ j w
+#   t\u0361ʃ d\u0361ʒ d\u0361z
+#   i u e e\u032F o ɛ ɔ a
+$boundary = [^[:L:][:M:][:N:]];
+$e = [e é è];
+$i = [i í ì];
+$ei = [$e $i];
+$vowel = [a á à $ei o ó ò u ú ù];
+$onset = [
+j w m n ɲ ŋ p b t d k ɡ f v ɾ s z h l ʎ {e\u032F}
+{t\u0361ʃ} {d\u0361ʒ} {d\u0361z} {mj} {mw} {nj} {nw}
+{ps} {pɾ} {pɾw} {pl} {pj} {pw} {bɾ} {bɾw} {bw} {bj} {bl}
+{ts} {tɾ} {tɾw} {tl} {tj} {tw} {dɾ} {dɾw} {dw} {dj} {dl}
+{kɾ} {kw} {kɾw} {kl} {kj} {kw} {ɡɾ} {ɡɾw} {ɡw} {ɡj} {ɡl}
+{fɾ} {fj} {fl} {fw} {fɾw} {vɾ} {vj} {vw} {ɾw} {ɾj}
+{zm} {zn} {zɲ} {zj} {zl} {zb} {zbɾ} {zbj} {zbw} {zd} {zdɾ} {zdj} {zdw}
+{zɡ} {zɡɾ} {zɡj} {zɡw} {zv} {zvɾ} {zɾ} {zvj} {zd\u0361ʒ} {zw}
+{sp} {spɾ} {spw} {st} {stɾ} {stw} {sk} {skɾ} {skw}
+{sf} {sfɾ} {sɾ} {st\u0361ʃ} {sj} {sw} {lj} {lw}
+];
+::Lower;
+::NFC;
+([abefjklmoptvw]) → $1;
+[á à] → ˈa;
+{c [$ei \' ’]} $vowel → t\u0361ʃ;
+cé [\' ’]? → t\u0361ʃˈe;
+cè [\' ’]? → t\u0361ʃˈɛ;
+c e [\' ’]? → t\u0361ʃe;
+c [íì] [\' ’]? → t\u0361ʃˈi;
+c i [\' ’]? → t\u0361ʃi;
+[c {ch} k q {qu}] → k;
+é → ˈe;
+è → ˈɛ;
+{g l $ei} $vowel → ʎ;
+g l → ʎ;
+ġ → d\u0361ʒ;
+gé [\' ’]? → d\u0361ʒˈe;
+gè [\' ’]? → d\u0361ʒˈɛ;
+g [íì] [\' ’]? → d\u0361ʒˈi;
+{g [$ei \' ’]} $vowel → d\u0361ʒ;
+{g} $ei → d\u0361ʒ;
+gn → ɲ;
+[g {gh}] → ɡ;
+[í ì] → ˈi;
+{i} $vowel → j;
+ł → ɰ;
+ṅ → ŋ;
+ñ → ɲ;
+nj → ɲ;
+ó → ˈo;
+ò → ˈɔ;
+r → ɾ;
+[ṡ x z] → z;
+{s}[bdg] → z;
+s → s;
+{u} $vowel → w;
+[ú ù] → ˈu;
+u → u;
+y → j;
+[ż đ {dh}] → d\u0361z;
+d → d;
+[[:P:][:Z:]]+ → ' ';
+::NULL;
+{n} [p b t d k ɡ f v ɾ s z $boundary] → ŋ;
+{ɰ} ˈ? [ei] → ;
+eɰ → e;
+iɰ → i;
+ɰ → e\u032F;
+::NULL;
+# Move stress marker before syllable onset: [zɡɾaŋfiɲˈae] → [zɡɾaŋfiˈɲae]
+($onset) ˈ → ˈ $1;
+::NULL;
+
diff --git a/icu4c/source/data/unit/af.txt b/icu4c/source/data/unit/af.txt
index 70d4f91..56623cb 100644
--- a/icu4c/source/data/unit/af.txt
+++ b/icu4c/source/data/unit/af.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 af{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"hh:mm"}
         hms{"hh:mm:ss"}
diff --git a/icu4c/source/data/unit/agq.txt b/icu4c/source/data/unit/agq.txt
index c364408..61cdbaf 100644
--- a/icu4c/source/data/unit/agq.txt
+++ b/icu4c/source/data/unit/agq.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 agq{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/ak.txt b/icu4c/source/data/unit/ak.txt
index 1c9e8ee..ac5ead3 100644
--- a/icu4c/source/data/unit/ak.txt
+++ b/icu4c/source/data/unit/ak.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ak{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/am.txt b/icu4c/source/data/unit/am.txt
index 18ceabd..0dcd22a 100644
--- a/icu4c/source/data/unit/am.txt
+++ b/icu4c/source/data/unit/am.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 am{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ar.txt b/icu4c/source/data/unit/ar.txt
index 3d1c41e..7be215f 100644
--- a/icu4c/source/data/unit/ar.txt
+++ b/icu4c/source/data/unit/ar.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/asa.txt b/icu4c/source/data/unit/asa.txt
index ae5b560..5f7cf91 100644
--- a/icu4c/source/data/unit/asa.txt
+++ b/icu4c/source/data/unit/asa.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 asa{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/ast.txt b/icu4c/source/data/unit/ast.txt
index a7eaa47..76b26f8 100644
--- a/icu4c/source/data/unit/ast.txt
+++ b/icu4c/source/data/unit/ast.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ast{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/az.txt b/icu4c/source/data/unit/az.txt
index 3c5f9ec..7cc0e65 100644
--- a/icu4c/source/data/unit/az.txt
+++ b/icu4c/source/data/unit/az.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/az_Cyrl.txt b/icu4c/source/data/unit/az_Cyrl.txt
index f225064..5152a0a 100644
--- a/icu4c/source/data/unit/az_Cyrl.txt
+++ b/icu4c/source/data/unit/az_Cyrl.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az_Cyrl{
     %%Parent{"root"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/az_Latn.txt b/icu4c/source/data/unit/az_Latn.txt
index 9df6ff3..47ecb5c 100644
--- a/icu4c/source/data/unit/az_Latn.txt
+++ b/icu4c/source/data/unit/az_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/bas.txt b/icu4c/source/data/unit/bas.txt
index f8558f5..41c9c6c 100644
--- a/icu4c/source/data/unit/bas.txt
+++ b/icu4c/source/data/unit/bas.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bas{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/be.txt b/icu4c/source/data/unit/be.txt
index ea98383..ebe0a46 100644
--- a/icu4c/source/data/unit/be.txt
+++ b/icu4c/source/data/unit/be.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 be{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"hh:mm"}
         hms{"hh:mm:ss"}
diff --git a/icu4c/source/data/unit/bem.txt b/icu4c/source/data/unit/bem.txt
index 58b983a..3d2794a 100644
--- a/icu4c/source/data/unit/bem.txt
+++ b/icu4c/source/data/unit/bem.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bem{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/bez.txt b/icu4c/source/data/unit/bez.txt
index b5b4150..98aea05 100644
--- a/icu4c/source/data/unit/bez.txt
+++ b/icu4c/source/data/unit/bez.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bez{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/bg.txt b/icu4c/source/data/unit/bg.txt
index 94c4b6e..f72140d 100644
--- a/icu4c/source/data/unit/bg.txt
+++ b/icu4c/source/data/unit/bg.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bg{
-    Version{"2.1.37.59"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/bm.txt b/icu4c/source/data/unit/bm.txt
index a385b5e..288184a 100644
--- a/icu4c/source/data/unit/bm.txt
+++ b/icu4c/source/data/unit/bm.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bm{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/bn.txt b/icu4c/source/data/unit/bn.txt
index e8955ed..304f6dd 100644
--- a/icu4c/source/data/unit/bn.txt
+++ b/icu4c/source/data/unit/bn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bn{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/bo.txt b/icu4c/source/data/unit/bo.txt
index 8b9ab6d..044ee50 100644
--- a/icu4c/source/data/unit/bo.txt
+++ b/icu4c/source/data/unit/bo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bo{
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/br.txt b/icu4c/source/data/unit/br.txt
index bc71b59..ff9d4dc 100644
--- a/icu4c/source/data/unit/br.txt
+++ b/icu4c/source/data/unit/br.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 br{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
@@ -85,6 +85,7 @@
                 many{"{0} a gilometroù karrez"}
                 one{"{0} c'hilometr karrez"}
                 other{"{0} kilometr karrez"}
+                per{"{0} dre gilometr karrez"}
                 two{"{0} gilometr karrez"}
             }
             square-meter{
@@ -102,6 +103,7 @@
                 many{"{0} a viltirioù karrez"}
                 one{"{0} miltir karrez"}
                 other{"{0} miltir karrez"}
+                per{"{0} dre viltir karrez"}
                 two{"{0} viltir karrez"}
             }
         }
@@ -117,6 +119,22 @@
                 other{"{0} karat"}
                 two{"{0} garat"}
             }
+            milligram-per-deciliter{
+                dnam{"milligramm dre zekilitr"}
+                few{"{0} milligramm dre zekilitr"}
+                many{"{0} a villigrammoù dre zekilitr"}
+                one{"{0} milligramm dre zekilitr"}
+                other{"{0} milligramm dre zekilitr"}
+                two{"{0} villigramm dre zekilitr"}
+            }
+            millimole-per-liter{
+                dnam{"millimol dre litr"}
+                few{"{0} millimol dre litr"}
+                many{"{0} a villimoloù dre litr"}
+                one{"{0} millimol dre litr"}
+                other{"{0} millimol dre litr"}
+                two{"{0} villimol dre litr"}
+            }
         }
         consumption{
             liter-per-100kilometers{
@@ -565,15 +583,23 @@
                 other{"{0} pikometr"}
                 two{"{0} bikometr"}
             }
+            point{
+                dnam{"poent"}
+                few{"{0} foent"}
+                many{"{0} a boentoù"}
+                one{"{0} poent"}
+                other{"{0} poent"}
+                two{"{0} boent"}
+            }
         }
         light{
             lux{
                 dnam{"luksoù"}
-                few{"{0} lx"}
+                few{"{0} luks"}
                 many{"{0} a luksoù"}
                 one{"{0} luks"}
-                other{"{0} lx"}
-                two{"{0} lx"}
+                other{"{0} luks"}
+                two{"{0} luks"}
             }
         }
         mass{
@@ -953,6 +979,20 @@
             }
         }
         angle{
+            arc-minute{
+                few{"{0}′"}
+                many{"{0}′"}
+                one{"{0}′"}
+                other{"{0}′"}
+                two{"{0}′"}
+            }
+            arc-second{
+                few{"{0}″"}
+                many{"{0}″"}
+                one{"{0}″"}
+                other{"{0}″"}
+                two{"{0}″"}
+            }
             degree{
                 dnam{"°"}
                 few{"{0}°"}
@@ -1019,6 +1059,7 @@
                 many{"{0} km²"}
                 one{"{0} km²"}
                 other{"{0} km²"}
+                per{"{0}/km²"}
                 two{"{0} km²"}
             }
             square-meter{
@@ -1036,6 +1077,7 @@
                 many{"{0} mi²"}
                 one{"{0} mi²"}
                 other{"{0} mi²"}
+                per{"{0}/mi²"}
                 two{"{0} mi²"}
             }
         }
@@ -1051,6 +1093,22 @@
                 other{"{0} kt"}
                 two{"{0} kt"}
             }
+            milligram-per-deciliter{
+                dnam{"mg/dl"}
+                few{"{0} mg/dl"}
+                many{"{0} mg/dl"}
+                one{"{0} mg/dl"}
+                other{"{0} mg/dl"}
+                two{"{0} mg/dl"}
+            }
+            millimole-per-liter{
+                dnam{"mmol/l"}
+                few{"{0} mmol/l"}
+                many{"{0} mmol/l"}
+                one{"{0} mmol/l"}
+                other{"{0} mmol/l"}
+                two{"{0} mmol/l"}
+            }
         }
         consumption{
             liter-per-100kilometers{
@@ -1167,6 +1225,15 @@
             minute{
                 per{"{0}/min"}
             }
+            month{
+                dnam{"mizioù"}
+                few{"{0} miz"}
+                many{"{0} a vizioù"}
+                one{"{0} miz"}
+                other{"{0} miz"}
+                per{"{0}/miz"}
+                two{"{0} m"}
+            }
             year{
                 dnam{"b"}
                 few{"{0} b"}
@@ -1321,6 +1388,14 @@
                 other{"{0} pm"}
                 two{"{0} pm"}
             }
+            point{
+                dnam{"pt"}
+                few{"{0} pt"}
+                many{"{0} pt"}
+                one{"{0} pt"}
+                other{"{0} pt"}
+                two{"{0} pt"}
+            }
         }
         light{
             lux{
@@ -1665,6 +1740,20 @@
             }
         }
         angle{
+            arc-minute{
+                few{"{0}′"}
+                many{"{0}′"}
+                one{"{0}′"}
+                other{"{0}′"}
+                two{"{0}′"}
+            }
+            arc-second{
+                few{"{0}″"}
+                many{"{0}″"}
+                one{"{0}″"}
+                other{"{0}″"}
+                two{"{0}″"}
+            }
             degree{
                 dnam{"deg"}
                 few{"{0} deg"}
@@ -1731,6 +1820,7 @@
                 many{"{0} km²"}
                 one{"{0} km²"}
                 other{"{0} km²"}
+                per{"{0}/km²"}
                 two{"{0} km²"}
             }
             square-meter{
@@ -1748,6 +1838,7 @@
                 many{"{0} mi²"}
                 one{"{0} mi²"}
                 other{"{0} mi²"}
+                per{"{0}/mi²"}
                 two{"{0} mi²"}
             }
         }
@@ -1763,6 +1854,22 @@
                 other{"{0} kt"}
                 two{"{0} kt"}
             }
+            milligram-per-deciliter{
+                dnam{"mg/dl"}
+                few{"{0} mg/dl"}
+                many{"{0} mg/dl"}
+                one{"{0} mg/dl"}
+                other{"{0} mg/dl"}
+                two{"{0} mg/dl"}
+            }
+            millimole-per-liter{
+                dnam{"millimol/litr"}
+                few{"{0} mmol/l"}
+                many{"{0} mmol/l"}
+                one{"{0} mmol/l"}
+                other{"{0} mmol/l"}
+                two{"{0} mmol/l"}
+            }
         }
         consumption{
             liter-per-100kilometers{
@@ -1897,13 +2004,13 @@
                 two{"{0} d"}
             }
             hour{
-                dnam{"h"}
-                few{"{0} h"}
-                many{"{0} h"}
-                one{"{0} h"}
-                other{"{0} h"}
-                per{"{0}/h"}
-                two{"{0} h"}
+                dnam{"e"}
+                few{"{0} e"}
+                many{"{0} e"}
+                one{"{0} e"}
+                other{"{0} e"}
+                per{"{0}/e"}
+                two{"{0} e"}
             }
             microsecond{
                 dnam{"μs"}
@@ -1930,6 +2037,15 @@
                 per{"{0}/min"}
                 two{"{0} min"}
             }
+            month{
+                dnam{"mizioù"}
+                few{"{0} miz"}
+                many{"{0} a vizioù"}
+                one{"{0} miz"}
+                other{"{0} miz"}
+                per{"{0}/miz"}
+                two{"{0} viz"}
+            }
             nanosecond{
                 dnam{"ns"}
                 few{"{0} ns"}
@@ -2000,6 +2116,14 @@
                 other{"{0} cal"}
                 two{"{0} cal"}
             }
+            foodcalorie{
+                dnam{"Cal"}
+                few{"{0} Cal"}
+                many{"{0} Cal"}
+                one{"{0} Cal"}
+                other{"{0} Cal"}
+                two{"{0} Cal"}
+            }
             joule{
                 dnam{"J"}
                 few{"{0} J"}
@@ -2204,6 +2328,14 @@
                 other{"{0} pm"}
                 two{"{0} pm"}
             }
+            point{
+                dnam{"pt"}
+                few{"{0} pt"}
+                many{"{0} pt"}
+                one{"{0} pt"}
+                other{"{0} pt"}
+                two{"{0} pt"}
+            }
         }
         light{
             lux{
diff --git a/icu4c/source/data/unit/brx.txt b/icu4c/source/data/unit/brx.txt
index 1386927..7105926 100644
--- a/icu4c/source/data/unit/brx.txt
+++ b/icu4c/source/data/unit/brx.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 brx{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/bs.txt b/icu4c/source/data/unit/bs.txt
index 0b76031..5802916 100644
--- a/icu4c/source/data/unit/bs.txt
+++ b/icu4c/source/data/unit/bs.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/bs_Cyrl.txt b/icu4c/source/data/unit/bs_Cyrl.txt
index 46b1e9a..cdeb529 100644
--- a/icu4c/source/data/unit/bs_Cyrl.txt
+++ b/icu4c/source/data/unit/bs_Cyrl.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs_Cyrl{
     %%Parent{"root"}
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/bs_Latn.txt b/icu4c/source/data/unit/bs_Latn.txt
index 5e72765..0ac3778 100644
--- a/icu4c/source/data/unit/bs_Latn.txt
+++ b/icu4c/source/data/unit/bs_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/ca.txt b/icu4c/source/data/unit/ca.txt
index 99cb8cc..8b267f7 100644
--- a/icu4c/source/data/unit/ca.txt
+++ b/icu4c/source/data/unit/ca.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ca{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ccp.txt b/icu4c/source/data/unit/ccp.txt
index 0dbe98c..00ee923 100644
--- a/icu4c/source/data/unit/ccp.txt
+++ b/icu4c/source/data/unit/ccp.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ccp{
-    Version{"2.1.37.51"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ce.txt b/icu4c/source/data/unit/ce.txt
index 96026c7..3ad3ec6 100644
--- a/icu4c/source/data/unit/ce.txt
+++ b/icu4c/source/data/unit/ce.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ce{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/cgg.txt b/icu4c/source/data/unit/cgg.txt
index c0ecc47..bb9e5b0 100644
--- a/icu4c/source/data/unit/cgg.txt
+++ b/icu4c/source/data/unit/cgg.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 cgg{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/chr.txt b/icu4c/source/data/unit/chr.txt
index 1af33c2..fcc8a60 100644
--- a/icu4c/source/data/unit/chr.txt
+++ b/icu4c/source/data/unit/chr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 chr{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
@@ -147,10 +147,10 @@
             }
         }
         coordinate{
-            east{"{0}Ꮧ"}
-            north{"{0}ᏧᏴ"}
-            south{"{0}ᏧᎦ"}
-            west{"{0}Ꮽ"}
+            east{"{0} ᏗᎧᎸᎬ"}
+            north{"{0} ᏧᏴᏢ"}
+            south{"{0} ᏧᎦᏄᏮ"}
+            west{"{0} ᏭᏕᎵᎬ"}
         }
         digital{
             bit{
@@ -994,10 +994,10 @@
             }
         }
         coordinate{
-            east{"{0}Ꮧ"}
-            north{"{0}ᏧᏴ"}
-            south{"{0}ᏧᎦ"}
-            west{"{0}Ꮽ"}
+            east{"{0} Ꮧ"}
+            north{"{0} ᏧᏴ"}
+            south{"{0} ᏧᎦ"}
+            west{"{0} Ꮽ"}
         }
         digital{
             bit{
diff --git a/icu4c/source/data/unit/ckb.txt b/icu4c/source/data/unit/ckb.txt
index f721c56..7bd24f8 100644
--- a/icu4c/source/data/unit/ckb.txt
+++ b/icu4c/source/data/unit/ckb.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ckb{
-    Version{"2.1.36.86"}
+    Version{"2.1.38.71"}
 }
diff --git a/icu4c/source/data/unit/cs.txt b/icu4c/source/data/unit/cs.txt
index 454be50..e1fa72a 100644
--- a/icu4c/source/data/unit/cs.txt
+++ b/icu4c/source/data/unit/cs.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 cs{
-    Version{"2.1.37.11"}
+    Version{"2.1.39.15"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/cy.txt b/icu4c/source/data/unit/cy.txt
index 98dc19c..fa0d675 100644
--- a/icu4c/source/data/unit/cy.txt
+++ b/icu4c/source/data/unit/cy.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 cy{
-    Version{"2.1.37.17"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/da.txt b/icu4c/source/data/unit/da.txt
index da6ef09..d0f4aff 100644
--- a/icu4c/source/data/unit/da.txt
+++ b/icu4c/source/data/unit/da.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 da{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h.mm"}
         hms{"h.mm.ss"}
diff --git a/icu4c/source/data/unit/dav.txt b/icu4c/source/data/unit/dav.txt
index 467d8f4..4d93c1e 100644
--- a/icu4c/source/data/unit/dav.txt
+++ b/icu4c/source/data/unit/dav.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dav{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/de.txt b/icu4c/source/data/unit/de.txt
index de19d30..559bea4 100644
--- a/icu4c/source/data/unit/de.txt
+++ b/icu4c/source/data/unit/de.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 de{
-    Version{"2.1.37.96"}
+    Version{"2.1.39.41"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/de_CH.txt b/icu4c/source/data/unit/de_CH.txt
index 99cf50a..086f15b 100644
--- a/icu4c/source/data/unit/de_CH.txt
+++ b/icu4c/source/data/unit/de_CH.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 de_CH{
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
     units{
         area{
             square-foot{
diff --git a/icu4c/source/data/unit/dje.txt b/icu4c/source/data/unit/dje.txt
index 6ffaeef..f0c1678 100644
--- a/icu4c/source/data/unit/dje.txt
+++ b/icu4c/source/data/unit/dje.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dje{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/dsb.txt b/icu4c/source/data/unit/dsb.txt
index 1e0ca48..355147d 100644
--- a/icu4c/source/data/unit/dsb.txt
+++ b/icu4c/source/data/unit/dsb.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dsb{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/dua.txt b/icu4c/source/data/unit/dua.txt
index 9f33cd5..de51750 100644
--- a/icu4c/source/data/unit/dua.txt
+++ b/icu4c/source/data/unit/dua.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dua{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/dyo.txt b/icu4c/source/data/unit/dyo.txt
index a4a954e..ed65450 100644
--- a/icu4c/source/data/unit/dyo.txt
+++ b/icu4c/source/data/unit/dyo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dyo{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/dz.txt b/icu4c/source/data/unit/dz.txt
index fdcaf84..7c2f258 100644
--- a/icu4c/source/data/unit/dz.txt
+++ b/icu4c/source/data/unit/dz.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dz{
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/ebu.txt b/icu4c/source/data/unit/ebu.txt
index 2199f72..51158d6 100644
--- a/icu4c/source/data/unit/ebu.txt
+++ b/icu4c/source/data/unit/ebu.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ebu{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/ee.txt b/icu4c/source/data/unit/ee.txt
index f6a078f..b528ec5 100644
--- a/icu4c/source/data/unit/ee.txt
+++ b/icu4c/source/data/unit/ee.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ee{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/el.txt b/icu4c/source/data/unit/el.txt
index 3f906f5..e0c1702 100644
--- a/icu4c/source/data/unit/el.txt
+++ b/icu4c/source/data/unit/el.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 el{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/en.txt b/icu4c/source/data/unit/en.txt
index d2078a4..4db2a3d 100644
--- a/icu4c/source/data/unit/en.txt
+++ b/icu4c/source/data/unit/en.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en{
-    Version{"2.1.37.44"}
+    Version{"2.1.39.27"}
     units{
         acceleration{
             g-force{
diff --git a/icu4c/source/data/unit/en_001.txt b/icu4c/source/data/unit/en_001.txt
index decc26c..3dd11cb 100644
--- a/icu4c/source/data/unit/en_001.txt
+++ b/icu4c/source/data/unit/en_001.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_001{
-    Version{"2.1.35.71"}
+    Version{"2.1.38.69"}
     units{
         acceleration{
             meter-per-second-squared{
diff --git a/icu4c/source/data/unit/en_150.txt b/icu4c/source/data/unit/en_150.txt
index 564d55e..c7bcd83 100644
--- a/icu4c/source/data/unit/en_150.txt
+++ b/icu4c/source/data/unit/en_150.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_150{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_AG.txt b/icu4c/source/data/unit/en_AG.txt
index ed7f63d..dab34a4 100644
--- a/icu4c/source/data/unit/en_AG.txt
+++ b/icu4c/source/data/unit/en_AG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_AI.txt b/icu4c/source/data/unit/en_AI.txt
index a92294b..e77964d 100644
--- a/icu4c/source/data/unit/en_AI.txt
+++ b/icu4c/source/data/unit/en_AI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_AT.txt b/icu4c/source/data/unit/en_AT.txt
index 0bca0cd..c955b37 100644
--- a/icu4c/source/data/unit/en_AT.txt
+++ b/icu4c/source/data/unit/en_AT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AT{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_AU.txt b/icu4c/source/data/unit/en_AU.txt
index 5d2ab53..4156363 100644
--- a/icu4c/source/data/unit/en_AU.txt
+++ b/icu4c/source/data/unit/en_AU.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AU{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
     units{
         energy{
             kilowatt-hour{
@@ -12,6 +12,12 @@
             }
         }
         length{
+            centimeter{
+                other{"{0} centimetres"}
+            }
+            decimeter{
+                other{"{0} decimetres"}
+            }
             kilometer{
                 dnam{"kilometre"}
             }
@@ -245,6 +251,9 @@
                 one{"{0} CM"}
                 other{"{0} CM"}
             }
+            pound{
+                other{"{0} lb"}
+            }
         }
         pressure{
             millibar{
diff --git a/icu4c/source/data/unit/en_BB.txt b/icu4c/source/data/unit/en_BB.txt
index 2c2c05e..a3a8e74 100644
--- a/icu4c/source/data/unit/en_BB.txt
+++ b/icu4c/source/data/unit/en_BB.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BB{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_BE.txt b/icu4c/source/data/unit/en_BE.txt
index 6c7e5ab..c0eab02 100644
--- a/icu4c/source/data/unit/en_BE.txt
+++ b/icu4c/source/data/unit/en_BE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BE{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_BM.txt b/icu4c/source/data/unit/en_BM.txt
index a07478e..dfb1e87 100644
--- a/icu4c/source/data/unit/en_BM.txt
+++ b/icu4c/source/data/unit/en_BM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_BS.txt b/icu4c/source/data/unit/en_BS.txt
index d955b27..faf38e9 100644
--- a/icu4c/source/data/unit/en_BS.txt
+++ b/icu4c/source/data/unit/en_BS.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     unitsNarrow{
         temperature{
             celsius{
diff --git a/icu4c/source/data/unit/en_BW.txt b/icu4c/source/data/unit/en_BW.txt
index e9eeab0..63e350b 100644
--- a/icu4c/source/data/unit/en_BW.txt
+++ b/icu4c/source/data/unit/en_BW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_BZ.txt b/icu4c/source/data/unit/en_BZ.txt
index cb95d08..732be22 100644
--- a/icu4c/source/data/unit/en_BZ.txt
+++ b/icu4c/source/data/unit/en_BZ.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     unitsNarrow{
         temperature{
             celsius{
diff --git a/icu4c/source/data/unit/en_CA.txt b/icu4c/source/data/unit/en_CA.txt
index 518c6f4..d8365df 100644
--- a/icu4c/source/data/unit/en_CA.txt
+++ b/icu4c/source/data/unit/en_CA.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CA{
     %%Parent{"en_001"}
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     units{
         concentr{
             karat{
diff --git a/icu4c/source/data/unit/en_CC.txt b/icu4c/source/data/unit/en_CC.txt
index 67fe580..e8c2d33 100644
--- a/icu4c/source/data/unit/en_CC.txt
+++ b/icu4c/source/data/unit/en_CC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_CH.txt b/icu4c/source/data/unit/en_CH.txt
index 1bbe260..745eed0 100644
--- a/icu4c/source/data/unit/en_CH.txt
+++ b/icu4c/source/data/unit/en_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CH{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_CK.txt b/icu4c/source/data/unit/en_CK.txt
index 8f3b9a4..a6909b9 100644
--- a/icu4c/source/data/unit/en_CK.txt
+++ b/icu4c/source/data/unit/en_CK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_CM.txt b/icu4c/source/data/unit/en_CM.txt
index e3da63d..9cb94c0 100644
--- a/icu4c/source/data/unit/en_CM.txt
+++ b/icu4c/source/data/unit/en_CM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_CX.txt b/icu4c/source/data/unit/en_CX.txt
index 4e3c98e..7166f9d 100644
--- a/icu4c/source/data/unit/en_CX.txt
+++ b/icu4c/source/data/unit/en_CX.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CX{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_CY.txt b/icu4c/source/data/unit/en_CY.txt
index 4fa4a14..6e80705 100644
--- a/icu4c/source/data/unit/en_CY.txt
+++ b/icu4c/source/data/unit/en_CY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_DE.txt b/icu4c/source/data/unit/en_DE.txt
index fd11453..9631682 100644
--- a/icu4c/source/data/unit/en_DE.txt
+++ b/icu4c/source/data/unit/en_DE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DE{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_DG.txt b/icu4c/source/data/unit/en_DG.txt
index bd59dcb..a185284 100644
--- a/icu4c/source/data/unit/en_DG.txt
+++ b/icu4c/source/data/unit/en_DG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_DK.txt b/icu4c/source/data/unit/en_DK.txt
index 9f596cd..342c391 100644
--- a/icu4c/source/data/unit/en_DK.txt
+++ b/icu4c/source/data/unit/en_DK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DK{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_DM.txt b/icu4c/source/data/unit/en_DM.txt
index 067f54d..ead644c 100644
--- a/icu4c/source/data/unit/en_DM.txt
+++ b/icu4c/source/data/unit/en_DM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_ER.txt b/icu4c/source/data/unit/en_ER.txt
index dac4b71..9809fe6 100644
--- a/icu4c/source/data/unit/en_ER.txt
+++ b/icu4c/source/data/unit/en_ER.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ER{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_FI.txt b/icu4c/source/data/unit/en_FI.txt
index 0940644..8626b24 100644
--- a/icu4c/source/data/unit/en_FI.txt
+++ b/icu4c/source/data/unit/en_FI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FI{
     %%Parent{"en_150"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_FJ.txt b/icu4c/source/data/unit/en_FJ.txt
index 17022d5..32898fb 100644
--- a/icu4c/source/data/unit/en_FJ.txt
+++ b/icu4c/source/data/unit/en_FJ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FJ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_FK.txt b/icu4c/source/data/unit/en_FK.txt
index edbb4d8..7551e65 100644
--- a/icu4c/source/data/unit/en_FK.txt
+++ b/icu4c/source/data/unit/en_FK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_FM.txt b/icu4c/source/data/unit/en_FM.txt
index 9b1d31f..e4a293d 100644
--- a/icu4c/source/data/unit/en_FM.txt
+++ b/icu4c/source/data/unit/en_FM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_GB.txt b/icu4c/source/data/unit/en_GB.txt
index 85224fb..aa620d0 100644
--- a/icu4c/source/data/unit/en_GB.txt
+++ b/icu4c/source/data/unit/en_GB.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GB{
     %%Parent{"en_001"}
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     units{
         speed{
             kilometer-per-hour{
diff --git a/icu4c/source/data/unit/en_GD.txt b/icu4c/source/data/unit/en_GD.txt
index a006727..9ad43f3 100644
--- a/icu4c/source/data/unit/en_GD.txt
+++ b/icu4c/source/data/unit/en_GD.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_GG.txt b/icu4c/source/data/unit/en_GG.txt
index b91b6b8..6e3d4df 100644
--- a/icu4c/source/data/unit/en_GG.txt
+++ b/icu4c/source/data/unit/en_GG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_GH.txt b/icu4c/source/data/unit/en_GH.txt
index 50a4429..d244565 100644
--- a/icu4c/source/data/unit/en_GH.txt
+++ b/icu4c/source/data/unit/en_GH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_GI.txt b/icu4c/source/data/unit/en_GI.txt
index e19c4d8..fc5f7d7 100644
--- a/icu4c/source/data/unit/en_GI.txt
+++ b/icu4c/source/data/unit/en_GI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_GM.txt b/icu4c/source/data/unit/en_GM.txt
index 9448c85..807df46 100644
--- a/icu4c/source/data/unit/en_GM.txt
+++ b/icu4c/source/data/unit/en_GM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_GY.txt b/icu4c/source/data/unit/en_GY.txt
index 7c5333b..4971e6d 100644
--- a/icu4c/source/data/unit/en_GY.txt
+++ b/icu4c/source/data/unit/en_GY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_HK.txt b/icu4c/source/data/unit/en_HK.txt
index d43b56c..78bb499 100644
--- a/icu4c/source/data/unit/en_HK.txt
+++ b/icu4c/source/data/unit/en_HK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_HK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_IE.txt b/icu4c/source/data/unit/en_IE.txt
index 94ab93c..7cb27d7 100644
--- a/icu4c/source/data/unit/en_IE.txt
+++ b/icu4c/source/data/unit/en_IE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_IL.txt b/icu4c/source/data/unit/en_IL.txt
index 55a5091..df09f53d 100644
--- a/icu4c/source/data/unit/en_IL.txt
+++ b/icu4c/source/data/unit/en_IL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_IM.txt b/icu4c/source/data/unit/en_IM.txt
index 3ccab11..2af0241 100644
--- a/icu4c/source/data/unit/en_IM.txt
+++ b/icu4c/source/data/unit/en_IM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_IN.txt b/icu4c/source/data/unit/en_IN.txt
index a2978db..428b860 100644
--- a/icu4c/source/data/unit/en_IN.txt
+++ b/icu4c/source/data/unit/en_IN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IN{
     %%Parent{"en_001"}
-    Version{"2.1.37.11"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/unit/en_IO.txt b/icu4c/source/data/unit/en_IO.txt
index 3f89192..d87cdff 100644
--- a/icu4c/source/data/unit/en_IO.txt
+++ b/icu4c/source/data/unit/en_IO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_JE.txt b/icu4c/source/data/unit/en_JE.txt
index 66de22d..2d50f0a 100644
--- a/icu4c/source/data/unit/en_JE.txt
+++ b/icu4c/source/data/unit/en_JE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_JE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_JM.txt b/icu4c/source/data/unit/en_JM.txt
index ad3c905..c7e0fef 100644
--- a/icu4c/source/data/unit/en_JM.txt
+++ b/icu4c/source/data/unit/en_JM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_JM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_KE.txt b/icu4c/source/data/unit/en_KE.txt
index 0af301a..4e7344a 100644
--- a/icu4c/source/data/unit/en_KE.txt
+++ b/icu4c/source/data/unit/en_KE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_KI.txt b/icu4c/source/data/unit/en_KI.txt
index f671853..74349d3 100644
--- a/icu4c/source/data/unit/en_KI.txt
+++ b/icu4c/source/data/unit/en_KI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_KN.txt b/icu4c/source/data/unit/en_KN.txt
index 573c389..3accb4c 100644
--- a/icu4c/source/data/unit/en_KN.txt
+++ b/icu4c/source/data/unit/en_KN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KN{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_KY.txt b/icu4c/source/data/unit/en_KY.txt
index 62222e6..9f81ebd 100644
--- a/icu4c/source/data/unit/en_KY.txt
+++ b/icu4c/source/data/unit/en_KY.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     unitsNarrow{
         temperature{
             celsius{
diff --git a/icu4c/source/data/unit/en_LC.txt b/icu4c/source/data/unit/en_LC.txt
index 7033a6a..9c2e8c4 100644
--- a/icu4c/source/data/unit/en_LC.txt
+++ b/icu4c/source/data/unit/en_LC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_LR.txt b/icu4c/source/data/unit/en_LR.txt
index 8d60973..3b6da71 100644
--- a/icu4c/source/data/unit/en_LR.txt
+++ b/icu4c/source/data/unit/en_LR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LR{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_LS.txt b/icu4c/source/data/unit/en_LS.txt
index 61d557f..644ca26 100644
--- a/icu4c/source/data/unit/en_LS.txt
+++ b/icu4c/source/data/unit/en_LS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_MG.txt b/icu4c/source/data/unit/en_MG.txt
index f5b2bfd..500786d 100644
--- a/icu4c/source/data/unit/en_MG.txt
+++ b/icu4c/source/data/unit/en_MG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_MO.txt b/icu4c/source/data/unit/en_MO.txt
index 7c06497..5b0cc9a 100644
--- a/icu4c/source/data/unit/en_MO.txt
+++ b/icu4c/source/data/unit/en_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_MS.txt b/icu4c/source/data/unit/en_MS.txt
index 28ef10d..31e4995 100644
--- a/icu4c/source/data/unit/en_MS.txt
+++ b/icu4c/source/data/unit/en_MS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_MT.txt b/icu4c/source/data/unit/en_MT.txt
index 0d4bc8b..5ae61e8 100644
--- a/icu4c/source/data/unit/en_MT.txt
+++ b/icu4c/source/data/unit/en_MT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MT{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_MU.txt b/icu4c/source/data/unit/en_MU.txt
index f36ff7e..70f4a69 100644
--- a/icu4c/source/data/unit/en_MU.txt
+++ b/icu4c/source/data/unit/en_MU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_MW.txt b/icu4c/source/data/unit/en_MW.txt
index 8f5bed0..f0fe526 100644
--- a/icu4c/source/data/unit/en_MW.txt
+++ b/icu4c/source/data/unit/en_MW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_MY.txt b/icu4c/source/data/unit/en_MY.txt
index fc723c2..4fa38e5 100644
--- a/icu4c/source/data/unit/en_MY.txt
+++ b/icu4c/source/data/unit/en_MY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_NA.txt b/icu4c/source/data/unit/en_NA.txt
index 17f6b27..a07f557 100644
--- a/icu4c/source/data/unit/en_NA.txt
+++ b/icu4c/source/data/unit/en_NA.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NA{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_NF.txt b/icu4c/source/data/unit/en_NF.txt
index 56b1a98..b1e3b07 100644
--- a/icu4c/source/data/unit/en_NF.txt
+++ b/icu4c/source/data/unit/en_NF.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NF{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_NG.txt b/icu4c/source/data/unit/en_NG.txt
index 8102534..b302284 100644
--- a/icu4c/source/data/unit/en_NG.txt
+++ b/icu4c/source/data/unit/en_NG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_NL.txt b/icu4c/source/data/unit/en_NL.txt
index 4566eb3..d27f8a3 100644
--- a/icu4c/source/data/unit/en_NL.txt
+++ b/icu4c/source/data/unit/en_NL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NL{
     %%Parent{"en_150"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_NR.txt b/icu4c/source/data/unit/en_NR.txt
index a66b87f..7e1b070 100644
--- a/icu4c/source/data/unit/en_NR.txt
+++ b/icu4c/source/data/unit/en_NR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NR{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_NU.txt b/icu4c/source/data/unit/en_NU.txt
index 86aa256..d79dc18 100644
--- a/icu4c/source/data/unit/en_NU.txt
+++ b/icu4c/source/data/unit/en_NU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_NZ.txt b/icu4c/source/data/unit/en_NZ.txt
index 55787c8..e077345 100644
--- a/icu4c/source/data/unit/en_NZ.txt
+++ b/icu4c/source/data/unit/en_NZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NZ{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
 }
diff --git a/icu4c/source/data/unit/en_PG.txt b/icu4c/source/data/unit/en_PG.txt
index 6146600..b0aa15c 100644
--- a/icu4c/source/data/unit/en_PG.txt
+++ b/icu4c/source/data/unit/en_PG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_PH.txt b/icu4c/source/data/unit/en_PH.txt
index 04ac66a..94d6d4c 100644
--- a/icu4c/source/data/unit/en_PH.txt
+++ b/icu4c/source/data/unit/en_PH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_PK.txt b/icu4c/source/data/unit/en_PK.txt
index 3d5d2f6..ae335ca 100644
--- a/icu4c/source/data/unit/en_PK.txt
+++ b/icu4c/source/data/unit/en_PK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_PN.txt b/icu4c/source/data/unit/en_PN.txt
index 8b83a8d..907c98b 100644
--- a/icu4c/source/data/unit/en_PN.txt
+++ b/icu4c/source/data/unit/en_PN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PN{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_PW.txt b/icu4c/source/data/unit/en_PW.txt
index fbe3566..176dd77 100644
--- a/icu4c/source/data/unit/en_PW.txt
+++ b/icu4c/source/data/unit/en_PW.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     unitsNarrow{
         temperature{
             celsius{
diff --git a/icu4c/source/data/unit/en_RW.txt b/icu4c/source/data/unit/en_RW.txt
index 1323a28..b5bd04c 100644
--- a/icu4c/source/data/unit/en_RW.txt
+++ b/icu4c/source/data/unit/en_RW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_RW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SB.txt b/icu4c/source/data/unit/en_SB.txt
index 08287c0..135fc64 100644
--- a/icu4c/source/data/unit/en_SB.txt
+++ b/icu4c/source/data/unit/en_SB.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SB{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SC.txt b/icu4c/source/data/unit/en_SC.txt
index 9c80308..9026bef 100644
--- a/icu4c/source/data/unit/en_SC.txt
+++ b/icu4c/source/data/unit/en_SC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SD.txt b/icu4c/source/data/unit/en_SD.txt
index 8fef005..e3323d7 100644
--- a/icu4c/source/data/unit/en_SD.txt
+++ b/icu4c/source/data/unit/en_SD.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SE.txt b/icu4c/source/data/unit/en_SE.txt
index 35978fe..fa6772c 100644
--- a/icu4c/source/data/unit/en_SE.txt
+++ b/icu4c/source/data/unit/en_SE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SE{
     %%Parent{"en_150"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SG.txt b/icu4c/source/data/unit/en_SG.txt
index 904e860..c0e7458 100644
--- a/icu4c/source/data/unit/en_SG.txt
+++ b/icu4c/source/data/unit/en_SG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SH.txt b/icu4c/source/data/unit/en_SH.txt
index dbaac39..46006e9 100644
--- a/icu4c/source/data/unit/en_SH.txt
+++ b/icu4c/source/data/unit/en_SH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SI.txt b/icu4c/source/data/unit/en_SI.txt
index c6837fe..8dc7c6a 100644
--- a/icu4c/source/data/unit/en_SI.txt
+++ b/icu4c/source/data/unit/en_SI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SI{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SL.txt b/icu4c/source/data/unit/en_SL.txt
index f3ff3f7..627e073 100644
--- a/icu4c/source/data/unit/en_SL.txt
+++ b/icu4c/source/data/unit/en_SL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SS.txt b/icu4c/source/data/unit/en_SS.txt
index 1b9c52e..fac8b78 100644
--- a/icu4c/source/data/unit/en_SS.txt
+++ b/icu4c/source/data/unit/en_SS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SX.txt b/icu4c/source/data/unit/en_SX.txt
index c619269..e6eb9bb 100644
--- a/icu4c/source/data/unit/en_SX.txt
+++ b/icu4c/source/data/unit/en_SX.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SX{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_SZ.txt b/icu4c/source/data/unit/en_SZ.txt
index 734e744..650774b 100644
--- a/icu4c/source/data/unit/en_SZ.txt
+++ b/icu4c/source/data/unit/en_SZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_TC.txt b/icu4c/source/data/unit/en_TC.txt
index 31b22e7..6d30689 100644
--- a/icu4c/source/data/unit/en_TC.txt
+++ b/icu4c/source/data/unit/en_TC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_TK.txt b/icu4c/source/data/unit/en_TK.txt
index 380b9d9..a102a8c 100644
--- a/icu4c/source/data/unit/en_TK.txt
+++ b/icu4c/source/data/unit/en_TK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_TO.txt b/icu4c/source/data/unit/en_TO.txt
index 426b5d6..3f82fa0 100644
--- a/icu4c/source/data/unit/en_TO.txt
+++ b/icu4c/source/data/unit/en_TO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_TT.txt b/icu4c/source/data/unit/en_TT.txt
index 4d6d39d..284f5f7 100644
--- a/icu4c/source/data/unit/en_TT.txt
+++ b/icu4c/source/data/unit/en_TT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TT{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_TV.txt b/icu4c/source/data/unit/en_TV.txt
index debe076..7ad38cb 100644
--- a/icu4c/source/data/unit/en_TV.txt
+++ b/icu4c/source/data/unit/en_TV.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TV{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_TZ.txt b/icu4c/source/data/unit/en_TZ.txt
index 25e40bf..ed8f720 100644
--- a/icu4c/source/data/unit/en_TZ.txt
+++ b/icu4c/source/data/unit/en_TZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_UG.txt b/icu4c/source/data/unit/en_UG.txt
index d28e107..6d41671 100644
--- a/icu4c/source/data/unit/en_UG.txt
+++ b/icu4c/source/data/unit/en_UG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_UG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_VC.txt b/icu4c/source/data/unit/en_VC.txt
index dc17ae0..7f5fda9 100644
--- a/icu4c/source/data/unit/en_VC.txt
+++ b/icu4c/source/data/unit/en_VC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_VG.txt b/icu4c/source/data/unit/en_VG.txt
index 995ae52..0e708c0 100644
--- a/icu4c/source/data/unit/en_VG.txt
+++ b/icu4c/source/data/unit/en_VG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_VU.txt b/icu4c/source/data/unit/en_VU.txt
index 433c4c9..5fe2f2a 100644
--- a/icu4c/source/data/unit/en_VU.txt
+++ b/icu4c/source/data/unit/en_VU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_WS.txt b/icu4c/source/data/unit/en_WS.txt
index 0697889..00ce51e 100644
--- a/icu4c/source/data/unit/en_WS.txt
+++ b/icu4c/source/data/unit/en_WS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_WS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_ZA.txt b/icu4c/source/data/unit/en_ZA.txt
index 844f02c..41c2c2e 100644
--- a/icu4c/source/data/unit/en_ZA.txt
+++ b/icu4c/source/data/unit/en_ZA.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZA{
     %%Parent{"en_001"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_ZM.txt b/icu4c/source/data/unit/en_ZM.txt
index 3e9be74..b330b46 100644
--- a/icu4c/source/data/unit/en_ZM.txt
+++ b/icu4c/source/data/unit/en_ZM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/en_ZW.txt b/icu4c/source/data/unit/en_ZW.txt
index 5fb189a..f20fa35 100644
--- a/icu4c/source/data/unit/en_ZW.txt
+++ b/icu4c/source/data/unit/en_ZW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/eo.txt b/icu4c/source/data/unit/eo.txt
index 2e50d08..9b9a57a 100644
--- a/icu4c/source/data/unit/eo.txt
+++ b/icu4c/source/data/unit/eo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 eo{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     unitsShort{
         duration{
             month{
diff --git a/icu4c/source/data/unit/es.txt b/icu4c/source/data/unit/es.txt
index 1e69768..6137062 100644
--- a/icu4c/source/data/unit/es.txt
+++ b/icu4c/source/data/unit/es.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/es_419.txt b/icu4c/source/data/unit/es_419.txt
index fa2e0a6..760d35b 100644
--- a/icu4c/source/data/unit/es_419.txt
+++ b/icu4c/source/data/unit/es_419.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_419{
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
     units{
         angle{
             revolution{
diff --git a/icu4c/source/data/unit/es_AR.txt b/icu4c/source/data/unit/es_AR.txt
index c1074b2..0498501 100644
--- a/icu4c/source/data/unit/es_AR.txt
+++ b/icu4c/source/data/unit/es_AR.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_AR{
     %%Parent{"es_419"}
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
     units{
         duration{
             year{
diff --git a/icu4c/source/data/unit/es_BO.txt b/icu4c/source/data/unit/es_BO.txt
index c2c9891..c4c9902 100644
--- a/icu4c/source/data/unit/es_BO.txt
+++ b/icu4c/source/data/unit/es_BO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BO{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_BR.txt b/icu4c/source/data/unit/es_BR.txt
index ee8a444..1115ce9 100644
--- a/icu4c/source/data/unit/es_BR.txt
+++ b/icu4c/source/data/unit/es_BR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BR{
     %%Parent{"es_419"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_BZ.txt b/icu4c/source/data/unit/es_BZ.txt
index 7734598..3d2302c 100644
--- a/icu4c/source/data/unit/es_BZ.txt
+++ b/icu4c/source/data/unit/es_BZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BZ{
     %%Parent{"es_419"}
-    Version{"2.1.32.37"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_CL.txt b/icu4c/source/data/unit/es_CL.txt
index c4f1c46..509dff2 100644
--- a/icu4c/source/data/unit/es_CL.txt
+++ b/icu4c/source/data/unit/es_CL.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CL{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     durationUnits{
         hms{"hh:mm:ss"}
         ms{"mm:ss"}
diff --git a/icu4c/source/data/unit/es_CO.txt b/icu4c/source/data/unit/es_CO.txt
index b6ff0c4..8d99329 100644
--- a/icu4c/source/data/unit/es_CO.txt
+++ b/icu4c/source/data/unit/es_CO.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CO{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     units{
         duration{
             month{
diff --git a/icu4c/source/data/unit/es_CR.txt b/icu4c/source/data/unit/es_CR.txt
index 1c76e28..7cfafd6 100644
--- a/icu4c/source/data/unit/es_CR.txt
+++ b/icu4c/source/data/unit/es_CR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CR{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_CU.txt b/icu4c/source/data/unit/es_CU.txt
index f75d29f..3fb6de1 100644
--- a/icu4c/source/data/unit/es_CU.txt
+++ b/icu4c/source/data/unit/es_CU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CU{
     %%Parent{"es_419"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_DO.txt b/icu4c/source/data/unit/es_DO.txt
index f39b237..032455c 100644
--- a/icu4c/source/data/unit/es_DO.txt
+++ b/icu4c/source/data/unit/es_DO.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_DO{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     units{
         electric{
             ampere{
diff --git a/icu4c/source/data/unit/es_EC.txt b/icu4c/source/data/unit/es_EC.txt
index 3ba889d..5aaa937 100644
--- a/icu4c/source/data/unit/es_EC.txt
+++ b/icu4c/source/data/unit/es_EC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_EC{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_GT.txt b/icu4c/source/data/unit/es_GT.txt
index 9b37fa0..7ebc1c0 100644
--- a/icu4c/source/data/unit/es_GT.txt
+++ b/icu4c/source/data/unit/es_GT.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_GT{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/es_HN.txt b/icu4c/source/data/unit/es_HN.txt
index 0f5bdd9..fbd1b89 100644
--- a/icu4c/source/data/unit/es_HN.txt
+++ b/icu4c/source/data/unit/es_HN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_HN{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_MX.txt b/icu4c/source/data/unit/es_MX.txt
index 4dbfaa9..a421f47 100644
--- a/icu4c/source/data/unit/es_MX.txt
+++ b/icu4c/source/data/unit/es_MX.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_MX{
     %%Parent{"es_419"}
-    Version{"2.1.37.32"}
+    Version{"2.1.38.73"}
     units{
         angle{
             arc-minute{
@@ -102,12 +102,6 @@
                 dnam{"lux"}
             }
         }
-        mass{
-            microgram{
-                one{"{0} microgramo"}
-                other{"{0} microgramos"}
-            }
-        }
         power{
             gigawatt{
                 dnam{"gigavatios"}
@@ -306,12 +300,6 @@
                 dnam{"km/hora"}
             }
         }
-        temperature{
-            celsius{
-                one{"{0} °C"}
-                other{"{0} °C"}
-            }
-        }
         volume{
             cup{
                 dnam{"tza."}
diff --git a/icu4c/source/data/unit/es_NI.txt b/icu4c/source/data/unit/es_NI.txt
index 13bc101..ccbc5d7 100644
--- a/icu4c/source/data/unit/es_NI.txt
+++ b/icu4c/source/data/unit/es_NI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_NI{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_PA.txt b/icu4c/source/data/unit/es_PA.txt
index 670b666..a1761c0 100644
--- a/icu4c/source/data/unit/es_PA.txt
+++ b/icu4c/source/data/unit/es_PA.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PA{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_PE.txt b/icu4c/source/data/unit/es_PE.txt
index 4e9203c..5a2adc9 100644
--- a/icu4c/source/data/unit/es_PE.txt
+++ b/icu4c/source/data/unit/es_PE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PE{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_PR.txt b/icu4c/source/data/unit/es_PR.txt
index ac57a29..a329327 100644
--- a/icu4c/source/data/unit/es_PR.txt
+++ b/icu4c/source/data/unit/es_PR.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PR{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     unitsNarrow{
         temperature{
             fahrenheit{
diff --git a/icu4c/source/data/unit/es_PY.txt b/icu4c/source/data/unit/es_PY.txt
index cc9f149..c8fb2c0 100644
--- a/icu4c/source/data/unit/es_PY.txt
+++ b/icu4c/source/data/unit/es_PY.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PY{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     units{
         duration{
             year{
diff --git a/icu4c/source/data/unit/es_SV.txt b/icu4c/source/data/unit/es_SV.txt
index f3ed768..ba50c55 100644
--- a/icu4c/source/data/unit/es_SV.txt
+++ b/icu4c/source/data/unit/es_SV.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_SV{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_US.txt b/icu4c/source/data/unit/es_US.txt
index 9cbd2df..51926b6 100644
--- a/icu4c/source/data/unit/es_US.txt
+++ b/icu4c/source/data/unit/es_US.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_US{
     %%Parent{"es_419"}
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     units{
         angle{
             revolution{
@@ -72,12 +72,6 @@
                 other{"{0} pt"}
             }
         }
-        mass{
-            microgram{
-                one{"{0} microgramo"}
-                other{"{0} microgramos"}
-            }
-        }
         power{
             gigawatt{
                 dnam{"gigavatios"}
@@ -199,17 +193,7 @@
                 other{"{0} CV"}
             }
         }
-        temperature{
-            celsius{
-                one{"{0} °C"}
-                other{"{0} °C"}
-            }
-        }
         volume{
-            cup{
-                one{"{0} tza."}
-                other{"{0} tza."}
-            }
             gallon-imperial{
                 dnam{"Imp. gal"}
                 one{"{0} gal Imp."}
diff --git a/icu4c/source/data/unit/es_UY.txt b/icu4c/source/data/unit/es_UY.txt
index cde08bb..8898960 100644
--- a/icu4c/source/data/unit/es_UY.txt
+++ b/icu4c/source/data/unit/es_UY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_UY{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/es_VE.txt b/icu4c/source/data/unit/es_VE.txt
index 49d5a3f..b15c110 100644
--- a/icu4c/source/data/unit/es_VE.txt
+++ b/icu4c/source/data/unit/es_VE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_VE{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/et.txt b/icu4c/source/data/unit/et.txt
index 41036fd..fa1daee 100644
--- a/icu4c/source/data/unit/et.txt
+++ b/icu4c/source/data/unit/et.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 et{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/eu.txt b/icu4c/source/data/unit/eu.txt
index d4b757f..5882d91 100644
--- a/icu4c/source/data/unit/eu.txt
+++ b/icu4c/source/data/unit/eu.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 eu{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ewo.txt b/icu4c/source/data/unit/ewo.txt
index 526c3e0..32e11ea 100644
--- a/icu4c/source/data/unit/ewo.txt
+++ b/icu4c/source/data/unit/ewo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ewo{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/fa.txt b/icu4c/source/data/unit/fa.txt
index 03242f2..836aea0 100644
--- a/icu4c/source/data/unit/fa.txt
+++ b/icu4c/source/data/unit/fa.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fa{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ff.txt b/icu4c/source/data/unit/ff.txt
index 83c4535..71a6b94 100644
--- a/icu4c/source/data/unit/ff.txt
+++ b/icu4c/source/data/unit/ff.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ff{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/fi.txt b/icu4c/source/data/unit/fi.txt
index 12dec08..188d20d 100644
--- a/icu4c/source/data/unit/fi.txt
+++ b/icu4c/source/data/unit/fi.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fi{
-    Version{"2.1.37.67"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h.mm"}
         hms{"h.mm.ss"}
diff --git a/icu4c/source/data/unit/fil.txt b/icu4c/source/data/unit/fil.txt
index 3abb1bc..5141bb1 100644
--- a/icu4c/source/data/unit/fil.txt
+++ b/icu4c/source/data/unit/fil.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fil{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/fo.txt b/icu4c/source/data/unit/fo.txt
index b6b4c47..9a2c02b 100644
--- a/icu4c/source/data/unit/fo.txt
+++ b/icu4c/source/data/unit/fo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fo{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/fr.txt b/icu4c/source/data/unit/fr.txt
index b3c2f03..b1ba238 100644
--- a/icu4c/source/data/unit/fr.txt
+++ b/icu4c/source/data/unit/fr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/fr_CA.txt b/icu4c/source/data/unit/fr_CA.txt
index 3a4633d..ede368d 100644
--- a/icu4c/source/data/unit/fr_CA.txt
+++ b/icu4c/source/data/unit/fr_CA.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_CA{
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     units{
         acceleration{
             g-force{
@@ -74,10 +74,6 @@
             kilogram{
                 per{"{0} par kilogramme"}
             }
-            microgram{
-                one{"{0} microgramme"}
-                other{"{0} microgrammes"}
-            }
             stone{
                 other{"{0} stone"}
             }
@@ -211,10 +207,6 @@
             }
         }
         mass{
-            kilogram{
-                one{"{0}kg"}
-                other{"{0}kg"}
-            }
             metric-ton{
                 one{"{0}t"}
                 other{"{0}t"}
@@ -354,12 +346,6 @@
                 other{"{0} psi"}
             }
         }
-        temperature{
-            generic{
-                one{"{0}°"}
-                other{"{0}°"}
-            }
-        }
         volume{
             centiliter{
                 dnam{"cL"}
diff --git a/icu4c/source/data/unit/fr_HT.txt b/icu4c/source/data/unit/fr_HT.txt
index 4566647..49450da 100644
--- a/icu4c/source/data/unit/fr_HT.txt
+++ b/icu4c/source/data/unit/fr_HT.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_HT{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     units{
         area{
             hectare{
diff --git a/icu4c/source/data/unit/fur.txt b/icu4c/source/data/unit/fur.txt
index 6469460..7bff513 100644
--- a/icu4c/source/data/unit/fur.txt
+++ b/icu4c/source/data/unit/fur.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fur{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/fy.txt b/icu4c/source/data/unit/fy.txt
index 18f8911..1bcab07 100644
--- a/icu4c/source/data/unit/fy.txt
+++ b/icu4c/source/data/unit/fy.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fy{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ga.txt b/icu4c/source/data/unit/ga.txt
index daa6d52..37990be 100644
--- a/icu4c/source/data/unit/ga.txt
+++ b/icu4c/source/data/unit/ga.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ga{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/gd.txt b/icu4c/source/data/unit/gd.txt
index bd788a8..323e4d8 100644
--- a/icu4c/source/data/unit/gd.txt
+++ b/icu4c/source/data/unit/gd.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gd{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/gl.txt b/icu4c/source/data/unit/gl.txt
index dc59233..c9890e9 100644
--- a/icu4c/source/data/unit/gl.txt
+++ b/icu4c/source/data/unit/gl.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gl{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/gsw.txt b/icu4c/source/data/unit/gsw.txt
index e84930d..c357e13 100644
--- a/icu4c/source/data/unit/gsw.txt
+++ b/icu4c/source/data/unit/gsw.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gsw{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/gu.txt b/icu4c/source/data/unit/gu.txt
index 16f2c45..3c0acb6 100644
--- a/icu4c/source/data/unit/gu.txt
+++ b/icu4c/source/data/unit/gu.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gu{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/guz.txt b/icu4c/source/data/unit/guz.txt
index f7ea241..cb3724f 100644
--- a/icu4c/source/data/unit/guz.txt
+++ b/icu4c/source/data/unit/guz.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 guz{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/gv.txt b/icu4c/source/data/unit/gv.txt
index bad1078..4529a09 100644
--- a/icu4c/source/data/unit/gv.txt
+++ b/icu4c/source/data/unit/gv.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gv{
-    Version{"2.1.34.91"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/ha.txt b/icu4c/source/data/unit/ha.txt
index fe89ec3..2b69749 100644
--- a/icu4c/source/data/unit/ha.txt
+++ b/icu4c/source/data/unit/ha.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ha{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/haw.txt b/icu4c/source/data/unit/haw.txt
index 0969140..3570403 100644
--- a/icu4c/source/data/unit/haw.txt
+++ b/icu4c/source/data/unit/haw.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 haw{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/he.txt b/icu4c/source/data/unit/he.txt
index 5f50ec5..0196e74 100644
--- a/icu4c/source/data/unit/he.txt
+++ b/icu4c/source/data/unit/he.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 he{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/hi.txt b/icu4c/source/data/unit/hi.txt
index 813a8ac..1a7a8d4 100644
--- a/icu4c/source/data/unit/hi.txt
+++ b/icu4c/source/data/unit/hi.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hi{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/hr.txt b/icu4c/source/data/unit/hr.txt
index ca556ee..0fb539d 100644
--- a/icu4c/source/data/unit/hr.txt
+++ b/icu4c/source/data/unit/hr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hr{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/hsb.txt b/icu4c/source/data/unit/hsb.txt
index b9c0403..5fc2fe5 100644
--- a/icu4c/source/data/unit/hsb.txt
+++ b/icu4c/source/data/unit/hsb.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hsb{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/hu.txt b/icu4c/source/data/unit/hu.txt
index efea7d6..95f967f 100644
--- a/icu4c/source/data/unit/hu.txt
+++ b/icu4c/source/data/unit/hu.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hu{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/hy.txt b/icu4c/source/data/unit/hy.txt
index 8143127..9e18c94 100644
--- a/icu4c/source/data/unit/hy.txt
+++ b/icu4c/source/data/unit/hy.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hy{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/id.txt b/icu4c/source/data/unit/id.txt
index e151aa6..89247c1 100644
--- a/icu4c/source/data/unit/id.txt
+++ b/icu4c/source/data/unit/id.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 id{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h.mm"}
         hms{"h.mm.ss"}
diff --git a/icu4c/source/data/unit/ig.txt b/icu4c/source/data/unit/ig.txt
index 7e7e278..c1d9580 100644
--- a/icu4c/source/data/unit/ig.txt
+++ b/icu4c/source/data/unit/ig.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ig{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/ii.txt b/icu4c/source/data/unit/ii.txt
index a4a9813..5299ff5 100644
--- a/icu4c/source/data/unit/ii.txt
+++ b/icu4c/source/data/unit/ii.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ii{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/is.txt b/icu4c/source/data/unit/is.txt
index cbf6cfa..d012f50 100644
--- a/icu4c/source/data/unit/is.txt
+++ b/icu4c/source/data/unit/is.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 is{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/it.txt b/icu4c/source/data/unit/it.txt
index 74a8625..8225619 100644
--- a/icu4c/source/data/unit/it.txt
+++ b/icu4c/source/data/unit/it.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 it{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.40"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
@@ -826,7 +826,7 @@
             }
             month{
                 dnam{"mese"}
-                one{"{0}mesi"}
+                one{"{0}mese"}
                 other{"{0}mesi"}
             }
             second{
diff --git a/icu4c/source/data/unit/ja.txt b/icu4c/source/data/unit/ja.txt
index f152554..ff646ab 100644
--- a/icu4c/source/data/unit/ja.txt
+++ b/icu4c/source/data/unit/ja.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ja{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/jgo.txt b/icu4c/source/data/unit/jgo.txt
index eeed589..befd746 100644
--- a/icu4c/source/data/unit/jgo.txt
+++ b/icu4c/source/data/unit/jgo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 jgo{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/jmc.txt b/icu4c/source/data/unit/jmc.txt
index 88799a3..8b0c276 100644
--- a/icu4c/source/data/unit/jmc.txt
+++ b/icu4c/source/data/unit/jmc.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 jmc{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/ka.txt b/icu4c/source/data/unit/ka.txt
index 15c33bd..c700a00 100644
--- a/icu4c/source/data/unit/ka.txt
+++ b/icu4c/source/data/unit/ka.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ka{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/kab.txt b/icu4c/source/data/unit/kab.txt
index a7aaa0a..77d47a0 100644
--- a/icu4c/source/data/unit/kab.txt
+++ b/icu4c/source/data/unit/kab.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kab{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/kam.txt b/icu4c/source/data/unit/kam.txt
index be7e8d4..fa91ffc 100644
--- a/icu4c/source/data/unit/kam.txt
+++ b/icu4c/source/data/unit/kam.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kam{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/kde.txt b/icu4c/source/data/unit/kde.txt
index 08d1148..dfe5f27 100644
--- a/icu4c/source/data/unit/kde.txt
+++ b/icu4c/source/data/unit/kde.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kde{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/kea.txt b/icu4c/source/data/unit/kea.txt
index 6818db9..1e2e40e 100644
--- a/icu4c/source/data/unit/kea.txt
+++ b/icu4c/source/data/unit/kea.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kea{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/khq.txt b/icu4c/source/data/unit/khq.txt
index dc5b89c..3207438 100644
--- a/icu4c/source/data/unit/khq.txt
+++ b/icu4c/source/data/unit/khq.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 khq{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/ki.txt b/icu4c/source/data/unit/ki.txt
index b65f033..bb9774c 100644
--- a/icu4c/source/data/unit/ki.txt
+++ b/icu4c/source/data/unit/ki.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ki{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/kk.txt b/icu4c/source/data/unit/kk.txt
index 550608f..5728131 100644
--- a/icu4c/source/data/unit/kk.txt
+++ b/icu4c/source/data/unit/kk.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kk{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/kkj.txt b/icu4c/source/data/unit/kkj.txt
index 0766dcc..227e28b 100644
--- a/icu4c/source/data/unit/kkj.txt
+++ b/icu4c/source/data/unit/kkj.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kkj{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/kl.txt b/icu4c/source/data/unit/kl.txt
index f61cab6..141f8fd 100644
--- a/icu4c/source/data/unit/kl.txt
+++ b/icu4c/source/data/unit/kl.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kl{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/kln.txt b/icu4c/source/data/unit/kln.txt
index 7e71ab4..51163fa 100644
--- a/icu4c/source/data/unit/kln.txt
+++ b/icu4c/source/data/unit/kln.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kln{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/km.txt b/icu4c/source/data/unit/km.txt
index 01628c0..3e99676 100644
--- a/icu4c/source/data/unit/km.txt
+++ b/icu4c/source/data/unit/km.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 km{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/kn.txt b/icu4c/source/data/unit/kn.txt
index 0d972b9..2372128 100644
--- a/icu4c/source/data/unit/kn.txt
+++ b/icu4c/source/data/unit/kn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kn{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ko.txt b/icu4c/source/data/unit/ko.txt
index 6330830..1957bb9 100644
--- a/icu4c/source/data/unit/ko.txt
+++ b/icu4c/source/data/unit/ko.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ko{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/kok.txt b/icu4c/source/data/unit/kok.txt
index 3bb4c20..d0e8a69 100644
--- a/icu4c/source/data/unit/kok.txt
+++ b/icu4c/source/data/unit/kok.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kok{
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ks.txt b/icu4c/source/data/unit/ks.txt
index 2112dea..6d18325 100644
--- a/icu4c/source/data/unit/ks.txt
+++ b/icu4c/source/data/unit/ks.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ks{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/ksb.txt b/icu4c/source/data/unit/ksb.txt
index 0f244f8..6b5b72b 100644
--- a/icu4c/source/data/unit/ksb.txt
+++ b/icu4c/source/data/unit/ksb.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ksb{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/ksf.txt b/icu4c/source/data/unit/ksf.txt
index 8768530..e90eb30 100644
--- a/icu4c/source/data/unit/ksf.txt
+++ b/icu4c/source/data/unit/ksf.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ksf{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/ksh.txt b/icu4c/source/data/unit/ksh.txt
index abbd612..48201b0 100644
--- a/icu4c/source/data/unit/ksh.txt
+++ b/icu4c/source/data/unit/ksh.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ksh{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/kw.txt b/icu4c/source/data/unit/kw.txt
index 13f10c3..20e641f 100644
--- a/icu4c/source/data/unit/kw.txt
+++ b/icu4c/source/data/unit/kw.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kw{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/ky.txt b/icu4c/source/data/unit/ky.txt
index 78ed852..afba61f 100644
--- a/icu4c/source/data/unit/ky.txt
+++ b/icu4c/source/data/unit/ky.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ky{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/lag.txt b/icu4c/source/data/unit/lag.txt
index 7a87fc4..8a86891 100644
--- a/icu4c/source/data/unit/lag.txt
+++ b/icu4c/source/data/unit/lag.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lag{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/lb.txt b/icu4c/source/data/unit/lb.txt
index 9cd308c..5a45b62 100644
--- a/icu4c/source/data/unit/lb.txt
+++ b/icu4c/source/data/unit/lb.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lb{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/lg.txt b/icu4c/source/data/unit/lg.txt
index f17caa5..053ac2b 100644
--- a/icu4c/source/data/unit/lg.txt
+++ b/icu4c/source/data/unit/lg.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lg{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/lkt.txt b/icu4c/source/data/unit/lkt.txt
index 6ebeb57..cbf251c 100644
--- a/icu4c/source/data/unit/lkt.txt
+++ b/icu4c/source/data/unit/lkt.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lkt{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/ln.txt b/icu4c/source/data/unit/ln.txt
index 3f26cdb..0fb3758 100644
--- a/icu4c/source/data/unit/ln.txt
+++ b/icu4c/source/data/unit/ln.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ln{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/lo.txt b/icu4c/source/data/unit/lo.txt
index b2b564e..6798d07 100644
--- a/icu4c/source/data/unit/lo.txt
+++ b/icu4c/source/data/unit/lo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lo{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/lrc.txt b/icu4c/source/data/unit/lrc.txt
index 4a8bc0a..820939c 100644
--- a/icu4c/source/data/unit/lrc.txt
+++ b/icu4c/source/data/unit/lrc.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lrc{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/lt.txt b/icu4c/source/data/unit/lt.txt
index 776743c..0e92998 100644
--- a/icu4c/source/data/unit/lt.txt
+++ b/icu4c/source/data/unit/lt.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lt{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"hh:mm"}
         hms{"hh:mm:ss"}
diff --git a/icu4c/source/data/unit/lu.txt b/icu4c/source/data/unit/lu.txt
index 7b44552..f28aeda 100644
--- a/icu4c/source/data/unit/lu.txt
+++ b/icu4c/source/data/unit/lu.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lu{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/luo.txt b/icu4c/source/data/unit/luo.txt
index 43c1380..414d13f 100644
--- a/icu4c/source/data/unit/luo.txt
+++ b/icu4c/source/data/unit/luo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 luo{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/luy.txt b/icu4c/source/data/unit/luy.txt
index 9671ff7..3e07b21 100644
--- a/icu4c/source/data/unit/luy.txt
+++ b/icu4c/source/data/unit/luy.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 luy{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/lv.txt b/icu4c/source/data/unit/lv.txt
index 2eeb62f..6816a4c 100644
--- a/icu4c/source/data/unit/lv.txt
+++ b/icu4c/source/data/unit/lv.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lv{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/mas.txt b/icu4c/source/data/unit/mas.txt
index f690e2e..b34550c 100644
--- a/icu4c/source/data/unit/mas.txt
+++ b/icu4c/source/data/unit/mas.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mas{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/mer.txt b/icu4c/source/data/unit/mer.txt
index ebe2171..b59f5a7 100644
--- a/icu4c/source/data/unit/mer.txt
+++ b/icu4c/source/data/unit/mer.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mer{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/mfe.txt b/icu4c/source/data/unit/mfe.txt
index 501dcd3..b16617b 100644
--- a/icu4c/source/data/unit/mfe.txt
+++ b/icu4c/source/data/unit/mfe.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mfe{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/mg.txt b/icu4c/source/data/unit/mg.txt
index e9cddd2..dbd4114 100644
--- a/icu4c/source/data/unit/mg.txt
+++ b/icu4c/source/data/unit/mg.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mg{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/mgh.txt b/icu4c/source/data/unit/mgh.txt
index 34ae215..be38095 100644
--- a/icu4c/source/data/unit/mgh.txt
+++ b/icu4c/source/data/unit/mgh.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mgh{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/mgo.txt b/icu4c/source/data/unit/mgo.txt
index 465e404..8d73cf6 100644
--- a/icu4c/source/data/unit/mgo.txt
+++ b/icu4c/source/data/unit/mgo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mgo{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/mk.txt b/icu4c/source/data/unit/mk.txt
index 01da46c..d09b08d 100644
--- a/icu4c/source/data/unit/mk.txt
+++ b/icu4c/source/data/unit/mk.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mk{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ml.txt b/icu4c/source/data/unit/ml.txt
index 9cf9091..e8a820f 100644
--- a/icu4c/source/data/unit/ml.txt
+++ b/icu4c/source/data/unit/ml.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ml{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/mn.txt b/icu4c/source/data/unit/mn.txt
index c36823a..91e82c4 100644
--- a/icu4c/source/data/unit/mn.txt
+++ b/icu4c/source/data/unit/mn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mn{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"hh:mm"}
         hms{"hh:mm:ss"}
@@ -147,7 +147,7 @@
             }
         }
         coordinate{
-            east{"{0}E"}
+            east{"{0}Зүүн"}
             north{"{0}Умард"}
             south{"{0}Өмнөд"}
             west{"{0}Өрнөд"}
@@ -1512,7 +1512,7 @@
                 other{"{0} гПа"}
             }
             inch-hg{
-                dnam{"МөУсИн"}
+                dnam{"МөУс инч"}
                 one{"{0} МөУсИн"}
                 other{"{0} МөУсИн"}
             }
diff --git a/icu4c/source/data/unit/mr.txt b/icu4c/source/data/unit/mr.txt
index d85bceb..839d67e 100644
--- a/icu4c/source/data/unit/mr.txt
+++ b/icu4c/source/data/unit/mr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mr{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ms.txt b/icu4c/source/data/unit/ms.txt
index 2213db9..4835173 100644
--- a/icu4c/source/data/unit/ms.txt
+++ b/icu4c/source/data/unit/ms.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ms{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/mt.txt b/icu4c/source/data/unit/mt.txt
index 84293f6..671e32b 100644
--- a/icu4c/source/data/unit/mt.txt
+++ b/icu4c/source/data/unit/mt.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mt{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     units{
         angle{
             arc-minute{
diff --git a/icu4c/source/data/unit/mua.txt b/icu4c/source/data/unit/mua.txt
index 7381746..589cfb7 100644
--- a/icu4c/source/data/unit/mua.txt
+++ b/icu4c/source/data/unit/mua.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mua{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/my.txt b/icu4c/source/data/unit/my.txt
index eb7f3d7..7e283f4 100644
--- a/icu4c/source/data/unit/my.txt
+++ b/icu4c/source/data/unit/my.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 my{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
@@ -383,7 +383,7 @@
             kilogram{
                 dnam{"ကီလိုဂရမ်"}
                 other{"{0} ကီလိုဂရမ်"}
-                per{"{0} လျှင် တစ်ကီလိုဂရမ်"}
+                per{"တစ်ကီလိုဂရမ်လျှင် {0}"}
             }
             metric-ton{
                 dnam{"မက်ထရစ်တန်"}
diff --git a/icu4c/source/data/unit/mzn.txt b/icu4c/source/data/unit/mzn.txt
index 9156a11..2339241 100644
--- a/icu4c/source/data/unit/mzn.txt
+++ b/icu4c/source/data/unit/mzn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mzn{
-    Version{"2.1.31.86"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/naq.txt b/icu4c/source/data/unit/naq.txt
index 98e1493..24a23f7 100644
--- a/icu4c/source/data/unit/naq.txt
+++ b/icu4c/source/data/unit/naq.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 naq{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/nb.txt b/icu4c/source/data/unit/nb.txt
index de012ce..2cd9ef0 100644
--- a/icu4c/source/data/unit/nb.txt
+++ b/icu4c/source/data/unit/nb.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nb{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/nd.txt b/icu4c/source/data/unit/nd.txt
index ffbcd39..77b2835 100644
--- a/icu4c/source/data/unit/nd.txt
+++ b/icu4c/source/data/unit/nd.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nd{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/nds.txt b/icu4c/source/data/unit/nds.txt
index 1e1b1fa..9c716e3 100644
--- a/icu4c/source/data/unit/nds.txt
+++ b/icu4c/source/data/unit/nds.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nds{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/ne.txt b/icu4c/source/data/unit/ne.txt
index 046bd8e..3ecac8d 100644
--- a/icu4c/source/data/unit/ne.txt
+++ b/icu4c/source/data/unit/ne.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ne{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/nl.txt b/icu4c/source/data/unit/nl.txt
index 404d51a..ecc3be2 100644
--- a/icu4c/source/data/unit/nl.txt
+++ b/icu4c/source/data/unit/nl.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nl{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/nmg.txt b/icu4c/source/data/unit/nmg.txt
index 375b98a..5989a7d 100644
--- a/icu4c/source/data/unit/nmg.txt
+++ b/icu4c/source/data/unit/nmg.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nmg{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/nn.txt b/icu4c/source/data/unit/nn.txt
index 758ef4f..aebc8a6 100644
--- a/icu4c/source/data/unit/nn.txt
+++ b/icu4c/source/data/unit/nn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nn{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/nnh.txt b/icu4c/source/data/unit/nnh.txt
index 6af7536..bb4141f 100644
--- a/icu4c/source/data/unit/nnh.txt
+++ b/icu4c/source/data/unit/nnh.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nnh{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/nus.txt b/icu4c/source/data/unit/nus.txt
index b7bc2bd..c156f94 100644
--- a/icu4c/source/data/unit/nus.txt
+++ b/icu4c/source/data/unit/nus.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nus{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/nyn.txt b/icu4c/source/data/unit/nyn.txt
index 3f1d19b..1b6fcdb 100644
--- a/icu4c/source/data/unit/nyn.txt
+++ b/icu4c/source/data/unit/nyn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nyn{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/om.txt b/icu4c/source/data/unit/om.txt
index bf75a27..d0d0f28 100644
--- a/icu4c/source/data/unit/om.txt
+++ b/icu4c/source/data/unit/om.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 om{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/os.txt b/icu4c/source/data/unit/os.txt
index a60b54d..fc09042 100644
--- a/icu4c/source/data/unit/os.txt
+++ b/icu4c/source/data/unit/os.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 os{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/pa.txt b/icu4c/source/data/unit/pa.txt
index 036a002..119af76 100644
--- a/icu4c/source/data/unit/pa.txt
+++ b/icu4c/source/data/unit/pa.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/pa_Arab.txt b/icu4c/source/data/unit/pa_Arab.txt
index cbb8be4..1fb82e2 100644
--- a/icu4c/source/data/unit/pa_Arab.txt
+++ b/icu4c/source/data/unit/pa_Arab.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa_Arab{
     %%Parent{"root"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/pa_Guru.txt b/icu4c/source/data/unit/pa_Guru.txt
index a731d5e..e558d24 100644
--- a/icu4c/source/data/unit/pa_Guru.txt
+++ b/icu4c/source/data/unit/pa_Guru.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa_Guru{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/pl.txt b/icu4c/source/data/unit/pl.txt
index 2552096..a45701e 100644
--- a/icu4c/source/data/unit/pl.txt
+++ b/icu4c/source/data/unit/pl.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pl{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.15"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/pool.res b/icu4c/source/data/unit/pool.res
index 3b7fc18..02953a1 100644
--- a/icu4c/source/data/unit/pool.res
+++ b/icu4c/source/data/unit/pool.res
Binary files differ
diff --git a/icu4c/source/data/unit/ps.txt b/icu4c/source/data/unit/ps.txt
index fe7877d..1bf5742 100644
--- a/icu4c/source/data/unit/ps.txt
+++ b/icu4c/source/data/unit/ps.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ps{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/pt.txt b/icu4c/source/data/unit/pt.txt
index 6e4f788..b5ddaf1 100644
--- a/icu4c/source/data/unit/pt.txt
+++ b/icu4c/source/data/unit/pt.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/pt_AO.txt b/icu4c/source/data/unit/pt_AO.txt
index 5a8f6f2..4a41792 100644
--- a/icu4c/source/data/unit/pt_AO.txt
+++ b/icu4c/source/data/unit/pt_AO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_AO{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/pt_CH.txt b/icu4c/source/data/unit/pt_CH.txt
index 90d6a1e..acd87d8 100644
--- a/icu4c/source/data/unit/pt_CH.txt
+++ b/icu4c/source/data/unit/pt_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CH{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/pt_CV.txt b/icu4c/source/data/unit/pt_CV.txt
index 6b3cbbb..a42064f 100644
--- a/icu4c/source/data/unit/pt_CV.txt
+++ b/icu4c/source/data/unit/pt_CV.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CV{
     %%Parent{"pt_PT"}
-    Version{"2.1.35.71"}
+    Version{"2.1.39.12"}
 }
diff --git a/icu4c/source/data/unit/pt_GQ.txt b/icu4c/source/data/unit/pt_GQ.txt
index 793e060..8a8947f 100644
--- a/icu4c/source/data/unit/pt_GQ.txt
+++ b/icu4c/source/data/unit/pt_GQ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GQ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/pt_GW.txt b/icu4c/source/data/unit/pt_GW.txt
index e137e51..f131573 100644
--- a/icu4c/source/data/unit/pt_GW.txt
+++ b/icu4c/source/data/unit/pt_GW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GW{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/pt_LU.txt b/icu4c/source/data/unit/pt_LU.txt
index e6d1c60..d30ba91 100644
--- a/icu4c/source/data/unit/pt_LU.txt
+++ b/icu4c/source/data/unit/pt_LU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_LU{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/pt_MO.txt b/icu4c/source/data/unit/pt_MO.txt
index 76fe46e..fb39284 100644
--- a/icu4c/source/data/unit/pt_MO.txt
+++ b/icu4c/source/data/unit/pt_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_MO{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/pt_MZ.txt b/icu4c/source/data/unit/pt_MZ.txt
index b86fd1e..1274cac 100644
--- a/icu4c/source/data/unit/pt_MZ.txt
+++ b/icu4c/source/data/unit/pt_MZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_MZ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/pt_PT.txt b/icu4c/source/data/unit/pt_PT.txt
index 133ec92..34358a0 100644
--- a/icu4c/source/data/unit/pt_PT.txt
+++ b/icu4c/source/data/unit/pt_PT.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_PT{
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
     units{
         acceleration{
             g-force{
diff --git a/icu4c/source/data/unit/pt_ST.txt b/icu4c/source/data/unit/pt_ST.txt
index 95f596c..3d6d885 100644
--- a/icu4c/source/data/unit/pt_ST.txt
+++ b/icu4c/source/data/unit/pt_ST.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_ST{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/pt_TL.txt b/icu4c/source/data/unit/pt_TL.txt
index 786b602..0f0ddb9 100644
--- a/icu4c/source/data/unit/pt_TL.txt
+++ b/icu4c/source/data/unit/pt_TL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_TL{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/qu.txt b/icu4c/source/data/unit/qu.txt
index 68a924f..15761f1 100644
--- a/icu4c/source/data/unit/qu.txt
+++ b/icu4c/source/data/unit/qu.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 qu{
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/resfiles.mk b/icu4c/source/data/unit/resfiles.mk
index 8f02eda..4fa3f37 100644
--- a/icu4c/source/data/unit/resfiles.mk
+++ b/icu4c/source/data/unit/resfiles.mk
@@ -1,6 +1,6 @@
 # © 2016 and later: Unicode, Inc. and others.
 # License & terms of use: http://www.unicode.org/copyright.html#License
-UNIT_CLDR_VERSION = 32.0.1
+UNIT_CLDR_VERSION = 33
 # A list of txt's to build
 # Note:
 #
diff --git a/icu4c/source/data/unit/rm.txt b/icu4c/source/data/unit/rm.txt
index 478a9c3..2da85cf 100644
--- a/icu4c/source/data/unit/rm.txt
+++ b/icu4c/source/data/unit/rm.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rm{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/rn.txt b/icu4c/source/data/unit/rn.txt
index 42fbd7a..24f91e3 100644
--- a/icu4c/source/data/unit/rn.txt
+++ b/icu4c/source/data/unit/rn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rn{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/ro.txt b/icu4c/source/data/unit/ro.txt
index 6f58040..193a707 100644
--- a/icu4c/source/data/unit/ro.txt
+++ b/icu4c/source/data/unit/ro.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ro{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ro_MD.txt b/icu4c/source/data/unit/ro_MD.txt
index 7b7ea52..f792661 100644
--- a/icu4c/source/data/unit/ro_MD.txt
+++ b/icu4c/source/data/unit/ro_MD.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ro_MD{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     unitsNarrow{
         duration{
             day{
diff --git a/icu4c/source/data/unit/rof.txt b/icu4c/source/data/unit/rof.txt
index 2fa4a47..b5a6a65 100644
--- a/icu4c/source/data/unit/rof.txt
+++ b/icu4c/source/data/unit/rof.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rof{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/root.txt b/icu4c/source/data/unit/root.txt
index 47b63da..9902888 100644
--- a/icu4c/source/data/unit/root.txt
+++ b/icu4c/source/data/unit/root.txt
@@ -4,7 +4,7 @@
  * ICU <specials> source: <path>/common/main/root.xml
  */
 root{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.27"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ru.txt b/icu4c/source/data/unit/ru.txt
index 58684dd..d4adb0c 100644
--- a/icu4c/source/data/unit/ru.txt
+++ b/icu4c/source/data/unit/ru.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ru{
-    Version{"2.1.37.58"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
@@ -1129,10 +1129,10 @@
             }
             hour{
                 dnam{"ч"}
-                few{"{0} ч."}
-                many{"{0} ч."}
-                one{"{0} ч."}
-                other{"{0} ч."}
+                few{"{0} ч"}
+                many{"{0} ч"}
+                one{"{0} ч"}
+                other{"{0} ч"}
                 per{"{0}/ч."}
             }
             microsecond{
@@ -1151,10 +1151,10 @@
             }
             minute{
                 dnam{"мин"}
-                few{"{0} мин."}
-                many{"{0} мин."}
-                one{"{0} мин."}
-                other{"{0} мин."}
+                few{"{0} мин"}
+                many{"{0} мин"}
+                one{"{0} мин"}
+                other{"{0} мин"}
                 per{"{0}/мин."}
             }
             month{
@@ -1174,10 +1174,10 @@
             }
             second{
                 dnam{"c"}
-                few{"{0} с."}
-                many{"{0} с."}
-                one{"{0} с."}
-                other{"{0} с."}
+                few{"{0} с"}
+                many{"{0} с"}
+                one{"{0} с"}
+                other{"{0} с"}
                 per{"{0}/c"}
             }
             week{
@@ -1476,6 +1476,13 @@
                 one{"{0} мм рт. ст."}
                 other{"{0} мм рт. ст."}
             }
+            pound-per-square-inch{
+                dnam{"ф. на дюйм²"}
+                few{"{0} ф./дюйм²"}
+                many{"{0} ф./дюйм²"}
+                one{"{0} ф./дюйм²"}
+                other{"{0} ф./дюйм²"}
+            }
         }
         speed{
             kilometer-per-hour{
@@ -2046,10 +2053,10 @@
             }
             foot{
                 dnam{"фт"}
-                few{"{0} фута"}
-                many{"{0} футов"}
-                one{"{0} фут"}
-                other{"{0} фута"}
+                few{"{0} фт"}
+                many{"{0} фт"}
+                one{"{0} фт"}
+                other{"{0} фт"}
                 per{"{0}/фт"}
             }
             furlong{
diff --git a/icu4c/source/data/unit/rw.txt b/icu4c/source/data/unit/rw.txt
index 9e5d7be..a25ea2e 100644
--- a/icu4c/source/data/unit/rw.txt
+++ b/icu4c/source/data/unit/rw.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rw{
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
 }
diff --git a/icu4c/source/data/unit/rwk.txt b/icu4c/source/data/unit/rwk.txt
index 4949be2..6917463 100644
--- a/icu4c/source/data/unit/rwk.txt
+++ b/icu4c/source/data/unit/rwk.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rwk{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/sah.txt b/icu4c/source/data/unit/sah.txt
index 239f7d8..8496854 100644
--- a/icu4c/source/data/unit/sah.txt
+++ b/icu4c/source/data/unit/sah.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sah{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/saq.txt b/icu4c/source/data/unit/saq.txt
index 5d5c993..2afdbf4 100644
--- a/icu4c/source/data/unit/saq.txt
+++ b/icu4c/source/data/unit/saq.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 saq{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/sbp.txt b/icu4c/source/data/unit/sbp.txt
index ca158f6..80c2458 100644
--- a/icu4c/source/data/unit/sbp.txt
+++ b/icu4c/source/data/unit/sbp.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sbp{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/se.txt b/icu4c/source/data/unit/se.txt
index 900650f..0b2e087 100644
--- a/icu4c/source/data/unit/se.txt
+++ b/icu4c/source/data/unit/se.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 se{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/seh.txt b/icu4c/source/data/unit/seh.txt
index 191a593..0a4efad 100644
--- a/icu4c/source/data/unit/seh.txt
+++ b/icu4c/source/data/unit/seh.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 seh{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/ses.txt b/icu4c/source/data/unit/ses.txt
index 5802f81..0769c71 100644
--- a/icu4c/source/data/unit/ses.txt
+++ b/icu4c/source/data/unit/ses.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ses{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/sg.txt b/icu4c/source/data/unit/sg.txt
index 604c745..8760e35 100644
--- a/icu4c/source/data/unit/sg.txt
+++ b/icu4c/source/data/unit/sg.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sg{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/shi.txt b/icu4c/source/data/unit/shi.txt
index 1d344e4..cefeb4d 100644
--- a/icu4c/source/data/unit/shi.txt
+++ b/icu4c/source/data/unit/shi.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/shi_Latn.txt b/icu4c/source/data/unit/shi_Latn.txt
index ed61c3f..bab7108 100644
--- a/icu4c/source/data/unit/shi_Latn.txt
+++ b/icu4c/source/data/unit/shi_Latn.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi_Latn{
     %%Parent{"root"}
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/shi_Tfng.txt b/icu4c/source/data/unit/shi_Tfng.txt
index ba03fa3..aaf5c7b 100644
--- a/icu4c/source/data/unit/shi_Tfng.txt
+++ b/icu4c/source/data/unit/shi_Tfng.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi_Tfng{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/si.txt b/icu4c/source/data/unit/si.txt
index cd48620..865015e 100644
--- a/icu4c/source/data/unit/si.txt
+++ b/icu4c/source/data/unit/si.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 si{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h.mm"}
         hms{"h.mm.ss"}
diff --git a/icu4c/source/data/unit/sk.txt b/icu4c/source/data/unit/sk.txt
index 8e18524..347434a 100644
--- a/icu4c/source/data/unit/sk.txt
+++ b/icu4c/source/data/unit/sk.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sk{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/sl.txt b/icu4c/source/data/unit/sl.txt
index c3fc8db..a4f30b5 100644
--- a/icu4c/source/data/unit/sl.txt
+++ b/icu4c/source/data/unit/sl.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sl{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h.mm"}
         hms{"h.mm.ss"}
diff --git a/icu4c/source/data/unit/smn.txt b/icu4c/source/data/unit/smn.txt
index 8a8ff8d..bfeb6bb 100644
--- a/icu4c/source/data/unit/smn.txt
+++ b/icu4c/source/data/unit/smn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 smn{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/sn.txt b/icu4c/source/data/unit/sn.txt
index 728dbed..d62c3d6 100644
--- a/icu4c/source/data/unit/sn.txt
+++ b/icu4c/source/data/unit/sn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sn{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/so.txt b/icu4c/source/data/unit/so.txt
index 31f5954..04263bb 100644
--- a/icu4c/source/data/unit/so.txt
+++ b/icu4c/source/data/unit/so.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 so{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/sq.txt b/icu4c/source/data/unit/sq.txt
index 71d5999..4cb6c96 100644
--- a/icu4c/source/data/unit/sq.txt
+++ b/icu4c/source/data/unit/sq.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sq{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
@@ -511,9 +511,9 @@
                 other{"{0} gigavat"}
             }
             horsepower{
-                dnam{"kuaj fuqi"}
-                one{"{0} kalë fuqi"}
-                other{"{0} kuaj fuqi"}
+                dnam{"kuaj-fuqi"}
+                one{"{0} kalë-fuqi"}
+                other{"{0} kuaj-fuqi"}
             }
             kilowatt{
                 dnam{"kilovat"}
diff --git a/icu4c/source/data/unit/sr.txt b/icu4c/source/data/unit/sr.txt
index 07ae297..93b31fe 100644
--- a/icu4c/source/data/unit/sr.txt
+++ b/icu4c/source/data/unit/sr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/sr_Cyrl.txt b/icu4c/source/data/unit/sr_Cyrl.txt
index cac24ec..1d0d0a9 100644
--- a/icu4c/source/data/unit/sr_Cyrl.txt
+++ b/icu4c/source/data/unit/sr_Cyrl.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Cyrl{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/sr_Latn.txt b/icu4c/source/data/unit/sr_Latn.txt
index 59403a0..9011453 100644
--- a/icu4c/source/data/unit/sr_Latn.txt
+++ b/icu4c/source/data/unit/sr_Latn.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Latn{
     %%Parent{"root"}
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/sv.txt b/icu4c/source/data/unit/sv.txt
index d3c6d72..873da90 100644
--- a/icu4c/source/data/unit/sv.txt
+++ b/icu4c/source/data/unit/sv.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sv{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/sv_FI.txt b/icu4c/source/data/unit/sv_FI.txt
index b49c9f3..4e42004 100644
--- a/icu4c/source/data/unit/sv_FI.txt
+++ b/icu4c/source/data/unit/sv_FI.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sv_FI{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     unitsNarrow{
         speed{
             kilometer-per-hour{
diff --git a/icu4c/source/data/unit/sw.txt b/icu4c/source/data/unit/sw.txt
index 57b9750..9effafe 100644
--- a/icu4c/source/data/unit/sw.txt
+++ b/icu4c/source/data/unit/sw.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sw{
-    Version{"2.1.37.34"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ta.txt b/icu4c/source/data/unit/ta.txt
index 9ca004c..a20aa36 100644
--- a/icu4c/source/data/unit/ta.txt
+++ b/icu4c/source/data/unit/ta.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ta{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/te.txt b/icu4c/source/data/unit/te.txt
index 1bac5b2..e3d387f 100644
--- a/icu4c/source/data/unit/te.txt
+++ b/icu4c/source/data/unit/te.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 te{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/teo.txt b/icu4c/source/data/unit/teo.txt
index e043977..e70e3cd 100644
--- a/icu4c/source/data/unit/teo.txt
+++ b/icu4c/source/data/unit/teo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 teo{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/tg.txt b/icu4c/source/data/unit/tg.txt
index 75322d8..64d8d70 100644
--- a/icu4c/source/data/unit/tg.txt
+++ b/icu4c/source/data/unit/tg.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tg{
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/th.txt b/icu4c/source/data/unit/th.txt
index e6bd9e9..0ecd5da 100644
--- a/icu4c/source/data/unit/th.txt
+++ b/icu4c/source/data/unit/th.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 th{
-    Version{"2.1.37.56"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ti.txt b/icu4c/source/data/unit/ti.txt
index ebb29f7..06c46a2 100644
--- a/icu4c/source/data/unit/ti.txt
+++ b/icu4c/source/data/unit/ti.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ti{
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/to.txt b/icu4c/source/data/unit/to.txt
index c6cd657..ec7700f 100644
--- a/icu4c/source/data/unit/to.txt
+++ b/icu4c/source/data/unit/to.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 to{
-    Version{"2.1.37.5"}
+    Version{"2.1.38.39"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/tr.txt b/icu4c/source/data/unit/tr.txt
index df7db2a..58fbc83 100644
--- a/icu4c/source/data/unit/tr.txt
+++ b/icu4c/source/data/unit/tr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tr{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
@@ -1835,6 +1835,7 @@
                 other{"{0} pm"}
             }
             point{
+                dnam{"punto"}
                 one{"{0} pt"}
                 other{"{0} pt"}
             }
diff --git a/icu4c/source/data/unit/tt.txt b/icu4c/source/data/unit/tt.txt
index 7d59909..94593c7 100644
--- a/icu4c/source/data/unit/tt.txt
+++ b/icu4c/source/data/unit/tt.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tt{
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/twq.txt b/icu4c/source/data/unit/twq.txt
index 40fc971..ce8e0cd 100644
--- a/icu4c/source/data/unit/twq.txt
+++ b/icu4c/source/data/unit/twq.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 twq{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/tzm.txt b/icu4c/source/data/unit/tzm.txt
index 38e8af3..941a3c4 100644
--- a/icu4c/source/data/unit/tzm.txt
+++ b/icu4c/source/data/unit/tzm.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tzm{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/ug.txt b/icu4c/source/data/unit/ug.txt
index e36bea3..0b4e366 100644
--- a/icu4c/source/data/unit/ug.txt
+++ b/icu4c/source/data/unit/ug.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ug{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     units{
         acceleration{
             g-force{
diff --git a/icu4c/source/data/unit/uk.txt b/icu4c/source/data/unit/uk.txt
index 3db0250..245cf74 100644
--- a/icu4c/source/data/unit/uk.txt
+++ b/icu4c/source/data/unit/uk.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uk{
-    Version{"2.1.37.12"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ur.txt b/icu4c/source/data/unit/ur.txt
index 0f1f7ef..1fc506a 100644
--- a/icu4c/source/data/unit/ur.txt
+++ b/icu4c/source/data/unit/ur.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ur{
-    Version{"2.1.37.69"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/ur_IN.txt b/icu4c/source/data/unit/ur_IN.txt
index 4544397..f0e58bb 100644
--- a/icu4c/source/data/unit/ur_IN.txt
+++ b/icu4c/source/data/unit/ur_IN.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ur_IN{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     units{
         length{
             astronomical-unit{
diff --git a/icu4c/source/data/unit/uz.txt b/icu4c/source/data/unit/uz.txt
index 4cbc401..5b303a4 100644
--- a/icu4c/source/data/unit/uz.txt
+++ b/icu4c/source/data/unit/uz.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/uz_Arab.txt b/icu4c/source/data/unit/uz_Arab.txt
index ecd5ba3..543cad0 100644
--- a/icu4c/source/data/unit/uz_Arab.txt
+++ b/icu4c/source/data/unit/uz_Arab.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Arab{
     %%Parent{"root"}
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/uz_Cyrl.txt b/icu4c/source/data/unit/uz_Cyrl.txt
index 9d1e5d0..fdadc69 100644
--- a/icu4c/source/data/unit/uz_Cyrl.txt
+++ b/icu4c/source/data/unit/uz_Cyrl.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Cyrl{
     %%Parent{"root"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/uz_Latn.txt b/icu4c/source/data/unit/uz_Latn.txt
index 36553da..66698d6 100644
--- a/icu4c/source/data/unit/uz_Latn.txt
+++ b/icu4c/source/data/unit/uz_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/vai.txt b/icu4c/source/data/unit/vai.txt
index 60615c4..4b75f8a 100644
--- a/icu4c/source/data/unit/vai.txt
+++ b/icu4c/source/data/unit/vai.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/vai_Latn.txt b/icu4c/source/data/unit/vai_Latn.txt
index 99d351d..2089035 100644
--- a/icu4c/source/data/unit/vai_Latn.txt
+++ b/icu4c/source/data/unit/vai_Latn.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai_Latn{
     %%Parent{"root"}
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/vai_Vaii.txt b/icu4c/source/data/unit/vai_Vaii.txt
index 487dfa9..6ef4517 100644
--- a/icu4c/source/data/unit/vai_Vaii.txt
+++ b/icu4c/source/data/unit/vai_Vaii.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai_Vaii{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/vi.txt b/icu4c/source/data/unit/vi.txt
index 2767463..90b1498 100644
--- a/icu4c/source/data/unit/vi.txt
+++ b/icu4c/source/data/unit/vi.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vi{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/vun.txt b/icu4c/source/data/unit/vun.txt
index e4ed87b..eaf728b 100644
--- a/icu4c/source/data/unit/vun.txt
+++ b/icu4c/source/data/unit/vun.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vun{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/wae.txt b/icu4c/source/data/unit/wae.txt
index 3d7cd53..a5c3e8f 100644
--- a/icu4c/source/data/unit/wae.txt
+++ b/icu4c/source/data/unit/wae.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 wae{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     units{
         duration{
             day{
diff --git a/icu4c/source/data/unit/wo.txt b/icu4c/source/data/unit/wo.txt
index ef870ff..b490ab3 100644
--- a/icu4c/source/data/unit/wo.txt
+++ b/icu4c/source/data/unit/wo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 wo{
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/xog.txt b/icu4c/source/data/unit/xog.txt
index 31a3446..bc58d22 100644
--- a/icu4c/source/data/unit/xog.txt
+++ b/icu4c/source/data/unit/xog.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 xog{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/yav.txt b/icu4c/source/data/unit/yav.txt
index 96488b2..d737c00 100644
--- a/icu4c/source/data/unit/yav.txt
+++ b/icu4c/source/data/unit/yav.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yav{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/yi.txt b/icu4c/source/data/unit/yi.txt
index 0f2cc30..b408c5b 100644
--- a/icu4c/source/data/unit/yi.txt
+++ b/icu4c/source/data/unit/yi.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yi{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/yo.txt b/icu4c/source/data/unit/yo.txt
index dd1947a..f66f78b 100644
--- a/icu4c/source/data/unit/yo.txt
+++ b/icu4c/source/data/unit/yo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yo{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/yue.txt b/icu4c/source/data/unit/yue.txt
index a5ee891..5f5cae5 100644
--- a/icu4c/source/data/unit/yue.txt
+++ b/icu4c/source/data/unit/yue.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue{
-    Version{"2.1.37.33"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/yue_Hans.txt b/icu4c/source/data/unit/yue_Hans.txt
index 0eff2b4..f132e30 100644
--- a/icu4c/source/data/unit/yue_Hans.txt
+++ b/icu4c/source/data/unit/yue_Hans.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue_Hans{
     %%Parent{"root"}
-    Version{"2.1.37.8"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/yue_Hant.txt b/icu4c/source/data/unit/yue_Hant.txt
index b8cde82..a263f97 100644
--- a/icu4c/source/data/unit/yue_Hant.txt
+++ b/icu4c/source/data/unit/yue_Hant.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue_Hant{
-    Version{"2.1.36.80"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/unit/zgh.txt b/icu4c/source/data/unit/zgh.txt
index 7b1e54c..43ef8b1 100644
--- a/icu4c/source/data/unit/zgh.txt
+++ b/icu4c/source/data/unit/zgh.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zgh{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/unit/zh.txt b/icu4c/source/data/unit/zh.txt
index 1c7d8f4..93f6267 100644
--- a/icu4c/source/data/unit/zh.txt
+++ b/icu4c/source/data/unit/zh.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh{
-    Version{"2.1.37.42"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/zh_Hans.txt b/icu4c/source/data/unit/zh_Hans.txt
index e2e6871..a37beac 100644
--- a/icu4c/source/data/unit/zh_Hans.txt
+++ b/icu4c/source/data/unit/zh_Hans.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/zh_Hans_HK.txt b/icu4c/source/data/unit/zh_Hans_HK.txt
index 3e83ec7..51e732e 100644
--- a/icu4c/source/data/unit/zh_Hans_HK.txt
+++ b/icu4c/source/data/unit/zh_Hans_HK.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans_HK{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     units{
         compound{
             per{"{0}/{1}"}
diff --git a/icu4c/source/data/unit/zh_Hans_MO.txt b/icu4c/source/data/unit/zh_Hans_MO.txt
index f1f5175..6bbc9a2 100644
--- a/icu4c/source/data/unit/zh_Hans_MO.txt
+++ b/icu4c/source/data/unit/zh_Hans_MO.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans_MO{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     units{
         compound{
             per{"{0}/{1}"}
diff --git a/icu4c/source/data/unit/zh_Hans_SG.txt b/icu4c/source/data/unit/zh_Hans_SG.txt
index 78f772f..54d8f25 100644
--- a/icu4c/source/data/unit/zh_Hans_SG.txt
+++ b/icu4c/source/data/unit/zh_Hans_SG.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans_SG{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     units{
         compound{
             per{"{0}/{1}"}
diff --git a/icu4c/source/data/unit/zh_Hant.txt b/icu4c/source/data/unit/zh_Hant.txt
index 4ecb3cc..85cff36 100644
--- a/icu4c/source/data/unit/zh_Hant.txt
+++ b/icu4c/source/data/unit/zh_Hant.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hant{
     %%Parent{"root"}
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/unit/zh_Hant_HK.txt b/icu4c/source/data/unit/zh_Hant_HK.txt
index f48859b..b638b9c 100644
--- a/icu4c/source/data/unit/zh_Hant_HK.txt
+++ b/icu4c/source/data/unit/zh_Hant_HK.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hant_HK{
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
     units{
         acceleration{
             meter-per-second-squared{
diff --git a/icu4c/source/data/unit/zh_Hant_MO.txt b/icu4c/source/data/unit/zh_Hant_MO.txt
index 78fdee5..f61452c 100644
--- a/icu4c/source/data/unit/zh_Hant_MO.txt
+++ b/icu4c/source/data/unit/zh_Hant_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hant_MO{
     %%Parent{"zh_Hant_HK"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/unit/zu.txt b/icu4c/source/data/unit/zu.txt
index f588a17..60ba71d 100644
--- a/icu4c/source/data/unit/zu.txt
+++ b/icu4c/source/data/unit/zu.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zu{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     durationUnits{
         hm{"h:mm"}
         hms{"h:mm:ss"}
diff --git a/icu4c/source/data/xml/brkitr/de.xml b/icu4c/source/data/xml/brkitr/de.xml
index 23144d3..35ce3dd 100644
--- a/icu4c/source/data/xml/brkitr/de.xml
+++ b/icu4c/source/data/xml/brkitr/de.xml
@@ -14,7 +14,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 38848 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="de"/>
     </identity>
 </ldml>
diff --git a/icu4c/source/data/xml/brkitr/el.xml b/icu4c/source/data/xml/brkitr/el.xml
index 8d2db85..10f518a 100644
--- a/icu4c/source/data/xml/brkitr/el.xml
+++ b/icu4c/source/data/xml/brkitr/el.xml
@@ -12,7 +12,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="el"/> 
     </identity>
     <special xmlns:icu="http://www.icu-project.org/">
diff --git a/icu4c/source/data/xml/brkitr/en.xml b/icu4c/source/data/xml/brkitr/en.xml
index 1be1296..4be0acb 100644
--- a/icu4c/source/data/xml/brkitr/en.xml
+++ b/icu4c/source/data/xml/brkitr/en.xml
@@ -12,7 +12,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="en"/> 
     </identity>
 </ldml>
diff --git a/icu4c/source/data/xml/brkitr/en_US.xml b/icu4c/source/data/xml/brkitr/en_US.xml
index afa7207..31fcb5b 100644
--- a/icu4c/source/data/xml/brkitr/en_US.xml
+++ b/icu4c/source/data/xml/brkitr/en_US.xml
@@ -12,7 +12,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="en"/> 
         <territory type="US"/>
     </identity>
diff --git a/icu4c/source/data/xml/brkitr/en_US_POSIX.xml b/icu4c/source/data/xml/brkitr/en_US_POSIX.xml
index ec3370f..9c10d60 100644
--- a/icu4c/source/data/xml/brkitr/en_US_POSIX.xml
+++ b/icu4c/source/data/xml/brkitr/en_US_POSIX.xml
@@ -12,7 +12,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="en"/> 
         <territory type="US"/> 
         <variant type="POSIX"/> 
diff --git a/icu4c/source/data/xml/brkitr/es.xml b/icu4c/source/data/xml/brkitr/es.xml
index 3465f19..6d05699 100644
--- a/icu4c/source/data/xml/brkitr/es.xml
+++ b/icu4c/source/data/xml/brkitr/es.xml
@@ -14,7 +14,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 38848 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="es"/>
     </identity>
 </ldml>
diff --git a/icu4c/source/data/xml/brkitr/fi.xml b/icu4c/source/data/xml/brkitr/fi.xml
index 8f1e18b..e27987a 100644
--- a/icu4c/source/data/xml/brkitr/fi.xml
+++ b/icu4c/source/data/xml/brkitr/fi.xml
@@ -12,7 +12,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 28903 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="fi"/> 
     </identity>
     <special xmlns:icu="http://www.icu-project.org/">
diff --git a/icu4c/source/data/xml/brkitr/fr.xml b/icu4c/source/data/xml/brkitr/fr.xml
index af51689..970e1ef 100644
--- a/icu4c/source/data/xml/brkitr/fr.xml
+++ b/icu4c/source/data/xml/brkitr/fr.xml
@@ -14,7 +14,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 38848 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="fr"/>
     </identity>
 </ldml>
diff --git a/icu4c/source/data/xml/brkitr/it.xml b/icu4c/source/data/xml/brkitr/it.xml
index 4d078d0..8a61984 100644
--- a/icu4c/source/data/xml/brkitr/it.xml
+++ b/icu4c/source/data/xml/brkitr/it.xml
@@ -14,7 +14,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 38848 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="it"/>
     </identity>
 </ldml>
diff --git a/icu4c/source/data/xml/brkitr/ja.xml b/icu4c/source/data/xml/brkitr/ja.xml
index fe1f3bc..d0d02bf 100644
--- a/icu4c/source/data/xml/brkitr/ja.xml
+++ b/icu4c/source/data/xml/brkitr/ja.xml
@@ -12,7 +12,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="ja"/> 
     </identity>
     <special xmlns:icu="http://www.icu-project.org/">
diff --git a/icu4c/source/data/xml/brkitr/pt.xml b/icu4c/source/data/xml/brkitr/pt.xml
index 153f055..85dec35 100644
--- a/icu4c/source/data/xml/brkitr/pt.xml
+++ b/icu4c/source/data/xml/brkitr/pt.xml
@@ -14,7 +14,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 38848 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="pt"/>
     </identity>
 </ldml>
diff --git a/icu4c/source/data/xml/brkitr/root.xml b/icu4c/source/data/xml/brkitr/root.xml
index 1aaf7b7..6cc5ece 100644
--- a/icu4c/source/data/xml/brkitr/root.xml
+++ b/icu4c/source/data/xml/brkitr/root.xml
@@ -12,7 +12,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="root"/> 
     </identity>
     <special xmlns:icu="http://www.icu-project.org/">
diff --git a/icu4c/source/data/xml/brkitr/ru.xml b/icu4c/source/data/xml/brkitr/ru.xml
index 45026ee..501f3cf 100644
--- a/icu4c/source/data/xml/brkitr/ru.xml
+++ b/icu4c/source/data/xml/brkitr/ru.xml
@@ -14,7 +14,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 38848 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="ru"/>
     </identity>
 </ldml>
diff --git a/icu4c/source/data/xml/collation/root.xml b/icu4c/source/data/xml/collation/root.xml
index 6da1962..66e2f18 100644
--- a/icu4c/source/data/xml/collation/root.xml
+++ b/icu4c/source/data/xml/collation/root.xml
@@ -12,7 +12,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 1.5 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="root"/> 
     </identity>
     <special xmlns:icu="http://www.icu-project.org/">
diff --git a/icu4c/source/data/xml/main/root.xml b/icu4c/source/data/xml/main/root.xml
index 73aad4f..626098d 100644
--- a/icu4c/source/data/xml/main/root.xml
+++ b/icu4c/source/data/xml/main/root.xml
@@ -12,7 +12,7 @@
 >
 <ldml>
     <identity>
-        <version number="$Revision: 1.30 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="root"/> 
     </identity>
 </ldml>
diff --git a/icu4c/source/data/xml/rbnf/be.xml b/icu4c/source/data/xml/rbnf/be.xml
index e7000a8..1e3742a 100644
--- a/icu4c/source/data/xml/rbnf/be.xml
+++ b/icu4c/source/data/xml/rbnf/be.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="be"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/bg.xml b/icu4c/source/data/xml/rbnf/bg.xml
index 49cddfe..d98d81a 100644
--- a/icu4c/source/data/xml/rbnf/bg.xml
+++ b/icu4c/source/data/xml/rbnf/bg.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="bg"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/ca.xml b/icu4c/source/data/xml/rbnf/ca.xml
index 235ba19..c2cb1dd 100644
--- a/icu4c/source/data/xml/rbnf/ca.xml
+++ b/icu4c/source/data/xml/rbnf/ca.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="ca"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/cy.xml b/icu4c/source/data/xml/rbnf/cy.xml
index 1688d54..1f60adf 100644
--- a/icu4c/source/data/xml/rbnf/cy.xml
+++ b/icu4c/source/data/xml/rbnf/cy.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="cy"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/da.xml b/icu4c/source/data/xml/rbnf/da.xml
index 275ac51..0f89314 100644
--- a/icu4c/source/data/xml/rbnf/da.xml
+++ b/icu4c/source/data/xml/rbnf/da.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="da"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/de.xml b/icu4c/source/data/xml/rbnf/de.xml
index 327a7d5..a9de81f 100644
--- a/icu4c/source/data/xml/rbnf/de.xml
+++ b/icu4c/source/data/xml/rbnf/de.xml
@@ -8,7 +8,7 @@
 <ldml>
 	<identity>
 
-		<version number="$Revision: 1.4 $"/>
+		<version number="$Revision: 40674 $"/>
 		<language type="de"/>
 	</identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/en.xml b/icu4c/source/data/xml/rbnf/en.xml
index c4ad96e..380fe1d 100644
--- a/icu4c/source/data/xml/rbnf/en.xml
+++ b/icu4c/source/data/xml/rbnf/en.xml
@@ -8,7 +8,7 @@
 <ldml>
 	<identity>
 
-		<version number="$Revision: 1.4 $"/>
+		<version number="$Revision: 40674 $"/>
 		<language type="en"/>
 	</identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/fo.xml b/icu4c/source/data/xml/rbnf/fo.xml
index a60fc10..75e71b6 100644
--- a/icu4c/source/data/xml/rbnf/fo.xml
+++ b/icu4c/source/data/xml/rbnf/fo.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="fo"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/ga.xml b/icu4c/source/data/xml/rbnf/ga.xml
index 6fe0d63..6e787fa 100644
--- a/icu4c/source/data/xml/rbnf/ga.xml
+++ b/icu4c/source/data/xml/rbnf/ga.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
 	<identity>
-		<version number="$Revision: 1.4 $"/>
+		<version number="$Revision: 40674 $"/>
 		<language type="ga"/>
 	</identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/is.xml b/icu4c/source/data/xml/rbnf/is.xml
index e8cd8ce..ad1739e 100644
--- a/icu4c/source/data/xml/rbnf/is.xml
+++ b/icu4c/source/data/xml/rbnf/is.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="is"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/mk.xml b/icu4c/source/data/xml/rbnf/mk.xml
index 3be92ef..d40e08c 100644
--- a/icu4c/source/data/xml/rbnf/mk.xml
+++ b/icu4c/source/data/xml/rbnf/mk.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="mk"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/mt.xml b/icu4c/source/data/xml/rbnf/mt.xml
index 7aea539..5eaaed9 100644
--- a/icu4c/source/data/xml/rbnf/mt.xml
+++ b/icu4c/source/data/xml/rbnf/mt.xml
@@ -8,7 +8,7 @@
 <ldml>
 	<identity>
 
-		<version number="$Revision: 1.4 $"/>
+		<version number="$Revision: 40674 $"/>
 		<language type="mt"/>
 	</identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/nb.xml b/icu4c/source/data/xml/rbnf/nb.xml
index ed22c82..ec833a5 100644
--- a/icu4c/source/data/xml/rbnf/nb.xml
+++ b/icu4c/source/data/xml/rbnf/nb.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="nb"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/nn.xml b/icu4c/source/data/xml/rbnf/nn.xml
index 69fac5b..414ea9f 100644
--- a/icu4c/source/data/xml/rbnf/nn.xml
+++ b/icu4c/source/data/xml/rbnf/nn.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="nn"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/root.xml b/icu4c/source/data/xml/rbnf/root.xml
index 59d9ff3..06bc376 100644
--- a/icu4c/source/data/xml/rbnf/root.xml
+++ b/icu4c/source/data/xml/rbnf/root.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
 	<identity>
-		<version number="$Revision: 1.4 $"/>
+		<version number="$Revision: 40674 $"/>
 		<language type="root"/>
 	</identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/ru.xml b/icu4c/source/data/xml/rbnf/ru.xml
index 351c252..228bd07 100644
--- a/icu4c/source/data/xml/rbnf/ru.xml
+++ b/icu4c/source/data/xml/rbnf/ru.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="ru"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/sr.xml b/icu4c/source/data/xml/rbnf/sr.xml
index d1b54d2..07a5d64 100644
--- a/icu4c/source/data/xml/rbnf/sr.xml
+++ b/icu4c/source/data/xml/rbnf/sr.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="sr"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/xml/rbnf/uk.xml b/icu4c/source/data/xml/rbnf/uk.xml
index d3220dc..2b898ca 100644
--- a/icu4c/source/data/xml/rbnf/uk.xml
+++ b/icu4c/source/data/xml/rbnf/uk.xml
@@ -7,7 +7,7 @@
 <!DOCTYPE ldml SYSTEM "http://www.unicode.org/repos/cldr/trunk/common/dtd/ldml.dtd">
 <ldml>
     <identity>
-        <version number="$Revision: 1.1 $"/>
+        <version number="$Revision: 40674 $"/>
         <language type="uk"/>
     </identity>
     <rbnf>
diff --git a/icu4c/source/data/zone/af.txt b/icu4c/source/data/zone/af.txt
index 095bb3e..6336896 100644
--- a/icu4c/source/data/zone/af.txt
+++ b/icu4c/source/data/zone/af.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 af{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/agq.txt b/icu4c/source/data/zone/agq.txt
index c364408..61cdbaf 100644
--- a/icu4c/source/data/zone/agq.txt
+++ b/icu4c/source/data/zone/agq.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 agq{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/ak.txt b/icu4c/source/data/zone/ak.txt
index 1c9e8ee..ac5ead3 100644
--- a/icu4c/source/data/zone/ak.txt
+++ b/icu4c/source/data/zone/ak.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ak{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/am.txt b/icu4c/source/data/zone/am.txt
index 70cd7e8..394a11c 100644
--- a/icu4c/source/data/zone/am.txt
+++ b/icu4c/source/data/zone/am.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 am{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"አቢጃን"}
diff --git a/icu4c/source/data/zone/ar.txt b/icu4c/source/data/zone/ar.txt
index b91ca99..6e7d933 100644
--- a/icu4c/source/data/zone/ar.txt
+++ b/icu4c/source/data/zone/ar.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ar{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"أبيدجان"}
diff --git a/icu4c/source/data/zone/ar_XB.txt b/icu4c/source/data/zone/ar_XB.txt
index c76c8cf..4051eca 100644
--- a/icu4c/source/data/zone/ar_XB.txt
+++ b/icu4c/source/data/zone/ar_XB.txt
@@ -597,7 +597,7 @@
             ls{"؜‮Qyzylorda‬؜ ؜‮Standard‬؜ ؜‮Time‬؜"}
         }
         "meta:Reunion"{
-            ls{"؜‮Reunion‬؜ ؜‮Time‬؜"}
+            ls{"؜‮Réunion‬؜ ؜‮Time‬؜"}
         }
         "meta:Rothera"{
             ls{"؜‮Rothera‬؜ ؜‮Time‬؜"}
diff --git a/icu4c/source/data/zone/asa.txt b/icu4c/source/data/zone/asa.txt
index ae5b560..5f7cf91 100644
--- a/icu4c/source/data/zone/asa.txt
+++ b/icu4c/source/data/zone/asa.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 asa{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/ast.txt b/icu4c/source/data/zone/ast.txt
index cfc1843..a9e564b 100644
--- a/icu4c/source/data/zone/ast.txt
+++ b/icu4c/source/data/zone/ast.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ast{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/az.txt b/icu4c/source/data/zone/az.txt
index a216b47..c78b65f 100644
--- a/icu4c/source/data/zone/az.txt
+++ b/icu4c/source/data/zone/az.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abican"}
diff --git a/icu4c/source/data/zone/az_Cyrl.txt b/icu4c/source/data/zone/az_Cyrl.txt
index f225064..5152a0a 100644
--- a/icu4c/source/data/zone/az_Cyrl.txt
+++ b/icu4c/source/data/zone/az_Cyrl.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az_Cyrl{
     %%Parent{"root"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/az_Latn.txt b/icu4c/source/data/zone/az_Latn.txt
index 9df6ff3..47ecb5c 100644
--- a/icu4c/source/data/zone/az_Latn.txt
+++ b/icu4c/source/data/zone/az_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 az_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/bas.txt b/icu4c/source/data/zone/bas.txt
index f8558f5..41c9c6c 100644
--- a/icu4c/source/data/zone/bas.txt
+++ b/icu4c/source/data/zone/bas.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bas{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/be.txt b/icu4c/source/data/zone/be.txt
index b5ac1f2..49c6a4e 100644
--- a/icu4c/source/data/zone/be.txt
+++ b/icu4c/source/data/zone/be.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 be{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абіджан"}
diff --git a/icu4c/source/data/zone/bem.txt b/icu4c/source/data/zone/bem.txt
index 58b983a..3d2794a 100644
--- a/icu4c/source/data/zone/bem.txt
+++ b/icu4c/source/data/zone/bem.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bem{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/bez.txt b/icu4c/source/data/zone/bez.txt
index b5b4150..98aea05 100644
--- a/icu4c/source/data/zone/bez.txt
+++ b/icu4c/source/data/zone/bez.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bez{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/bg.txt b/icu4c/source/data/zone/bg.txt
index 4410d12..1449979 100644
--- a/icu4c/source/data/zone/bg.txt
+++ b/icu4c/source/data/zone/bg.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bg{
-    Version{"2.1.37.59"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абиджан"}
diff --git a/icu4c/source/data/zone/bm.txt b/icu4c/source/data/zone/bm.txt
index a385b5e..288184a 100644
--- a/icu4c/source/data/zone/bm.txt
+++ b/icu4c/source/data/zone/bm.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bm{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/bn.txt b/icu4c/source/data/zone/bn.txt
index 514faf9..cb057a8 100644
--- a/icu4c/source/data/zone/bn.txt
+++ b/icu4c/source/data/zone/bn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bn{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"আবিদজান"}
diff --git a/icu4c/source/data/zone/bo.txt b/icu4c/source/data/zone/bo.txt
index 836dcb6..0b65972 100644
--- a/icu4c/source/data/zone/bo.txt
+++ b/icu4c/source/data/zone/bo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bo{
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Etc:Unknown"{
             ec{"མ་རྟོགས་པ"}
diff --git a/icu4c/source/data/zone/br.txt b/icu4c/source/data/zone/br.txt
index 0de6c30..8d8055e 100644
--- a/icu4c/source/data/zone/br.txt
+++ b/icu4c/source/data/zone/br.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 br{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/brx.txt b/icu4c/source/data/zone/brx.txt
index 68a1d6d..bf62971 100644
--- a/icu4c/source/data/zone/brx.txt
+++ b/icu4c/source/data/zone/brx.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 brx{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"अबिद्जान"}
diff --git a/icu4c/source/data/zone/bs.txt b/icu4c/source/data/zone/bs.txt
index 4c3f504..7e4b5fa 100644
--- a/icu4c/source/data/zone/bs.txt
+++ b/icu4c/source/data/zone/bs.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/bs_Cyrl.txt b/icu4c/source/data/zone/bs_Cyrl.txt
index f380c65..a9ab791 100644
--- a/icu4c/source/data/zone/bs_Cyrl.txt
+++ b/icu4c/source/data/zone/bs_Cyrl.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs_Cyrl{
     %%Parent{"root"}
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абиџан"}
diff --git a/icu4c/source/data/zone/bs_Latn.txt b/icu4c/source/data/zone/bs_Latn.txt
index 5e72765..0ac3778 100644
--- a/icu4c/source/data/zone/bs_Latn.txt
+++ b/icu4c/source/data/zone/bs_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 bs_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/ca.txt b/icu4c/source/data/zone/ca.txt
index d7697dc..43292bf 100644
--- a/icu4c/source/data/zone/ca.txt
+++ b/icu4c/source/data/zone/ca.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ca{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/ccp.txt b/icu4c/source/data/zone/ccp.txt
index b45e1f8..9a20312 100644
--- a/icu4c/source/data/zone/ccp.txt
+++ b/icu4c/source/data/zone/ccp.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ccp{
-    Version{"2.1.37.51"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"𑄃𑄝𑄨𑄘𑄴𑄎𑄚𑄴"}
diff --git a/icu4c/source/data/zone/ce.txt b/icu4c/source/data/zone/ce.txt
index 2276206..78073a0 100644
--- a/icu4c/source/data/zone/ce.txt
+++ b/icu4c/source/data/zone/ce.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ce{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абиджан"}
@@ -303,6 +303,9 @@
         "America:El_Salvador"{
             ec{"Сальвадор"}
         }
+        "America:Fort_Nelson"{
+            ec{"Форт Нельсон"}
+        }
         "America:Fortaleza"{
             ec{"Форталеза"}
         }
@@ -504,6 +507,9 @@
         "America:Puerto_Rico"{
             ec{"Пуэрто-Рико"}
         }
+        "America:Punta_Arenas"{
+            ec{"Пунта-Аренас"}
+        }
         "America:Rainy_River"{
             ec{"Рейни-Ривер"}
         }
@@ -708,6 +714,9 @@
         "Asia:Dushanbe"{
             ec{"Душанбе"}
         }
+        "Asia:Famagusta"{
+            ec{"Фамагуста"}
+        }
         "Asia:Gaza"{
             ec{"Газа"}
         }
@@ -1278,7 +1287,7 @@
             ec{"Уоллис"}
         }
         "meta:Afghanistan"{
-            ls{"ОвхӀан мохк"}
+            ls{"ОвхӀан"}
         }
         "meta:Africa_Central"{
             ls{"Юккъера Африка"}
@@ -1422,9 +1431,9 @@
             ls{"Чили, стандартан хан"}
         }
         "meta:China"{
-            ld{"Китай, аьхкенан хан"}
-            lg{"Китай"}
-            ls{"Китай, стандартан хан"}
+            ld{"Цийчоьнан, аьхкенан хан"}
+            lg{"Цийчоь"}
+            ls{"Цийчоьнан, стандартан хан"}
         }
         "meta:Choibalsan"{
             ld{"Чойбалсан, аьхкенан хан"}
@@ -1552,7 +1561,7 @@
             ls{"Ховд, стандартан хан"}
         }
         "meta:India"{
-            ls{"Инди"}
+            ls{"ХӀинди"}
         }
         "meta:Indian_Ocean"{
             ls{"Индин океан"}
@@ -1585,9 +1594,9 @@
             ls{"Израиль, стандартан хан"}
         }
         "meta:Japan"{
-            ld{"Япони, аьхкенан хан"}
-            lg{"Япони"}
-            ls{"Япони, стандартан хан"}
+            ld{"Япон, аьхкенан хан"}
+            lg{"Япон"}
+            ls{"Япон, стандартан хан"}
         }
         "meta:Kazakhstan_Eastern"{
             ls{"Малхбален Казахстан"}
@@ -1752,6 +1761,9 @@
         "meta:Ponape"{
             ls{"Понапе, гӀ-наш"}
         }
+        "meta:Pyongyang"{
+            ls{"Пхеньян"}
+        }
         "meta:Reunion"{
             ls{"Реюньон"}
         }
diff --git a/icu4c/source/data/zone/cgg.txt b/icu4c/source/data/zone/cgg.txt
index c0ecc47..bb9e5b0 100644
--- a/icu4c/source/data/zone/cgg.txt
+++ b/icu4c/source/data/zone/cgg.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 cgg{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/chr.txt b/icu4c/source/data/zone/chr.txt
index 79114b8..140b0eb 100644
--- a/icu4c/source/data/zone/chr.txt
+++ b/icu4c/source/data/zone/chr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 chr{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"ᎠᏈᏣᏂ"}
diff --git a/icu4c/source/data/zone/ckb.txt b/icu4c/source/data/zone/ckb.txt
index f721c56..7bd24f8 100644
--- a/icu4c/source/data/zone/ckb.txt
+++ b/icu4c/source/data/zone/ckb.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ckb{
-    Version{"2.1.36.86"}
+    Version{"2.1.38.71"}
 }
diff --git a/icu4c/source/data/zone/cs.txt b/icu4c/source/data/zone/cs.txt
index 8045cb8..2360247 100644
--- a/icu4c/source/data/zone/cs.txt
+++ b/icu4c/source/data/zone/cs.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 cs{
-    Version{"2.1.37.11"}
+    Version{"2.1.39.15"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidžan"}
diff --git a/icu4c/source/data/zone/cy.txt b/icu4c/source/data/zone/cy.txt
index e86013f..9ddc96d 100644
--- a/icu4c/source/data/zone/cy.txt
+++ b/icu4c/source/data/zone/cy.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 cy{
-    Version{"2.1.37.17"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/da.txt b/icu4c/source/data/zone/da.txt
index 41a31e8..73b70de 100644
--- a/icu4c/source/data/zone/da.txt
+++ b/icu4c/source/data/zone/da.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 da{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/dav.txt b/icu4c/source/data/zone/dav.txt
index 467d8f4..4d93c1e 100644
--- a/icu4c/source/data/zone/dav.txt
+++ b/icu4c/source/data/zone/dav.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dav{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/de.txt b/icu4c/source/data/zone/de.txt
index 07ce768..7d54dbe 100644
--- a/icu4c/source/data/zone/de.txt
+++ b/icu4c/source/data/zone/de.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 de{
-    Version{"2.1.37.96"}
+    Version{"2.1.39.41"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/de_CH.txt b/icu4c/source/data/zone/de_CH.txt
index 4037d89..75a18ba 100644
--- a/icu4c/source/data/zone/de_CH.txt
+++ b/icu4c/source/data/zone/de_CH.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 de_CH{
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
     zoneStrings{
         "Europe:Saratov"{
             ec{"Saratov"}
diff --git a/icu4c/source/data/zone/dje.txt b/icu4c/source/data/zone/dje.txt
index 6ffaeef..f0c1678 100644
--- a/icu4c/source/data/zone/dje.txt
+++ b/icu4c/source/data/zone/dje.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dje{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/dsb.txt b/icu4c/source/data/zone/dsb.txt
index 6d967dc..baba7ac 100644
--- a/icu4c/source/data/zone/dsb.txt
+++ b/icu4c/source/data/zone/dsb.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dsb{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Accra"{
             ec{"Akkra"}
diff --git a/icu4c/source/data/zone/dua.txt b/icu4c/source/data/zone/dua.txt
index 9f33cd5..de51750 100644
--- a/icu4c/source/data/zone/dua.txt
+++ b/icu4c/source/data/zone/dua.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dua{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/dyo.txt b/icu4c/source/data/zone/dyo.txt
index a4a954e..ed65450 100644
--- a/icu4c/source/data/zone/dyo.txt
+++ b/icu4c/source/data/zone/dyo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dyo{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/dz.txt b/icu4c/source/data/zone/dz.txt
index 9b5ff3e..f846872 100644
--- a/icu4c/source/data/zone/dz.txt
+++ b/icu4c/source/data/zone/dz.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 dz{
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Africa:Cairo"{
             ec{"ཀཱའི་རོ"}
diff --git a/icu4c/source/data/zone/ebu.txt b/icu4c/source/data/zone/ebu.txt
index 2199f72..51158d6 100644
--- a/icu4c/source/data/zone/ebu.txt
+++ b/icu4c/source/data/zone/ebu.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ebu{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/ee.txt b/icu4c/source/data/zone/ee.txt
index ebaea9e..8d6b7ba 100644
--- a/icu4c/source/data/zone/ee.txt
+++ b/icu4c/source/data/zone/ee.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ee{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/el.txt b/icu4c/source/data/zone/el.txt
index f16f097..0b4cd60 100644
--- a/icu4c/source/data/zone/el.txt
+++ b/icu4c/source/data/zone/el.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 el{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Αμπιτζάν"}
diff --git a/icu4c/source/data/zone/en.txt b/icu4c/source/data/zone/en.txt
index 8546d1e..5c34566 100644
--- a/icu4c/source/data/zone/en.txt
+++ b/icu4c/source/data/zone/en.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en{
-    Version{"2.1.37.44"}
+    Version{"2.1.39.27"}
     zoneStrings{
         "Africa:Sao_Tome"{
             ec{"São Tomé"}
@@ -597,7 +597,7 @@
             ls{"Qyzylorda Standard Time"}
         }
         "meta:Reunion"{
-            ls{"Reunion Time"}
+            ls{"Réunion Time"}
         }
         "meta:Rothera"{
             ls{"Rothera Time"}
diff --git a/icu4c/source/data/zone/en_001.txt b/icu4c/source/data/zone/en_001.txt
index 4ac873c..0c66946 100644
--- a/icu4c/source/data/zone/en_001.txt
+++ b/icu4c/source/data/zone/en_001.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_001{
-    Version{"2.1.35.71"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Pacific:Honolulu"{
             sd{"∅∅∅"}
diff --git a/icu4c/source/data/zone/en_150.txt b/icu4c/source/data/zone/en_150.txt
index 69ccb4b..e03c52d 100644
--- a/icu4c/source/data/zone/en_150.txt
+++ b/icu4c/source/data/zone/en_150.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_150{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Europe_Central"{
             sd{"CEST"}
diff --git a/icu4c/source/data/zone/en_AG.txt b/icu4c/source/data/zone/en_AG.txt
index ed7f63d..dab34a4 100644
--- a/icu4c/source/data/zone/en_AG.txt
+++ b/icu4c/source/data/zone/en_AG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_AI.txt b/icu4c/source/data/zone/en_AI.txt
index a92294b..e77964d 100644
--- a/icu4c/source/data/zone/en_AI.txt
+++ b/icu4c/source/data/zone/en_AI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_AT.txt b/icu4c/source/data/zone/en_AT.txt
index 0bca0cd..c955b37 100644
--- a/icu4c/source/data/zone/en_AT.txt
+++ b/icu4c/source/data/zone/en_AT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AT{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_AU.txt b/icu4c/source/data/zone/en_AU.txt
index cbf51a3..bb6d6d4 100644
--- a/icu4c/source/data/zone/en_AU.txt
+++ b/icu4c/source/data/zone/en_AU.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_AU{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
     zoneStrings{
         "America:St_Barthelemy"{
             ec{"St Barthélemy"}
diff --git a/icu4c/source/data/zone/en_BB.txt b/icu4c/source/data/zone/en_BB.txt
index 2c2c05e..a3a8e74 100644
--- a/icu4c/source/data/zone/en_BB.txt
+++ b/icu4c/source/data/zone/en_BB.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BB{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_BE.txt b/icu4c/source/data/zone/en_BE.txt
index 6c7e5ab..c0eab02 100644
--- a/icu4c/source/data/zone/en_BE.txt
+++ b/icu4c/source/data/zone/en_BE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BE{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_BM.txt b/icu4c/source/data/zone/en_BM.txt
index a07478e..dfb1e87 100644
--- a/icu4c/source/data/zone/en_BM.txt
+++ b/icu4c/source/data/zone/en_BM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_BS.txt b/icu4c/source/data/zone/en_BS.txt
index 3457002..2d87547 100644
--- a/icu4c/source/data/zone/en_BS.txt
+++ b/icu4c/source/data/zone/en_BS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_BW.txt b/icu4c/source/data/zone/en_BW.txt
index 2e1667d..afaeebc 100644
--- a/icu4c/source/data/zone/en_BW.txt
+++ b/icu4c/source/data/zone/en_BW.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_BZ.txt b/icu4c/source/data/zone/en_BZ.txt
index 8807b66..8a36306 100644
--- a/icu4c/source/data/zone/en_BZ.txt
+++ b/icu4c/source/data/zone/en_BZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_BZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_CA.txt b/icu4c/source/data/zone/en_CA.txt
index 5d99a25..60e3919 100644
--- a/icu4c/source/data/zone/en_CA.txt
+++ b/icu4c/source/data/zone/en_CA.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CA{
     %%Parent{"en_001"}
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     zoneStrings{
         "Asia:Rangoon"{
             ec{"Rangoon"}
diff --git a/icu4c/source/data/zone/en_CC.txt b/icu4c/source/data/zone/en_CC.txt
index 67fe580..e8c2d33 100644
--- a/icu4c/source/data/zone/en_CC.txt
+++ b/icu4c/source/data/zone/en_CC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_CH.txt b/icu4c/source/data/zone/en_CH.txt
index 1bbe260..745eed0 100644
--- a/icu4c/source/data/zone/en_CH.txt
+++ b/icu4c/source/data/zone/en_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CH{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_CK.txt b/icu4c/source/data/zone/en_CK.txt
index 8f3b9a4..a6909b9 100644
--- a/icu4c/source/data/zone/en_CK.txt
+++ b/icu4c/source/data/zone/en_CK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_CM.txt b/icu4c/source/data/zone/en_CM.txt
index 55f692f..6f69b0b 100644
--- a/icu4c/source/data/zone/en_CM.txt
+++ b/icu4c/source/data/zone/en_CM.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_CX.txt b/icu4c/source/data/zone/en_CX.txt
index 4e3c98e..7166f9d 100644
--- a/icu4c/source/data/zone/en_CX.txt
+++ b/icu4c/source/data/zone/en_CX.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CX{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_CY.txt b/icu4c/source/data/zone/en_CY.txt
index 4fa4a14..6e80705 100644
--- a/icu4c/source/data/zone/en_CY.txt
+++ b/icu4c/source/data/zone/en_CY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_CY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_DE.txt b/icu4c/source/data/zone/en_DE.txt
index fd11453..9631682 100644
--- a/icu4c/source/data/zone/en_DE.txt
+++ b/icu4c/source/data/zone/en_DE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DE{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_DG.txt b/icu4c/source/data/zone/en_DG.txt
index bd59dcb..a185284 100644
--- a/icu4c/source/data/zone/en_DG.txt
+++ b/icu4c/source/data/zone/en_DG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_DK.txt b/icu4c/source/data/zone/en_DK.txt
index 9f596cd..342c391 100644
--- a/icu4c/source/data/zone/en_DK.txt
+++ b/icu4c/source/data/zone/en_DK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DK{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_DM.txt b/icu4c/source/data/zone/en_DM.txt
index 067f54d..ead644c 100644
--- a/icu4c/source/data/zone/en_DM.txt
+++ b/icu4c/source/data/zone/en_DM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_DM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_ER.txt b/icu4c/source/data/zone/en_ER.txt
index 352a799..d1c2baa 100644
--- a/icu4c/source/data/zone/en_ER.txt
+++ b/icu4c/source/data/zone/en_ER.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ER{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_FI.txt b/icu4c/source/data/zone/en_FI.txt
index 0940644..8626b24 100644
--- a/icu4c/source/data/zone/en_FI.txt
+++ b/icu4c/source/data/zone/en_FI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FI{
     %%Parent{"en_150"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_FJ.txt b/icu4c/source/data/zone/en_FJ.txt
index 17022d5..32898fb 100644
--- a/icu4c/source/data/zone/en_FJ.txt
+++ b/icu4c/source/data/zone/en_FJ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FJ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_FK.txt b/icu4c/source/data/zone/en_FK.txt
index edbb4d8..7551e65 100644
--- a/icu4c/source/data/zone/en_FK.txt
+++ b/icu4c/source/data/zone/en_FK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_FM.txt b/icu4c/source/data/zone/en_FM.txt
index 9b1d31f..e4a293d 100644
--- a/icu4c/source/data/zone/en_FM.txt
+++ b/icu4c/source/data/zone/en_FM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_FM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_GB.txt b/icu4c/source/data/zone/en_GB.txt
index 15724aa..9cfc8d8 100644
--- a/icu4c/source/data/zone/en_GB.txt
+++ b/icu4c/source/data/zone/en_GB.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GB{
     %%Parent{"en_001"}
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     zoneStrings{
         "America:St_Barthelemy"{
             ec{"St Barthélemy"}
diff --git a/icu4c/source/data/zone/en_GD.txt b/icu4c/source/data/zone/en_GD.txt
index a006727..9ad43f3 100644
--- a/icu4c/source/data/zone/en_GD.txt
+++ b/icu4c/source/data/zone/en_GD.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_GG.txt b/icu4c/source/data/zone/en_GG.txt
index b91b6b8..6e3d4df 100644
--- a/icu4c/source/data/zone/en_GG.txt
+++ b/icu4c/source/data/zone/en_GG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_GH.txt b/icu4c/source/data/zone/en_GH.txt
index 1dadcbf..4d90fe8 100644
--- a/icu4c/source/data/zone/en_GH.txt
+++ b/icu4c/source/data/zone/en_GH.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_GI.txt b/icu4c/source/data/zone/en_GI.txt
index e19c4d8..fc5f7d7 100644
--- a/icu4c/source/data/zone/en_GI.txt
+++ b/icu4c/source/data/zone/en_GI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_GM.txt b/icu4c/source/data/zone/en_GM.txt
index 2aaeaa6..a2278c2 100644
--- a/icu4c/source/data/zone/en_GM.txt
+++ b/icu4c/source/data/zone/en_GM.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_GU.txt b/icu4c/source/data/zone/en_GU.txt
index 23ce62c..0448d10 100644
--- a/icu4c/source/data/zone/en_GU.txt
+++ b/icu4c/source/data/zone/en_GU.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GU{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Chamorro"{
             ss{"ChST"}
diff --git a/icu4c/source/data/zone/en_GY.txt b/icu4c/source/data/zone/en_GY.txt
index eeea58f..2513873 100644
--- a/icu4c/source/data/zone/en_GY.txt
+++ b/icu4c/source/data/zone/en_GY.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_GY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Guyana"{
             ss{"GYT"}
diff --git a/icu4c/source/data/zone/en_HK.txt b/icu4c/source/data/zone/en_HK.txt
index b257bd2..bee99f9 100644
--- a/icu4c/source/data/zone/en_HK.txt
+++ b/icu4c/source/data/zone/en_HK.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_HK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Hong_Kong"{
             sd{"HKST"}
diff --git a/icu4c/source/data/zone/en_IE.txt b/icu4c/source/data/zone/en_IE.txt
index b137172..13adfe4 100644
--- a/icu4c/source/data/zone/en_IE.txt
+++ b/icu4c/source/data/zone/en_IE.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Europe:Dublin"{
             sd{"IST"}
diff --git a/icu4c/source/data/zone/en_IL.txt b/icu4c/source/data/zone/en_IL.txt
index 55a5091..df09f53d 100644
--- a/icu4c/source/data/zone/en_IL.txt
+++ b/icu4c/source/data/zone/en_IL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_IM.txt b/icu4c/source/data/zone/en_IM.txt
index 3ccab11..2af0241 100644
--- a/icu4c/source/data/zone/en_IM.txt
+++ b/icu4c/source/data/zone/en_IM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_IN.txt b/icu4c/source/data/zone/en_IN.txt
index b1665c0..3cf5204 100644
--- a/icu4c/source/data/zone/en_IN.txt
+++ b/icu4c/source/data/zone/en_IN.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IN{
     %%Parent{"en_001"}
-    Version{"2.1.37.11"}
+    Version{"2.1.38.73"}
     zoneStrings{
         "Asia:Rangoon"{
             ec{"Rangoon"}
diff --git a/icu4c/source/data/zone/en_IO.txt b/icu4c/source/data/zone/en_IO.txt
index 3f89192..d87cdff 100644
--- a/icu4c/source/data/zone/en_IO.txt
+++ b/icu4c/source/data/zone/en_IO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_IO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_JE.txt b/icu4c/source/data/zone/en_JE.txt
index 66de22d..2d50f0a 100644
--- a/icu4c/source/data/zone/en_JE.txt
+++ b/icu4c/source/data/zone/en_JE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_JE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_JM.txt b/icu4c/source/data/zone/en_JM.txt
index ad3c905..c7e0fef 100644
--- a/icu4c/source/data/zone/en_JM.txt
+++ b/icu4c/source/data/zone/en_JM.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_JM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_KE.txt b/icu4c/source/data/zone/en_KE.txt
index 99f6540..0bc982e 100644
--- a/icu4c/source/data/zone/en_KE.txt
+++ b/icu4c/source/data/zone/en_KE.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KE{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_KI.txt b/icu4c/source/data/zone/en_KI.txt
index f671853..74349d3 100644
--- a/icu4c/source/data/zone/en_KI.txt
+++ b/icu4c/source/data/zone/en_KI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KI{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_KN.txt b/icu4c/source/data/zone/en_KN.txt
index 573c389..3accb4c 100644
--- a/icu4c/source/data/zone/en_KN.txt
+++ b/icu4c/source/data/zone/en_KN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KN{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_KY.txt b/icu4c/source/data/zone/en_KY.txt
index 0d60082..dfde982 100644
--- a/icu4c/source/data/zone/en_KY.txt
+++ b/icu4c/source/data/zone/en_KY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_KY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_LC.txt b/icu4c/source/data/zone/en_LC.txt
index 7033a6a..9c2e8c4 100644
--- a/icu4c/source/data/zone/en_LC.txt
+++ b/icu4c/source/data/zone/en_LC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_LR.txt b/icu4c/source/data/zone/en_LR.txt
index cdc0e9c..96e8342 100644
--- a/icu4c/source/data/zone/en_LR.txt
+++ b/icu4c/source/data/zone/en_LR.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LR{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_LS.txt b/icu4c/source/data/zone/en_LS.txt
index d763f1c..b66f500 100644
--- a/icu4c/source/data/zone/en_LS.txt
+++ b/icu4c/source/data/zone/en_LS.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_LS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_MG.txt b/icu4c/source/data/zone/en_MG.txt
index b4f8e39..b0517d6 100644
--- a/icu4c/source/data/zone/en_MG.txt
+++ b/icu4c/source/data/zone/en_MG.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_MH.txt b/icu4c/source/data/zone/en_MH.txt
index b274226..474bcc9 100644
--- a/icu4c/source/data/zone/en_MH.txt
+++ b/icu4c/source/data/zone/en_MH.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MH{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Pacific:Honolulu"{
             sd{"∅∅∅"}
diff --git a/icu4c/source/data/zone/en_MO.txt b/icu4c/source/data/zone/en_MO.txt
index b6df445..85411fc 100644
--- a/icu4c/source/data/zone/en_MO.txt
+++ b/icu4c/source/data/zone/en_MO.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Hong_Kong"{
             sd{"HKST"}
diff --git a/icu4c/source/data/zone/en_MP.txt b/icu4c/source/data/zone/en_MP.txt
index 431abca..317e58a 100644
--- a/icu4c/source/data/zone/en_MP.txt
+++ b/icu4c/source/data/zone/en_MP.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MP{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Pacific:Honolulu"{
             sd{"∅∅∅"}
diff --git a/icu4c/source/data/zone/en_MS.txt b/icu4c/source/data/zone/en_MS.txt
index 28ef10d..31e4995 100644
--- a/icu4c/source/data/zone/en_MS.txt
+++ b/icu4c/source/data/zone/en_MS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_MT.txt b/icu4c/source/data/zone/en_MT.txt
index 0d4bc8b..5ae61e8 100644
--- a/icu4c/source/data/zone/en_MT.txt
+++ b/icu4c/source/data/zone/en_MT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MT{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_MU.txt b/icu4c/source/data/zone/en_MU.txt
index 142bd4b..39e1bb3 100644
--- a/icu4c/source/data/zone/en_MU.txt
+++ b/icu4c/source/data/zone/en_MU.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_MW.txt b/icu4c/source/data/zone/en_MW.txt
index 6108372..fc99065 100644
--- a/icu4c/source/data/zone/en_MW.txt
+++ b/icu4c/source/data/zone/en_MW.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_MY.txt b/icu4c/source/data/zone/en_MY.txt
index b6c151f..deb91d3 100644
--- a/icu4c/source/data/zone/en_MY.txt
+++ b/icu4c/source/data/zone/en_MY.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_MY{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Malaysia"{
             ss{"MYT"}
diff --git a/icu4c/source/data/zone/en_NA.txt b/icu4c/source/data/zone/en_NA.txt
index 9feab5e..b879661d 100644
--- a/icu4c/source/data/zone/en_NA.txt
+++ b/icu4c/source/data/zone/en_NA.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NA{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_NF.txt b/icu4c/source/data/zone/en_NF.txt
index 56b1a98..b1e3b07 100644
--- a/icu4c/source/data/zone/en_NF.txt
+++ b/icu4c/source/data/zone/en_NF.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NF{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_NG.txt b/icu4c/source/data/zone/en_NG.txt
index 8d8610a..c584ac6 100644
--- a/icu4c/source/data/zone/en_NG.txt
+++ b/icu4c/source/data/zone/en_NG.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_NL.txt b/icu4c/source/data/zone/en_NL.txt
index 4566eb3..d27f8a3 100644
--- a/icu4c/source/data/zone/en_NL.txt
+++ b/icu4c/source/data/zone/en_NL.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NL{
     %%Parent{"en_150"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_NR.txt b/icu4c/source/data/zone/en_NR.txt
index a66b87f..7e1b070 100644
--- a/icu4c/source/data/zone/en_NR.txt
+++ b/icu4c/source/data/zone/en_NR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NR{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_NU.txt b/icu4c/source/data/zone/en_NU.txt
index 86aa256..d79dc18 100644
--- a/icu4c/source/data/zone/en_NU.txt
+++ b/icu4c/source/data/zone/en_NU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_NZ.txt b/icu4c/source/data/zone/en_NZ.txt
index 93e36b2..60e25a9 100644
--- a/icu4c/source/data/zone/en_NZ.txt
+++ b/icu4c/source/data/zone/en_NZ.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_NZ{
     %%Parent{"en_001"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
     zoneStrings{
         "meta:Australia_Central"{
             sd{"ACDT"}
diff --git a/icu4c/source/data/zone/en_PG.txt b/icu4c/source/data/zone/en_PG.txt
index 6146600..b0aa15c 100644
--- a/icu4c/source/data/zone/en_PG.txt
+++ b/icu4c/source/data/zone/en_PG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_PH.txt b/icu4c/source/data/zone/en_PH.txt
index 04ac66a..94d6d4c 100644
--- a/icu4c/source/data/zone/en_PH.txt
+++ b/icu4c/source/data/zone/en_PH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_PK.txt b/icu4c/source/data/zone/en_PK.txt
index 3d5d2f6..ae335ca 100644
--- a/icu4c/source/data/zone/en_PK.txt
+++ b/icu4c/source/data/zone/en_PK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_PN.txt b/icu4c/source/data/zone/en_PN.txt
index 8b83a8d..907c98b 100644
--- a/icu4c/source/data/zone/en_PN.txt
+++ b/icu4c/source/data/zone/en_PN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PN{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_PW.txt b/icu4c/source/data/zone/en_PW.txt
index 43ec73a..14fe4d0 100644
--- a/icu4c/source/data/zone/en_PW.txt
+++ b/icu4c/source/data/zone/en_PW.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_PW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_RW.txt b/icu4c/source/data/zone/en_RW.txt
index ed8d086..f5c0211 100644
--- a/icu4c/source/data/zone/en_RW.txt
+++ b/icu4c/source/data/zone/en_RW.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_RW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_SB.txt b/icu4c/source/data/zone/en_SB.txt
index 08287c0..135fc64 100644
--- a/icu4c/source/data/zone/en_SB.txt
+++ b/icu4c/source/data/zone/en_SB.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SB{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_SC.txt b/icu4c/source/data/zone/en_SC.txt
index 9c80308..9026bef 100644
--- a/icu4c/source/data/zone/en_SC.txt
+++ b/icu4c/source/data/zone/en_SC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_SD.txt b/icu4c/source/data/zone/en_SD.txt
index bbcda66..8a77095 100644
--- a/icu4c/source/data/zone/en_SD.txt
+++ b/icu4c/source/data/zone/en_SD.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SD{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_SE.txt b/icu4c/source/data/zone/en_SE.txt
index 35978fe..fa6772c 100644
--- a/icu4c/source/data/zone/en_SE.txt
+++ b/icu4c/source/data/zone/en_SE.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SE{
     %%Parent{"en_150"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_SG.txt b/icu4c/source/data/zone/en_SG.txt
index 0a95579..b209469 100644
--- a/icu4c/source/data/zone/en_SG.txt
+++ b/icu4c/source/data/zone/en_SG.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Malaysia"{
             ss{"MYT"}
diff --git a/icu4c/source/data/zone/en_SH.txt b/icu4c/source/data/zone/en_SH.txt
index dbaac39..46006e9 100644
--- a/icu4c/source/data/zone/en_SH.txt
+++ b/icu4c/source/data/zone/en_SH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SH{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_SI.txt b/icu4c/source/data/zone/en_SI.txt
index c6837fe..8dc7c6a 100644
--- a/icu4c/source/data/zone/en_SI.txt
+++ b/icu4c/source/data/zone/en_SI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SI{
     %%Parent{"en_150"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_SL.txt b/icu4c/source/data/zone/en_SL.txt
index e5e4286..b0c4e29 100644
--- a/icu4c/source/data/zone/en_SL.txt
+++ b/icu4c/source/data/zone/en_SL.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SL{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_SS.txt b/icu4c/source/data/zone/en_SS.txt
index 3ae2e52..3955765 100644
--- a/icu4c/source/data/zone/en_SS.txt
+++ b/icu4c/source/data/zone/en_SS.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_SX.txt b/icu4c/source/data/zone/en_SX.txt
index c619269..e6eb9bb 100644
--- a/icu4c/source/data/zone/en_SX.txt
+++ b/icu4c/source/data/zone/en_SX.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SX{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_SZ.txt b/icu4c/source/data/zone/en_SZ.txt
index 3d5fdce..dd32505 100644
--- a/icu4c/source/data/zone/en_SZ.txt
+++ b/icu4c/source/data/zone/en_SZ.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_SZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_TC.txt b/icu4c/source/data/zone/en_TC.txt
index 31b22e7..6d30689 100644
--- a/icu4c/source/data/zone/en_TC.txt
+++ b/icu4c/source/data/zone/en_TC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_TK.txt b/icu4c/source/data/zone/en_TK.txt
index 380b9d9..a102a8c 100644
--- a/icu4c/source/data/zone/en_TK.txt
+++ b/icu4c/source/data/zone/en_TK.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TK{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_TO.txt b/icu4c/source/data/zone/en_TO.txt
index 426b5d6..3f82fa0 100644
--- a/icu4c/source/data/zone/en_TO.txt
+++ b/icu4c/source/data/zone/en_TO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TO{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_TT.txt b/icu4c/source/data/zone/en_TT.txt
index 4d6d39d..284f5f7 100644
--- a/icu4c/source/data/zone/en_TT.txt
+++ b/icu4c/source/data/zone/en_TT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TT{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_TV.txt b/icu4c/source/data/zone/en_TV.txt
index debe076..7ad38cb 100644
--- a/icu4c/source/data/zone/en_TV.txt
+++ b/icu4c/source/data/zone/en_TV.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TV{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_TZ.txt b/icu4c/source/data/zone/en_TZ.txt
index e2b2c02..926e95a 100644
--- a/icu4c/source/data/zone/en_TZ.txt
+++ b/icu4c/source/data/zone/en_TZ.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_TZ{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_UG.txt b/icu4c/source/data/zone/en_UG.txt
index 7660008..4106c4d 100644
--- a/icu4c/source/data/zone/en_UG.txt
+++ b/icu4c/source/data/zone/en_UG.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_UG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_VC.txt b/icu4c/source/data/zone/en_VC.txt
index dc17ae0..7f5fda9 100644
--- a/icu4c/source/data/zone/en_VC.txt
+++ b/icu4c/source/data/zone/en_VC.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VC{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_VG.txt b/icu4c/source/data/zone/en_VG.txt
index 995ae52..0e708c0 100644
--- a/icu4c/source/data/zone/en_VG.txt
+++ b/icu4c/source/data/zone/en_VG.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VG{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_VU.txt b/icu4c/source/data/zone/en_VU.txt
index 433c4c9..5fe2f2a 100644
--- a/icu4c/source/data/zone/en_VU.txt
+++ b/icu4c/source/data/zone/en_VU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_VU{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_WS.txt b/icu4c/source/data/zone/en_WS.txt
index 0697889..00ce51e 100644
--- a/icu4c/source/data/zone/en_WS.txt
+++ b/icu4c/source/data/zone/en_WS.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_WS{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/en_ZA.txt b/icu4c/source/data/zone/en_ZA.txt
index 94874f7..ee91a8f 100644
--- a/icu4c/source/data/zone/en_ZA.txt
+++ b/icu4c/source/data/zone/en_ZA.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZA{
     %%Parent{"en_001"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_ZM.txt b/icu4c/source/data/zone/en_ZM.txt
index 4165d7a..6ab63ad 100644
--- a/icu4c/source/data/zone/en_ZM.txt
+++ b/icu4c/source/data/zone/en_ZM.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZM{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/en_ZW.txt b/icu4c/source/data/zone/en_ZW.txt
index bad1607..0f8ee03 100644
--- a/icu4c/source/data/zone/en_ZW.txt
+++ b/icu4c/source/data/zone/en_ZW.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 en_ZW{
     %%Parent{"en_001"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Africa_Central"{
             ss{"CAT"}
diff --git a/icu4c/source/data/zone/eo.txt b/icu4c/source/data/zone/eo.txt
index 81bca0f..a39005c 100644
--- a/icu4c/source/data/zone/eo.txt
+++ b/icu4c/source/data/zone/eo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 eo{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/es.txt b/icu4c/source/data/zone/es.txt
index 093d60f..8941dbd 100644
--- a/icu4c/source/data/zone/es.txt
+++ b/icu4c/source/data/zone/es.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abiyán"}
@@ -535,7 +535,7 @@
             ec{"Santarém"}
         }
         "America:Santiago"{
-            ec{"Santiago"}
+            ec{"Santiago de Chile"}
         }
         "America:Santo_Domingo"{
             ec{"Santo Domingo"}
diff --git a/icu4c/source/data/zone/es_419.txt b/icu4c/source/data/zone/es_419.txt
index cf4e1fe..4597e93 100644
--- a/icu4c/source/data/zone/es_419.txt
+++ b/icu4c/source/data/zone/es_419.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_419{
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "Africa:Accra"{
             ec{"Accra"}
diff --git a/icu4c/source/data/zone/es_AR.txt b/icu4c/source/data/zone/es_AR.txt
index 75f68b2..506d4ca 100644
--- a/icu4c/source/data/zone/es_AR.txt
+++ b/icu4c/source/data/zone/es_AR.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_AR{
     %%Parent{"es_419"}
-    Version{"2.1.37.22"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Argentina"{
             sd{"ARST"}
diff --git a/icu4c/source/data/zone/es_BO.txt b/icu4c/source/data/zone/es_BO.txt
index 61af802..c43c4a8 100644
--- a/icu4c/source/data/zone/es_BO.txt
+++ b/icu4c/source/data/zone/es_BO.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BO{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Bolivia"{
             ss{"BOT"}
diff --git a/icu4c/source/data/zone/es_BR.txt b/icu4c/source/data/zone/es_BR.txt
index ee8a444..1115ce9 100644
--- a/icu4c/source/data/zone/es_BR.txt
+++ b/icu4c/source/data/zone/es_BR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BR{
     %%Parent{"es_419"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_BZ.txt b/icu4c/source/data/zone/es_BZ.txt
index 7734598..3d2302c 100644
--- a/icu4c/source/data/zone/es_BZ.txt
+++ b/icu4c/source/data/zone/es_BZ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_BZ{
     %%Parent{"es_419"}
-    Version{"2.1.32.37"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_CL.txt b/icu4c/source/data/zone/es_CL.txt
index 78fe6ba..3a0c927 100644
--- a/icu4c/source/data/zone/es_CL.txt
+++ b/icu4c/source/data/zone/es_CL.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CL{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Chile"{
             sd{"CLST"}
diff --git a/icu4c/source/data/zone/es_CO.txt b/icu4c/source/data/zone/es_CO.txt
index 67be7c8..abdd1ec 100644
--- a/icu4c/source/data/zone/es_CO.txt
+++ b/icu4c/source/data/zone/es_CO.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CO{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Colombia"{
             sd{"COST"}
diff --git a/icu4c/source/data/zone/es_CR.txt b/icu4c/source/data/zone/es_CR.txt
index 1c76e28..7cfafd6 100644
--- a/icu4c/source/data/zone/es_CR.txt
+++ b/icu4c/source/data/zone/es_CR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CR{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_CU.txt b/icu4c/source/data/zone/es_CU.txt
index f75d29f..3fb6de1 100644
--- a/icu4c/source/data/zone/es_CU.txt
+++ b/icu4c/source/data/zone/es_CU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_CU{
     %%Parent{"es_419"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_DO.txt b/icu4c/source/data/zone/es_DO.txt
index df7b8fc..40f5604 100644
--- a/icu4c/source/data/zone/es_DO.txt
+++ b/icu4c/source/data/zone/es_DO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_DO{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_EC.txt b/icu4c/source/data/zone/es_EC.txt
index ebd79da..cb58859 100644
--- a/icu4c/source/data/zone/es_EC.txt
+++ b/icu4c/source/data/zone/es_EC.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_EC{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Ecuador"{
             ss{"ECT"}
diff --git a/icu4c/source/data/zone/es_GT.txt b/icu4c/source/data/zone/es_GT.txt
index 9c61a0e..8fada43 100644
--- a/icu4c/source/data/zone/es_GT.txt
+++ b/icu4c/source/data/zone/es_GT.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_GT{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_HN.txt b/icu4c/source/data/zone/es_HN.txt
index 0f5bdd9..fbd1b89 100644
--- a/icu4c/source/data/zone/es_HN.txt
+++ b/icu4c/source/data/zone/es_HN.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_HN{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_MX.txt b/icu4c/source/data/zone/es_MX.txt
index aa6d662..2d1a890 100644
--- a/icu4c/source/data/zone/es_MX.txt
+++ b/icu4c/source/data/zone/es_MX.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_MX{
     %%Parent{"es_419"}
-    Version{"2.1.37.32"}
+    Version{"2.1.38.73"}
     zoneStrings{
         "Africa:Accra"{
             ec{"Acra"}
diff --git a/icu4c/source/data/zone/es_NI.txt b/icu4c/source/data/zone/es_NI.txt
index 13bc101..ccbc5d7 100644
--- a/icu4c/source/data/zone/es_NI.txt
+++ b/icu4c/source/data/zone/es_NI.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_NI{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_PA.txt b/icu4c/source/data/zone/es_PA.txt
index 670b666..a1761c0 100644
--- a/icu4c/source/data/zone/es_PA.txt
+++ b/icu4c/source/data/zone/es_PA.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PA{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_PE.txt b/icu4c/source/data/zone/es_PE.txt
index 9a4613f..7c8ae4d 100644
--- a/icu4c/source/data/zone/es_PE.txt
+++ b/icu4c/source/data/zone/es_PE.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PE{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Peru"{
             sd{"PEST"}
diff --git a/icu4c/source/data/zone/es_PR.txt b/icu4c/source/data/zone/es_PR.txt
index b2f6a02..e32abc3 100644
--- a/icu4c/source/data/zone/es_PR.txt
+++ b/icu4c/source/data/zone/es_PR.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PR{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_PY.txt b/icu4c/source/data/zone/es_PY.txt
index 3b86492..55990e4 100644
--- a/icu4c/source/data/zone/es_PY.txt
+++ b/icu4c/source/data/zone/es_PY.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_PY{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_SV.txt b/icu4c/source/data/zone/es_SV.txt
index f3ed768..ba50c55 100644
--- a/icu4c/source/data/zone/es_SV.txt
+++ b/icu4c/source/data/zone/es_SV.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_SV{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/es_US.txt b/icu4c/source/data/zone/es_US.txt
index 8ed3d50..8aa282e 100644
--- a/icu4c/source/data/zone/es_US.txt
+++ b/icu4c/source/data/zone/es_US.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_US{
     %%Parent{"es_419"}
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     zoneStrings{
         "Africa:Accra"{
             ec{"Acra"}
diff --git a/icu4c/source/data/zone/es_UY.txt b/icu4c/source/data/zone/es_UY.txt
index 3f16d81..0537a6e 100644
--- a/icu4c/source/data/zone/es_UY.txt
+++ b/icu4c/source/data/zone/es_UY.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_UY{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Uruguay"{
             sd{"UYST"}
diff --git a/icu4c/source/data/zone/es_VE.txt b/icu4c/source/data/zone/es_VE.txt
index c0b3d7f..66b343f 100644
--- a/icu4c/source/data/zone/es_VE.txt
+++ b/icu4c/source/data/zone/es_VE.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 es_VE{
     %%Parent{"es_419"}
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Venezuela"{
             ss{"VET"}
diff --git a/icu4c/source/data/zone/et.txt b/icu4c/source/data/zone/et.txt
index ed269af..06058b8 100644
--- a/icu4c/source/data/zone/et.txt
+++ b/icu4c/source/data/zone/et.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 et{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/eu.txt b/icu4c/source/data/zone/eu.txt
index 0f4c7b1..460033b 100644
--- a/icu4c/source/data/zone/eu.txt
+++ b/icu4c/source/data/zone/eu.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 eu{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/ewo.txt b/icu4c/source/data/zone/ewo.txt
index 526c3e0..32e11ea 100644
--- a/icu4c/source/data/zone/ewo.txt
+++ b/icu4c/source/data/zone/ewo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ewo{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/fa.txt b/icu4c/source/data/zone/fa.txt
index dcaa046..802e83b 100644
--- a/icu4c/source/data/zone/fa.txt
+++ b/icu4c/source/data/zone/fa.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fa{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"آبیجان"}
diff --git a/icu4c/source/data/zone/ff.txt b/icu4c/source/data/zone/ff.txt
index 83c4535..71a6b94 100644
--- a/icu4c/source/data/zone/ff.txt
+++ b/icu4c/source/data/zone/ff.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ff{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/fi.txt b/icu4c/source/data/zone/fi.txt
index 31d1e42..2330293 100644
--- a/icu4c/source/data/zone/fi.txt
+++ b/icu4c/source/data/zone/fi.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fi{
-    Version{"2.1.37.67"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/fil.txt b/icu4c/source/data/zone/fil.txt
index 19bdca6..03f1835 100644
--- a/icu4c/source/data/zone/fil.txt
+++ b/icu4c/source/data/zone/fil.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fil{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/fo.txt b/icu4c/source/data/zone/fo.txt
index 3b8fbf8..e4354fe 100644
--- a/icu4c/source/data/zone/fo.txt
+++ b/icu4c/source/data/zone/fo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fo{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
@@ -148,7 +148,7 @@
             ec{"Porto-Novo"}
         }
         "Africa:Sao_Tome"{
-            ec{"Sao Tome"}
+            ec{"São Tomé"}
         }
         "Africa:Tripoli"{
             ec{"Tripoli"}
@@ -1110,7 +1110,7 @@
             ec{"Ulyanovsk"}
         }
         "Europe:Uzhgorod"{
-            ec{"Uzhgorod"}
+            ec{"Uzhhorod"}
         }
         "Europe:Vaduz"{
             ec{"Vaduz"}
diff --git a/icu4c/source/data/zone/fr.txt b/icu4c/source/data/zone/fr.txt
index e12e975..8bfacdb 100644
--- a/icu4c/source/data/zone/fr.txt
+++ b/icu4c/source/data/zone/fr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/fr_CA.txt b/icu4c/source/data/zone/fr_CA.txt
index f254ff0..e424365 100644
--- a/icu4c/source/data/zone/fr_CA.txt
+++ b/icu4c/source/data/zone/fr_CA.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_CA{
-    Version{"2.1.37.22"}
+    Version{"2.1.38.73"}
     zoneStrings{
         "Africa:Ndjamena"{
             ec{"Ndjamena"}
diff --git a/icu4c/source/data/zone/fr_GF.txt b/icu4c/source/data/zone/fr_GF.txt
index 695d907..c805647 100644
--- a/icu4c/source/data/zone/fr_GF.txt
+++ b/icu4c/source/data/zone/fr_GF.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fr_GF{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:French_Guiana"{
             ss{"GFT"}
diff --git a/icu4c/source/data/zone/fur.txt b/icu4c/source/data/zone/fur.txt
index 47eed75..b1cea21 100644
--- a/icu4c/source/data/zone/fur.txt
+++ b/icu4c/source/data/zone/fur.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fur{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "America:New_York"{
             ec{"Gnove York"}
diff --git a/icu4c/source/data/zone/fy.txt b/icu4c/source/data/zone/fy.txt
index 5c2d522..62ade7f 100644
--- a/icu4c/source/data/zone/fy.txt
+++ b/icu4c/source/data/zone/fy.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 fy{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Addis_Ababa"{
             ec{"Addis Abeba"}
diff --git a/icu4c/source/data/zone/ga.txt b/icu4c/source/data/zone/ga.txt
index e1b8843..9c04cb3 100644
--- a/icu4c/source/data/zone/ga.txt
+++ b/icu4c/source/data/zone/ga.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ga{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/gd.txt b/icu4c/source/data/zone/gd.txt
index 231f956..6e33dbf 100644
--- a/icu4c/source/data/zone/gd.txt
+++ b/icu4c/source/data/zone/gd.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gd{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/gl.txt b/icu4c/source/data/zone/gl.txt
index 0be0da4..420e39c 100644
--- a/icu4c/source/data/zone/gl.txt
+++ b/icu4c/source/data/zone/gl.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gl{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/gsw.txt b/icu4c/source/data/zone/gsw.txt
index 030b1b7..d9f1bd4 100644
--- a/icu4c/source/data/zone/gsw.txt
+++ b/icu4c/source/data/zone/gsw.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gsw{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Accra"{
             ec{"Akkra"}
diff --git a/icu4c/source/data/zone/gu.txt b/icu4c/source/data/zone/gu.txt
index c7e0eaf..210ac8a 100644
--- a/icu4c/source/data/zone/gu.txt
+++ b/icu4c/source/data/zone/gu.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gu{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"આબિદ્જાન"}
diff --git a/icu4c/source/data/zone/guz.txt b/icu4c/source/data/zone/guz.txt
index f7ea241..cb3724f 100644
--- a/icu4c/source/data/zone/guz.txt
+++ b/icu4c/source/data/zone/guz.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 guz{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/gv.txt b/icu4c/source/data/zone/gv.txt
index bad1078..4529a09 100644
--- a/icu4c/source/data/zone/gv.txt
+++ b/icu4c/source/data/zone/gv.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 gv{
-    Version{"2.1.34.91"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/ha.txt b/icu4c/source/data/zone/ha.txt
index fe89ec3..2b69749 100644
--- a/icu4c/source/data/zone/ha.txt
+++ b/icu4c/source/data/zone/ha.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ha{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/haw.txt b/icu4c/source/data/zone/haw.txt
index bf41094..b093a55 100644
--- a/icu4c/source/data/zone/haw.txt
+++ b/icu4c/source/data/zone/haw.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 haw{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Pacific:Honolulu"{
             sd{"HDT"}
diff --git a/icu4c/source/data/zone/he.txt b/icu4c/source/data/zone/he.txt
index 7df449b..04044b6 100644
--- a/icu4c/source/data/zone/he.txt
+++ b/icu4c/source/data/zone/he.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 he{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"אביג׳אן"}
@@ -1547,6 +1547,9 @@
             lg{"שעון מערב גרינלנד"}
             ls{"שעון מערב גרינלנד (חורף)"}
         }
+        "meta:Guam"{
+            ls{"שעון גואם"}
+        }
         "meta:Gulf"{
             ls{"שעון מדינות המפרץ"}
         }
@@ -1729,6 +1732,9 @@
             lg{"שעון פרננדו די נורוניה"}
             ls{"שעון פרננדו די נורוניה (חורף)"}
         }
+        "meta:North_Mariana"{
+            ls{"שעון איי מריאנה הצפוניים"}
+        }
         "meta:Novosibirsk"{
             ld{"שעון נובוסיבירסק (קיץ)"}
             lg{"שעון נובוסיבירסק"}
diff --git a/icu4c/source/data/zone/hi.txt b/icu4c/source/data/zone/hi.txt
index ce94feb..bcabb70 100644
--- a/icu4c/source/data/zone/hi.txt
+++ b/icu4c/source/data/zone/hi.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hi{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"अबिदजान"}
diff --git a/icu4c/source/data/zone/hr.txt b/icu4c/source/data/zone/hr.txt
index 6bbc616..0d210b2 100644
--- a/icu4c/source/data/zone/hr.txt
+++ b/icu4c/source/data/zone/hr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hr{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/hsb.txt b/icu4c/source/data/zone/hsb.txt
index cb3f5cc..dd7d4da 100644
--- a/icu4c/source/data/zone/hsb.txt
+++ b/icu4c/source/data/zone/hsb.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hsb{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Accra"{
             ec{"Akkra"}
diff --git a/icu4c/source/data/zone/hu.txt b/icu4c/source/data/zone/hu.txt
index 1398518..9bec0d9 100644
--- a/icu4c/source/data/zone/hu.txt
+++ b/icu4c/source/data/zone/hu.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hu{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/hy.txt b/icu4c/source/data/zone/hy.txt
index 8ce6ff4..b6c53f8 100644
--- a/icu4c/source/data/zone/hy.txt
+++ b/icu4c/source/data/zone/hy.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 hy{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Աբիջան"}
diff --git a/icu4c/source/data/zone/id.txt b/icu4c/source/data/zone/id.txt
index fdd0505..9490afc 100644
--- a/icu4c/source/data/zone/id.txt
+++ b/icu4c/source/data/zone/id.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 id{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/ig.txt b/icu4c/source/data/zone/ig.txt
index 7e7e278..c1d9580 100644
--- a/icu4c/source/data/zone/ig.txt
+++ b/icu4c/source/data/zone/ig.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ig{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/ii.txt b/icu4c/source/data/zone/ii.txt
index 3a45c28..2aba5aa 100644
--- a/icu4c/source/data/zone/ii.txt
+++ b/icu4c/source/data/zone/ii.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ii{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Etc:Unknown"{
             ec{"ꅉꀋꐚꌠ"}
diff --git a/icu4c/source/data/zone/is.txt b/icu4c/source/data/zone/is.txt
index 8b7f0c5..5892e1c 100644
--- a/icu4c/source/data/zone/is.txt
+++ b/icu4c/source/data/zone/is.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 is{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/it.txt b/icu4c/source/data/zone/it.txt
index 1c5286d..f2421e8 100644
--- a/icu4c/source/data/zone/it.txt
+++ b/icu4c/source/data/zone/it.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 it{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.40"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/ja.txt b/icu4c/source/data/zone/ja.txt
index 4089f28..0a867e3 100644
--- a/icu4c/source/data/zone/ja.txt
+++ b/icu4c/source/data/zone/ja.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ja{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"アビジャン"}
diff --git a/icu4c/source/data/zone/jgo.txt b/icu4c/source/data/zone/jgo.txt
index a5e70ab..9b1d64e 100644
--- a/icu4c/source/data/zone/jgo.txt
+++ b/icu4c/source/data/zone/jgo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 jgo{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         fallbackFormat{"{1} ({0})"}
         gmtFormat{"GMT{0}"}
diff --git a/icu4c/source/data/zone/jmc.txt b/icu4c/source/data/zone/jmc.txt
index 88799a3..8b0c276 100644
--- a/icu4c/source/data/zone/jmc.txt
+++ b/icu4c/source/data/zone/jmc.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 jmc{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/ka.txt b/icu4c/source/data/zone/ka.txt
index bd8bab4..78e3316 100644
--- a/icu4c/source/data/zone/ka.txt
+++ b/icu4c/source/data/zone/ka.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ka{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"აბიჯანი"}
diff --git a/icu4c/source/data/zone/kab.txt b/icu4c/source/data/zone/kab.txt
index a7aaa0a..77d47a0 100644
--- a/icu4c/source/data/zone/kab.txt
+++ b/icu4c/source/data/zone/kab.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kab{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/kam.txt b/icu4c/source/data/zone/kam.txt
index be7e8d4..fa91ffc 100644
--- a/icu4c/source/data/zone/kam.txt
+++ b/icu4c/source/data/zone/kam.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kam{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/kde.txt b/icu4c/source/data/zone/kde.txt
index 08d1148..dfe5f27 100644
--- a/icu4c/source/data/zone/kde.txt
+++ b/icu4c/source/data/zone/kde.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kde{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/kea.txt b/icu4c/source/data/zone/kea.txt
index 79a4db7..5568f80 100644
--- a/icu4c/source/data/zone/kea.txt
+++ b/icu4c/source/data/zone/kea.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kea{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "America:Blanc-Sablon"{
             ec{"Blank-Sablon"}
diff --git a/icu4c/source/data/zone/khq.txt b/icu4c/source/data/zone/khq.txt
index dc5b89c..3207438 100644
--- a/icu4c/source/data/zone/khq.txt
+++ b/icu4c/source/data/zone/khq.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 khq{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/ki.txt b/icu4c/source/data/zone/ki.txt
index b65f033..bb9774c 100644
--- a/icu4c/source/data/zone/ki.txt
+++ b/icu4c/source/data/zone/ki.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ki{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/kk.txt b/icu4c/source/data/zone/kk.txt
index 61f3eb8..cd49b49 100644
--- a/icu4c/source/data/zone/kk.txt
+++ b/icu4c/source/data/zone/kk.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kk{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абиджан"}
diff --git a/icu4c/source/data/zone/kkj.txt b/icu4c/source/data/zone/kkj.txt
index 0766dcc..227e28b 100644
--- a/icu4c/source/data/zone/kkj.txt
+++ b/icu4c/source/data/zone/kkj.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kkj{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/kl.txt b/icu4c/source/data/zone/kl.txt
index aa880c5..f266e93 100644
--- a/icu4c/source/data/zone/kl.txt
+++ b/icu4c/source/data/zone/kl.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kl{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/kln.txt b/icu4c/source/data/zone/kln.txt
index 7e71ab4..51163fa 100644
--- a/icu4c/source/data/zone/kln.txt
+++ b/icu4c/source/data/zone/kln.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kln{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/km.txt b/icu4c/source/data/zone/km.txt
index fc5751f..c904137 100644
--- a/icu4c/source/data/zone/km.txt
+++ b/icu4c/source/data/zone/km.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 km{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"អាប៊ីដ្យាន"}
@@ -1076,6 +1076,9 @@
         "Europe:Sarajevo"{
             ec{"សារ៉ាយ៉េវ៉ូ"}
         }
+        "Europe:Saratov"{
+            ec{"សារ៉ាតាវ"}
+        }
         "Europe:Simferopol"{
             ec{"ស៊ីមហ្វើរ៉ុប៉ូល"}
         }
diff --git a/icu4c/source/data/zone/kn.txt b/icu4c/source/data/zone/kn.txt
index 4bf73df..5cb783b 100644
--- a/icu4c/source/data/zone/kn.txt
+++ b/icu4c/source/data/zone/kn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kn{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"ಅಬಿದ್‌ಜನ್"}
diff --git a/icu4c/source/data/zone/ko.txt b/icu4c/source/data/zone/ko.txt
index 661989c..9406ed1 100644
--- a/icu4c/source/data/zone/ko.txt
+++ b/icu4c/source/data/zone/ko.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ko{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"아비장"}
diff --git a/icu4c/source/data/zone/ko_KP.txt b/icu4c/source/data/zone/ko_KP.txt
index ffc72a5..09d7205 100644
--- a/icu4c/source/data/zone/ko_KP.txt
+++ b/icu4c/source/data/zone/ko_KP.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ko_KP{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Korea"{
             ld{"조선 하계 표준시"}
diff --git a/icu4c/source/data/zone/kok.txt b/icu4c/source/data/zone/kok.txt
index c5d8434..b02c2d0 100644
--- a/icu4c/source/data/zone/kok.txt
+++ b/icu4c/source/data/zone/kok.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kok{
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Etc:UTC"{
             ls{"समन्वित वैश्विक वेळ"}
diff --git a/icu4c/source/data/zone/ks.txt b/icu4c/source/data/zone/ks.txt
index 2cd0bb0..9fdc2ef 100644
--- a/icu4c/source/data/zone/ks.txt
+++ b/icu4c/source/data/zone/ks.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ks{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"عابِدجان"}
diff --git a/icu4c/source/data/zone/ksb.txt b/icu4c/source/data/zone/ksb.txt
index 0f244f8..6b5b72b 100644
--- a/icu4c/source/data/zone/ksb.txt
+++ b/icu4c/source/data/zone/ksb.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ksb{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/ksf.txt b/icu4c/source/data/zone/ksf.txt
index 8768530..e90eb30 100644
--- a/icu4c/source/data/zone/ksf.txt
+++ b/icu4c/source/data/zone/ksf.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ksf{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/ksh.txt b/icu4c/source/data/zone/ksh.txt
index 117308f..f9584d2 100644
--- a/icu4c/source/data/zone/ksh.txt
+++ b/icu4c/source/data/zone/ksh.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ksh{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Cairo"{
             ec{"Kaijro"}
diff --git a/icu4c/source/data/zone/kw.txt b/icu4c/source/data/zone/kw.txt
index 13f10c3..20e641f 100644
--- a/icu4c/source/data/zone/kw.txt
+++ b/icu4c/source/data/zone/kw.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 kw{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/ky.txt b/icu4c/source/data/zone/ky.txt
index 556ab67..06a1884 100644
--- a/icu4c/source/data/zone/ky.txt
+++ b/icu4c/source/data/zone/ky.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ky{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абиджан"}
diff --git a/icu4c/source/data/zone/lag.txt b/icu4c/source/data/zone/lag.txt
index 7a87fc4..8a86891 100644
--- a/icu4c/source/data/zone/lag.txt
+++ b/icu4c/source/data/zone/lag.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lag{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/lb.txt b/icu4c/source/data/zone/lb.txt
index 4d38f812..385e98f 100644
--- a/icu4c/source/data/zone/lb.txt
+++ b/icu4c/source/data/zone/lb.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lb{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Accra"{
             ec{"Accra"}
diff --git a/icu4c/source/data/zone/lg.txt b/icu4c/source/data/zone/lg.txt
index f17caa5..053ac2b 100644
--- a/icu4c/source/data/zone/lg.txt
+++ b/icu4c/source/data/zone/lg.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lg{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/lkt.txt b/icu4c/source/data/zone/lkt.txt
index e4eaa46..d135506 100644
--- a/icu4c/source/data/zone/lkt.txt
+++ b/icu4c/source/data/zone/lkt.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lkt{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/ln.txt b/icu4c/source/data/zone/ln.txt
index 1689e98..dcf710f 100644
--- a/icu4c/source/data/zone/ln.txt
+++ b/icu4c/source/data/zone/ln.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ln{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         fallbackFormat{"{1} ({0})"}
         regionFormat{"Ngonga ya {0}"}
diff --git a/icu4c/source/data/zone/lo.txt b/icu4c/source/data/zone/lo.txt
index 9b91958..de2cd59 100644
--- a/icu4c/source/data/zone/lo.txt
+++ b/icu4c/source/data/zone/lo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lo{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"ອາບິດແຈນ"}
diff --git a/icu4c/source/data/zone/lrc.txt b/icu4c/source/data/zone/lrc.txt
index 0a8b458..bcb234c 100644
--- a/icu4c/source/data/zone/lrc.txt
+++ b/icu4c/source/data/zone/lrc.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lrc{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Etc:Unknown"{
             ec{"نادیار"}
diff --git a/icu4c/source/data/zone/lt.txt b/icu4c/source/data/zone/lt.txt
index 14a2b02..ca819bb 100644
--- a/icu4c/source/data/zone/lt.txt
+++ b/icu4c/source/data/zone/lt.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lt{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidžanas"}
diff --git a/icu4c/source/data/zone/lu.txt b/icu4c/source/data/zone/lu.txt
index 7b44552..f28aeda 100644
--- a/icu4c/source/data/zone/lu.txt
+++ b/icu4c/source/data/zone/lu.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lu{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/luo.txt b/icu4c/source/data/zone/luo.txt
index 43c1380..414d13f 100644
--- a/icu4c/source/data/zone/luo.txt
+++ b/icu4c/source/data/zone/luo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 luo{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/luy.txt b/icu4c/source/data/zone/luy.txt
index 9671ff7..3e07b21 100644
--- a/icu4c/source/data/zone/luy.txt
+++ b/icu4c/source/data/zone/luy.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 luy{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/lv.txt b/icu4c/source/data/zone/lv.txt
index 26c4025..0950421 100644
--- a/icu4c/source/data/zone/lv.txt
+++ b/icu4c/source/data/zone/lv.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 lv{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidžana"}
diff --git a/icu4c/source/data/zone/mas.txt b/icu4c/source/data/zone/mas.txt
index f690e2e..b34550c 100644
--- a/icu4c/source/data/zone/mas.txt
+++ b/icu4c/source/data/zone/mas.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mas{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/mer.txt b/icu4c/source/data/zone/mer.txt
index ebe2171..b59f5a7 100644
--- a/icu4c/source/data/zone/mer.txt
+++ b/icu4c/source/data/zone/mer.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mer{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/mfe.txt b/icu4c/source/data/zone/mfe.txt
index 501dcd3..b16617b 100644
--- a/icu4c/source/data/zone/mfe.txt
+++ b/icu4c/source/data/zone/mfe.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mfe{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/mg.txt b/icu4c/source/data/zone/mg.txt
index e9cddd2..dbd4114 100644
--- a/icu4c/source/data/zone/mg.txt
+++ b/icu4c/source/data/zone/mg.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mg{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/mgh.txt b/icu4c/source/data/zone/mgh.txt
index 34ae215..be38095 100644
--- a/icu4c/source/data/zone/mgh.txt
+++ b/icu4c/source/data/zone/mgh.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mgh{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/mgo.txt b/icu4c/source/data/zone/mgo.txt
index 9f0b9f9..00085fc 100644
--- a/icu4c/source/data/zone/mgo.txt
+++ b/icu4c/source/data/zone/mgo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mgo{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         fallbackFormat{"{1} ({0})"}
         gmtFormat{"GMT{0}"}
diff --git a/icu4c/source/data/zone/mk.txt b/icu4c/source/data/zone/mk.txt
index fe2b69a..7d020cf 100644
--- a/icu4c/source/data/zone/mk.txt
+++ b/icu4c/source/data/zone/mk.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mk{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абиџан"}
diff --git a/icu4c/source/data/zone/ml.txt b/icu4c/source/data/zone/ml.txt
index a419a22..d783dda 100644
--- a/icu4c/source/data/zone/ml.txt
+++ b/icu4c/source/data/zone/ml.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ml{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"അബിദ്‌ജാൻ‌"}
diff --git a/icu4c/source/data/zone/mn.txt b/icu4c/source/data/zone/mn.txt
index a7c4f9d..9bd9140 100644
--- a/icu4c/source/data/zone/mn.txt
+++ b/icu4c/source/data/zone/mn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mn{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абижан"}
@@ -1756,7 +1756,7 @@
         "meta:Pierre_Miquelon"{
             ld{"Сен-Пьер ба Микелоны зуны цаг"}
             lg{"Сен-Пьер ба Микелоны цаг"}
-            ls{"Сен-Пьер ба Микелоны стандарт цаг"}
+            ls{"Сент-Пьер ба Микелоны стандарт цаг"}
         }
         "meta:Pitcairn"{
             ls{"Питкернийн цаг"}
diff --git a/icu4c/source/data/zone/mr.txt b/icu4c/source/data/zone/mr.txt
index 9ac88f0..3342eaf 100644
--- a/icu4c/source/data/zone/mr.txt
+++ b/icu4c/source/data/zone/mr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mr{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"अबिद्जान"}
diff --git a/icu4c/source/data/zone/ms.txt b/icu4c/source/data/zone/ms.txt
index f108633..2e3d8bf 100644
--- a/icu4c/source/data/zone/ms.txt
+++ b/icu4c/source/data/zone/ms.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ms{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/mt.txt b/icu4c/source/data/zone/mt.txt
index 5b66009..66f0300 100644
--- a/icu4c/source/data/zone/mt.txt
+++ b/icu4c/source/data/zone/mt.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mt{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/mua.txt b/icu4c/source/data/zone/mua.txt
index 7381746..589cfb7 100644
--- a/icu4c/source/data/zone/mua.txt
+++ b/icu4c/source/data/zone/mua.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mua{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/my.txt b/icu4c/source/data/zone/my.txt
index 84475a3..8429f3f 100644
--- a/icu4c/source/data/zone/my.txt
+++ b/icu4c/source/data/zone/my.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 my{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"အာဘီဂျန်"}
diff --git a/icu4c/source/data/zone/mzn.txt b/icu4c/source/data/zone/mzn.txt
index 53c6b86..d046fb2 100644
--- a/icu4c/source/data/zone/mzn.txt
+++ b/icu4c/source/data/zone/mzn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 mzn{
-    Version{"2.1.31.86"}
+    Version{"2.1.39.11"}
     zoneStrings{
         fallbackFormat{"{1} ({0})"}
         gmtFormat{"GMT{0}"}
diff --git a/icu4c/source/data/zone/naq.txt b/icu4c/source/data/zone/naq.txt
index 98e1493..24a23f7 100644
--- a/icu4c/source/data/zone/naq.txt
+++ b/icu4c/source/data/zone/naq.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 naq{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/nb.txt b/icu4c/source/data/zone/nb.txt
index e426db4..f07027d 100644
--- a/icu4c/source/data/zone/nb.txt
+++ b/icu4c/source/data/zone/nb.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nb{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/nd.txt b/icu4c/source/data/zone/nd.txt
index ffbcd39..77b2835 100644
--- a/icu4c/source/data/zone/nd.txt
+++ b/icu4c/source/data/zone/nd.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nd{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/nds.txt b/icu4c/source/data/zone/nds.txt
index d293203..0f3ddc3 100644
--- a/icu4c/source/data/zone/nds.txt
+++ b/icu4c/source/data/zone/nds.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nds{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/ne.txt b/icu4c/source/data/zone/ne.txt
index db71f8c..6ff086c 100644
--- a/icu4c/source/data/zone/ne.txt
+++ b/icu4c/source/data/zone/ne.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ne{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"अविड्जान"}
diff --git a/icu4c/source/data/zone/ne_IN.txt b/icu4c/source/data/zone/ne_IN.txt
index fbe90d5..7a4d1dc 100644
--- a/icu4c/source/data/zone/ne_IN.txt
+++ b/icu4c/source/data/zone/ne_IN.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ne_IN{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:India"{
             ss{"IST"}
diff --git a/icu4c/source/data/zone/nl.txt b/icu4c/source/data/zone/nl.txt
index 066c23b..57ab4fc 100644
--- a/icu4c/source/data/zone/nl.txt
+++ b/icu4c/source/data/zone/nl.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nl{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/nl_SR.txt b/icu4c/source/data/zone/nl_SR.txt
index c9b6d26..928419d 100644
--- a/icu4c/source/data/zone/nl_SR.txt
+++ b/icu4c/source/data/zone/nl_SR.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nl_SR{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Suriname"{
             ss{"SRT"}
diff --git a/icu4c/source/data/zone/nmg.txt b/icu4c/source/data/zone/nmg.txt
index 375b98a..5989a7d 100644
--- a/icu4c/source/data/zone/nmg.txt
+++ b/icu4c/source/data/zone/nmg.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nmg{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/nn.txt b/icu4c/source/data/zone/nn.txt
index f2772ff..efb3e33 100644
--- a/icu4c/source/data/zone/nn.txt
+++ b/icu4c/source/data/zone/nn.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nn{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/nnh.txt b/icu4c/source/data/zone/nnh.txt
index 6af7536..bb4141f 100644
--- a/icu4c/source/data/zone/nnh.txt
+++ b/icu4c/source/data/zone/nnh.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nnh{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/nus.txt b/icu4c/source/data/zone/nus.txt
index b7bc2bd..c156f94 100644
--- a/icu4c/source/data/zone/nus.txt
+++ b/icu4c/source/data/zone/nus.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nus{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/nyn.txt b/icu4c/source/data/zone/nyn.txt
index 3f1d19b..1b6fcdb 100644
--- a/icu4c/source/data/zone/nyn.txt
+++ b/icu4c/source/data/zone/nyn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 nyn{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/om.txt b/icu4c/source/data/zone/om.txt
index 35b731f..bf6660a 100644
--- a/icu4c/source/data/zone/om.txt
+++ b/icu4c/source/data/zone/om.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 om{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         gmtFormat{"GMT{0}"}
         hourFormat{"+HH:mm;-HH:mm"}
diff --git a/icu4c/source/data/zone/os.txt b/icu4c/source/data/zone/os.txt
index ffed847..650749e 100644
--- a/icu4c/source/data/zone/os.txt
+++ b/icu4c/source/data/zone/os.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 os{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Asia:Tbilisi"{
             ec{"Тбилис"}
diff --git a/icu4c/source/data/zone/pa.txt b/icu4c/source/data/zone/pa.txt
index c608d8e..a3fc7e7 100644
--- a/icu4c/source/data/zone/pa.txt
+++ b/icu4c/source/data/zone/pa.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa{
-    Version{"2.1.37.22"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"ਅਬੀਦਜਾਨ"}
diff --git a/icu4c/source/data/zone/pa_Arab.txt b/icu4c/source/data/zone/pa_Arab.txt
index cbb8be4..1fb82e2 100644
--- a/icu4c/source/data/zone/pa_Arab.txt
+++ b/icu4c/source/data/zone/pa_Arab.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa_Arab{
     %%Parent{"root"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/pa_Guru.txt b/icu4c/source/data/zone/pa_Guru.txt
index a731d5e..e558d24 100644
--- a/icu4c/source/data/zone/pa_Guru.txt
+++ b/icu4c/source/data/zone/pa_Guru.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pa_Guru{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/pl.txt b/icu4c/source/data/zone/pl.txt
index cdf2452..99edca2 100644
--- a/icu4c/source/data/zone/pl.txt
+++ b/icu4c/source/data/zone/pl.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pl{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.15"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidżan"}
diff --git a/icu4c/source/data/zone/pool.res b/icu4c/source/data/zone/pool.res
index 57068ee..dcbba3f 100644
--- a/icu4c/source/data/zone/pool.res
+++ b/icu4c/source/data/zone/pool.res
Binary files differ
diff --git a/icu4c/source/data/zone/ps.txt b/icu4c/source/data/zone/ps.txt
index 6bcc499..538c4f3 100644
--- a/icu4c/source/data/zone/ps.txt
+++ b/icu4c/source/data/zone/ps.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ps{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"ابيجان"}
@@ -873,6 +873,9 @@
         "Australia:Hobart"{
             ec{"هوبارټ"}
         }
+        "Australia:Lindeman"{
+            ec{"لینډامین"}
+        }
         "Australia:Lord_Howe"{
             ec{"رب هیله"}
         }
@@ -1127,6 +1130,9 @@
         "Pacific:Honolulu"{
             ec{"هینولولو"}
         }
+        "Pacific:Johnston"{
+            ec{"جانستون"}
+        }
         "Pacific:Kosrae"{
             ec{"کوسیرا"}
         }
@@ -1640,6 +1646,9 @@
             lg{"سینټ پییرا و ميکلين وخت"}
             ls{"سینټ پییرا و ميکلين معیاری وخت"}
         }
+        "meta:Pitcairn"{
+            ls{"پیټ کارین وخت"}
+        }
         "meta:Ponape"{
             ls{"پونپپ وخت"}
         }
@@ -1668,6 +1677,9 @@
         "meta:Singapore"{
             ls{"د سنګاپور معیاري وخت"}
         }
+        "meta:Solomon"{
+            ls{"د سلیمان ټاپوګانو وخت"}
+        }
         "meta:South_Georgia"{
             ls{"د سویل جورجیا وخت"}
         }
diff --git a/icu4c/source/data/zone/pt.txt b/icu4c/source/data/zone/pt.txt
index de8f2e8..9dbda7f 100644
--- a/icu4c/source/data/zone/pt.txt
+++ b/icu4c/source/data/zone/pt.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/pt_AO.txt b/icu4c/source/data/zone/pt_AO.txt
index 9370cda..9f7dc41 100644
--- a/icu4c/source/data/zone/pt_AO.txt
+++ b/icu4c/source/data/zone/pt_AO.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_AO{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Azores"{
             sd{"∅∅∅"}
diff --git a/icu4c/source/data/zone/pt_CH.txt b/icu4c/source/data/zone/pt_CH.txt
index 90d6a1e..acd87d8 100644
--- a/icu4c/source/data/zone/pt_CH.txt
+++ b/icu4c/source/data/zone/pt_CH.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CH{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/pt_CV.txt b/icu4c/source/data/zone/pt_CV.txt
index 159ef6e..54c9366 100644
--- a/icu4c/source/data/zone/pt_CV.txt
+++ b/icu4c/source/data/zone/pt_CV.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_CV{
     %%Parent{"pt_PT"}
-    Version{"2.1.35.71"}
+    Version{"2.1.39.12"}
     zoneStrings{
         "meta:Azores"{
             sd{"∅∅∅"}
diff --git a/icu4c/source/data/zone/pt_GQ.txt b/icu4c/source/data/zone/pt_GQ.txt
index 793e060..8a8947f 100644
--- a/icu4c/source/data/zone/pt_GQ.txt
+++ b/icu4c/source/data/zone/pt_GQ.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GQ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/pt_GW.txt b/icu4c/source/data/zone/pt_GW.txt
index 741af61..945884a 100644
--- a/icu4c/source/data/zone/pt_GW.txt
+++ b/icu4c/source/data/zone/pt_GW.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_GW{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Azores"{
             sd{"∅∅∅"}
diff --git a/icu4c/source/data/zone/pt_LU.txt b/icu4c/source/data/zone/pt_LU.txt
index e6d1c60..d30ba91 100644
--- a/icu4c/source/data/zone/pt_LU.txt
+++ b/icu4c/source/data/zone/pt_LU.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_LU{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/pt_MO.txt b/icu4c/source/data/zone/pt_MO.txt
index 41bf9b2..58fb0b6 100644
--- a/icu4c/source/data/zone/pt_MO.txt
+++ b/icu4c/source/data/zone/pt_MO.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_MO{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Azores"{
             sd{"∅∅∅"}
diff --git a/icu4c/source/data/zone/pt_MZ.txt b/icu4c/source/data/zone/pt_MZ.txt
index 64fee5f..2783928 100644
--- a/icu4c/source/data/zone/pt_MZ.txt
+++ b/icu4c/source/data/zone/pt_MZ.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_MZ{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Azores"{
             sd{"∅∅∅"}
diff --git a/icu4c/source/data/zone/pt_PT.txt b/icu4c/source/data/zone/pt_PT.txt
index 6f3455d..49de6d2 100644
--- a/icu4c/source/data/zone/pt_PT.txt
+++ b/icu4c/source/data/zone/pt_PT.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_PT{
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Addis_Ababa"{
             ec{"Adis-Abeba"}
diff --git a/icu4c/source/data/zone/pt_ST.txt b/icu4c/source/data/zone/pt_ST.txt
index 829c952..f83ab6f 100644
--- a/icu4c/source/data/zone/pt_ST.txt
+++ b/icu4c/source/data/zone/pt_ST.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_ST{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "meta:Azores"{
             sd{"∅∅∅"}
diff --git a/icu4c/source/data/zone/pt_TL.txt b/icu4c/source/data/zone/pt_TL.txt
index dbb0d87..9bc9304 100644
--- a/icu4c/source/data/zone/pt_TL.txt
+++ b/icu4c/source/data/zone/pt_TL.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 pt_TL{
     %%Parent{"pt_PT"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:Azores"{
             sd{"∅∅∅"}
diff --git a/icu4c/source/data/zone/qu.txt b/icu4c/source/data/zone/qu.txt
index f127c8e..1e05cf5 100644
--- a/icu4c/source/data/zone/qu.txt
+++ b/icu4c/source/data/zone/qu.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 qu{
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/qu_BO.txt b/icu4c/source/data/zone/qu_BO.txt
index 892e7ce..bf44aac 100644
--- a/icu4c/source/data/zone/qu_BO.txt
+++ b/icu4c/source/data/zone/qu_BO.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 qu_BO{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Bolivia"{
             ss{"BOT"}
diff --git a/icu4c/source/data/zone/qu_EC.txt b/icu4c/source/data/zone/qu_EC.txt
index 6b68228..f599615 100644
--- a/icu4c/source/data/zone/qu_EC.txt
+++ b/icu4c/source/data/zone/qu_EC.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 qu_EC{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Ecuador"{
             ss{"ECT"}
diff --git a/icu4c/source/data/zone/resfiles.mk b/icu4c/source/data/zone/resfiles.mk
index a764437..2f9096e 100644
--- a/icu4c/source/data/zone/resfiles.mk
+++ b/icu4c/source/data/zone/resfiles.mk
@@ -1,6 +1,6 @@
 # © 2016 and later: Unicode, Inc. and others.
 # License & terms of use: http://www.unicode.org/copyright.html#License
-ZONE_CLDR_VERSION = 32.0.1
+ZONE_CLDR_VERSION = 33
 # A list of txt's to build
 # Note:
 #
diff --git a/icu4c/source/data/zone/rm.txt b/icu4c/source/data/zone/rm.txt
index 2a1730f..16d2144 100644
--- a/icu4c/source/data/zone/rm.txt
+++ b/icu4c/source/data/zone/rm.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rm{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Addis_Ababa"{
             ec{"Addis Abeba"}
diff --git a/icu4c/source/data/zone/rn.txt b/icu4c/source/data/zone/rn.txt
index 42fbd7a..24f91e3 100644
--- a/icu4c/source/data/zone/rn.txt
+++ b/icu4c/source/data/zone/rn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rn{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/ro.txt b/icu4c/source/data/zone/ro.txt
index f2b2510..8782638 100644
--- a/icu4c/source/data/zone/ro.txt
+++ b/icu4c/source/data/zone/ro.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ro{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/rof.txt b/icu4c/source/data/zone/rof.txt
index 2fa4a47..b5a6a65 100644
--- a/icu4c/source/data/zone/rof.txt
+++ b/icu4c/source/data/zone/rof.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rof{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/root.txt b/icu4c/source/data/zone/root.txt
index 9222f01..6ebde3e 100644
--- a/icu4c/source/data/zone/root.txt
+++ b/icu4c/source/data/zone/root.txt
@@ -4,7 +4,7 @@
  * ICU <specials> source: <path>/common/main/root.xml
  */
 root{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.27"}
     zoneStrings{
         "Africa:Asmera"{
             ec{"Asmara"}
diff --git a/icu4c/source/data/zone/ru.txt b/icu4c/source/data/zone/ru.txt
index 7629c03..78e8123 100644
--- a/icu4c/source/data/zone/ru.txt
+++ b/icu4c/source/data/zone/ru.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ru{
-    Version{"2.1.37.58"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абиджан"}
diff --git a/icu4c/source/data/zone/rw.txt b/icu4c/source/data/zone/rw.txt
index 1570fc3..3acbbd8 100644
--- a/icu4c/source/data/zone/rw.txt
+++ b/icu4c/source/data/zone/rw.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rw{
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     zoneStrings{
         gmtFormat{"GMT{0}"}
         hourFormat{"+HH:mm;-HH:mm"}
diff --git a/icu4c/source/data/zone/rwk.txt b/icu4c/source/data/zone/rwk.txt
index 4949be2..6917463 100644
--- a/icu4c/source/data/zone/rwk.txt
+++ b/icu4c/source/data/zone/rwk.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 rwk{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/sah.txt b/icu4c/source/data/zone/sah.txt
index 756796a..9c7a972 100644
--- a/icu4c/source/data/zone/sah.txt
+++ b/icu4c/source/data/zone/sah.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sah{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Asia:Almaty"{
             ec{"Алматы"}
diff --git a/icu4c/source/data/zone/saq.txt b/icu4c/source/data/zone/saq.txt
index 5d5c993..2afdbf4 100644
--- a/icu4c/source/data/zone/saq.txt
+++ b/icu4c/source/data/zone/saq.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 saq{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/sbp.txt b/icu4c/source/data/zone/sbp.txt
index ca158f6..80c2458 100644
--- a/icu4c/source/data/zone/sbp.txt
+++ b/icu4c/source/data/zone/sbp.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sbp{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/se.txt b/icu4c/source/data/zone/se.txt
index 57258f4..ae2f5df 100644
--- a/icu4c/source/data/zone/se.txt
+++ b/icu4c/source/data/zone/se.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 se{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "America:Curacao"{
             ec{"Curaçao"}
diff --git a/icu4c/source/data/zone/se_FI.txt b/icu4c/source/data/zone/se_FI.txt
index 35c00e7..cec245e 100644
--- a/icu4c/source/data/zone/se_FI.txt
+++ b/icu4c/source/data/zone/se_FI.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 se_FI{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.73"}
     zoneStrings{
         "Africa:Cairo"{
             ec{"Kairo"}
diff --git a/icu4c/source/data/zone/seh.txt b/icu4c/source/data/zone/seh.txt
index 191a593..0a4efad 100644
--- a/icu4c/source/data/zone/seh.txt
+++ b/icu4c/source/data/zone/seh.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 seh{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/ses.txt b/icu4c/source/data/zone/ses.txt
index 5802f81..0769c71 100644
--- a/icu4c/source/data/zone/ses.txt
+++ b/icu4c/source/data/zone/ses.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ses{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/sg.txt b/icu4c/source/data/zone/sg.txt
index 604c745..8760e35 100644
--- a/icu4c/source/data/zone/sg.txt
+++ b/icu4c/source/data/zone/sg.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sg{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/shi.txt b/icu4c/source/data/zone/shi.txt
index 1d344e4..cefeb4d 100644
--- a/icu4c/source/data/zone/shi.txt
+++ b/icu4c/source/data/zone/shi.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/shi_Latn.txt b/icu4c/source/data/zone/shi_Latn.txt
index ed61c3f..bab7108 100644
--- a/icu4c/source/data/zone/shi_Latn.txt
+++ b/icu4c/source/data/zone/shi_Latn.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi_Latn{
     %%Parent{"root"}
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/shi_Tfng.txt b/icu4c/source/data/zone/shi_Tfng.txt
index ba03fa3..aaf5c7b 100644
--- a/icu4c/source/data/zone/shi_Tfng.txt
+++ b/icu4c/source/data/zone/shi_Tfng.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 shi_Tfng{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/si.txt b/icu4c/source/data/zone/si.txt
index 9dfbf9b..5c034b6 100644
--- a/icu4c/source/data/zone/si.txt
+++ b/icu4c/source/data/zone/si.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 si{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"අබිජාන්"}
diff --git a/icu4c/source/data/zone/sk.txt b/icu4c/source/data/zone/sk.txt
index cb869f9..ddf4454 100644
--- a/icu4c/source/data/zone/sk.txt
+++ b/icu4c/source/data/zone/sk.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sk{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/sl.txt b/icu4c/source/data/zone/sl.txt
index af32501..e272c47 100644
--- a/icu4c/source/data/zone/sl.txt
+++ b/icu4c/source/data/zone/sl.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sl{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidžan"}
diff --git a/icu4c/source/data/zone/smn.txt b/icu4c/source/data/zone/smn.txt
index 90e2da1..e02844e 100644
--- a/icu4c/source/data/zone/smn.txt
+++ b/icu4c/source/data/zone/smn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 smn{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/sn.txt b/icu4c/source/data/zone/sn.txt
index 728dbed..d62c3d6 100644
--- a/icu4c/source/data/zone/sn.txt
+++ b/icu4c/source/data/zone/sn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sn{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/so.txt b/icu4c/source/data/zone/so.txt
index 83e29fd..f29e37a 100644
--- a/icu4c/source/data/zone/so.txt
+++ b/icu4c/source/data/zone/so.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 so{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "meta:Colombia"{
             ld{"Waqtiyada Xagaaga Kolambiya"}
diff --git a/icu4c/source/data/zone/sq.txt b/icu4c/source/data/zone/sq.txt
index 0145bb7..755e00b 100644
--- a/icu4c/source/data/zone/sq.txt
+++ b/icu4c/source/data/zone/sq.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sq{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abixhan"}
@@ -1780,7 +1780,7 @@
             ls{"Ora e Palaut"}
         }
         "meta:Papua_New_Guinea"{
-            ls{"Ora e Papua-Guinesë së Re"}
+            ls{"Ora e Guinesë së Re-Papua"}
         }
         "meta:Paraguay"{
             ld{"Ora Verore e Paraguait"}
diff --git a/icu4c/source/data/zone/sr.txt b/icu4c/source/data/zone/sr.txt
index c9e0554..d32a142 100644
--- a/icu4c/source/data/zone/sr.txt
+++ b/icu4c/source/data/zone/sr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абиџан"}
diff --git a/icu4c/source/data/zone/sr_Cyrl.txt b/icu4c/source/data/zone/sr_Cyrl.txt
index cac24ec..1d0d0a9 100644
--- a/icu4c/source/data/zone/sr_Cyrl.txt
+++ b/icu4c/source/data/zone/sr_Cyrl.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Cyrl{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/sr_Latn.txt b/icu4c/source/data/zone/sr_Latn.txt
index 0b0cca1..b59418e 100644
--- a/icu4c/source/data/zone/sr_Latn.txt
+++ b/icu4c/source/data/zone/sr_Latn.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sr_Latn{
     %%Parent{"root"}
-    Version{"2.1.37.8"}
+    Version{"2.1.39.37"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidžan"}
diff --git a/icu4c/source/data/zone/sv.txt b/icu4c/source/data/zone/sv.txt
index 0364c0a..e86f083 100644
--- a/icu4c/source/data/zone/sv.txt
+++ b/icu4c/source/data/zone/sv.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sv{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/sw.txt b/icu4c/source/data/zone/sw.txt
index f8bfc30..53677c6 100644
--- a/icu4c/source/data/zone/sw.txt
+++ b/icu4c/source/data/zone/sw.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 sw{
-    Version{"2.1.37.34"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/ta.txt b/icu4c/source/data/zone/ta.txt
index 6316557..ac3fed4 100644
--- a/icu4c/source/data/zone/ta.txt
+++ b/icu4c/source/data/zone/ta.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ta{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"அபிட்ஜான்"}
diff --git a/icu4c/source/data/zone/ta_MY.txt b/icu4c/source/data/zone/ta_MY.txt
index 4f300b4..feef69b 100644
--- a/icu4c/source/data/zone/ta_MY.txt
+++ b/icu4c/source/data/zone/ta_MY.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ta_MY{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:India"{
             ss{"∅∅∅"}
diff --git a/icu4c/source/data/zone/ta_SG.txt b/icu4c/source/data/zone/ta_SG.txt
index 49d91e7..200f608 100644
--- a/icu4c/source/data/zone/ta_SG.txt
+++ b/icu4c/source/data/zone/ta_SG.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ta_SG{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "meta:India"{
             ss{"∅∅∅"}
diff --git a/icu4c/source/data/zone/te.txt b/icu4c/source/data/zone/te.txt
index fb8aa32..e331b67 100644
--- a/icu4c/source/data/zone/te.txt
+++ b/icu4c/source/data/zone/te.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 te{
-    Version{"2.1.36.86"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"అబిడ్జాన్"}
diff --git a/icu4c/source/data/zone/teo.txt b/icu4c/source/data/zone/teo.txt
index e043977..e70e3cd 100644
--- a/icu4c/source/data/zone/teo.txt
+++ b/icu4c/source/data/zone/teo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 teo{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/tg.txt b/icu4c/source/data/zone/tg.txt
index 5bced17..042d026 100644
--- a/icu4c/source/data/zone/tg.txt
+++ b/icu4c/source/data/zone/tg.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tg{
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
     zoneStrings{
         "Asia:Dushanbe"{
             ec{"Душанбе"}
diff --git a/icu4c/source/data/zone/th.txt b/icu4c/source/data/zone/th.txt
index b584cde..c39c76e 100644
--- a/icu4c/source/data/zone/th.txt
+++ b/icu4c/source/data/zone/th.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 th{
-    Version{"2.1.37.56"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"อาบีจาน"}
diff --git a/icu4c/source/data/zone/ti.txt b/icu4c/source/data/zone/ti.txt
index 2b6eb5b..ca95c35 100644
--- a/icu4c/source/data/zone/ti.txt
+++ b/icu4c/source/data/zone/ti.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ti{
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/to.txt b/icu4c/source/data/zone/to.txt
index d71ea34..133c7f4 100644
--- a/icu4c/source/data/zone/to.txt
+++ b/icu4c/source/data/zone/to.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 to{
-    Version{"2.1.37.5"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/tr.txt b/icu4c/source/data/zone/tr.txt
index d35eccd..4d25657 100644
--- a/icu4c/source/data/zone/tr.txt
+++ b/icu4c/source/data/zone/tr.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tr{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/tt.txt b/icu4c/source/data/zone/tt.txt
index c96cf06..85f7c22 100644
--- a/icu4c/source/data/zone/tt.txt
+++ b/icu4c/source/data/zone/tt.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tt{
-    Version{"2.1.37.5"}
+    Version{"2.1.38.72"}
     zoneStrings{
         "Etc:UTC"{
             ls{"Бөтендөнья килештерелгән вакыты"}
diff --git a/icu4c/source/data/zone/twq.txt b/icu4c/source/data/zone/twq.txt
index 40fc971..ce8e0cd 100644
--- a/icu4c/source/data/zone/twq.txt
+++ b/icu4c/source/data/zone/twq.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 twq{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/tzm.txt b/icu4c/source/data/zone/tzm.txt
index 38e8af3..941a3c4 100644
--- a/icu4c/source/data/zone/tzm.txt
+++ b/icu4c/source/data/zone/tzm.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 tzm{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/ug.txt b/icu4c/source/data/zone/ug.txt
index 4487bc0..cd6d561 100644
--- a/icu4c/source/data/zone/ug.txt
+++ b/icu4c/source/data/zone/ug.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ug{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Sao_Tome"{
             ec{"سان-تومې"}
diff --git a/icu4c/source/data/zone/uk.txt b/icu4c/source/data/zone/uk.txt
index 6e75ca6..680aac1 100644
--- a/icu4c/source/data/zone/uk.txt
+++ b/icu4c/source/data/zone/uk.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uk{
-    Version{"2.1.37.12"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Абіджан"}
diff --git a/icu4c/source/data/zone/ur.txt b/icu4c/source/data/zone/ur.txt
index 7c05193..be87506 100644
--- a/icu4c/source/data/zone/ur.txt
+++ b/icu4c/source/data/zone/ur.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ur{
-    Version{"2.1.37.69"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"عابدجان"}
diff --git a/icu4c/source/data/zone/ur_IN.txt b/icu4c/source/data/zone/ur_IN.txt
index f28bf16..31b09cd 100644
--- a/icu4c/source/data/zone/ur_IN.txt
+++ b/icu4c/source/data/zone/ur_IN.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 ur_IN{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "Africa:Accra"{
             ec{"اکرا"}
diff --git a/icu4c/source/data/zone/uz.txt b/icu4c/source/data/zone/uz.txt
index cf63363..7ce357c 100644
--- a/icu4c/source/data/zone/uz.txt
+++ b/icu4c/source/data/zone/uz.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/uz_Arab.txt b/icu4c/source/data/zone/uz_Arab.txt
index 0c83edc..559b29e 100644
--- a/icu4c/source/data/zone/uz_Arab.txt
+++ b/icu4c/source/data/zone/uz_Arab.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Arab{
     %%Parent{"root"}
-    Version{"2.1.36.86"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Asia:Kabul"{
             ec{"کابل"}
diff --git a/icu4c/source/data/zone/uz_Cyrl.txt b/icu4c/source/data/zone/uz_Cyrl.txt
index 4861e6b..617ace7 100644
--- a/icu4c/source/data/zone/uz_Cyrl.txt
+++ b/icu4c/source/data/zone/uz_Cyrl.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Cyrl{
     %%Parent{"root"}
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Africa:Asmera"{
             ec{"Asmara"}
diff --git a/icu4c/source/data/zone/uz_Latn.txt b/icu4c/source/data/zone/uz_Latn.txt
index 36553da..66698d6 100644
--- a/icu4c/source/data/zone/uz_Latn.txt
+++ b/icu4c/source/data/zone/uz_Latn.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 uz_Latn{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/vai.txt b/icu4c/source/data/zone/vai.txt
index 60615c4..4b75f8a 100644
--- a/icu4c/source/data/zone/vai.txt
+++ b/icu4c/source/data/zone/vai.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/vai_Latn.txt b/icu4c/source/data/zone/vai_Latn.txt
index 99d351d..2089035 100644
--- a/icu4c/source/data/zone/vai_Latn.txt
+++ b/icu4c/source/data/zone/vai_Latn.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai_Latn{
     %%Parent{"root"}
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/vai_Vaii.txt b/icu4c/source/data/zone/vai_Vaii.txt
index 487dfa9..6ef4517 100644
--- a/icu4c/source/data/zone/vai_Vaii.txt
+++ b/icu4c/source/data/zone/vai_Vaii.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vai_Vaii{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/vi.txt b/icu4c/source/data/zone/vi.txt
index 4f6d79d..5c7622c 100644
--- a/icu4c/source/data/zone/vi.txt
+++ b/icu4c/source/data/zone/vi.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vi{
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"Abidjan"}
diff --git a/icu4c/source/data/zone/vun.txt b/icu4c/source/data/zone/vun.txt
index e4ed87b..eaf728b 100644
--- a/icu4c/source/data/zone/vun.txt
+++ b/icu4c/source/data/zone/vun.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 vun{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/wae.txt b/icu4c/source/data/zone/wae.txt
index 9b56802..3f00d0d 100644
--- a/icu4c/source/data/zone/wae.txt
+++ b/icu4c/source/data/zone/wae.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 wae{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Africa:Accra"{
             ec{"Akra"}
diff --git a/icu4c/source/data/zone/wo.txt b/icu4c/source/data/zone/wo.txt
index 01e2bce..dc656a7 100644
--- a/icu4c/source/data/zone/wo.txt
+++ b/icu4c/source/data/zone/wo.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 wo{
-    Version{"2.1.37.4"}
+    Version{"2.1.38.71"}
     zoneStrings{
         "Africa:Dakar"{
             ec{"Dakar"}
diff --git a/icu4c/source/data/zone/xog.txt b/icu4c/source/data/zone/xog.txt
index 31a3446..bc58d22 100644
--- a/icu4c/source/data/zone/xog.txt
+++ b/icu4c/source/data/zone/xog.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 xog{
-    Version{"2.1.31.33"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/yav.txt b/icu4c/source/data/zone/yav.txt
index 96488b2..d737c00 100644
--- a/icu4c/source/data/zone/yav.txt
+++ b/icu4c/source/data/zone/yav.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yav{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/yi.txt b/icu4c/source/data/zone/yi.txt
index 51f7e83..0d54dd2 100644
--- a/icu4c/source/data/zone/yi.txt
+++ b/icu4c/source/data/zone/yi.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yi{
-    Version{"2.1.37.1"}
+    Version{"2.1.38.69"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"אַבידזשאַן"}
diff --git a/icu4c/source/data/zone/yo.txt b/icu4c/source/data/zone/yo.txt
index dd1947a..f66f78b 100644
--- a/icu4c/source/data/zone/yo.txt
+++ b/icu4c/source/data/zone/yo.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yo{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/yue.txt b/icu4c/source/data/zone/yue.txt
index e1b9169..e574272 100644
--- a/icu4c/source/data/zone/yue.txt
+++ b/icu4c/source/data/zone/yue.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue{
-    Version{"2.1.37.33"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"阿比讓"}
diff --git a/icu4c/source/data/zone/yue_Hans.txt b/icu4c/source/data/zone/yue_Hans.txt
index c33ab51..67ce98b 100644
--- a/icu4c/source/data/zone/yue_Hans.txt
+++ b/icu4c/source/data/zone/yue_Hans.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue_Hans{
     %%Parent{"root"}
-    Version{"2.1.37.8"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"阿比让"}
diff --git a/icu4c/source/data/zone/yue_Hant.txt b/icu4c/source/data/zone/yue_Hant.txt
index b8cde82..a263f97 100644
--- a/icu4c/source/data/zone/yue_Hant.txt
+++ b/icu4c/source/data/zone/yue_Hant.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 yue_Hant{
-    Version{"2.1.36.80"}
+    Version{"2.1.38.69"}
 }
diff --git a/icu4c/source/data/zone/zgh.txt b/icu4c/source/data/zone/zgh.txt
index 7b1e54c..43ef8b1 100644
--- a/icu4c/source/data/zone/zgh.txt
+++ b/icu4c/source/data/zone/zgh.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zgh{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
 }
diff --git a/icu4c/source/data/zone/zh.txt b/icu4c/source/data/zone/zh.txt
index 69aaa78..605185e 100644
--- a/icu4c/source/data/zone/zh.txt
+++ b/icu4c/source/data/zone/zh.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh{
-    Version{"2.1.37.42"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"阿比让"}
diff --git a/icu4c/source/data/zone/zh_Hans.txt b/icu4c/source/data/zone/zh_Hans.txt
index e2e6871..a37beac 100644
--- a/icu4c/source/data/zone/zh_Hans.txt
+++ b/icu4c/source/data/zone/zh_Hans.txt
@@ -1,5 +1,5 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans{
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/zh_Hans_SG.txt b/icu4c/source/data/zone/zh_Hans_SG.txt
index 711e434..df75cd9 100644
--- a/icu4c/source/data/zone/zh_Hans_SG.txt
+++ b/icu4c/source/data/zone/zh_Hans_SG.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hans_SG{
-    Version{"2.1.37.6"}
+    Version{"2.1.38.39"}
     zoneStrings{
         "America:Scoresbysund"{
             ec{"斯考斯伯松德"}
diff --git a/icu4c/source/data/zone/zh_Hant.txt b/icu4c/source/data/zone/zh_Hant.txt
index b00cdf6..d3d99a2 100644
--- a/icu4c/source/data/zone/zh_Hant.txt
+++ b/icu4c/source/data/zone/zh_Hant.txt
@@ -2,7 +2,7 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hant{
     %%Parent{"root"}
-    Version{"2.1.37.5"}
+    Version{"2.1.39.20"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"阿比讓"}
diff --git a/icu4c/source/data/zone/zh_Hant_HK.txt b/icu4c/source/data/zone/zh_Hant_HK.txt
index 97a45d9..026c675 100644
--- a/icu4c/source/data/zone/zh_Hant_HK.txt
+++ b/icu4c/source/data/zone/zh_Hant_HK.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hant_HK{
-    Version{"2.1.37.6"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"阿比贊"}
diff --git a/icu4c/source/data/zone/zh_Hant_MO.txt b/icu4c/source/data/zone/zh_Hant_MO.txt
index 78fdee5..f61452c 100644
--- a/icu4c/source/data/zone/zh_Hant_MO.txt
+++ b/icu4c/source/data/zone/zh_Hant_MO.txt
@@ -2,5 +2,5 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zh_Hant_MO{
     %%Parent{"zh_Hant_HK"}
-    Version{"2.1.31.33"}
+    Version{"2.1.38.39"}
 }
diff --git a/icu4c/source/data/zone/zu.txt b/icu4c/source/data/zone/zu.txt
index 72b23d4..507672f 100644
--- a/icu4c/source/data/zone/zu.txt
+++ b/icu4c/source/data/zone/zu.txt
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
 zu{
-    Version{"2.1.37.1"}
+    Version{"2.1.39.11"}
     zoneStrings{
         "Africa:Abidjan"{
             ec{"i-Abidjan"}
diff --git a/icu4c/source/extra/uconv/uconv.vcxproj b/icu4c/source/extra/uconv/uconv.vcxproj
index d208f8e..ff28d9b 100644
--- a/icu4c/source/extra/uconv/uconv.vcxproj
+++ b/icu4c/source/extra/uconv/uconv.vcxproj
@@ -1,51 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
   <PropertyGroup Label="Globals">
     <ProjectGuid>{DBA4088D-F6F9-4F8F-8820-082A4765C16C}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,6 +46,15 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>UCONVMSG_LINK;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <CustomBuildStep>
       <Command>copy "$(TargetPath)" ..\..\..\bin
@@ -92,30 +65,18 @@
       <TypeLibraryName>.\x86\Release/uconv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;UCONVMSG_LINK;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/uconv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <AdditionalDependencies>uconvmsg.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>uconvmsg.lib;icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/uconv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalLibraryDirectories>x86\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>x86\Release;..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/uconv.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -133,32 +94,18 @@
       <TypeLibraryName>.\x86\Debug/uconv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;UCONVMSG_LINK;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/uconv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <AdditionalDependencies>uconvmsg.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>uconvmsg.lib;icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/uconv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalLibraryDirectories>x86\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>x86\Debug;..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/uconv.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -174,37 +121,23 @@
       <Outputs>$(ProjectDir)..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/uconv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;UCONVMSG_LINK;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/uconv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <AdditionalDependencies>uconvmsg.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>uconvmsg.lib;icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/uconv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalLibraryDirectories>x64\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>x64\Release;..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/uconv.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -214,40 +147,24 @@
       <Outputs>$(ProjectDir)..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/uconv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;UCONVMSG_LINK;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/uconv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <AdditionalDependencies>uconvmsg.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>uconvmsg.lib;icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/uconv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalLibraryDirectories>x64\Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>x64\Debug;..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/uconv.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -276,25 +193,7 @@
     </CustomBuild>
     <None Include="resfiles.mk" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tools\genrb\genrb.vcxproj">
-      <Project>{97521d06-ec47-45d4-8bd0-9e16b3f93b2a}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tools\pkgdata\pkgdata.vcxproj">
-      <Project>{4c8454fe-81d3-4ca3-9927-29ba96f03dac}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/i18n/Android.bp b/icu4c/source/i18n/Android.bp
index 29996d2..c04c24d 100644
--- a/icu4c/source/i18n/Android.bp
+++ b/icu4c/source/i18n/Android.bp
@@ -84,6 +84,12 @@
         "digitgrouping.cpp",
         "digitinterval.cpp",
         "digitlst.cpp",
+        "double-conversion-bignum.cpp",
+        "double-conversion-bignum-dtoa.cpp",
+        "double-conversion-cached-powers.cpp",
+        "double-conversion.cpp",
+        "double-conversion-diy-fp.cpp",
+        "double-conversion-fast-dtoa.cpp",
         "dtfmtsym.cpp",
         "dtitvfmt.cpp",
         "dtitvinf.cpp",
diff --git a/icu4c/source/i18n/Makefile.in b/icu4c/source/i18n/Makefile.in
index dda6050..e52be37 100644
--- a/icu4c/source/i18n/Makefile.in
+++ b/icu4c/source/i18n/Makefile.in
@@ -107,7 +107,9 @@
 number_decimfmtprops.o number_fluent.o number_formatimpl.o number_grouping.o \
 number_integerwidth.o number_longnames.o number_modifiers.o number_notation.o \
 number_padding.o number_patternmodifier.o number_patternstring.o \
-number_rounding.o number_scientific.o number_stringbuilder.o
+number_rounding.o number_scientific.o number_stringbuilder.o \
+double-conversion.o double-conversion-bignum-dtoa.o double-conversion-bignum.o \
+double-conversion-cached-powers.o double-conversion-diy-fp.o double-conversion-fast-dtoa.o
 
 
 ## Header files to install
diff --git a/icu4c/source/i18n/alphaindex.cpp b/icu4c/source/i18n/alphaindex.cpp
index d877cb2..d36a2cc 100644
--- a/icu4c/source/i18n/alphaindex.cpp
+++ b/icu4c/source/i18n/alphaindex.cpp
@@ -725,7 +725,7 @@
     }
 
     // question: should we add auxiliary exemplars?
-    if (exemplars.containsSome(0x61, 0x7A) /* a-z */ || exemplars.size() == 0) {
+    if (exemplars.containsSome(0x61, 0x7A) /* a-z */ || exemplars.isEmpty()) {
         exemplars.add(0x61, 0x7A);
     }
     if (exemplars.containsSome(0xAC00, 0xD7A3)) {  // Hangul syllables
@@ -740,14 +740,9 @@
         // cut down to small list
         // make use of the fact that Ethiopic is allocated in 8's, where
         // the base is 0 mod 8.
-        UnicodeSet ethiopic(
-            UNICODE_STRING_SIMPLE("[[:Block=Ethiopic:]&[:Script=Ethiopic:]]"), status);
-        UnicodeSetIterator it(ethiopic);
-        while (it.next() && !it.isString()) {
-            if ((it.getCodepoint() & 0x7) != 0) {
-                exemplars.remove(it.getCodepoint());
-            }
-        }
+        UnicodeSet ethiopic(UnicodeString(u"[ሀለሐመሠረሰሸቀቈቐቘበቨተቸኀኈነኘአከኰኸዀወዐዘዠየደዸጀገጐጘጠጨጰጸፀፈፐፘ]"), status);
+        ethiopic.retainAll(exemplars);
+        exemplars.remove(u'ሀ', 0x137F).addAll(ethiopic);
     }
 
     // Upper-case any that aren't already so.
diff --git a/icu4c/source/i18n/calendar.cpp b/icu4c/source/i18n/calendar.cpp
index 092dc4c..526a5a7 100644
--- a/icu4c/source/i18n/calendar.cpp
+++ b/icu4c/source/i18n/calendar.cpp
@@ -3223,14 +3223,14 @@
         bestField == UCAL_DAY_OF_WEEK_IN_MONTH);
     int32_t year;
 
-    if (bestField == UCAL_WEEK_OF_YEAR) {
-        year = internalGet(UCAL_YEAR_WOY, handleGetExtendedYear());
-        internalSet(UCAL_EXTENDED_YEAR, year);
+    if (bestField == UCAL_WEEK_OF_YEAR && newerField(UCAL_YEAR_WOY, UCAL_YEAR) == UCAL_YEAR_WOY) {
+        year = internalGet(UCAL_YEAR_WOY);
     } else {
         year = handleGetExtendedYear();
-        internalSet(UCAL_EXTENDED_YEAR, year);
     }
 
+    internalSet(UCAL_EXTENDED_YEAR, year);
+
 #if defined (U_DEBUG_CAL)
     fprintf(stderr, "%s:%d: bestField= %s - y=%d\n", __FILE__, __LINE__, fldName(bestField), year);
 #endif
diff --git a/icu4c/source/i18n/collationiterator.h b/icu4c/source/i18n/collationiterator.h
index ff6e5ec..12e05b4 100644
--- a/icu4c/source/i18n/collationiterator.h
+++ b/icu4c/source/i18n/collationiterator.h
@@ -34,12 +34,12 @@
 // Export an explicit template instantiation of the MaybeStackArray that
 //    is used as a data member of CEBuffer.
 //
-//    MSVC requires this, even though it should not be necessary. 
-//    No direct access to the MaybeStackArray leaks out of the i18n library.
+//    When building DLLs for Windows this is required even though
+//    no direct access to the MaybeStackArray leaks out of the i18n library.
 //
 // See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.
 //
-#if defined (_MSC_VER)
+#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
 template class U_I18N_API MaybeStackArray<int64_t, CEBUFFER_INITIAL_CAPACITY>;
 #endif
 
diff --git a/icu4c/source/i18n/dcfmtsym.cpp b/icu4c/source/i18n/dcfmtsym.cpp
index d321a82..a2cc58c 100644
--- a/icu4c/source/i18n/dcfmtsym.cpp
+++ b/icu4c/source/i18n/dcfmtsym.cpp
@@ -38,6 +38,7 @@
 #include "uresimp.h"
 #include "ureslocs.h"
 #include "charstr.h"
+#include "uassert.h"
 
 // *****************************************************************************
 // class DecimalFormatSymbols
@@ -165,6 +166,7 @@
         uprv_strcpy(actualLocale, rhs.actualLocale);
         fIsCustomCurrencySymbol = rhs.fIsCustomCurrencySymbol; 
         fIsCustomIntlCurrencySymbol = rhs.fIsCustomIntlCurrencySymbol; 
+        fCodePointZero = rhs.fCodePointZero;
     }
     return *this;
 }
@@ -196,6 +198,7 @@
             return FALSE;
         }
     }
+    // No need to check fCodePointZero since it is based on fSymbols
     return locale == that.locale &&
         uprv_strcmp(validLocale, that.validLocale) == 0 &&
         uprv_strcmp(actualLocale, that.actualLocale) == 0;
@@ -433,6 +436,24 @@
     // Let the monetary number separators equal the default number separators if necessary.
     sink.resolveMissingMonetarySeparators(fSymbols);
 
+    // Resolve codePointZero
+    UChar32 tempCodePointZero;
+    for (int32_t i=0; i<=9; i++) {
+        const UnicodeString& stringDigit = getConstDigitSymbol(i);
+        if (stringDigit.countChar32() != 1) {
+            tempCodePointZero = -1;
+            break;
+        }
+        UChar32 cp = stringDigit.char32At(0);
+        if (i == 0) {
+            tempCodePointZero = cp;
+        } else if (cp != tempCodePointZero + i) {
+            tempCodePointZero = -1;
+            break;
+        }
+    }
+    fCodePointZero = tempCodePointZero;
+
     // Obtain currency data from the currency API.  This is strictly
     // for backward compatibility; we don't use DecimalFormatSymbols
     // for currency data anymore.
@@ -530,6 +551,8 @@
     fSymbols[kExponentMultiplicationSymbol] = (UChar)0xd7; // 'x' multiplication symbol for exponents
     fIsCustomCurrencySymbol = FALSE; 
     fIsCustomIntlCurrencySymbol = FALSE;
+    fCodePointZero = 0x30;
+    U_ASSERT(fCodePointZero == fSymbols[kZeroDigitSymbol].char32At(0));
 
 }
 
diff --git a/icu4c/source/i18n/decNumber.cpp b/icu4c/source/i18n/decNumber.cpp
index 149062e..cee2f8e 100644
--- a/icu4c/source/i18n/decNumber.cpp
+++ b/icu4c/source/i18n/decNumber.cpp
@@ -627,10 +627,12 @@
 
       for (; *c=='0' && *(c+1)!='\0';) c++;  /* strip insignificant zeros  */
       firstexp=c;                            /* save exponent digit place  */
+      uInt uexponent = 0;   /* Avoid undefined behavior on signed int overflow */
       for (; ;c++) {
         if (*c<'0' || *c>'9') break;         /* not a digit  */
-        exponent=X10(exponent)+(Int)*c-(Int)'0';
+        uexponent=X10(uexponent)+(uInt)*c-(uInt)'0';
         } /* c  */
+      exponent = (Int)uexponent;
       /* if not now on a '\0', *c must not be a digit  */
       if (*c!='\0') break;
 
diff --git a/icu4c/source/i18n/decimalformatpattern.cpp b/icu4c/source/i18n/decimalformatpattern.cpp
index b07bcdd..4ee5e33 100644
--- a/icu4c/source/i18n/decimalformatpattern.cpp
+++ b/icu4c/source/i18n/decimalformatpattern.cpp
@@ -50,10 +50,12 @@
     parseError.preContext[stop-start] = 0;
 
     //for post-context
-    start = pos+1;
-    stop  = ((pos+U_PARSE_CONTEXT_LEN)<=pattern.length()) ? (pos+(U_PARSE_CONTEXT_LEN-1)) :
-        pattern.length();
-    pattern.extract(start,stop-start,parseError.postContext,0);
+    start = pattern.moveIndex32(pos, 1);
+    stop = pos + U_PARSE_CONTEXT_LEN - 1;
+    if (stop > pattern.length()) {
+        stop = pattern.length();
+    }
+    pattern.extract(start, stop - start, parseError.postContext, 0);
     //null terminate the buffer
     parseError.postContext[stop-start]= 0;
 }
diff --git a/icu4c/source/i18n/digitlst.cpp b/icu4c/source/i18n/digitlst.cpp
index 8e86fa7..978bb60 100644
--- a/icu4c/source/i18n/digitlst.cpp
+++ b/icu4c/source/i18n/digitlst.cpp
@@ -44,12 +44,15 @@
 #include "digitinterval.h" 
 #include "ucln_in.h"
 #include "umutex.h"
+#include "double-conversion.h"
 #include <stdlib.h>
 #include <limits.h>
 #include <string.h>
 #include <stdio.h>
 #include <limits>
 
+using icu::double_conversion::DoubleToStringConverter;
+
 #if !defined(U_USE_STRTOD_L)
 # if U_PLATFORM_USES_ONLY_WIN32_API
 #   define U_USE_STRTOD_L 1
@@ -850,8 +853,53 @@
         } else {
             uprv_strcpy(rep,"inf");
         }
+    } else if (uprv_isNaN(source)) {
+        uprv_strcpy(rep, "NaN");
     } else {
-        sprintf(rep, "%+1.*e", MAX_DBL_DIGITS - 1, source);
+        bool sign;
+        int32_t length;
+        int32_t point;
+        DoubleToStringConverter::DoubleToAscii(
+            source,
+            DoubleToStringConverter::DtoaMode::SHORTEST,
+            0,
+            rep + 1,
+            sizeof(rep),
+            &sign,
+            &length,
+            &point
+        );
+
+        // Convert the raw buffer into a string for decNumber
+        int32_t power = point - length;
+        if (sign) {
+            rep[0] = '-';
+        } else {
+            rep[0] = '0';
+        }
+        length++;
+        rep[length++] = 'E';
+        if (power < 0) {
+            rep[length++] = '-';
+            power = -power;
+        } else {
+            rep[length++] = '+';
+        }
+        if (power < 10) {
+            rep[length++] = power + '0';
+        } else if (power < 100) {
+            rep[length++] = (power / 10) + '0';
+            rep[length++] = (power % 10) + '0';
+        } else {
+            U_ASSERT(power < 1000);
+            rep[length + 2] = (power % 10) + '0';
+            power /= 10;
+            rep[length + 1] = (power % 10) + '0';
+            power /= 10;
+            rep[length] = power + '0';
+            length += 3;
+        }
+        rep[length++] = 0;
     }
     U_ASSERT(uprv_strlen(rep) < sizeof(rep));
 
diff --git a/icu4c/source/i18n/double-conversion-bignum-dtoa.cpp b/icu4c/source/i18n/double-conversion-bignum-dtoa.cpp
new file mode 100644
index 0000000..07d0b0e
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-bignum-dtoa.cpp
@@ -0,0 +1,659 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#include <math.h>
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-bignum-dtoa.h"
+
+#include "double-conversion-bignum.h"
+#include "double-conversion-ieee.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+static int NormalizedExponent(uint64_t significand, int exponent) {
+  ASSERT(significand != 0);
+  while ((significand & Double::kHiddenBit) == 0) {
+    significand = significand << 1;
+    exponent = exponent - 1;
+  }
+  return exponent;
+}
+
+
+// Forward declarations:
+// Returns an estimation of k such that 10^(k-1) <= v < 10^k.
+static int EstimatePower(int exponent);
+// Computes v / 10^estimated_power exactly, as a ratio of two bignums, numerator
+// and denominator.
+static void InitialScaledStartValues(uint64_t significand,
+                                     int exponent,
+                                     bool lower_boundary_is_closer,
+                                     int estimated_power,
+                                     bool need_boundary_deltas,
+                                     Bignum* numerator,
+                                     Bignum* denominator,
+                                     Bignum* delta_minus,
+                                     Bignum* delta_plus);
+// Multiplies numerator/denominator so that its values lies in the range 1-10.
+// Returns decimal_point s.t.
+//  v = numerator'/denominator' * 10^(decimal_point-1)
+//     where numerator' and denominator' are the values of numerator and
+//     denominator after the call to this function.
+static void FixupMultiply10(int estimated_power, bool is_even,
+                            int* decimal_point,
+                            Bignum* numerator, Bignum* denominator,
+                            Bignum* delta_minus, Bignum* delta_plus);
+// Generates digits from the left to the right and stops when the generated
+// digits yield the shortest decimal representation of v.
+static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
+                                   Bignum* delta_minus, Bignum* delta_plus,
+                                   bool is_even,
+                                   Vector<char> buffer, int* length);
+// Generates 'requested_digits' after the decimal point.
+static void BignumToFixed(int requested_digits, int* decimal_point,
+                          Bignum* numerator, Bignum* denominator,
+                          Vector<char>(buffer), int* length);
+// Generates 'count' digits of numerator/denominator.
+// Once 'count' digits have been produced rounds the result depending on the
+// remainder (remainders of exactly .5 round upwards). Might update the
+// decimal_point when rounding up (for example for 0.9999).
+static void GenerateCountedDigits(int count, int* decimal_point,
+                                  Bignum* numerator, Bignum* denominator,
+                                  Vector<char>(buffer), int* length);
+
+
+void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
+                Vector<char> buffer, int* length, int* decimal_point) {
+  ASSERT(v > 0);
+  ASSERT(!Double(v).IsSpecial());
+  uint64_t significand;
+  int exponent;
+  bool lower_boundary_is_closer;
+  if (mode == BIGNUM_DTOA_SHORTEST_SINGLE) {
+    float f = static_cast<float>(v);
+    ASSERT(f == v);
+    significand = Single(f).Significand();
+    exponent = Single(f).Exponent();
+    lower_boundary_is_closer = Single(f).LowerBoundaryIsCloser();
+  } else {
+    significand = Double(v).Significand();
+    exponent = Double(v).Exponent();
+    lower_boundary_is_closer = Double(v).LowerBoundaryIsCloser();
+  }
+  bool need_boundary_deltas =
+      (mode == BIGNUM_DTOA_SHORTEST || mode == BIGNUM_DTOA_SHORTEST_SINGLE);
+
+  bool is_even = (significand & 1) == 0;
+  int normalized_exponent = NormalizedExponent(significand, exponent);
+  // estimated_power might be too low by 1.
+  int estimated_power = EstimatePower(normalized_exponent);
+
+  // Shortcut for Fixed.
+  // The requested digits correspond to the digits after the point. If the
+  // number is much too small, then there is no need in trying to get any
+  // digits.
+  if (mode == BIGNUM_DTOA_FIXED && -estimated_power - 1 > requested_digits) {
+    buffer[0] = '\0';
+    *length = 0;
+    // Set decimal-point to -requested_digits. This is what Gay does.
+    // Note that it should not have any effect anyways since the string is
+    // empty.
+    *decimal_point = -requested_digits;
+    return;
+  }
+
+  Bignum numerator;
+  Bignum denominator;
+  Bignum delta_minus;
+  Bignum delta_plus;
+  // Make sure the bignum can grow large enough. The smallest double equals
+  // 4e-324. In this case the denominator needs fewer than 324*4 binary digits.
+  // The maximum double is 1.7976931348623157e308 which needs fewer than
+  // 308*4 binary digits.
+  ASSERT(Bignum::kMaxSignificantBits >= 324*4);
+  InitialScaledStartValues(significand, exponent, lower_boundary_is_closer,
+                           estimated_power, need_boundary_deltas,
+                           &numerator, &denominator,
+                           &delta_minus, &delta_plus);
+  // We now have v = (numerator / denominator) * 10^estimated_power.
+  FixupMultiply10(estimated_power, is_even, decimal_point,
+                  &numerator, &denominator,
+                  &delta_minus, &delta_plus);
+  // We now have v = (numerator / denominator) * 10^(decimal_point-1), and
+  //  1 <= (numerator + delta_plus) / denominator < 10
+  switch (mode) {
+    case BIGNUM_DTOA_SHORTEST:
+    case BIGNUM_DTOA_SHORTEST_SINGLE:
+      GenerateShortestDigits(&numerator, &denominator,
+                             &delta_minus, &delta_plus,
+                             is_even, buffer, length);
+      break;
+    case BIGNUM_DTOA_FIXED:
+      BignumToFixed(requested_digits, decimal_point,
+                    &numerator, &denominator,
+                    buffer, length);
+      break;
+    case BIGNUM_DTOA_PRECISION:
+      GenerateCountedDigits(requested_digits, decimal_point,
+                            &numerator, &denominator,
+                            buffer, length);
+      break;
+    default:
+      UNREACHABLE();
+  }
+  buffer[*length] = '\0';
+}
+
+
+// The procedure starts generating digits from the left to the right and stops
+// when the generated digits yield the shortest decimal representation of v. A
+// decimal representation of v is a number lying closer to v than to any other
+// double, so it converts to v when read.
+//
+// This is true if d, the decimal representation, is between m- and m+, the
+// upper and lower boundaries. d must be strictly between them if !is_even.
+//           m- := (numerator - delta_minus) / denominator
+//           m+ := (numerator + delta_plus) / denominator
+//
+// Precondition: 0 <= (numerator+delta_plus) / denominator < 10.
+//   If 1 <= (numerator+delta_plus) / denominator < 10 then no leading 0 digit
+//   will be produced. This should be the standard precondition.
+static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
+                                   Bignum* delta_minus, Bignum* delta_plus,
+                                   bool is_even,
+                                   Vector<char> buffer, int* length) {
+  // Small optimization: if delta_minus and delta_plus are the same just reuse
+  // one of the two bignums.
+  if (Bignum::Equal(*delta_minus, *delta_plus)) {
+    delta_plus = delta_minus;
+  }
+  *length = 0;
+  for (;;) {
+    uint16_t digit;
+    digit = numerator->DivideModuloIntBignum(*denominator);
+    ASSERT(digit <= 9);  // digit is a uint16_t and therefore always positive.
+    // digit = numerator / denominator (integer division).
+    // numerator = numerator % denominator.
+    buffer[(*length)++] = static_cast<char>(digit + '0');
+
+    // Can we stop already?
+    // If the remainder of the division is less than the distance to the lower
+    // boundary we can stop. In this case we simply round down (discarding the
+    // remainder).
+    // Similarly we test if we can round up (using the upper boundary).
+    bool in_delta_room_minus;
+    bool in_delta_room_plus;
+    if (is_even) {
+      in_delta_room_minus = Bignum::LessEqual(*numerator, *delta_minus);
+    } else {
+      in_delta_room_minus = Bignum::Less(*numerator, *delta_minus);
+    }
+    if (is_even) {
+      in_delta_room_plus =
+          Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0;
+    } else {
+      in_delta_room_plus =
+          Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0;
+    }
+    if (!in_delta_room_minus && !in_delta_room_plus) {
+      // Prepare for next iteration.
+      numerator->Times10();
+      delta_minus->Times10();
+      // We optimized delta_plus to be equal to delta_minus (if they share the
+      // same value). So don't multiply delta_plus if they point to the same
+      // object.
+      if (delta_minus != delta_plus) {
+        delta_plus->Times10();
+      }
+    } else if (in_delta_room_minus && in_delta_room_plus) {
+      // Let's see if 2*numerator < denominator.
+      // If yes, then the next digit would be < 5 and we can round down.
+      int compare = Bignum::PlusCompare(*numerator, *numerator, *denominator);
+      if (compare < 0) {
+        // Remaining digits are less than .5. -> Round down (== do nothing).
+      } else if (compare > 0) {
+        // Remaining digits are more than .5 of denominator. -> Round up.
+        // Note that the last digit could not be a '9' as otherwise the whole
+        // loop would have stopped earlier.
+        // We still have an assert here in case the preconditions were not
+        // satisfied.
+        ASSERT(buffer[(*length) - 1] != '9');
+        buffer[(*length) - 1]++;
+      } else {
+        // Halfway case.
+        // TODO(floitsch): need a way to solve half-way cases.
+        //   For now let's round towards even (since this is what Gay seems to
+        //   do).
+
+        if ((buffer[(*length) - 1] - '0') % 2 == 0) {
+          // Round down => Do nothing.
+        } else {
+          ASSERT(buffer[(*length) - 1] != '9');
+          buffer[(*length) - 1]++;
+        }
+      }
+      return;
+    } else if (in_delta_room_minus) {
+      // Round down (== do nothing).
+      return;
+    } else {  // in_delta_room_plus
+      // Round up.
+      // Note again that the last digit could not be '9' since this would have
+      // stopped the loop earlier.
+      // We still have an ASSERT here, in case the preconditions were not
+      // satisfied.
+      ASSERT(buffer[(*length) -1] != '9');
+      buffer[(*length) - 1]++;
+      return;
+    }
+  }
+}
+
+
+// Let v = numerator / denominator < 10.
+// Then we generate 'count' digits of d = x.xxxxx... (without the decimal point)
+// from left to right. Once 'count' digits have been produced we decide wether
+// to round up or down. Remainders of exactly .5 round upwards. Numbers such
+// as 9.999999 propagate a carry all the way, and change the
+// exponent (decimal_point), when rounding upwards.
+static void GenerateCountedDigits(int count, int* decimal_point,
+                                  Bignum* numerator, Bignum* denominator,
+                                  Vector<char> buffer, int* length) {
+  ASSERT(count >= 0);
+  for (int i = 0; i < count - 1; ++i) {
+    uint16_t digit;
+    digit = numerator->DivideModuloIntBignum(*denominator);
+    ASSERT(digit <= 9);  // digit is a uint16_t and therefore always positive.
+    // digit = numerator / denominator (integer division).
+    // numerator = numerator % denominator.
+    buffer[i] = static_cast<char>(digit + '0');
+    // Prepare for next iteration.
+    numerator->Times10();
+  }
+  // Generate the last digit.
+  uint16_t digit;
+  digit = numerator->DivideModuloIntBignum(*denominator);
+  if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) {
+    digit++;
+  }
+  ASSERT(digit <= 10);
+  buffer[count - 1] = static_cast<char>(digit + '0');
+  // Correct bad digits (in case we had a sequence of '9's). Propagate the
+  // carry until we hat a non-'9' or til we reach the first digit.
+  for (int i = count - 1; i > 0; --i) {
+    if (buffer[i] != '0' + 10) break;
+    buffer[i] = '0';
+    buffer[i - 1]++;
+  }
+  if (buffer[0] == '0' + 10) {
+    // Propagate a carry past the top place.
+    buffer[0] = '1';
+    (*decimal_point)++;
+  }
+  *length = count;
+}
+
+
+// Generates 'requested_digits' after the decimal point. It might omit
+// trailing '0's. If the input number is too small then no digits at all are
+// generated (ex.: 2 fixed digits for 0.00001).
+//
+// Input verifies:  1 <= (numerator + delta) / denominator < 10.
+static void BignumToFixed(int requested_digits, int* decimal_point,
+                          Bignum* numerator, Bignum* denominator,
+                          Vector<char>(buffer), int* length) {
+  // Note that we have to look at more than just the requested_digits, since
+  // a number could be rounded up. Example: v=0.5 with requested_digits=0.
+  // Even though the power of v equals 0 we can't just stop here.
+  if (-(*decimal_point) > requested_digits) {
+    // The number is definitively too small.
+    // Ex: 0.001 with requested_digits == 1.
+    // Set decimal-point to -requested_digits. This is what Gay does.
+    // Note that it should not have any effect anyways since the string is
+    // empty.
+    *decimal_point = -requested_digits;
+    *length = 0;
+    return;
+  } else if (-(*decimal_point) == requested_digits) {
+    // We only need to verify if the number rounds down or up.
+    // Ex: 0.04 and 0.06 with requested_digits == 1.
+    ASSERT(*decimal_point == -requested_digits);
+    // Initially the fraction lies in range (1, 10]. Multiply the denominator
+    // by 10 so that we can compare more easily.
+    denominator->Times10();
+    if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) {
+      // If the fraction is >= 0.5 then we have to include the rounded
+      // digit.
+      buffer[0] = '1';
+      *length = 1;
+      (*decimal_point)++;
+    } else {
+      // Note that we caught most of similar cases earlier.
+      *length = 0;
+    }
+    return;
+  } else {
+    // The requested digits correspond to the digits after the point.
+    // The variable 'needed_digits' includes the digits before the point.
+    int needed_digits = (*decimal_point) + requested_digits;
+    GenerateCountedDigits(needed_digits, decimal_point,
+                          numerator, denominator,
+                          buffer, length);
+  }
+}
+
+
+// Returns an estimation of k such that 10^(k-1) <= v < 10^k where
+// v = f * 2^exponent and 2^52 <= f < 2^53.
+// v is hence a normalized double with the given exponent. The output is an
+// approximation for the exponent of the decimal approimation .digits * 10^k.
+//
+// The result might undershoot by 1 in which case 10^k <= v < 10^k+1.
+// Note: this property holds for v's upper boundary m+ too.
+//    10^k <= m+ < 10^k+1.
+//   (see explanation below).
+//
+// Examples:
+//  EstimatePower(0)   => 16
+//  EstimatePower(-52) => 0
+//
+// Note: e >= 0 => EstimatedPower(e) > 0. No similar claim can be made for e<0.
+static int EstimatePower(int exponent) {
+  // This function estimates log10 of v where v = f*2^e (with e == exponent).
+  // Note that 10^floor(log10(v)) <= v, but v <= 10^ceil(log10(v)).
+  // Note that f is bounded by its container size. Let p = 53 (the double's
+  // significand size). Then 2^(p-1) <= f < 2^p.
+  //
+  // Given that log10(v) == log2(v)/log2(10) and e+(len(f)-1) is quite close
+  // to log2(v) the function is simplified to (e+(len(f)-1)/log2(10)).
+  // The computed number undershoots by less than 0.631 (when we compute log3
+  // and not log10).
+  //
+  // Optimization: since we only need an approximated result this computation
+  // can be performed on 64 bit integers. On x86/x64 architecture the speedup is
+  // not really measurable, though.
+  //
+  // Since we want to avoid overshooting we decrement by 1e10 so that
+  // floating-point imprecisions don't affect us.
+  //
+  // Explanation for v's boundary m+: the computation takes advantage of
+  // the fact that 2^(p-1) <= f < 2^p. Boundaries still satisfy this requirement
+  // (even for denormals where the delta can be much more important).
+
+  const double k1Log10 = 0.30102999566398114;  // 1/lg(10)
+
+  // For doubles len(f) == 53 (don't forget the hidden bit).
+  const int kSignificandSize = Double::kSignificandSize;
+  double estimate = ceil((exponent + kSignificandSize - 1) * k1Log10 - 1e-10);
+  return static_cast<int>(estimate);
+}
+
+
+// See comments for InitialScaledStartValues.
+static void InitialScaledStartValuesPositiveExponent(
+    uint64_t significand, int exponent,
+    int estimated_power, bool need_boundary_deltas,
+    Bignum* numerator, Bignum* denominator,
+    Bignum* delta_minus, Bignum* delta_plus) {
+  // A positive exponent implies a positive power.
+  ASSERT(estimated_power >= 0);
+  // Since the estimated_power is positive we simply multiply the denominator
+  // by 10^estimated_power.
+
+  // numerator = v.
+  numerator->AssignUInt64(significand);
+  numerator->ShiftLeft(exponent);
+  // denominator = 10^estimated_power.
+  denominator->AssignPowerUInt16(10, estimated_power);
+
+  if (need_boundary_deltas) {
+    // Introduce a common denominator so that the deltas to the boundaries are
+    // integers.
+    denominator->ShiftLeft(1);
+    numerator->ShiftLeft(1);
+    // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common
+    // denominator (of 2) delta_plus equals 2^e.
+    delta_plus->AssignUInt16(1);
+    delta_plus->ShiftLeft(exponent);
+    // Same for delta_minus. The adjustments if f == 2^p-1 are done later.
+    delta_minus->AssignUInt16(1);
+    delta_minus->ShiftLeft(exponent);
+  }
+}
+
+
+// See comments for InitialScaledStartValues
+static void InitialScaledStartValuesNegativeExponentPositivePower(
+    uint64_t significand, int exponent,
+    int estimated_power, bool need_boundary_deltas,
+    Bignum* numerator, Bignum* denominator,
+    Bignum* delta_minus, Bignum* delta_plus) {
+  // v = f * 2^e with e < 0, and with estimated_power >= 0.
+  // This means that e is close to 0 (have a look at how estimated_power is
+  // computed).
+
+  // numerator = significand
+  //  since v = significand * 2^exponent this is equivalent to
+  //  numerator = v * / 2^-exponent
+  numerator->AssignUInt64(significand);
+  // denominator = 10^estimated_power * 2^-exponent (with exponent < 0)
+  denominator->AssignPowerUInt16(10, estimated_power);
+  denominator->ShiftLeft(-exponent);
+
+  if (need_boundary_deltas) {
+    // Introduce a common denominator so that the deltas to the boundaries are
+    // integers.
+    denominator->ShiftLeft(1);
+    numerator->ShiftLeft(1);
+    // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common
+    // denominator (of 2) delta_plus equals 2^e.
+    // Given that the denominator already includes v's exponent the distance
+    // to the boundaries is simply 1.
+    delta_plus->AssignUInt16(1);
+    // Same for delta_minus. The adjustments if f == 2^p-1 are done later.
+    delta_minus->AssignUInt16(1);
+  }
+}
+
+
+// See comments for InitialScaledStartValues
+static void InitialScaledStartValuesNegativeExponentNegativePower(
+    uint64_t significand, int exponent,
+    int estimated_power, bool need_boundary_deltas,
+    Bignum* numerator, Bignum* denominator,
+    Bignum* delta_minus, Bignum* delta_plus) {
+  // Instead of multiplying the denominator with 10^estimated_power we
+  // multiply all values (numerator and deltas) by 10^-estimated_power.
+
+  // Use numerator as temporary container for power_ten.
+  Bignum* power_ten = numerator;
+  power_ten->AssignPowerUInt16(10, -estimated_power);
+
+  if (need_boundary_deltas) {
+    // Since power_ten == numerator we must make a copy of 10^estimated_power
+    // before we complete the computation of the numerator.
+    // delta_plus = delta_minus = 10^estimated_power
+    delta_plus->AssignBignum(*power_ten);
+    delta_minus->AssignBignum(*power_ten);
+  }
+
+  // numerator = significand * 2 * 10^-estimated_power
+  //  since v = significand * 2^exponent this is equivalent to
+  // numerator = v * 10^-estimated_power * 2 * 2^-exponent.
+  // Remember: numerator has been abused as power_ten. So no need to assign it
+  //  to itself.
+  ASSERT(numerator == power_ten);
+  numerator->MultiplyByUInt64(significand);
+
+  // denominator = 2 * 2^-exponent with exponent < 0.
+  denominator->AssignUInt16(1);
+  denominator->ShiftLeft(-exponent);
+
+  if (need_boundary_deltas) {
+    // Introduce a common denominator so that the deltas to the boundaries are
+    // integers.
+    numerator->ShiftLeft(1);
+    denominator->ShiftLeft(1);
+    // With this shift the boundaries have their correct value, since
+    // delta_plus = 10^-estimated_power, and
+    // delta_minus = 10^-estimated_power.
+    // These assignments have been done earlier.
+    // The adjustments if f == 2^p-1 (lower boundary is closer) are done later.
+  }
+}
+
+
+// Let v = significand * 2^exponent.
+// Computes v / 10^estimated_power exactly, as a ratio of two bignums, numerator
+// and denominator. The functions GenerateShortestDigits and
+// GenerateCountedDigits will then convert this ratio to its decimal
+// representation d, with the required accuracy.
+// Then d * 10^estimated_power is the representation of v.
+// (Note: the fraction and the estimated_power might get adjusted before
+// generating the decimal representation.)
+//
+// The initial start values consist of:
+//  - a scaled numerator: s.t. numerator/denominator == v / 10^estimated_power.
+//  - a scaled (common) denominator.
+//  optionally (used by GenerateShortestDigits to decide if it has the shortest
+//  decimal converting back to v):
+//  - v - m-: the distance to the lower boundary.
+//  - m+ - v: the distance to the upper boundary.
+//
+// v, m+, m-, and therefore v - m- and m+ - v all share the same denominator.
+//
+// Let ep == estimated_power, then the returned values will satisfy:
+//  v / 10^ep = numerator / denominator.
+//  v's boundarys m- and m+:
+//    m- / 10^ep == v / 10^ep - delta_minus / denominator
+//    m+ / 10^ep == v / 10^ep + delta_plus / denominator
+//  Or in other words:
+//    m- == v - delta_minus * 10^ep / denominator;
+//    m+ == v + delta_plus * 10^ep / denominator;
+//
+// Since 10^(k-1) <= v < 10^k    (with k == estimated_power)
+//  or       10^k <= v < 10^(k+1)
+//  we then have 0.1 <= numerator/denominator < 1
+//           or    1 <= numerator/denominator < 10
+//
+// It is then easy to kickstart the digit-generation routine.
+//
+// The boundary-deltas are only filled if the mode equals BIGNUM_DTOA_SHORTEST
+// or BIGNUM_DTOA_SHORTEST_SINGLE.
+
+static void InitialScaledStartValues(uint64_t significand,
+                                     int exponent,
+                                     bool lower_boundary_is_closer,
+                                     int estimated_power,
+                                     bool need_boundary_deltas,
+                                     Bignum* numerator,
+                                     Bignum* denominator,
+                                     Bignum* delta_minus,
+                                     Bignum* delta_plus) {
+  if (exponent >= 0) {
+    InitialScaledStartValuesPositiveExponent(
+        significand, exponent, estimated_power, need_boundary_deltas,
+        numerator, denominator, delta_minus, delta_plus);
+  } else if (estimated_power >= 0) {
+    InitialScaledStartValuesNegativeExponentPositivePower(
+        significand, exponent, estimated_power, need_boundary_deltas,
+        numerator, denominator, delta_minus, delta_plus);
+  } else {
+    InitialScaledStartValuesNegativeExponentNegativePower(
+        significand, exponent, estimated_power, need_boundary_deltas,
+        numerator, denominator, delta_minus, delta_plus);
+  }
+
+  if (need_boundary_deltas && lower_boundary_is_closer) {
+    // The lower boundary is closer at half the distance of "normal" numbers.
+    // Increase the common denominator and adapt all but the delta_minus.
+    denominator->ShiftLeft(1);  // *2
+    numerator->ShiftLeft(1);    // *2
+    delta_plus->ShiftLeft(1);   // *2
+  }
+}
+
+
+// This routine multiplies numerator/denominator so that its values lies in the
+// range 1-10. That is after a call to this function we have:
+//    1 <= (numerator + delta_plus) /denominator < 10.
+// Let numerator the input before modification and numerator' the argument
+// after modification, then the output-parameter decimal_point is such that
+//  numerator / denominator * 10^estimated_power ==
+//    numerator' / denominator' * 10^(decimal_point - 1)
+// In some cases estimated_power was too low, and this is already the case. We
+// then simply adjust the power so that 10^(k-1) <= v < 10^k (with k ==
+// estimated_power) but do not touch the numerator or denominator.
+// Otherwise the routine multiplies the numerator and the deltas by 10.
+static void FixupMultiply10(int estimated_power, bool is_even,
+                            int* decimal_point,
+                            Bignum* numerator, Bignum* denominator,
+                            Bignum* delta_minus, Bignum* delta_plus) {
+  bool in_range;
+  if (is_even) {
+    // For IEEE doubles half-way cases (in decimal system numbers ending with 5)
+    // are rounded to the closest floating-point number with even significand.
+    in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0;
+  } else {
+    in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0;
+  }
+  if (in_range) {
+    // Since numerator + delta_plus >= denominator we already have
+    // 1 <= numerator/denominator < 10. Simply update the estimated_power.
+    *decimal_point = estimated_power + 1;
+  } else {
+    *decimal_point = estimated_power;
+    numerator->Times10();
+    if (Bignum::Equal(*delta_minus, *delta_plus)) {
+      delta_minus->Times10();
+      delta_plus->AssignBignum(*delta_minus);
+    } else {
+      delta_minus->Times10();
+      delta_plus->Times10();
+    }
+  }
+}
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-bignum-dtoa.h b/icu4c/source/i18n/double-conversion-bignum-dtoa.h
new file mode 100644
index 0000000..edc21b0
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-bignum-dtoa.h
@@ -0,0 +1,102 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#ifndef DOUBLE_CONVERSION_BIGNUM_DTOA_H_
+#define DOUBLE_CONVERSION_BIGNUM_DTOA_H_
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+enum BignumDtoaMode {
+  // Return the shortest correct representation.
+  // For example the output of 0.299999999999999988897 is (the less accurate but
+  // correct) 0.3.
+  BIGNUM_DTOA_SHORTEST,
+  // Same as BIGNUM_DTOA_SHORTEST but for single-precision floats.
+  BIGNUM_DTOA_SHORTEST_SINGLE,
+  // Return a fixed number of digits after the decimal point.
+  // For instance fixed(0.1, 4) becomes 0.1000
+  // If the input number is big, the output will be big.
+  BIGNUM_DTOA_FIXED,
+  // Return a fixed number of digits, no matter what the exponent is.
+  BIGNUM_DTOA_PRECISION
+};
+
+// Converts the given double 'v' to ascii.
+// The result should be interpreted as buffer * 10^(point-length).
+// The buffer will be null-terminated.
+//
+// The input v must be > 0 and different from NaN, and Infinity.
+//
+// The output depends on the given mode:
+//  - SHORTEST: produce the least amount of digits for which the internal
+//   identity requirement is still satisfied. If the digits are printed
+//   (together with the correct exponent) then reading this number will give
+//   'v' again. The buffer will choose the representation that is closest to
+//   'v'. If there are two at the same distance, than the number is round up.
+//   In this mode the 'requested_digits' parameter is ignored.
+//  - FIXED: produces digits necessary to print a given number with
+//   'requested_digits' digits after the decimal point. The produced digits
+//   might be too short in which case the caller has to fill the gaps with '0's.
+//   Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2.
+//   Halfway cases are rounded up. The call toFixed(0.15, 2) thus returns
+//     buffer="2", point=0.
+//   Note: the length of the returned buffer has no meaning wrt the significance
+//   of its digits. That is, just because it contains '0's does not mean that
+//   any other digit would not satisfy the internal identity requirement.
+//  - PRECISION: produces 'requested_digits' where the first digit is not '0'.
+//   Even though the length of produced digits usually equals
+//   'requested_digits', the function is allowed to return fewer digits, in
+//   which case the caller has to fill the missing digits with '0's.
+//   Halfway cases are again rounded up.
+// 'BignumDtoa' expects the given buffer to be big enough to hold all digits
+// and a terminating null-character.
+void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
+                Vector<char> buffer, int* length, int* point);
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+
+#endif  // DOUBLE_CONVERSION_BIGNUM_DTOA_H_
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-bignum.cpp b/icu4c/source/i18n/double-conversion-bignum.cpp
new file mode 100644
index 0000000..d5682af
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-bignum.cpp
@@ -0,0 +1,784 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-bignum.h"
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+Bignum::Bignum()
+    : bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) {
+  for (int i = 0; i < kBigitCapacity; ++i) {
+    bigits_[i] = 0;
+  }
+}
+
+
+template<typename S>
+static int BitSize(S value) {
+  (void) value;  // Mark variable as used.
+  return 8 * sizeof(value);
+}
+
+// Guaranteed to lie in one Bigit.
+void Bignum::AssignUInt16(uint16_t value) {
+  ASSERT(kBigitSize >= BitSize(value));
+  Zero();
+  if (value == 0) return;
+
+  EnsureCapacity(1);
+  bigits_[0] = value;
+  used_digits_ = 1;
+}
+
+
+void Bignum::AssignUInt64(uint64_t value) {
+  const int kUInt64Size = 64;
+
+  Zero();
+  if (value == 0) return;
+
+  int needed_bigits = kUInt64Size / kBigitSize + 1;
+  EnsureCapacity(needed_bigits);
+  for (int i = 0; i < needed_bigits; ++i) {
+    bigits_[i] = value & kBigitMask;
+    value = value >> kBigitSize;
+  }
+  used_digits_ = needed_bigits;
+  Clamp();
+}
+
+
+void Bignum::AssignBignum(const Bignum& other) {
+  exponent_ = other.exponent_;
+  for (int i = 0; i < other.used_digits_; ++i) {
+    bigits_[i] = other.bigits_[i];
+  }
+  // Clear the excess digits (if there were any).
+  for (int i = other.used_digits_; i < used_digits_; ++i) {
+    bigits_[i] = 0;
+  }
+  used_digits_ = other.used_digits_;
+}
+
+
+static uint64_t ReadUInt64(Vector<const char> buffer,
+                           int from,
+                           int digits_to_read) {
+  uint64_t result = 0;
+  for (int i = from; i < from + digits_to_read; ++i) {
+    int digit = buffer[i] - '0';
+    ASSERT(0 <= digit && digit <= 9);
+    result = result * 10 + digit;
+  }
+  return result;
+}
+
+
+void Bignum::AssignDecimalString(Vector<const char> value) {
+  // 2^64 = 18446744073709551616 > 10^19
+  const int kMaxUint64DecimalDigits = 19;
+  Zero();
+  int length = value.length();
+  unsigned int pos = 0;
+  // Let's just say that each digit needs 4 bits.
+  while (length >= kMaxUint64DecimalDigits) {
+    uint64_t digits = ReadUInt64(value, pos, kMaxUint64DecimalDigits);
+    pos += kMaxUint64DecimalDigits;
+    length -= kMaxUint64DecimalDigits;
+    MultiplyByPowerOfTen(kMaxUint64DecimalDigits);
+    AddUInt64(digits);
+  }
+  uint64_t digits = ReadUInt64(value, pos, length);
+  MultiplyByPowerOfTen(length);
+  AddUInt64(digits);
+  Clamp();
+}
+
+
+static int HexCharValue(char c) {
+  if ('0' <= c && c <= '9') return c - '0';
+  if ('a' <= c && c <= 'f') return 10 + c - 'a';
+  ASSERT('A' <= c && c <= 'F');
+  return 10 + c - 'A';
+}
+
+
+void Bignum::AssignHexString(Vector<const char> value) {
+  Zero();
+  int length = value.length();
+
+  int needed_bigits = length * 4 / kBigitSize + 1;
+  EnsureCapacity(needed_bigits);
+  int string_index = length - 1;
+  for (int i = 0; i < needed_bigits - 1; ++i) {
+    // These bigits are guaranteed to be "full".
+    Chunk current_bigit = 0;
+    for (int j = 0; j < kBigitSize / 4; j++) {
+      current_bigit += HexCharValue(value[string_index--]) << (j * 4);
+    }
+    bigits_[i] = current_bigit;
+  }
+  used_digits_ = needed_bigits - 1;
+
+  Chunk most_significant_bigit = 0;  // Could be = 0;
+  for (int j = 0; j <= string_index; ++j) {
+    most_significant_bigit <<= 4;
+    most_significant_bigit += HexCharValue(value[j]);
+  }
+  if (most_significant_bigit != 0) {
+    bigits_[used_digits_] = most_significant_bigit;
+    used_digits_++;
+  }
+  Clamp();
+}
+
+
+void Bignum::AddUInt64(uint64_t operand) {
+  if (operand == 0) return;
+  Bignum other;
+  other.AssignUInt64(operand);
+  AddBignum(other);
+}
+
+
+void Bignum::AddBignum(const Bignum& other) {
+  ASSERT(IsClamped());
+  ASSERT(other.IsClamped());
+
+  // If this has a greater exponent than other append zero-bigits to this.
+  // After this call exponent_ <= other.exponent_.
+  Align(other);
+
+  // There are two possibilities:
+  //   aaaaaaaaaaa 0000  (where the 0s represent a's exponent)
+  //     bbbbb 00000000
+  //   ----------------
+  //   ccccccccccc 0000
+  // or
+  //    aaaaaaaaaa 0000
+  //  bbbbbbbbb 0000000
+  //  -----------------
+  //  cccccccccccc 0000
+  // In both cases we might need a carry bigit.
+
+  EnsureCapacity(1 + Max(BigitLength(), other.BigitLength()) - exponent_);
+  Chunk carry = 0;
+  int bigit_pos = other.exponent_ - exponent_;
+  ASSERT(bigit_pos >= 0);
+  for (int i = 0; i < other.used_digits_; ++i) {
+    Chunk sum = bigits_[bigit_pos] + other.bigits_[i] + carry;
+    bigits_[bigit_pos] = sum & kBigitMask;
+    carry = sum >> kBigitSize;
+    bigit_pos++;
+  }
+
+  while (carry != 0) {
+    Chunk sum = bigits_[bigit_pos] + carry;
+    bigits_[bigit_pos] = sum & kBigitMask;
+    carry = sum >> kBigitSize;
+    bigit_pos++;
+  }
+  used_digits_ = Max(bigit_pos, used_digits_);
+  ASSERT(IsClamped());
+}
+
+
+void Bignum::SubtractBignum(const Bignum& other) {
+  ASSERT(IsClamped());
+  ASSERT(other.IsClamped());
+  // We require this to be bigger than other.
+  ASSERT(LessEqual(other, *this));
+
+  Align(other);
+
+  int offset = other.exponent_ - exponent_;
+  Chunk borrow = 0;
+  int i;
+  for (i = 0; i < other.used_digits_; ++i) {
+    ASSERT((borrow == 0) || (borrow == 1));
+    Chunk difference = bigits_[i + offset] - other.bigits_[i] - borrow;
+    bigits_[i + offset] = difference & kBigitMask;
+    borrow = difference >> (kChunkSize - 1);
+  }
+  while (borrow != 0) {
+    Chunk difference = bigits_[i + offset] - borrow;
+    bigits_[i + offset] = difference & kBigitMask;
+    borrow = difference >> (kChunkSize - 1);
+    ++i;
+  }
+  Clamp();
+}
+
+
+void Bignum::ShiftLeft(int shift_amount) {
+  if (used_digits_ == 0) return;
+  exponent_ += shift_amount / kBigitSize;
+  int local_shift = shift_amount % kBigitSize;
+  EnsureCapacity(used_digits_ + 1);
+  BigitsShiftLeft(local_shift);
+}
+
+
+void Bignum::MultiplyByUInt32(uint32_t factor) {
+  if (factor == 1) return;
+  if (factor == 0) {
+    Zero();
+    return;
+  }
+  if (used_digits_ == 0) return;
+
+  // The product of a bigit with the factor is of size kBigitSize + 32.
+  // Assert that this number + 1 (for the carry) fits into double chunk.
+  ASSERT(kDoubleChunkSize >= kBigitSize + 32 + 1);
+  DoubleChunk carry = 0;
+  for (int i = 0; i < used_digits_; ++i) {
+    DoubleChunk product = static_cast<DoubleChunk>(factor) * bigits_[i] + carry;
+    bigits_[i] = static_cast<Chunk>(product & kBigitMask);
+    carry = (product >> kBigitSize);
+  }
+  while (carry != 0) {
+    EnsureCapacity(used_digits_ + 1);
+    bigits_[used_digits_] = carry & kBigitMask;
+    used_digits_++;
+    carry >>= kBigitSize;
+  }
+}
+
+
+void Bignum::MultiplyByUInt64(uint64_t factor) {
+  if (factor == 1) return;
+  if (factor == 0) {
+    Zero();
+    return;
+  }
+  ASSERT(kBigitSize < 32);
+  uint64_t carry = 0;
+  uint64_t low = factor & 0xFFFFFFFF;
+  uint64_t high = factor >> 32;
+  for (int i = 0; i < used_digits_; ++i) {
+    uint64_t product_low = low * bigits_[i];
+    uint64_t product_high = high * bigits_[i];
+    uint64_t tmp = (carry & kBigitMask) + product_low;
+    bigits_[i] = tmp & kBigitMask;
+    carry = (carry >> kBigitSize) + (tmp >> kBigitSize) +
+        (product_high << (32 - kBigitSize));
+  }
+  while (carry != 0) {
+    EnsureCapacity(used_digits_ + 1);
+    bigits_[used_digits_] = carry & kBigitMask;
+    used_digits_++;
+    carry >>= kBigitSize;
+  }
+}
+
+
+void Bignum::MultiplyByPowerOfTen(int exponent) {
+  const uint64_t kFive27 = UINT64_2PART_C(0x6765c793, fa10079d);
+  const uint16_t kFive1 = 5;
+  const uint16_t kFive2 = kFive1 * 5;
+  const uint16_t kFive3 = kFive2 * 5;
+  const uint16_t kFive4 = kFive3 * 5;
+  const uint16_t kFive5 = kFive4 * 5;
+  const uint16_t kFive6 = kFive5 * 5;
+  const uint32_t kFive7 = kFive6 * 5;
+  const uint32_t kFive8 = kFive7 * 5;
+  const uint32_t kFive9 = kFive8 * 5;
+  const uint32_t kFive10 = kFive9 * 5;
+  const uint32_t kFive11 = kFive10 * 5;
+  const uint32_t kFive12 = kFive11 * 5;
+  const uint32_t kFive13 = kFive12 * 5;
+  const uint32_t kFive1_to_12[] =
+      { kFive1, kFive2, kFive3, kFive4, kFive5, kFive6,
+        kFive7, kFive8, kFive9, kFive10, kFive11, kFive12 };
+
+  ASSERT(exponent >= 0);
+  if (exponent == 0) return;
+  if (used_digits_ == 0) return;
+
+  // We shift by exponent at the end just before returning.
+  int remaining_exponent = exponent;
+  while (remaining_exponent >= 27) {
+    MultiplyByUInt64(kFive27);
+    remaining_exponent -= 27;
+  }
+  while (remaining_exponent >= 13) {
+    MultiplyByUInt32(kFive13);
+    remaining_exponent -= 13;
+  }
+  if (remaining_exponent > 0) {
+    MultiplyByUInt32(kFive1_to_12[remaining_exponent - 1]);
+  }
+  ShiftLeft(exponent);
+}
+
+
+void Bignum::Square() {
+  ASSERT(IsClamped());
+  int product_length = 2 * used_digits_;
+  EnsureCapacity(product_length);
+
+  // Comba multiplication: compute each column separately.
+  // Example: r = a2a1a0 * b2b1b0.
+  //    r =  1    * a0b0 +
+  //        10    * (a1b0 + a0b1) +
+  //        100   * (a2b0 + a1b1 + a0b2) +
+  //        1000  * (a2b1 + a1b2) +
+  //        10000 * a2b2
+  //
+  // In the worst case we have to accumulate nb-digits products of digit*digit.
+  //
+  // Assert that the additional number of bits in a DoubleChunk are enough to
+  // sum up used_digits of Bigit*Bigit.
+  if ((1 << (2 * (kChunkSize - kBigitSize))) <= used_digits_) {
+    UNIMPLEMENTED();
+  }
+  DoubleChunk accumulator = 0;
+  // First shift the digits so we don't overwrite them.
+  int copy_offset = used_digits_;
+  for (int i = 0; i < used_digits_; ++i) {
+    bigits_[copy_offset + i] = bigits_[i];
+  }
+  // We have two loops to avoid some 'if's in the loop.
+  for (int i = 0; i < used_digits_; ++i) {
+    // Process temporary digit i with power i.
+    // The sum of the two indices must be equal to i.
+    int bigit_index1 = i;
+    int bigit_index2 = 0;
+    // Sum all of the sub-products.
+    while (bigit_index1 >= 0) {
+      Chunk chunk1 = bigits_[copy_offset + bigit_index1];
+      Chunk chunk2 = bigits_[copy_offset + bigit_index2];
+      accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
+      bigit_index1--;
+      bigit_index2++;
+    }
+    bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
+    accumulator >>= kBigitSize;
+  }
+  for (int i = used_digits_; i < product_length; ++i) {
+    int bigit_index1 = used_digits_ - 1;
+    int bigit_index2 = i - bigit_index1;
+    // Invariant: sum of both indices is again equal to i.
+    // Inner loop runs 0 times on last iteration, emptying accumulator.
+    while (bigit_index2 < used_digits_) {
+      Chunk chunk1 = bigits_[copy_offset + bigit_index1];
+      Chunk chunk2 = bigits_[copy_offset + bigit_index2];
+      accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
+      bigit_index1--;
+      bigit_index2++;
+    }
+    // The overwritten bigits_[i] will never be read in further loop iterations,
+    // because bigit_index1 and bigit_index2 are always greater
+    // than i - used_digits_.
+    bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
+    accumulator >>= kBigitSize;
+  }
+  // Since the result was guaranteed to lie inside the number the
+  // accumulator must be 0 now.
+  ASSERT(accumulator == 0);
+
+  // Don't forget to update the used_digits and the exponent.
+  used_digits_ = product_length;
+  exponent_ *= 2;
+  Clamp();
+}
+
+
+void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) {
+  ASSERT(base != 0);
+  ASSERT(power_exponent >= 0);
+  if (power_exponent == 0) {
+    AssignUInt16(1);
+    return;
+  }
+  Zero();
+  int shifts = 0;
+  // We expect base to be in range 2-32, and most often to be 10.
+  // It does not make much sense to implement different algorithms for counting
+  // the bits.
+  while ((base & 1) == 0) {
+    base >>= 1;
+    shifts++;
+  }
+  int bit_size = 0;
+  int tmp_base = base;
+  while (tmp_base != 0) {
+    tmp_base >>= 1;
+    bit_size++;
+  }
+  int final_size = bit_size * power_exponent;
+  // 1 extra bigit for the shifting, and one for rounded final_size.
+  EnsureCapacity(final_size / kBigitSize + 2);
+
+  // Left to Right exponentiation.
+  int mask = 1;
+  while (power_exponent >= mask) mask <<= 1;
+
+  // The mask is now pointing to the bit above the most significant 1-bit of
+  // power_exponent.
+  // Get rid of first 1-bit;
+  mask >>= 2;
+  uint64_t this_value = base;
+
+  bool delayed_multipliciation = false;
+  const uint64_t max_32bits = 0xFFFFFFFF;
+  while (mask != 0 && this_value <= max_32bits) {
+    this_value = this_value * this_value;
+    // Verify that there is enough space in this_value to perform the
+    // multiplication.  The first bit_size bits must be 0.
+    if ((power_exponent & mask) != 0) {
+      uint64_t base_bits_mask =
+          ~((static_cast<uint64_t>(1) << (64 - bit_size)) - 1);
+      bool high_bits_zero = (this_value & base_bits_mask) == 0;
+      if (high_bits_zero) {
+        this_value *= base;
+      } else {
+        delayed_multipliciation = true;
+      }
+    }
+    mask >>= 1;
+  }
+  AssignUInt64(this_value);
+  if (delayed_multipliciation) {
+    MultiplyByUInt32(base);
+  }
+
+  // Now do the same thing as a bignum.
+  while (mask != 0) {
+    Square();
+    if ((power_exponent & mask) != 0) {
+      MultiplyByUInt32(base);
+    }
+    mask >>= 1;
+  }
+
+  // And finally add the saved shifts.
+  ShiftLeft(shifts * power_exponent);
+}
+
+
+// Precondition: this/other < 16bit.
+uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) {
+  ASSERT(IsClamped());
+  ASSERT(other.IsClamped());
+  ASSERT(other.used_digits_ > 0);
+
+  // Easy case: if we have less digits than the divisor than the result is 0.
+  // Note: this handles the case where this == 0, too.
+  if (BigitLength() < other.BigitLength()) {
+    return 0;
+  }
+
+  Align(other);
+
+  uint16_t result = 0;
+
+  // Start by removing multiples of 'other' until both numbers have the same
+  // number of digits.
+  while (BigitLength() > other.BigitLength()) {
+    // This naive approach is extremely inefficient if `this` divided by other
+    // is big. This function is implemented for doubleToString where
+    // the result should be small (less than 10).
+    ASSERT(other.bigits_[other.used_digits_ - 1] >= ((1 << kBigitSize) / 16));
+    ASSERT(bigits_[used_digits_ - 1] < 0x10000);
+    // Remove the multiples of the first digit.
+    // Example this = 23 and other equals 9. -> Remove 2 multiples.
+    result += static_cast<uint16_t>(bigits_[used_digits_ - 1]);
+    SubtractTimes(other, bigits_[used_digits_ - 1]);
+  }
+
+  ASSERT(BigitLength() == other.BigitLength());
+
+  // Both bignums are at the same length now.
+  // Since other has more than 0 digits we know that the access to
+  // bigits_[used_digits_ - 1] is safe.
+  Chunk this_bigit = bigits_[used_digits_ - 1];
+  Chunk other_bigit = other.bigits_[other.used_digits_ - 1];
+
+  if (other.used_digits_ == 1) {
+    // Shortcut for easy (and common) case.
+    int quotient = this_bigit / other_bigit;
+    bigits_[used_digits_ - 1] = this_bigit - other_bigit * quotient;
+    ASSERT(quotient < 0x10000);
+    result += static_cast<uint16_t>(quotient);
+    Clamp();
+    return result;
+  }
+
+  int division_estimate = this_bigit / (other_bigit + 1);
+  ASSERT(division_estimate < 0x10000);
+  result += static_cast<uint16_t>(division_estimate);
+  SubtractTimes(other, division_estimate);
+
+  if (other_bigit * (division_estimate + 1) > this_bigit) {
+    // No need to even try to subtract. Even if other's remaining digits were 0
+    // another subtraction would be too much.
+    return result;
+  }
+
+  while (LessEqual(other, *this)) {
+    SubtractBignum(other);
+    result++;
+  }
+  return result;
+}
+
+
+template<typename S>
+static int SizeInHexChars(S number) {
+  ASSERT(number > 0);
+  int result = 0;
+  while (number != 0) {
+    number >>= 4;
+    result++;
+  }
+  return result;
+}
+
+
+static char HexCharOfValue(int value) {
+  ASSERT(0 <= value && value <= 16);
+  if (value < 10) return static_cast<char>(value + '0');
+  return static_cast<char>(value - 10 + 'A');
+}
+
+
+bool Bignum::ToHexString(char* buffer, int buffer_size) const {
+  ASSERT(IsClamped());
+  // Each bigit must be printable as separate hex-character.
+  ASSERT(kBigitSize % 4 == 0);
+  const int kHexCharsPerBigit = kBigitSize / 4;
+
+  if (used_digits_ == 0) {
+    if (buffer_size < 2) return false;
+    buffer[0] = '0';
+    buffer[1] = '\0';
+    return true;
+  }
+  // We add 1 for the terminating '\0' character.
+  int needed_chars = (BigitLength() - 1) * kHexCharsPerBigit +
+      SizeInHexChars(bigits_[used_digits_ - 1]) + 1;
+  if (needed_chars > buffer_size) return false;
+  int string_index = needed_chars - 1;
+  buffer[string_index--] = '\0';
+  for (int i = 0; i < exponent_; ++i) {
+    for (int j = 0; j < kHexCharsPerBigit; ++j) {
+      buffer[string_index--] = '0';
+    }
+  }
+  for (int i = 0; i < used_digits_ - 1; ++i) {
+    Chunk current_bigit = bigits_[i];
+    for (int j = 0; j < kHexCharsPerBigit; ++j) {
+      buffer[string_index--] = HexCharOfValue(current_bigit & 0xF);
+      current_bigit >>= 4;
+    }
+  }
+  // And finally the last bigit.
+  Chunk most_significant_bigit = bigits_[used_digits_ - 1];
+  while (most_significant_bigit != 0) {
+    buffer[string_index--] = HexCharOfValue(most_significant_bigit & 0xF);
+    most_significant_bigit >>= 4;
+  }
+  return true;
+}
+
+
+Bignum::Chunk Bignum::BigitAt(int index) const {
+  if (index >= BigitLength()) return 0;
+  if (index < exponent_) return 0;
+  return bigits_[index - exponent_];
+}
+
+
+int Bignum::Compare(const Bignum& a, const Bignum& b) {
+  ASSERT(a.IsClamped());
+  ASSERT(b.IsClamped());
+  int bigit_length_a = a.BigitLength();
+  int bigit_length_b = b.BigitLength();
+  if (bigit_length_a < bigit_length_b) return -1;
+  if (bigit_length_a > bigit_length_b) return +1;
+  for (int i = bigit_length_a - 1; i >= Min(a.exponent_, b.exponent_); --i) {
+    Chunk bigit_a = a.BigitAt(i);
+    Chunk bigit_b = b.BigitAt(i);
+    if (bigit_a < bigit_b) return -1;
+    if (bigit_a > bigit_b) return +1;
+    // Otherwise they are equal up to this digit. Try the next digit.
+  }
+  return 0;
+}
+
+
+int Bignum::PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c) {
+  ASSERT(a.IsClamped());
+  ASSERT(b.IsClamped());
+  ASSERT(c.IsClamped());
+  if (a.BigitLength() < b.BigitLength()) {
+    return PlusCompare(b, a, c);
+  }
+  if (a.BigitLength() + 1 < c.BigitLength()) return -1;
+  if (a.BigitLength() > c.BigitLength()) return +1;
+  // The exponent encodes 0-bigits. So if there are more 0-digits in 'a' than
+  // 'b' has digits, then the bigit-length of 'a'+'b' must be equal to the one
+  // of 'a'.
+  if (a.exponent_ >= b.BigitLength() && a.BigitLength() < c.BigitLength()) {
+    return -1;
+  }
+
+  Chunk borrow = 0;
+  // Starting at min_exponent all digits are == 0. So no need to compare them.
+  int min_exponent = Min(Min(a.exponent_, b.exponent_), c.exponent_);
+  for (int i = c.BigitLength() - 1; i >= min_exponent; --i) {
+    Chunk chunk_a = a.BigitAt(i);
+    Chunk chunk_b = b.BigitAt(i);
+    Chunk chunk_c = c.BigitAt(i);
+    Chunk sum = chunk_a + chunk_b;
+    if (sum > chunk_c + borrow) {
+      return +1;
+    } else {
+      borrow = chunk_c + borrow - sum;
+      if (borrow > 1) return -1;
+      borrow <<= kBigitSize;
+    }
+  }
+  if (borrow == 0) return 0;
+  return -1;
+}
+
+
+void Bignum::Clamp() {
+  while (used_digits_ > 0 && bigits_[used_digits_ - 1] == 0) {
+    used_digits_--;
+  }
+  if (used_digits_ == 0) {
+    // Zero.
+    exponent_ = 0;
+  }
+}
+
+
+bool Bignum::IsClamped() const {
+  return used_digits_ == 0 || bigits_[used_digits_ - 1] != 0;
+}
+
+
+void Bignum::Zero() {
+  for (int i = 0; i < used_digits_; ++i) {
+    bigits_[i] = 0;
+  }
+  used_digits_ = 0;
+  exponent_ = 0;
+}
+
+
+void Bignum::Align(const Bignum& other) {
+  if (exponent_ > other.exponent_) {
+    // If "X" represents a "hidden" digit (by the exponent) then we are in the
+    // following case (a == this, b == other):
+    // a:  aaaaaaXXXX   or a:   aaaaaXXX
+    // b:     bbbbbbX      b: bbbbbbbbXX
+    // We replace some of the hidden digits (X) of a with 0 digits.
+    // a:  aaaaaa000X   or a:   aaaaa0XX
+    int zero_digits = exponent_ - other.exponent_;
+    EnsureCapacity(used_digits_ + zero_digits);
+    for (int i = used_digits_ - 1; i >= 0; --i) {
+      bigits_[i + zero_digits] = bigits_[i];
+    }
+    for (int i = 0; i < zero_digits; ++i) {
+      bigits_[i] = 0;
+    }
+    used_digits_ += zero_digits;
+    exponent_ -= zero_digits;
+    ASSERT(used_digits_ >= 0);
+    ASSERT(exponent_ >= 0);
+  }
+}
+
+
+void Bignum::BigitsShiftLeft(int shift_amount) {
+  ASSERT(shift_amount < kBigitSize);
+  ASSERT(shift_amount >= 0);
+  Chunk carry = 0;
+  for (int i = 0; i < used_digits_; ++i) {
+    Chunk new_carry = bigits_[i] >> (kBigitSize - shift_amount);
+    bigits_[i] = ((bigits_[i] << shift_amount) + carry) & kBigitMask;
+    carry = new_carry;
+  }
+  if (carry != 0) {
+    bigits_[used_digits_] = carry;
+    used_digits_++;
+  }
+}
+
+
+void Bignum::SubtractTimes(const Bignum& other, int factor) {
+  ASSERT(exponent_ <= other.exponent_);
+  if (factor < 3) {
+    for (int i = 0; i < factor; ++i) {
+      SubtractBignum(other);
+    }
+    return;
+  }
+  Chunk borrow = 0;
+  int exponent_diff = other.exponent_ - exponent_;
+  for (int i = 0; i < other.used_digits_; ++i) {
+    DoubleChunk product = static_cast<DoubleChunk>(factor) * other.bigits_[i];
+    DoubleChunk remove = borrow + product;
+    Chunk difference = bigits_[i + exponent_diff] - (remove & kBigitMask);
+    bigits_[i + exponent_diff] = difference & kBigitMask;
+    borrow = static_cast<Chunk>((difference >> (kChunkSize - 1)) +
+                                (remove >> kBigitSize));
+  }
+  for (int i = other.used_digits_ + exponent_diff; i < used_digits_; ++i) {
+    if (borrow == 0) return;
+    Chunk difference = bigits_[i] - borrow;
+    bigits_[i] = difference & kBigitMask;
+    borrow = difference >> (kChunkSize - 1);
+  }
+  Clamp();
+}
+
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-bignum.h b/icu4c/source/i18n/double-conversion-bignum.h
new file mode 100644
index 0000000..d1af3bf
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-bignum.h
@@ -0,0 +1,162 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#ifndef DOUBLE_CONVERSION_BIGNUM_H_
+#define DOUBLE_CONVERSION_BIGNUM_H_
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+class Bignum {
+ public:
+  // 3584 = 128 * 28. We can represent 2^3584 > 10^1000 accurately.
+  // This bignum can encode much bigger numbers, since it contains an
+  // exponent.
+  static const int kMaxSignificantBits = 3584;
+
+  Bignum();
+  void AssignUInt16(uint16_t value);
+  void AssignUInt64(uint64_t value);
+  void AssignBignum(const Bignum& other);
+
+  void AssignDecimalString(Vector<const char> value);
+  void AssignHexString(Vector<const char> value);
+
+  void AssignPowerUInt16(uint16_t base, int exponent);
+
+  void AddUInt64(uint64_t operand);
+  void AddBignum(const Bignum& other);
+  // Precondition: this >= other.
+  void SubtractBignum(const Bignum& other);
+
+  void Square();
+  void ShiftLeft(int shift_amount);
+  void MultiplyByUInt32(uint32_t factor);
+  void MultiplyByUInt64(uint64_t factor);
+  void MultiplyByPowerOfTen(int exponent);
+  void Times10() { return MultiplyByUInt32(10); }
+  // Pseudocode:
+  //  int result = this / other;
+  //  this = this % other;
+  // In the worst case this function is in O(this/other).
+  uint16_t DivideModuloIntBignum(const Bignum& other);
+
+  bool ToHexString(char* buffer, int buffer_size) const;
+
+  // Returns
+  //  -1 if a < b,
+  //   0 if a == b, and
+  //  +1 if a > b.
+  static int Compare(const Bignum& a, const Bignum& b);
+  static bool Equal(const Bignum& a, const Bignum& b) {
+    return Compare(a, b) == 0;
+  }
+  static bool LessEqual(const Bignum& a, const Bignum& b) {
+    return Compare(a, b) <= 0;
+  }
+  static bool Less(const Bignum& a, const Bignum& b) {
+    return Compare(a, b) < 0;
+  }
+  // Returns Compare(a + b, c);
+  static int PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c);
+  // Returns a + b == c
+  static bool PlusEqual(const Bignum& a, const Bignum& b, const Bignum& c) {
+    return PlusCompare(a, b, c) == 0;
+  }
+  // Returns a + b <= c
+  static bool PlusLessEqual(const Bignum& a, const Bignum& b, const Bignum& c) {
+    return PlusCompare(a, b, c) <= 0;
+  }
+  // Returns a + b < c
+  static bool PlusLess(const Bignum& a, const Bignum& b, const Bignum& c) {
+    return PlusCompare(a, b, c) < 0;
+  }
+ private:
+  typedef uint32_t Chunk;
+  typedef uint64_t DoubleChunk;
+
+  static const int kChunkSize = sizeof(Chunk) * 8;
+  static const int kDoubleChunkSize = sizeof(DoubleChunk) * 8;
+  // With bigit size of 28 we loose some bits, but a double still fits easily
+  // into two chunks, and more importantly we can use the Comba multiplication.
+  static const int kBigitSize = 28;
+  static const Chunk kBigitMask = (1 << kBigitSize) - 1;
+  // Every instance allocates kBigitLength chunks on the stack. Bignums cannot
+  // grow. There are no checks if the stack-allocated space is sufficient.
+  static const int kBigitCapacity = kMaxSignificantBits / kBigitSize;
+
+  void EnsureCapacity(int size) {
+    if (size > kBigitCapacity) {
+      UNREACHABLE();
+    }
+  }
+  void Align(const Bignum& other);
+  void Clamp();
+  bool IsClamped() const;
+  void Zero();
+  // Requires this to have enough capacity (no tests done).
+  // Updates used_digits_ if necessary.
+  // shift_amount must be < kBigitSize.
+  void BigitsShiftLeft(int shift_amount);
+  // BigitLength includes the "hidden" digits encoded in the exponent.
+  int BigitLength() const { return used_digits_ + exponent_; }
+  Chunk BigitAt(int index) const;
+  void SubtractTimes(const Bignum& other, int factor);
+
+  Chunk bigits_buffer_[kBigitCapacity];
+  // A vector backed by bigits_buffer_. This way accesses to the array are
+  // checked for out-of-bounds errors.
+  Vector<Chunk> bigits_;
+  int used_digits_;
+  // The Bignum's value equals value(bigits_) * 2^(exponent_ * kBigitSize).
+  int exponent_;
+
+  DISALLOW_COPY_AND_ASSIGN(Bignum);
+};
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+
+#endif  // DOUBLE_CONVERSION_BIGNUM_H_
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-cached-powers.cpp b/icu4c/source/i18n/double-conversion-cached-powers.cpp
new file mode 100644
index 0000000..e497004
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-cached-powers.cpp
@@ -0,0 +1,193 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2006-2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#include <stdarg.h>
+#include <limits.h>
+#include <math.h>
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-utils.h"
+
+#include "double-conversion-cached-powers.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+struct CachedPower {
+  uint64_t significand;
+  int16_t binary_exponent;
+  int16_t decimal_exponent;
+};
+
+static const CachedPower kCachedPowers[] = {
+  {UINT64_2PART_C(0xfa8fd5a0, 081c0288), -1220, -348},
+  {UINT64_2PART_C(0xbaaee17f, a23ebf76), -1193, -340},
+  {UINT64_2PART_C(0x8b16fb20, 3055ac76), -1166, -332},
+  {UINT64_2PART_C(0xcf42894a, 5dce35ea), -1140, -324},
+  {UINT64_2PART_C(0x9a6bb0aa, 55653b2d), -1113, -316},
+  {UINT64_2PART_C(0xe61acf03, 3d1a45df), -1087, -308},
+  {UINT64_2PART_C(0xab70fe17, c79ac6ca), -1060, -300},
+  {UINT64_2PART_C(0xff77b1fc, bebcdc4f), -1034, -292},
+  {UINT64_2PART_C(0xbe5691ef, 416bd60c), -1007, -284},
+  {UINT64_2PART_C(0x8dd01fad, 907ffc3c), -980, -276},
+  {UINT64_2PART_C(0xd3515c28, 31559a83), -954, -268},
+  {UINT64_2PART_C(0x9d71ac8f, ada6c9b5), -927, -260},
+  {UINT64_2PART_C(0xea9c2277, 23ee8bcb), -901, -252},
+  {UINT64_2PART_C(0xaecc4991, 4078536d), -874, -244},
+  {UINT64_2PART_C(0x823c1279, 5db6ce57), -847, -236},
+  {UINT64_2PART_C(0xc2109436, 4dfb5637), -821, -228},
+  {UINT64_2PART_C(0x9096ea6f, 3848984f), -794, -220},
+  {UINT64_2PART_C(0xd77485cb, 25823ac7), -768, -212},
+  {UINT64_2PART_C(0xa086cfcd, 97bf97f4), -741, -204},
+  {UINT64_2PART_C(0xef340a98, 172aace5), -715, -196},
+  {UINT64_2PART_C(0xb23867fb, 2a35b28e), -688, -188},
+  {UINT64_2PART_C(0x84c8d4df, d2c63f3b), -661, -180},
+  {UINT64_2PART_C(0xc5dd4427, 1ad3cdba), -635, -172},
+  {UINT64_2PART_C(0x936b9fce, bb25c996), -608, -164},
+  {UINT64_2PART_C(0xdbac6c24, 7d62a584), -582, -156},
+  {UINT64_2PART_C(0xa3ab6658, 0d5fdaf6), -555, -148},
+  {UINT64_2PART_C(0xf3e2f893, dec3f126), -529, -140},
+  {UINT64_2PART_C(0xb5b5ada8, aaff80b8), -502, -132},
+  {UINT64_2PART_C(0x87625f05, 6c7c4a8b), -475, -124},
+  {UINT64_2PART_C(0xc9bcff60, 34c13053), -449, -116},
+  {UINT64_2PART_C(0x964e858c, 91ba2655), -422, -108},
+  {UINT64_2PART_C(0xdff97724, 70297ebd), -396, -100},
+  {UINT64_2PART_C(0xa6dfbd9f, b8e5b88f), -369, -92},
+  {UINT64_2PART_C(0xf8a95fcf, 88747d94), -343, -84},
+  {UINT64_2PART_C(0xb9447093, 8fa89bcf), -316, -76},
+  {UINT64_2PART_C(0x8a08f0f8, bf0f156b), -289, -68},
+  {UINT64_2PART_C(0xcdb02555, 653131b6), -263, -60},
+  {UINT64_2PART_C(0x993fe2c6, d07b7fac), -236, -52},
+  {UINT64_2PART_C(0xe45c10c4, 2a2b3b06), -210, -44},
+  {UINT64_2PART_C(0xaa242499, 697392d3), -183, -36},
+  {UINT64_2PART_C(0xfd87b5f2, 8300ca0e), -157, -28},
+  {UINT64_2PART_C(0xbce50864, 92111aeb), -130, -20},
+  {UINT64_2PART_C(0x8cbccc09, 6f5088cc), -103, -12},
+  {UINT64_2PART_C(0xd1b71758, e219652c), -77, -4},
+  {UINT64_2PART_C(0x9c400000, 00000000), -50, 4},
+  {UINT64_2PART_C(0xe8d4a510, 00000000), -24, 12},
+  {UINT64_2PART_C(0xad78ebc5, ac620000), 3, 20},
+  {UINT64_2PART_C(0x813f3978, f8940984), 30, 28},
+  {UINT64_2PART_C(0xc097ce7b, c90715b3), 56, 36},
+  {UINT64_2PART_C(0x8f7e32ce, 7bea5c70), 83, 44},
+  {UINT64_2PART_C(0xd5d238a4, abe98068), 109, 52},
+  {UINT64_2PART_C(0x9f4f2726, 179a2245), 136, 60},
+  {UINT64_2PART_C(0xed63a231, d4c4fb27), 162, 68},
+  {UINT64_2PART_C(0xb0de6538, 8cc8ada8), 189, 76},
+  {UINT64_2PART_C(0x83c7088e, 1aab65db), 216, 84},
+  {UINT64_2PART_C(0xc45d1df9, 42711d9a), 242, 92},
+  {UINT64_2PART_C(0x924d692c, a61be758), 269, 100},
+  {UINT64_2PART_C(0xda01ee64, 1a708dea), 295, 108},
+  {UINT64_2PART_C(0xa26da399, 9aef774a), 322, 116},
+  {UINT64_2PART_C(0xf209787b, b47d6b85), 348, 124},
+  {UINT64_2PART_C(0xb454e4a1, 79dd1877), 375, 132},
+  {UINT64_2PART_C(0x865b8692, 5b9bc5c2), 402, 140},
+  {UINT64_2PART_C(0xc83553c5, c8965d3d), 428, 148},
+  {UINT64_2PART_C(0x952ab45c, fa97a0b3), 455, 156},
+  {UINT64_2PART_C(0xde469fbd, 99a05fe3), 481, 164},
+  {UINT64_2PART_C(0xa59bc234, db398c25), 508, 172},
+  {UINT64_2PART_C(0xf6c69a72, a3989f5c), 534, 180},
+  {UINT64_2PART_C(0xb7dcbf53, 54e9bece), 561, 188},
+  {UINT64_2PART_C(0x88fcf317, f22241e2), 588, 196},
+  {UINT64_2PART_C(0xcc20ce9b, d35c78a5), 614, 204},
+  {UINT64_2PART_C(0x98165af3, 7b2153df), 641, 212},
+  {UINT64_2PART_C(0xe2a0b5dc, 971f303a), 667, 220},
+  {UINT64_2PART_C(0xa8d9d153, 5ce3b396), 694, 228},
+  {UINT64_2PART_C(0xfb9b7cd9, a4a7443c), 720, 236},
+  {UINT64_2PART_C(0xbb764c4c, a7a44410), 747, 244},
+  {UINT64_2PART_C(0x8bab8eef, b6409c1a), 774, 252},
+  {UINT64_2PART_C(0xd01fef10, a657842c), 800, 260},
+  {UINT64_2PART_C(0x9b10a4e5, e9913129), 827, 268},
+  {UINT64_2PART_C(0xe7109bfb, a19c0c9d), 853, 276},
+  {UINT64_2PART_C(0xac2820d9, 623bf429), 880, 284},
+  {UINT64_2PART_C(0x80444b5e, 7aa7cf85), 907, 292},
+  {UINT64_2PART_C(0xbf21e440, 03acdd2d), 933, 300},
+  {UINT64_2PART_C(0x8e679c2f, 5e44ff8f), 960, 308},
+  {UINT64_2PART_C(0xd433179d, 9c8cb841), 986, 316},
+  {UINT64_2PART_C(0x9e19db92, b4e31ba9), 1013, 324},
+  {UINT64_2PART_C(0xeb96bf6e, badf77d9), 1039, 332},
+  {UINT64_2PART_C(0xaf87023b, 9bf0ee6b), 1066, 340},
+};
+
+static const int kCachedPowersOffset = 348;  // -1 * the first decimal_exponent.
+static const double kD_1_LOG2_10 = 0.30102999566398114;  //  1 / lg(10)
+// Difference between the decimal exponents in the table above.
+const int PowersOfTenCache::kDecimalExponentDistance = 8;
+const int PowersOfTenCache::kMinDecimalExponent = -348;
+const int PowersOfTenCache::kMaxDecimalExponent = 340;
+
+void PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
+    int min_exponent,
+    int max_exponent,
+    DiyFp* power,
+    int* decimal_exponent) {
+  int kQ = DiyFp::kSignificandSize;
+  double k = ceil((min_exponent + kQ - 1) * kD_1_LOG2_10);
+  int foo = kCachedPowersOffset;
+  int index =
+      (foo + static_cast<int>(k) - 1) / kDecimalExponentDistance + 1;
+  ASSERT(0 <= index && index < static_cast<int>(ARRAY_SIZE(kCachedPowers)));
+  CachedPower cached_power = kCachedPowers[index];
+  ASSERT(min_exponent <= cached_power.binary_exponent);
+  (void) max_exponent;  // Mark variable as used.
+  ASSERT(cached_power.binary_exponent <= max_exponent);
+  *decimal_exponent = cached_power.decimal_exponent;
+  *power = DiyFp(cached_power.significand, cached_power.binary_exponent);
+}
+
+
+void PowersOfTenCache::GetCachedPowerForDecimalExponent(int requested_exponent,
+                                                        DiyFp* power,
+                                                        int* found_exponent) {
+  ASSERT(kMinDecimalExponent <= requested_exponent);
+  ASSERT(requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance);
+  int index =
+      (requested_exponent + kCachedPowersOffset) / kDecimalExponentDistance;
+  CachedPower cached_power = kCachedPowers[index];
+  *power = DiyFp(cached_power.significand, cached_power.binary_exponent);
+  *found_exponent = cached_power.decimal_exponent;
+  ASSERT(*found_exponent <= requested_exponent);
+  ASSERT(requested_exponent < *found_exponent + kDecimalExponentDistance);
+}
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-cached-powers.h b/icu4c/source/i18n/double-conversion-cached-powers.h
new file mode 100644
index 0000000..438746b
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-cached-powers.h
@@ -0,0 +1,82 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#ifndef DOUBLE_CONVERSION_CACHED_POWERS_H_
+#define DOUBLE_CONVERSION_CACHED_POWERS_H_
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-diy-fp.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+class PowersOfTenCache {
+ public:
+
+  // Not all powers of ten are cached. The decimal exponent of two neighboring
+  // cached numbers will differ by kDecimalExponentDistance.
+  static const int kDecimalExponentDistance;
+
+  static const int kMinDecimalExponent;
+  static const int kMaxDecimalExponent;
+
+  // Returns a cached power-of-ten with a binary exponent in the range
+  // [min_exponent; max_exponent] (boundaries included).
+  static void GetCachedPowerForBinaryExponentRange(int min_exponent,
+                                                   int max_exponent,
+                                                   DiyFp* power,
+                                                   int* decimal_exponent);
+
+  // Returns a cached power of ten x ~= 10^k such that
+  //   k <= decimal_exponent < k + kCachedPowersDecimalDistance.
+  // The given decimal_exponent must satisfy
+  //   kMinDecimalExponent <= requested_exponent, and
+  //   requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance.
+  static void GetCachedPowerForDecimalExponent(int requested_exponent,
+                                               DiyFp* power,
+                                               int* found_exponent);
+};
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+
+#endif  // DOUBLE_CONVERSION_CACHED_POWERS_H_
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-diy-fp.cpp b/icu4c/source/i18n/double-conversion-diy-fp.cpp
new file mode 100644
index 0000000..f38430c
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-diy-fp.cpp
@@ -0,0 +1,74 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-diy-fp.h"
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+void DiyFp::Multiply(const DiyFp& other) {
+  // Simply "emulates" a 128 bit multiplication.
+  // However: the resulting number only contains 64 bits. The least
+  // significant 64 bits are only used for rounding the most significant 64
+  // bits.
+  const uint64_t kM32 = 0xFFFFFFFFU;
+  uint64_t a = f_ >> 32;
+  uint64_t b = f_ & kM32;
+  uint64_t c = other.f_ >> 32;
+  uint64_t d = other.f_ & kM32;
+  uint64_t ac = a * c;
+  uint64_t bc = b * c;
+  uint64_t ad = a * d;
+  uint64_t bd = b * d;
+  uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32);
+  // By adding 1U << 31 to tmp we round the final result.
+  // Halfway cases will be round up.
+  tmp += 1U << 31;
+  uint64_t result_f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);
+  e_ += other.e_ + 64;
+  f_ = result_f;
+}
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-diy-fp.h b/icu4c/source/i18n/double-conversion-diy-fp.h
new file mode 100644
index 0000000..2189685
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-diy-fp.h
@@ -0,0 +1,136 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#ifndef DOUBLE_CONVERSION_DIY_FP_H_
+#define DOUBLE_CONVERSION_DIY_FP_H_
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+// This "Do It Yourself Floating Point" class implements a floating-point number
+// with a uint64 significand and an int exponent. Normalized DiyFp numbers will
+// have the most significant bit of the significand set.
+// Multiplication and Subtraction do not normalize their results.
+// DiyFp are not designed to contain special doubles (NaN and Infinity).
+class DiyFp {
+ public:
+  static const int kSignificandSize = 64;
+
+  DiyFp() : f_(0), e_(0) {}
+  DiyFp(uint64_t significand, int exponent) : f_(significand), e_(exponent) {}
+
+  // this = this - other.
+  // The exponents of both numbers must be the same and the significand of this
+  // must be bigger than the significand of other.
+  // The result will not be normalized.
+  void Subtract(const DiyFp& other) {
+    ASSERT(e_ == other.e_);
+    ASSERT(f_ >= other.f_);
+    f_ -= other.f_;
+  }
+
+  // Returns a - b.
+  // The exponents of both numbers must be the same and this must be bigger
+  // than other. The result will not be normalized.
+  static DiyFp Minus(const DiyFp& a, const DiyFp& b) {
+    DiyFp result = a;
+    result.Subtract(b);
+    return result;
+  }
+
+
+  // this = this * other.
+  void Multiply(const DiyFp& other);
+
+  // returns a * b;
+  static DiyFp Times(const DiyFp& a, const DiyFp& b) {
+    DiyFp result = a;
+    result.Multiply(b);
+    return result;
+  }
+
+  void Normalize() {
+    ASSERT(f_ != 0);
+    uint64_t significand = f_;
+    int exponent = e_;
+
+    // This method is mainly called for normalizing boundaries. In general
+    // boundaries need to be shifted by 10 bits. We thus optimize for this case.
+    const uint64_t k10MSBits = UINT64_2PART_C(0xFFC00000, 00000000);
+    while ((significand & k10MSBits) == 0) {
+      significand <<= 10;
+      exponent -= 10;
+    }
+    while ((significand & kUint64MSB) == 0) {
+      significand <<= 1;
+      exponent--;
+    }
+    f_ = significand;
+    e_ = exponent;
+  }
+
+  static DiyFp Normalize(const DiyFp& a) {
+    DiyFp result = a;
+    result.Normalize();
+    return result;
+  }
+
+  uint64_t f() const { return f_; }
+  int e() const { return e_; }
+
+  void set_f(uint64_t new_value) { f_ = new_value; }
+  void set_e(int new_value) { e_ = new_value; }
+
+ private:
+  static const uint64_t kUint64MSB = UINT64_2PART_C(0x80000000, 00000000);
+
+  uint64_t f_;
+  int e_;
+};
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+
+#endif  // DOUBLE_CONVERSION_DIY_FP_H_
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-fast-dtoa.cpp b/icu4c/source/i18n/double-conversion-fast-dtoa.cpp
new file mode 100644
index 0000000..8d1499a
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-fast-dtoa.cpp
@@ -0,0 +1,683 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-fast-dtoa.h"
+
+#include "double-conversion-cached-powers.h"
+#include "double-conversion-diy-fp.h"
+#include "double-conversion-ieee.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+// The minimal and maximal target exponent define the range of w's binary
+// exponent, where 'w' is the result of multiplying the input by a cached power
+// of ten.
+//
+// A different range might be chosen on a different platform, to optimize digit
+// generation, but a smaller range requires more powers of ten to be cached.
+static const int kMinimalTargetExponent = -60;
+static const int kMaximalTargetExponent = -32;
+
+
+// Adjusts the last digit of the generated number, and screens out generated
+// solutions that may be inaccurate. A solution may be inaccurate if it is
+// outside the safe interval, or if we cannot prove that it is closer to the
+// input than a neighboring representation of the same length.
+//
+// Input: * buffer containing the digits of too_high / 10^kappa
+//        * the buffer's length
+//        * distance_too_high_w == (too_high - w).f() * unit
+//        * unsafe_interval == (too_high - too_low).f() * unit
+//        * rest = (too_high - buffer * 10^kappa).f() * unit
+//        * ten_kappa = 10^kappa * unit
+//        * unit = the common multiplier
+// Output: returns true if the buffer is guaranteed to contain the closest
+//    representable number to the input.
+//  Modifies the generated digits in the buffer to approach (round towards) w.
+static bool RoundWeed(Vector<char> buffer,
+                      int length,
+                      uint64_t distance_too_high_w,
+                      uint64_t unsafe_interval,
+                      uint64_t rest,
+                      uint64_t ten_kappa,
+                      uint64_t unit) {
+  uint64_t small_distance = distance_too_high_w - unit;
+  uint64_t big_distance = distance_too_high_w + unit;
+  // Let w_low  = too_high - big_distance, and
+  //     w_high = too_high - small_distance.
+  // Note: w_low < w < w_high
+  //
+  // The real w (* unit) must lie somewhere inside the interval
+  // ]w_low; w_high[ (often written as "(w_low; w_high)")
+
+  // Basically the buffer currently contains a number in the unsafe interval
+  // ]too_low; too_high[ with too_low < w < too_high
+  //
+  //  too_high - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+  //                     ^v 1 unit            ^      ^                 ^      ^
+  //  boundary_high ---------------------     .      .                 .      .
+  //                     ^v 1 unit            .      .                 .      .
+  //   - - - - - - - - - - - - - - - - - - -  +  - - + - - - - - -     .      .
+  //                                          .      .         ^       .      .
+  //                                          .  big_distance  .       .      .
+  //                                          .      .         .       .    rest
+  //                              small_distance     .         .       .      .
+  //                                          v      .         .       .      .
+  //  w_high - - - - - - - - - - - - - - - - - -     .         .       .      .
+  //                     ^v 1 unit                   .         .       .      .
+  //  w ----------------------------------------     .         .       .      .
+  //                     ^v 1 unit                   v         .       .      .
+  //  w_low  - - - - - - - - - - - - - - - - - - - - -         .       .      .
+  //                                                           .       .      v
+  //  buffer --------------------------------------------------+-------+--------
+  //                                                           .       .
+  //                                                  safe_interval    .
+  //                                                           v       .
+  //   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -     .
+  //                     ^v 1 unit                                     .
+  //  boundary_low -------------------------                     unsafe_interval
+  //                     ^v 1 unit                                     v
+  //  too_low  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+  //
+  //
+  // Note that the value of buffer could lie anywhere inside the range too_low
+  // to too_high.
+  //
+  // boundary_low, boundary_high and w are approximations of the real boundaries
+  // and v (the input number). They are guaranteed to be precise up to one unit.
+  // In fact the error is guaranteed to be strictly less than one unit.
+  //
+  // Anything that lies outside the unsafe interval is guaranteed not to round
+  // to v when read again.
+  // Anything that lies inside the safe interval is guaranteed to round to v
+  // when read again.
+  // If the number inside the buffer lies inside the unsafe interval but not
+  // inside the safe interval then we simply do not know and bail out (returning
+  // false).
+  //
+  // Similarly we have to take into account the imprecision of 'w' when finding
+  // the closest representation of 'w'. If we have two potential
+  // representations, and one is closer to both w_low and w_high, then we know
+  // it is closer to the actual value v.
+  //
+  // By generating the digits of too_high we got the largest (closest to
+  // too_high) buffer that is still in the unsafe interval. In the case where
+  // w_high < buffer < too_high we try to decrement the buffer.
+  // This way the buffer approaches (rounds towards) w.
+  // There are 3 conditions that stop the decrementation process:
+  //   1) the buffer is already below w_high
+  //   2) decrementing the buffer would make it leave the unsafe interval
+  //   3) decrementing the buffer would yield a number below w_high and farther
+  //      away than the current number. In other words:
+  //              (buffer{-1} < w_high) && w_high - buffer{-1} > buffer - w_high
+  // Instead of using the buffer directly we use its distance to too_high.
+  // Conceptually rest ~= too_high - buffer
+  // We need to do the following tests in this order to avoid over- and
+  // underflows.
+  ASSERT(rest <= unsafe_interval);
+  while (rest < small_distance &&  // Negated condition 1
+         unsafe_interval - rest >= ten_kappa &&  // Negated condition 2
+         (rest + ten_kappa < small_distance ||  // buffer{-1} > w_high
+          small_distance - rest >= rest + ten_kappa - small_distance)) {
+    buffer[length - 1]--;
+    rest += ten_kappa;
+  }
+
+  // We have approached w+ as much as possible. We now test if approaching w-
+  // would require changing the buffer. If yes, then we have two possible
+  // representations close to w, but we cannot decide which one is closer.
+  if (rest < big_distance &&
+      unsafe_interval - rest >= ten_kappa &&
+      (rest + ten_kappa < big_distance ||
+       big_distance - rest > rest + ten_kappa - big_distance)) {
+    return false;
+  }
+
+  // Weeding test.
+  //   The safe interval is [too_low + 2 ulp; too_high - 2 ulp]
+  //   Since too_low = too_high - unsafe_interval this is equivalent to
+  //      [too_high - unsafe_interval + 4 ulp; too_high - 2 ulp]
+  //   Conceptually we have: rest ~= too_high - buffer
+  return (2 * unit <= rest) && (rest <= unsafe_interval - 4 * unit);
+}
+
+
+// Rounds the buffer upwards if the result is closer to v by possibly adding
+// 1 to the buffer. If the precision of the calculation is not sufficient to
+// round correctly, return false.
+// The rounding might shift the whole buffer in which case the kappa is
+// adjusted. For example "99", kappa = 3 might become "10", kappa = 4.
+//
+// If 2*rest > ten_kappa then the buffer needs to be round up.
+// rest can have an error of +/- 1 unit. This function accounts for the
+// imprecision and returns false, if the rounding direction cannot be
+// unambiguously determined.
+//
+// Precondition: rest < ten_kappa.
+static bool RoundWeedCounted(Vector<char> buffer,
+                             int length,
+                             uint64_t rest,
+                             uint64_t ten_kappa,
+                             uint64_t unit,
+                             int* kappa) {
+  ASSERT(rest < ten_kappa);
+  // The following tests are done in a specific order to avoid overflows. They
+  // will work correctly with any uint64 values of rest < ten_kappa and unit.
+  //
+  // If the unit is too big, then we don't know which way to round. For example
+  // a unit of 50 means that the real number lies within rest +/- 50. If
+  // 10^kappa == 40 then there is no way to tell which way to round.
+  if (unit >= ten_kappa) return false;
+  // Even if unit is just half the size of 10^kappa we are already completely
+  // lost. (And after the previous test we know that the expression will not
+  // over/underflow.)
+  if (ten_kappa - unit <= unit) return false;
+  // If 2 * (rest + unit) <= 10^kappa we can safely round down.
+  if ((ten_kappa - rest > rest) && (ten_kappa - 2 * rest >= 2 * unit)) {
+    return true;
+  }
+  // If 2 * (rest - unit) >= 10^kappa, then we can safely round up.
+  if ((rest > unit) && (ten_kappa - (rest - unit) <= (rest - unit))) {
+    // Increment the last digit recursively until we find a non '9' digit.
+    buffer[length - 1]++;
+    for (int i = length - 1; i > 0; --i) {
+      if (buffer[i] != '0' + 10) break;
+      buffer[i] = '0';
+      buffer[i - 1]++;
+    }
+    // If the first digit is now '0'+ 10 we had a buffer with all '9's. With the
+    // exception of the first digit all digits are now '0'. Simply switch the
+    // first digit to '1' and adjust the kappa. Example: "99" becomes "10" and
+    // the power (the kappa) is increased.
+    if (buffer[0] == '0' + 10) {
+      buffer[0] = '1';
+      (*kappa) += 1;
+    }
+    return true;
+  }
+  return false;
+}
+
+// Returns the biggest power of ten that is less than or equal to the given
+// number. We furthermore receive the maximum number of bits 'number' has.
+//
+// Returns power == 10^(exponent_plus_one-1) such that
+//    power <= number < power * 10.
+// If number_bits == 0 then 0^(0-1) is returned.
+// The number of bits must be <= 32.
+// Precondition: number < (1 << (number_bits + 1)).
+
+// Inspired by the method for finding an integer log base 10 from here:
+// http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10
+static unsigned int const kSmallPowersOfTen[] =
+    {0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000,
+     1000000000};
+
+static void BiggestPowerTen(uint32_t number,
+                            int number_bits,
+                            uint32_t* power,
+                            int* exponent_plus_one) {
+  ASSERT(number < (1u << (number_bits + 1)));
+  // 1233/4096 is approximately 1/lg(10).
+  int exponent_plus_one_guess = ((number_bits + 1) * 1233 >> 12);
+  // We increment to skip over the first entry in the kPowersOf10 table.
+  // Note: kPowersOf10[i] == 10^(i-1).
+  exponent_plus_one_guess++;
+  // We don't have any guarantees that 2^number_bits <= number.
+  if (number < kSmallPowersOfTen[exponent_plus_one_guess]) {
+    exponent_plus_one_guess--;
+  }
+  *power = kSmallPowersOfTen[exponent_plus_one_guess];
+  *exponent_plus_one = exponent_plus_one_guess;
+}
+
+// Generates the digits of input number w.
+// w is a floating-point number (DiyFp), consisting of a significand and an
+// exponent. Its exponent is bounded by kMinimalTargetExponent and
+// kMaximalTargetExponent.
+//       Hence -60 <= w.e() <= -32.
+//
+// Returns false if it fails, in which case the generated digits in the buffer
+// should not be used.
+// Preconditions:
+//  * low, w and high are correct up to 1 ulp (unit in the last place). That
+//    is, their error must be less than a unit of their last digits.
+//  * low.e() == w.e() == high.e()
+//  * low < w < high, and taking into account their error: low~ <= high~
+//  * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent
+// Postconditions: returns false if procedure fails.
+//   otherwise:
+//     * buffer is not null-terminated, but len contains the number of digits.
+//     * buffer contains the shortest possible decimal digit-sequence
+//       such that LOW < buffer * 10^kappa < HIGH, where LOW and HIGH are the
+//       correct values of low and high (without their error).
+//     * if more than one decimal representation gives the minimal number of
+//       decimal digits then the one closest to W (where W is the correct value
+//       of w) is chosen.
+// Remark: this procedure takes into account the imprecision of its input
+//   numbers. If the precision is not enough to guarantee all the postconditions
+//   then false is returned. This usually happens rarely (~0.5%).
+//
+// Say, for the sake of example, that
+//   w.e() == -48, and w.f() == 0x1234567890abcdef
+// w's value can be computed by w.f() * 2^w.e()
+// We can obtain w's integral digits by simply shifting w.f() by -w.e().
+//  -> w's integral part is 0x1234
+//  w's fractional part is therefore 0x567890abcdef.
+// Printing w's integral part is easy (simply print 0x1234 in decimal).
+// In order to print its fraction we repeatedly multiply the fraction by 10 and
+// get each digit. Example the first digit after the point would be computed by
+//   (0x567890abcdef * 10) >> 48. -> 3
+// The whole thing becomes slightly more complicated because we want to stop
+// once we have enough digits. That is, once the digits inside the buffer
+// represent 'w' we can stop. Everything inside the interval low - high
+// represents w. However we have to pay attention to low, high and w's
+// imprecision.
+static bool DigitGen(DiyFp low,
+                     DiyFp w,
+                     DiyFp high,
+                     Vector<char> buffer,
+                     int* length,
+                     int* kappa) {
+  ASSERT(low.e() == w.e() && w.e() == high.e());
+  ASSERT(low.f() + 1 <= high.f() - 1);
+  ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
+  // low, w and high are imprecise, but by less than one ulp (unit in the last
+  // place).
+  // If we remove (resp. add) 1 ulp from low (resp. high) we are certain that
+  // the new numbers are outside of the interval we want the final
+  // representation to lie in.
+  // Inversely adding (resp. removing) 1 ulp from low (resp. high) would yield
+  // numbers that are certain to lie in the interval. We will use this fact
+  // later on.
+  // We will now start by generating the digits within the uncertain
+  // interval. Later we will weed out representations that lie outside the safe
+  // interval and thus _might_ lie outside the correct interval.
+  uint64_t unit = 1;
+  DiyFp too_low = DiyFp(low.f() - unit, low.e());
+  DiyFp too_high = DiyFp(high.f() + unit, high.e());
+  // too_low and too_high are guaranteed to lie outside the interval we want the
+  // generated number in.
+  DiyFp unsafe_interval = DiyFp::Minus(too_high, too_low);
+  // We now cut the input number into two parts: the integral digits and the
+  // fractionals. We will not write any decimal separator though, but adapt
+  // kappa instead.
+  // Reminder: we are currently computing the digits (stored inside the buffer)
+  // such that:   too_low < buffer * 10^kappa < too_high
+  // We use too_high for the digit_generation and stop as soon as possible.
+  // If we stop early we effectively round down.
+  DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
+  // Division by one is a shift.
+  uint32_t integrals = static_cast<uint32_t>(too_high.f() >> -one.e());
+  // Modulo by one is an and.
+  uint64_t fractionals = too_high.f() & (one.f() - 1);
+  uint32_t divisor;
+  int divisor_exponent_plus_one;
+  BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
+                  &divisor, &divisor_exponent_plus_one);
+  *kappa = divisor_exponent_plus_one;
+  *length = 0;
+  // Loop invariant: buffer = too_high / 10^kappa  (integer division)
+  // The invariant holds for the first iteration: kappa has been initialized
+  // with the divisor exponent + 1. And the divisor is the biggest power of ten
+  // that is smaller than integrals.
+  while (*kappa > 0) {
+    int digit = integrals / divisor;
+    ASSERT(digit <= 9);
+    buffer[*length] = static_cast<char>('0' + digit);
+    (*length)++;
+    integrals %= divisor;
+    (*kappa)--;
+    // Note that kappa now equals the exponent of the divisor and that the
+    // invariant thus holds again.
+    uint64_t rest =
+        (static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
+    // Invariant: too_high = buffer * 10^kappa + DiyFp(rest, one.e())
+    // Reminder: unsafe_interval.e() == one.e()
+    if (rest < unsafe_interval.f()) {
+      // Rounding down (by not emitting the remaining digits) yields a number
+      // that lies within the unsafe interval.
+      return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f(),
+                       unsafe_interval.f(), rest,
+                       static_cast<uint64_t>(divisor) << -one.e(), unit);
+    }
+    divisor /= 10;
+  }
+
+  // The integrals have been generated. We are at the point of the decimal
+  // separator. In the following loop we simply multiply the remaining digits by
+  // 10 and divide by one. We just need to pay attention to multiply associated
+  // data (like the interval or 'unit'), too.
+  // Note that the multiplication by 10 does not overflow, because w.e >= -60
+  // and thus one.e >= -60.
+  ASSERT(one.e() >= -60);
+  ASSERT(fractionals < one.f());
+  ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
+  for (;;) {
+    fractionals *= 10;
+    unit *= 10;
+    unsafe_interval.set_f(unsafe_interval.f() * 10);
+    // Integer division by one.
+    int digit = static_cast<int>(fractionals >> -one.e());
+    ASSERT(digit <= 9);
+    buffer[*length] = static_cast<char>('0' + digit);
+    (*length)++;
+    fractionals &= one.f() - 1;  // Modulo by one.
+    (*kappa)--;
+    if (fractionals < unsafe_interval.f()) {
+      return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f() * unit,
+                       unsafe_interval.f(), fractionals, one.f(), unit);
+    }
+  }
+}
+
+
+
+// Generates (at most) requested_digits digits of input number w.
+// w is a floating-point number (DiyFp), consisting of a significand and an
+// exponent. Its exponent is bounded by kMinimalTargetExponent and
+// kMaximalTargetExponent.
+//       Hence -60 <= w.e() <= -32.
+//
+// Returns false if it fails, in which case the generated digits in the buffer
+// should not be used.
+// Preconditions:
+//  * w is correct up to 1 ulp (unit in the last place). That
+//    is, its error must be strictly less than a unit of its last digit.
+//  * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent
+//
+// Postconditions: returns false if procedure fails.
+//   otherwise:
+//     * buffer is not null-terminated, but length contains the number of
+//       digits.
+//     * the representation in buffer is the most precise representation of
+//       requested_digits digits.
+//     * buffer contains at most requested_digits digits of w. If there are less
+//       than requested_digits digits then some trailing '0's have been removed.
+//     * kappa is such that
+//            w = buffer * 10^kappa + eps with |eps| < 10^kappa / 2.
+//
+// Remark: This procedure takes into account the imprecision of its input
+//   numbers. If the precision is not enough to guarantee all the postconditions
+//   then false is returned. This usually happens rarely, but the failure-rate
+//   increases with higher requested_digits.
+static bool DigitGenCounted(DiyFp w,
+                            int requested_digits,
+                            Vector<char> buffer,
+                            int* length,
+                            int* kappa) {
+  ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
+  ASSERT(kMinimalTargetExponent >= -60);
+  ASSERT(kMaximalTargetExponent <= -32);
+  // w is assumed to have an error less than 1 unit. Whenever w is scaled we
+  // also scale its error.
+  uint64_t w_error = 1;
+  // We cut the input number into two parts: the integral digits and the
+  // fractional digits. We don't emit any decimal separator, but adapt kappa
+  // instead. Example: instead of writing "1.2" we put "12" into the buffer and
+  // increase kappa by 1.
+  DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
+  // Division by one is a shift.
+  uint32_t integrals = static_cast<uint32_t>(w.f() >> -one.e());
+  // Modulo by one is an and.
+  uint64_t fractionals = w.f() & (one.f() - 1);
+  uint32_t divisor;
+  int divisor_exponent_plus_one;
+  BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
+                  &divisor, &divisor_exponent_plus_one);
+  *kappa = divisor_exponent_plus_one;
+  *length = 0;
+
+  // Loop invariant: buffer = w / 10^kappa  (integer division)
+  // The invariant holds for the first iteration: kappa has been initialized
+  // with the divisor exponent + 1. And the divisor is the biggest power of ten
+  // that is smaller than 'integrals'.
+  while (*kappa > 0) {
+    int digit = integrals / divisor;
+    ASSERT(digit <= 9);
+    buffer[*length] = static_cast<char>('0' + digit);
+    (*length)++;
+    requested_digits--;
+    integrals %= divisor;
+    (*kappa)--;
+    // Note that kappa now equals the exponent of the divisor and that the
+    // invariant thus holds again.
+    if (requested_digits == 0) break;
+    divisor /= 10;
+  }
+
+  if (requested_digits == 0) {
+    uint64_t rest =
+        (static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
+    return RoundWeedCounted(buffer, *length, rest,
+                            static_cast<uint64_t>(divisor) << -one.e(), w_error,
+                            kappa);
+  }
+
+  // The integrals have been generated. We are at the point of the decimal
+  // separator. In the following loop we simply multiply the remaining digits by
+  // 10 and divide by one. We just need to pay attention to multiply associated
+  // data (the 'unit'), too.
+  // Note that the multiplication by 10 does not overflow, because w.e >= -60
+  // and thus one.e >= -60.
+  ASSERT(one.e() >= -60);
+  ASSERT(fractionals < one.f());
+  ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
+  while (requested_digits > 0 && fractionals > w_error) {
+    fractionals *= 10;
+    w_error *= 10;
+    // Integer division by one.
+    int digit = static_cast<int>(fractionals >> -one.e());
+    ASSERT(digit <= 9);
+    buffer[*length] = static_cast<char>('0' + digit);
+    (*length)++;
+    requested_digits--;
+    fractionals &= one.f() - 1;  // Modulo by one.
+    (*kappa)--;
+  }
+  if (requested_digits != 0) return false;
+  return RoundWeedCounted(buffer, *length, fractionals, one.f(), w_error,
+                          kappa);
+}
+
+
+// Provides a decimal representation of v.
+// Returns true if it succeeds, otherwise the result cannot be trusted.
+// There will be *length digits inside the buffer (not null-terminated).
+// If the function returns true then
+//        v == (double) (buffer * 10^decimal_exponent).
+// The digits in the buffer are the shortest representation possible: no
+// 0.09999999999999999 instead of 0.1. The shorter representation will even be
+// chosen even if the longer one would be closer to v.
+// The last digit will be closest to the actual v. That is, even if several
+// digits might correctly yield 'v' when read again, the closest will be
+// computed.
+static bool Grisu3(double v,
+                   FastDtoaMode mode,
+                   Vector<char> buffer,
+                   int* length,
+                   int* decimal_exponent) {
+  DiyFp w = Double(v).AsNormalizedDiyFp();
+  // boundary_minus and boundary_plus are the boundaries between v and its
+  // closest floating-point neighbors. Any number strictly between
+  // boundary_minus and boundary_plus will round to v when convert to a double.
+  // Grisu3 will never output representations that lie exactly on a boundary.
+  DiyFp boundary_minus, boundary_plus;
+  if (mode == FAST_DTOA_SHORTEST) {
+    Double(v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
+  } else {
+    ASSERT(mode == FAST_DTOA_SHORTEST_SINGLE);
+    float single_v = static_cast<float>(v);
+    Single(single_v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
+  }
+  ASSERT(boundary_plus.e() == w.e());
+  DiyFp ten_mk;  // Cached power of ten: 10^-k
+  int mk;        // -k
+  int ten_mk_minimal_binary_exponent =
+     kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+  int ten_mk_maximal_binary_exponent =
+     kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+  PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
+      ten_mk_minimal_binary_exponent,
+      ten_mk_maximal_binary_exponent,
+      &ten_mk, &mk);
+  ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
+          DiyFp::kSignificandSize) &&
+         (kMaximalTargetExponent >= w.e() + ten_mk.e() +
+          DiyFp::kSignificandSize));
+  // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
+  // 64 bit significand and ten_mk is thus only precise up to 64 bits.
+
+  // The DiyFp::Times procedure rounds its result, and ten_mk is approximated
+  // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
+  // off by a small amount.
+  // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
+  // In other words: let f = scaled_w.f() and e = scaled_w.e(), then
+  //           (f-1) * 2^e < w*10^k < (f+1) * 2^e
+  DiyFp scaled_w = DiyFp::Times(w, ten_mk);
+  ASSERT(scaled_w.e() ==
+         boundary_plus.e() + ten_mk.e() + DiyFp::kSignificandSize);
+  // In theory it would be possible to avoid some recomputations by computing
+  // the difference between w and boundary_minus/plus (a power of 2) and to
+  // compute scaled_boundary_minus/plus by subtracting/adding from
+  // scaled_w. However the code becomes much less readable and the speed
+  // enhancements are not terriffic.
+  DiyFp scaled_boundary_minus = DiyFp::Times(boundary_minus, ten_mk);
+  DiyFp scaled_boundary_plus  = DiyFp::Times(boundary_plus,  ten_mk);
+
+  // DigitGen will generate the digits of scaled_w. Therefore we have
+  // v == (double) (scaled_w * 10^-mk).
+  // Set decimal_exponent == -mk and pass it to DigitGen. If scaled_w is not an
+  // integer than it will be updated. For instance if scaled_w == 1.23 then
+  // the buffer will be filled with "123" und the decimal_exponent will be
+  // decreased by 2.
+  int kappa;
+  bool result = DigitGen(scaled_boundary_minus, scaled_w, scaled_boundary_plus,
+                         buffer, length, &kappa);
+  *decimal_exponent = -mk + kappa;
+  return result;
+}
+
+
+// The "counted" version of grisu3 (see above) only generates requested_digits
+// number of digits. This version does not generate the shortest representation,
+// and with enough requested digits 0.1 will at some point print as 0.9999999...
+// Grisu3 is too imprecise for real halfway cases (1.5 will not work) and
+// therefore the rounding strategy for halfway cases is irrelevant.
+static bool Grisu3Counted(double v,
+                          int requested_digits,
+                          Vector<char> buffer,
+                          int* length,
+                          int* decimal_exponent) {
+  DiyFp w = Double(v).AsNormalizedDiyFp();
+  DiyFp ten_mk;  // Cached power of ten: 10^-k
+  int mk;        // -k
+  int ten_mk_minimal_binary_exponent =
+     kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+  int ten_mk_maximal_binary_exponent =
+     kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+  PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
+      ten_mk_minimal_binary_exponent,
+      ten_mk_maximal_binary_exponent,
+      &ten_mk, &mk);
+  ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
+          DiyFp::kSignificandSize) &&
+         (kMaximalTargetExponent >= w.e() + ten_mk.e() +
+          DiyFp::kSignificandSize));
+  // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
+  // 64 bit significand and ten_mk is thus only precise up to 64 bits.
+
+  // The DiyFp::Times procedure rounds its result, and ten_mk is approximated
+  // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
+  // off by a small amount.
+  // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
+  // In other words: let f = scaled_w.f() and e = scaled_w.e(), then
+  //           (f-1) * 2^e < w*10^k < (f+1) * 2^e
+  DiyFp scaled_w = DiyFp::Times(w, ten_mk);
+
+  // We now have (double) (scaled_w * 10^-mk).
+  // DigitGen will generate the first requested_digits digits of scaled_w and
+  // return together with a kappa such that scaled_w ~= buffer * 10^kappa. (It
+  // will not always be exactly the same since DigitGenCounted only produces a
+  // limited number of digits.)
+  int kappa;
+  bool result = DigitGenCounted(scaled_w, requested_digits,
+                                buffer, length, &kappa);
+  *decimal_exponent = -mk + kappa;
+  return result;
+}
+
+
+bool FastDtoa(double v,
+              FastDtoaMode mode,
+              int requested_digits,
+              Vector<char> buffer,
+              int* length,
+              int* decimal_point) {
+  ASSERT(v > 0);
+  ASSERT(!Double(v).IsSpecial());
+
+  bool result = false;
+  int decimal_exponent = 0;
+  switch (mode) {
+    case FAST_DTOA_SHORTEST:
+    case FAST_DTOA_SHORTEST_SINGLE:
+      result = Grisu3(v, mode, buffer, length, &decimal_exponent);
+      break;
+    case FAST_DTOA_PRECISION:
+      result = Grisu3Counted(v, requested_digits,
+                             buffer, length, &decimal_exponent);
+      break;
+    default:
+      UNREACHABLE();
+  }
+  if (result) {
+    *decimal_point = *length + decimal_exponent;
+    buffer[*length] = '\0';
+  }
+  return result;
+}
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-fast-dtoa.h b/icu4c/source/i18n/double-conversion-fast-dtoa.h
new file mode 100644
index 0000000..58a6470
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-fast-dtoa.h
@@ -0,0 +1,106 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#ifndef DOUBLE_CONVERSION_FAST_DTOA_H_
+#define DOUBLE_CONVERSION_FAST_DTOA_H_
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+enum FastDtoaMode {
+  // Computes the shortest representation of the given input. The returned
+  // result will be the most accurate number of this length. Longer
+  // representations might be more accurate.
+  FAST_DTOA_SHORTEST,
+  // Same as FAST_DTOA_SHORTEST but for single-precision floats.
+  FAST_DTOA_SHORTEST_SINGLE,
+  // Computes a representation where the precision (number of digits) is
+  // given as input. The precision is independent of the decimal point.
+  FAST_DTOA_PRECISION
+};
+
+// FastDtoa will produce at most kFastDtoaMaximalLength digits. This does not
+// include the terminating '\0' character.
+static const int kFastDtoaMaximalLength = 17;
+// Same for single-precision numbers.
+static const int kFastDtoaMaximalSingleLength = 9;
+
+// Provides a decimal representation of v.
+// The result should be interpreted as buffer * 10^(point - length).
+//
+// Precondition:
+//   * v must be a strictly positive finite double.
+//
+// Returns true if it succeeds, otherwise the result can not be trusted.
+// There will be *length digits inside the buffer followed by a null terminator.
+// If the function returns true and mode equals
+//   - FAST_DTOA_SHORTEST, then
+//     the parameter requested_digits is ignored.
+//     The result satisfies
+//         v == (double) (buffer * 10^(point - length)).
+//     The digits in the buffer are the shortest representation possible. E.g.
+//     if 0.099999999999 and 0.1 represent the same double then "1" is returned
+//     with point = 0.
+//     The last digit will be closest to the actual v. That is, even if several
+//     digits might correctly yield 'v' when read again, the buffer will contain
+//     the one closest to v.
+//   - FAST_DTOA_PRECISION, then
+//     the buffer contains requested_digits digits.
+//     the difference v - (buffer * 10^(point-length)) is closest to zero for
+//     all possible representations of requested_digits digits.
+//     If there are two values that are equally close, then FastDtoa returns
+//     false.
+// For both modes the buffer must be large enough to hold the result.
+bool FastDtoa(double d,
+              FastDtoaMode mode,
+              int requested_digits,
+              Vector<char> buffer,
+              int* length,
+              int* decimal_point);
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+
+#endif  // DOUBLE_CONVERSION_FAST_DTOA_H_
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-ieee.h b/icu4c/source/i18n/double-conversion-ieee.h
new file mode 100644
index 0000000..952bcea
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-ieee.h
@@ -0,0 +1,420 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#ifndef DOUBLE_CONVERSION_DOUBLE_H_
+#define DOUBLE_CONVERSION_DOUBLE_H_
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-diy-fp.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+// We assume that doubles and uint64_t have the same endianness.
+static uint64_t double_to_uint64(double d) { return BitCast<uint64_t>(d); }
+static double uint64_to_double(uint64_t d64) { return BitCast<double>(d64); }
+static uint32_t float_to_uint32(float f) { return BitCast<uint32_t>(f); }
+static float uint32_to_float(uint32_t d32) { return BitCast<float>(d32); }
+
+// Helper functions for doubles.
+class Double {
+ public:
+  static const uint64_t kSignMask = UINT64_2PART_C(0x80000000, 00000000);
+  static const uint64_t kExponentMask = UINT64_2PART_C(0x7FF00000, 00000000);
+  static const uint64_t kSignificandMask = UINT64_2PART_C(0x000FFFFF, FFFFFFFF);
+  static const uint64_t kHiddenBit = UINT64_2PART_C(0x00100000, 00000000);
+  static const int kPhysicalSignificandSize = 52;  // Excludes the hidden bit.
+  static const int kSignificandSize = 53;
+
+  Double() : d64_(0) {}
+  explicit Double(double d) : d64_(double_to_uint64(d)) {}
+  explicit Double(uint64_t d64) : d64_(d64) {}
+  explicit Double(DiyFp diy_fp)
+    : d64_(DiyFpToUint64(diy_fp)) {}
+
+  // The value encoded by this Double must be greater or equal to +0.0.
+  // It must not be special (infinity, or NaN).
+  DiyFp AsDiyFp() const {
+    ASSERT(Sign() > 0);
+    ASSERT(!IsSpecial());
+    return DiyFp(Significand(), Exponent());
+  }
+
+  // The value encoded by this Double must be strictly greater than 0.
+  DiyFp AsNormalizedDiyFp() const {
+    ASSERT(value() > 0.0);
+    uint64_t f = Significand();
+    int e = Exponent();
+
+    // The current double could be a denormal.
+    while ((f & kHiddenBit) == 0) {
+      f <<= 1;
+      e--;
+    }
+    // Do the final shifts in one go.
+    f <<= DiyFp::kSignificandSize - kSignificandSize;
+    e -= DiyFp::kSignificandSize - kSignificandSize;
+    return DiyFp(f, e);
+  }
+
+  // Returns the double's bit as uint64.
+  uint64_t AsUint64() const {
+    return d64_;
+  }
+
+  // Returns the next greater double. Returns +infinity on input +infinity.
+  double NextDouble() const {
+    if (d64_ == kInfinity) return Double(kInfinity).value();
+    if (Sign() < 0 && Significand() == 0) {
+      // -0.0
+      return 0.0;
+    }
+    if (Sign() < 0) {
+      return Double(d64_ - 1).value();
+    } else {
+      return Double(d64_ + 1).value();
+    }
+  }
+
+  double PreviousDouble() const {
+    if (d64_ == (kInfinity | kSignMask)) return -Infinity();
+    if (Sign() < 0) {
+      return Double(d64_ + 1).value();
+    } else {
+      if (Significand() == 0) return -0.0;
+      return Double(d64_ - 1).value();
+    }
+  }
+
+  int Exponent() const {
+    if (IsDenormal()) return kDenormalExponent;
+
+    uint64_t d64 = AsUint64();
+    int biased_e =
+        static_cast<int>((d64 & kExponentMask) >> kPhysicalSignificandSize);
+    return biased_e - kExponentBias;
+  }
+
+  uint64_t Significand() const {
+    uint64_t d64 = AsUint64();
+    uint64_t significand = d64 & kSignificandMask;
+    if (!IsDenormal()) {
+      return significand + kHiddenBit;
+    } else {
+      return significand;
+    }
+  }
+
+  // Returns true if the double is a denormal.
+  bool IsDenormal() const {
+    uint64_t d64 = AsUint64();
+    return (d64 & kExponentMask) == 0;
+  }
+
+  // We consider denormals not to be special.
+  // Hence only Infinity and NaN are special.
+  bool IsSpecial() const {
+    uint64_t d64 = AsUint64();
+    return (d64 & kExponentMask) == kExponentMask;
+  }
+
+  bool IsNan() const {
+    uint64_t d64 = AsUint64();
+    return ((d64 & kExponentMask) == kExponentMask) &&
+        ((d64 & kSignificandMask) != 0);
+  }
+
+  bool IsInfinite() const {
+    uint64_t d64 = AsUint64();
+    return ((d64 & kExponentMask) == kExponentMask) &&
+        ((d64 & kSignificandMask) == 0);
+  }
+
+  int Sign() const {
+    uint64_t d64 = AsUint64();
+    return (d64 & kSignMask) == 0? 1: -1;
+  }
+
+  // Precondition: the value encoded by this Double must be greater or equal
+  // than +0.0.
+  DiyFp UpperBoundary() const {
+    ASSERT(Sign() > 0);
+    return DiyFp(Significand() * 2 + 1, Exponent() - 1);
+  }
+
+  // Computes the two boundaries of this.
+  // The bigger boundary (m_plus) is normalized. The lower boundary has the same
+  // exponent as m_plus.
+  // Precondition: the value encoded by this Double must be greater than 0.
+  void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
+    ASSERT(value() > 0.0);
+    DiyFp v = this->AsDiyFp();
+    DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
+    DiyFp m_minus;
+    if (LowerBoundaryIsCloser()) {
+      m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2);
+    } else {
+      m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1);
+    }
+    m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e()));
+    m_minus.set_e(m_plus.e());
+    *out_m_plus = m_plus;
+    *out_m_minus = m_minus;
+  }
+
+  bool LowerBoundaryIsCloser() const {
+    // The boundary is closer if the significand is of the form f == 2^p-1 then
+    // the lower boundary is closer.
+    // Think of v = 1000e10 and v- = 9999e9.
+    // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but
+    // at a distance of 1e8.
+    // The only exception is for the smallest normal: the largest denormal is
+    // at the same distance as its successor.
+    // Note: denormals have the same exponent as the smallest normals.
+    bool physical_significand_is_zero = ((AsUint64() & kSignificandMask) == 0);
+    return physical_significand_is_zero && (Exponent() != kDenormalExponent);
+  }
+
+  double value() const { return uint64_to_double(d64_); }
+
+  // Returns the significand size for a given order of magnitude.
+  // If v = f*2^e with 2^p-1 <= f <= 2^p then p+e is v's order of magnitude.
+  // This function returns the number of significant binary digits v will have
+  // once it's encoded into a double. In almost all cases this is equal to
+  // kSignificandSize. The only exceptions are denormals. They start with
+  // leading zeroes and their effective significand-size is hence smaller.
+  static int SignificandSizeForOrderOfMagnitude(int order) {
+    if (order >= (kDenormalExponent + kSignificandSize)) {
+      return kSignificandSize;
+    }
+    if (order <= kDenormalExponent) return 0;
+    return order - kDenormalExponent;
+  }
+
+  static double Infinity() {
+    return Double(kInfinity).value();
+  }
+
+  static double NaN() {
+    return Double(kNaN).value();
+  }
+
+ private:
+  static const int kExponentBias = 0x3FF + kPhysicalSignificandSize;
+  static const int kDenormalExponent = -kExponentBias + 1;
+  static const int kMaxExponent = 0x7FF - kExponentBias;
+  static const uint64_t kInfinity = UINT64_2PART_C(0x7FF00000, 00000000);
+  static const uint64_t kNaN = UINT64_2PART_C(0x7FF80000, 00000000);
+
+  const uint64_t d64_;
+
+  static uint64_t DiyFpToUint64(DiyFp diy_fp) {
+    uint64_t significand = diy_fp.f();
+    int exponent = diy_fp.e();
+    while (significand > kHiddenBit + kSignificandMask) {
+      significand >>= 1;
+      exponent++;
+    }
+    if (exponent >= kMaxExponent) {
+      return kInfinity;
+    }
+    if (exponent < kDenormalExponent) {
+      return 0;
+    }
+    while (exponent > kDenormalExponent && (significand & kHiddenBit) == 0) {
+      significand <<= 1;
+      exponent--;
+    }
+    uint64_t biased_exponent;
+    if (exponent == kDenormalExponent && (significand & kHiddenBit) == 0) {
+      biased_exponent = 0;
+    } else {
+      biased_exponent = static_cast<uint64_t>(exponent + kExponentBias);
+    }
+    return (significand & kSignificandMask) |
+        (biased_exponent << kPhysicalSignificandSize);
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(Double);
+};
+
+class Single {
+ public:
+  static const uint32_t kSignMask = 0x80000000;
+  static const uint32_t kExponentMask = 0x7F800000;
+  static const uint32_t kSignificandMask = 0x007FFFFF;
+  static const uint32_t kHiddenBit = 0x00800000;
+  static const int kPhysicalSignificandSize = 23;  // Excludes the hidden bit.
+  static const int kSignificandSize = 24;
+
+  Single() : d32_(0) {}
+  explicit Single(float f) : d32_(float_to_uint32(f)) {}
+  explicit Single(uint32_t d32) : d32_(d32) {}
+
+  // The value encoded by this Single must be greater or equal to +0.0.
+  // It must not be special (infinity, or NaN).
+  DiyFp AsDiyFp() const {
+    ASSERT(Sign() > 0);
+    ASSERT(!IsSpecial());
+    return DiyFp(Significand(), Exponent());
+  }
+
+  // Returns the single's bit as uint64.
+  uint32_t AsUint32() const {
+    return d32_;
+  }
+
+  int Exponent() const {
+    if (IsDenormal()) return kDenormalExponent;
+
+    uint32_t d32 = AsUint32();
+    int biased_e =
+        static_cast<int>((d32 & kExponentMask) >> kPhysicalSignificandSize);
+    return biased_e - kExponentBias;
+  }
+
+  uint32_t Significand() const {
+    uint32_t d32 = AsUint32();
+    uint32_t significand = d32 & kSignificandMask;
+    if (!IsDenormal()) {
+      return significand + kHiddenBit;
+    } else {
+      return significand;
+    }
+  }
+
+  // Returns true if the single is a denormal.
+  bool IsDenormal() const {
+    uint32_t d32 = AsUint32();
+    return (d32 & kExponentMask) == 0;
+  }
+
+  // We consider denormals not to be special.
+  // Hence only Infinity and NaN are special.
+  bool IsSpecial() const {
+    uint32_t d32 = AsUint32();
+    return (d32 & kExponentMask) == kExponentMask;
+  }
+
+  bool IsNan() const {
+    uint32_t d32 = AsUint32();
+    return ((d32 & kExponentMask) == kExponentMask) &&
+        ((d32 & kSignificandMask) != 0);
+  }
+
+  bool IsInfinite() const {
+    uint32_t d32 = AsUint32();
+    return ((d32 & kExponentMask) == kExponentMask) &&
+        ((d32 & kSignificandMask) == 0);
+  }
+
+  int Sign() const {
+    uint32_t d32 = AsUint32();
+    return (d32 & kSignMask) == 0? 1: -1;
+  }
+
+  // Computes the two boundaries of this.
+  // The bigger boundary (m_plus) is normalized. The lower boundary has the same
+  // exponent as m_plus.
+  // Precondition: the value encoded by this Single must be greater than 0.
+  void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
+    ASSERT(value() > 0.0);
+    DiyFp v = this->AsDiyFp();
+    DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
+    DiyFp m_minus;
+    if (LowerBoundaryIsCloser()) {
+      m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2);
+    } else {
+      m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1);
+    }
+    m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e()));
+    m_minus.set_e(m_plus.e());
+    *out_m_plus = m_plus;
+    *out_m_minus = m_minus;
+  }
+
+  // Precondition: the value encoded by this Single must be greater or equal
+  // than +0.0.
+  DiyFp UpperBoundary() const {
+    ASSERT(Sign() > 0);
+    return DiyFp(Significand() * 2 + 1, Exponent() - 1);
+  }
+
+  bool LowerBoundaryIsCloser() const {
+    // The boundary is closer if the significand is of the form f == 2^p-1 then
+    // the lower boundary is closer.
+    // Think of v = 1000e10 and v- = 9999e9.
+    // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but
+    // at a distance of 1e8.
+    // The only exception is for the smallest normal: the largest denormal is
+    // at the same distance as its successor.
+    // Note: denormals have the same exponent as the smallest normals.
+    bool physical_significand_is_zero = ((AsUint32() & kSignificandMask) == 0);
+    return physical_significand_is_zero && (Exponent() != kDenormalExponent);
+  }
+
+  float value() const { return uint32_to_float(d32_); }
+
+  static float Infinity() {
+    return Single(kInfinity).value();
+  }
+
+  static float NaN() {
+    return Single(kNaN).value();
+  }
+
+ private:
+  static const int kExponentBias = 0x7F + kPhysicalSignificandSize;
+  static const int kDenormalExponent = -kExponentBias + 1;
+  static const int kMaxExponent = 0xFF - kExponentBias;
+  static const uint32_t kInfinity = 0x7F800000;
+  static const uint32_t kNaN = 0x7FC00000;
+
+  const uint32_t d32_;
+
+  DISALLOW_COPY_AND_ASSIGN(Single);
+};
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+
+#endif  // DOUBLE_CONVERSION_DOUBLE_H_
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion-utils.h b/icu4c/source/i18n/double-conversion-utils.h
new file mode 100644
index 0000000..02795b4
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion-utils.h
@@ -0,0 +1,358 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#ifndef DOUBLE_CONVERSION_UTILS_H_
+#define DOUBLE_CONVERSION_UTILS_H_
+
+#include <stdlib.h>
+#include <string.h>
+
+// ICU PATCH: Use U_ASSERT instead of <assert.h>
+#include "uassert.h"
+#define ASSERT U_ASSERT
+
+#ifndef UNIMPLEMENTED
+#define UNIMPLEMENTED() (abort())
+#endif
+#ifndef DOUBLE_CONVERSION_NO_RETURN
+#ifdef _MSC_VER
+#define DOUBLE_CONVERSION_NO_RETURN __declspec(noreturn)
+#else
+#define DOUBLE_CONVERSION_NO_RETURN __attribute__((noreturn))
+#endif
+#endif
+#ifndef UNREACHABLE
+#ifdef _MSC_VER
+void DOUBLE_CONVERSION_NO_RETURN abort_noreturn();
+inline void abort_noreturn() { abort(); }
+#define UNREACHABLE()   (abort_noreturn())
+#else
+#define UNREACHABLE()   (abort())
+#endif
+#endif
+
+
+// Double operations detection based on target architecture.
+// Linux uses a 80bit wide floating point stack on x86. This induces double
+// rounding, which in turn leads to wrong results.
+// An easy way to test if the floating-point operations are correct is to
+// evaluate: 89255.0/1e22. If the floating-point stack is 64 bits wide then
+// the result is equal to 89255e-22.
+// The best way to test this, is to create a division-function and to compare
+// the output of the division with the expected result. (Inlining must be
+// disabled.)
+// On Linux,x86 89255e-22 != Div_double(89255.0/1e22)
+// ICU PATCH: Enable ARM builds for Windows with 'defined(_M_ARM)'.
+#if defined(_M_X64) || defined(__x86_64__) || \
+    defined(__ARMEL__) || defined(__avr32__) || defined(_M_ARM) || \
+    defined(__hppa__) || defined(__ia64__) || \
+    defined(__mips__) || \
+    defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) || \
+    defined(_POWER) || defined(_ARCH_PPC) || defined(_ARCH_PPC64) || \
+    defined(__sparc__) || defined(__sparc) || defined(__s390__) || \
+    defined(__SH4__) || defined(__alpha__) || \
+    defined(_MIPS_ARCH_MIPS32R2) || \
+    defined(__AARCH64EL__) || defined(__aarch64__) || \
+    defined(__riscv)
+#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
+#elif defined(__mc68000__)
+#undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS
+#elif defined(_M_IX86) || defined(__i386__) || defined(__i386)
+#if defined(_WIN32)
+// Windows uses a 64bit wide floating point stack.
+#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
+#else
+#undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS
+#endif  // _WIN32
+#else
+#error Target architecture was not detected as supported by Double-Conversion.
+#endif
+
+#if defined(__GNUC__)
+#define DOUBLE_CONVERSION_UNUSED __attribute__((unused))
+#else
+#define DOUBLE_CONVERSION_UNUSED
+#endif
+
+#if defined(_WIN32) && !defined(__MINGW32__)
+
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef short int16_t;  // NOLINT
+typedef unsigned short uint16_t;  // NOLINT
+typedef int int32_t;
+typedef unsigned int uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+// intptr_t and friends are defined in crtdefs.h through stdio.h.
+
+#else
+
+#include <stdint.h>
+
+#endif
+
+typedef uint16_t uc16;
+
+// The following macro works on both 32 and 64-bit platforms.
+// Usage: instead of writing 0x1234567890123456
+//      write UINT64_2PART_C(0x12345678,90123456);
+#define UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
+
+
+// The expression ARRAY_SIZE(a) is a compile-time constant of type
+// size_t which represents the number of elements of the given
+// array. You should only use ARRAY_SIZE on statically allocated
+// arrays.
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(a)                                   \
+  ((sizeof(a) / sizeof(*(a))) /                         \
+  static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
+#endif
+
+// A macro to disallow the evil copy constructor and operator= functions
+// This should be used in the private: declarations for a class
+#ifndef DISALLOW_COPY_AND_ASSIGN
+#define DISALLOW_COPY_AND_ASSIGN(TypeName)      \
+  TypeName(const TypeName&);                    \
+  void operator=(const TypeName&)
+#endif
+
+// A macro to disallow all the implicit constructors, namely the
+// default constructor, copy constructor and operator= functions.
+//
+// This should be used in the private: declarations for a class
+// that wants to prevent anyone from instantiating it. This is
+// especially useful for classes containing only static methods.
+#ifndef DISALLOW_IMPLICIT_CONSTRUCTORS
+#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
+  TypeName();                                    \
+  DISALLOW_COPY_AND_ASSIGN(TypeName)
+#endif
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+static const int kCharSize = sizeof(char);
+
+// Returns the maximum of the two parameters.
+template <typename T>
+static T Max(T a, T b) {
+  return a < b ? b : a;
+}
+
+
+// Returns the minimum of the two parameters.
+template <typename T>
+static T Min(T a, T b) {
+  return a < b ? a : b;
+}
+
+
+inline int StrLength(const char* string) {
+  size_t length = strlen(string);
+  ASSERT(length == static_cast<size_t>(static_cast<int>(length)));
+  return static_cast<int>(length);
+}
+
+// This is a simplified version of V8's Vector class.
+template <typename T>
+class Vector {
+ public:
+  Vector() : start_(NULL), length_(0) {}
+  Vector(T* data, int len) : start_(data), length_(len) {
+    ASSERT(len == 0 || (len > 0 && data != NULL));
+  }
+
+  // Returns a vector using the same backing storage as this one,
+  // spanning from and including 'from', to but not including 'to'.
+  Vector<T> SubVector(int from, int to) {
+    ASSERT(to <= length_);
+    ASSERT(from < to);
+    ASSERT(0 <= from);
+    return Vector<T>(start() + from, to - from);
+  }
+
+  // Returns the length of the vector.
+  int length() const { return length_; }
+
+  // Returns whether or not the vector is empty.
+  bool is_empty() const { return length_ == 0; }
+
+  // Returns the pointer to the start of the data in the vector.
+  T* start() const { return start_; }
+
+  // Access individual vector elements - checks bounds in debug mode.
+  T& operator[](int index) const {
+    ASSERT(0 <= index && index < length_);
+    return start_[index];
+  }
+
+  T& first() { return start_[0]; }
+
+  T& last() { return start_[length_ - 1]; }
+
+ private:
+  T* start_;
+  int length_;
+};
+
+
+// Helper class for building result strings in a character buffer. The
+// purpose of the class is to use safe operations that checks the
+// buffer bounds on all operations in debug mode.
+class StringBuilder {
+ public:
+  StringBuilder(char* buffer, int buffer_size)
+      : buffer_(buffer, buffer_size), position_(0) { }
+
+  ~StringBuilder() { if (!is_finalized()) Finalize(); }
+
+  int size() const { return buffer_.length(); }
+
+  // Get the current position in the builder.
+  int position() const {
+    ASSERT(!is_finalized());
+    return position_;
+  }
+
+  // Reset the position.
+  void Reset() { position_ = 0; }
+
+  // Add a single character to the builder. It is not allowed to add
+  // 0-characters; use the Finalize() method to terminate the string
+  // instead.
+  void AddCharacter(char c) {
+    ASSERT(c != '\0');
+    ASSERT(!is_finalized() && position_ < buffer_.length());
+    buffer_[position_++] = c;
+  }
+
+  // Add an entire string to the builder. Uses strlen() internally to
+  // compute the length of the input string.
+  void AddString(const char* s) {
+    AddSubstring(s, StrLength(s));
+  }
+
+  // Add the first 'n' characters of the given string 's' to the
+  // builder. The input string must have enough characters.
+  void AddSubstring(const char* s, int n) {
+    ASSERT(!is_finalized() && position_ + n < buffer_.length());
+    ASSERT(static_cast<size_t>(n) <= strlen(s));
+    memmove(&buffer_[position_], s, n * kCharSize);
+    position_ += n;
+  }
+
+
+  // Add character padding to the builder. If count is non-positive,
+  // nothing is added to the builder.
+  void AddPadding(char c, int count) {
+    for (int i = 0; i < count; i++) {
+      AddCharacter(c);
+    }
+  }
+
+  // Finalize the string by 0-terminating it and returning the buffer.
+  char* Finalize() {
+    ASSERT(!is_finalized() && position_ < buffer_.length());
+    buffer_[position_] = '\0';
+    // Make sure nobody managed to add a 0-character to the
+    // buffer while building the string.
+    ASSERT(strlen(buffer_.start()) == static_cast<size_t>(position_));
+    position_ = -1;
+    ASSERT(is_finalized());
+    return buffer_.start();
+  }
+
+ private:
+  Vector<char> buffer_;
+  int position_;
+
+  bool is_finalized() const { return position_ < 0; }
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder);
+};
+
+// The type-based aliasing rule allows the compiler to assume that pointers of
+// different types (for some definition of different) never alias each other.
+// Thus the following code does not work:
+//
+// float f = foo();
+// int fbits = *(int*)(&f);
+//
+// The compiler 'knows' that the int pointer can't refer to f since the types
+// don't match, so the compiler may cache f in a register, leaving random data
+// in fbits.  Using C++ style casts makes no difference, however a pointer to
+// char data is assumed to alias any other pointer.  This is the 'memcpy
+// exception'.
+//
+// Bit_cast uses the memcpy exception to move the bits from a variable of one
+// type of a variable of another type.  Of course the end result is likely to
+// be implementation dependent.  Most compilers (gcc-4.2 and MSVC 2005)
+// will completely optimize BitCast away.
+//
+// There is an additional use for BitCast.
+// Recent gccs will warn when they see casts that may result in breakage due to
+// the type-based aliasing rule.  If you have checked that there is no breakage
+// you can use BitCast to cast one pointer type to another.  This confuses gcc
+// enough that it can no longer see that you have cast one pointer type to
+// another thus avoiding the warning.
+template <class Dest, class Source>
+inline Dest BitCast(const Source& source) {
+  // Compile time assertion: sizeof(Dest) == sizeof(Source)
+  // A compile error here means your Dest and Source have different sizes.
+  DOUBLE_CONVERSION_UNUSED
+      typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1];
+
+  Dest dest;
+  memmove(&dest, &source, sizeof(dest));
+  return dest;
+}
+
+template <class Dest, class Source>
+inline Dest BitCast(Source* source) {
+  return BitCast<Dest>(reinterpret_cast<uintptr_t>(source));
+}
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+
+#endif  // DOUBLE_CONVERSION_UTILS_H_
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion.cpp b/icu4c/source/i18n/double-conversion.cpp
new file mode 100644
index 0000000..8629284
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion.cpp
@@ -0,0 +1,1005 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#include <limits.h>
+#include <math.h>
+
+// ICU PATCH: Customize header file paths for ICU.
+// The files fixed-dtoa.h and strtod.h are not needed.
+
+#include "double-conversion.h"
+
+#include "double-conversion-bignum-dtoa.h"
+#include "double-conversion-fast-dtoa.h"
+#include "double-conversion-ieee.h"
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+#if 0  // not needed for ICU
+const DoubleToStringConverter& DoubleToStringConverter::EcmaScriptConverter() {
+  int flags = UNIQUE_ZERO | EMIT_POSITIVE_EXPONENT_SIGN;
+  static DoubleToStringConverter converter(flags,
+                                           "Infinity",
+                                           "NaN",
+                                           'e',
+                                           -6, 21,
+                                           6, 0);
+  return converter;
+}
+
+
+bool DoubleToStringConverter::HandleSpecialValues(
+    double value,
+    StringBuilder* result_builder) const {
+  Double double_inspect(value);
+  if (double_inspect.IsInfinite()) {
+    if (infinity_symbol_ == NULL) return false;
+    if (value < 0) {
+      result_builder->AddCharacter('-');
+    }
+    result_builder->AddString(infinity_symbol_);
+    return true;
+  }
+  if (double_inspect.IsNan()) {
+    if (nan_symbol_ == NULL) return false;
+    result_builder->AddString(nan_symbol_);
+    return true;
+  }
+  return false;
+}
+
+
+void DoubleToStringConverter::CreateExponentialRepresentation(
+    const char* decimal_digits,
+    int length,
+    int exponent,
+    StringBuilder* result_builder) const {
+  ASSERT(length != 0);
+  result_builder->AddCharacter(decimal_digits[0]);
+  if (length != 1) {
+    result_builder->AddCharacter('.');
+    result_builder->AddSubstring(&decimal_digits[1], length-1);
+  }
+  result_builder->AddCharacter(exponent_character_);
+  if (exponent < 0) {
+    result_builder->AddCharacter('-');
+    exponent = -exponent;
+  } else {
+    if ((flags_ & EMIT_POSITIVE_EXPONENT_SIGN) != 0) {
+      result_builder->AddCharacter('+');
+    }
+  }
+  if (exponent == 0) {
+    result_builder->AddCharacter('0');
+    return;
+  }
+  ASSERT(exponent < 1e4);
+  const int kMaxExponentLength = 5;
+  char buffer[kMaxExponentLength + 1];
+  buffer[kMaxExponentLength] = '\0';
+  int first_char_pos = kMaxExponentLength;
+  while (exponent > 0) {
+    buffer[--first_char_pos] = '0' + (exponent % 10);
+    exponent /= 10;
+  }
+  result_builder->AddSubstring(&buffer[first_char_pos],
+                               kMaxExponentLength - first_char_pos);
+}
+
+
+void DoubleToStringConverter::CreateDecimalRepresentation(
+    const char* decimal_digits,
+    int length,
+    int decimal_point,
+    int digits_after_point,
+    StringBuilder* result_builder) const {
+  // Create a representation that is padded with zeros if needed.
+  if (decimal_point <= 0) {
+      // "0.00000decimal_rep" or "0.000decimal_rep00".
+    result_builder->AddCharacter('0');
+    if (digits_after_point > 0) {
+      result_builder->AddCharacter('.');
+      result_builder->AddPadding('0', -decimal_point);
+      ASSERT(length <= digits_after_point - (-decimal_point));
+      result_builder->AddSubstring(decimal_digits, length);
+      int remaining_digits = digits_after_point - (-decimal_point) - length;
+      result_builder->AddPadding('0', remaining_digits);
+    }
+  } else if (decimal_point >= length) {
+    // "decimal_rep0000.00000" or "decimal_rep.0000".
+    result_builder->AddSubstring(decimal_digits, length);
+    result_builder->AddPadding('0', decimal_point - length);
+    if (digits_after_point > 0) {
+      result_builder->AddCharacter('.');
+      result_builder->AddPadding('0', digits_after_point);
+    }
+  } else {
+    // "decima.l_rep000".
+    ASSERT(digits_after_point > 0);
+    result_builder->AddSubstring(decimal_digits, decimal_point);
+    result_builder->AddCharacter('.');
+    ASSERT(length - decimal_point <= digits_after_point);
+    result_builder->AddSubstring(&decimal_digits[decimal_point],
+                                 length - decimal_point);
+    int remaining_digits = digits_after_point - (length - decimal_point);
+    result_builder->AddPadding('0', remaining_digits);
+  }
+  if (digits_after_point == 0) {
+    if ((flags_ & EMIT_TRAILING_DECIMAL_POINT) != 0) {
+      result_builder->AddCharacter('.');
+    }
+    if ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) {
+      result_builder->AddCharacter('0');
+    }
+  }
+}
+
+
+bool DoubleToStringConverter::ToShortestIeeeNumber(
+    double value,
+    StringBuilder* result_builder,
+    DoubleToStringConverter::DtoaMode mode) const {
+  ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE);
+  if (Double(value).IsSpecial()) {
+    return HandleSpecialValues(value, result_builder);
+  }
+
+  int decimal_point;
+  bool sign;
+  const int kDecimalRepCapacity = kBase10MaximalLength + 1;
+  char decimal_rep[kDecimalRepCapacity];
+  int decimal_rep_length;
+
+  DoubleToAscii(value, mode, 0, decimal_rep, kDecimalRepCapacity,
+                &sign, &decimal_rep_length, &decimal_point);
+
+  bool unique_zero = (flags_ & UNIQUE_ZERO) != 0;
+  if (sign && (value != 0.0 || !unique_zero)) {
+    result_builder->AddCharacter('-');
+  }
+
+  int exponent = decimal_point - 1;
+  if ((decimal_in_shortest_low_ <= exponent) &&
+      (exponent < decimal_in_shortest_high_)) {
+    CreateDecimalRepresentation(decimal_rep, decimal_rep_length,
+                                decimal_point,
+                                Max(0, decimal_rep_length - decimal_point),
+                                result_builder);
+  } else {
+    CreateExponentialRepresentation(decimal_rep, decimal_rep_length, exponent,
+                                    result_builder);
+  }
+  return true;
+}
+
+
+bool DoubleToStringConverter::ToFixed(double value,
+                                      int requested_digits,
+                                      StringBuilder* result_builder) const {
+  ASSERT(kMaxFixedDigitsBeforePoint == 60);
+  const double kFirstNonFixed = 1e60;
+
+  if (Double(value).IsSpecial()) {
+    return HandleSpecialValues(value, result_builder);
+  }
+
+  if (requested_digits > kMaxFixedDigitsAfterPoint) return false;
+  if (value >= kFirstNonFixed || value <= -kFirstNonFixed) return false;
+
+  // Find a sufficiently precise decimal representation of n.
+  int decimal_point;
+  bool sign;
+  // Add space for the '\0' byte.
+  const int kDecimalRepCapacity =
+      kMaxFixedDigitsBeforePoint + kMaxFixedDigitsAfterPoint + 1;
+  char decimal_rep[kDecimalRepCapacity];
+  int decimal_rep_length;
+  DoubleToAscii(value, FIXED, requested_digits,
+                decimal_rep, kDecimalRepCapacity,
+                &sign, &decimal_rep_length, &decimal_point);
+
+  bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+  if (sign && (value != 0.0 || !unique_zero)) {
+    result_builder->AddCharacter('-');
+  }
+
+  CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point,
+                              requested_digits, result_builder);
+  return true;
+}
+
+
+bool DoubleToStringConverter::ToExponential(
+    double value,
+    int requested_digits,
+    StringBuilder* result_builder) const {
+  if (Double(value).IsSpecial()) {
+    return HandleSpecialValues(value, result_builder);
+  }
+
+  if (requested_digits < -1) return false;
+  if (requested_digits > kMaxExponentialDigits) return false;
+
+  int decimal_point;
+  bool sign;
+  // Add space for digit before the decimal point and the '\0' character.
+  const int kDecimalRepCapacity = kMaxExponentialDigits + 2;
+  ASSERT(kDecimalRepCapacity > kBase10MaximalLength);
+  char decimal_rep[kDecimalRepCapacity];
+  int decimal_rep_length;
+
+  if (requested_digits == -1) {
+    DoubleToAscii(value, SHORTEST, 0,
+                  decimal_rep, kDecimalRepCapacity,
+                  &sign, &decimal_rep_length, &decimal_point);
+  } else {
+    DoubleToAscii(value, PRECISION, requested_digits + 1,
+                  decimal_rep, kDecimalRepCapacity,
+                  &sign, &decimal_rep_length, &decimal_point);
+    ASSERT(decimal_rep_length <= requested_digits + 1);
+
+    for (int i = decimal_rep_length; i < requested_digits + 1; ++i) {
+      decimal_rep[i] = '0';
+    }
+    decimal_rep_length = requested_digits + 1;
+  }
+
+  bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+  if (sign && (value != 0.0 || !unique_zero)) {
+    result_builder->AddCharacter('-');
+  }
+
+  int exponent = decimal_point - 1;
+  CreateExponentialRepresentation(decimal_rep,
+                                  decimal_rep_length,
+                                  exponent,
+                                  result_builder);
+  return true;
+}
+
+
+bool DoubleToStringConverter::ToPrecision(double value,
+                                          int precision,
+                                          StringBuilder* result_builder) const {
+  if (Double(value).IsSpecial()) {
+    return HandleSpecialValues(value, result_builder);
+  }
+
+  if (precision < kMinPrecisionDigits || precision > kMaxPrecisionDigits) {
+    return false;
+  }
+
+  // Find a sufficiently precise decimal representation of n.
+  int decimal_point;
+  bool sign;
+  // Add one for the terminating null character.
+  const int kDecimalRepCapacity = kMaxPrecisionDigits + 1;
+  char decimal_rep[kDecimalRepCapacity];
+  int decimal_rep_length;
+
+  DoubleToAscii(value, PRECISION, precision,
+                decimal_rep, kDecimalRepCapacity,
+                &sign, &decimal_rep_length, &decimal_point);
+  ASSERT(decimal_rep_length <= precision);
+
+  bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+  if (sign && (value != 0.0 || !unique_zero)) {
+    result_builder->AddCharacter('-');
+  }
+
+  // The exponent if we print the number as x.xxeyyy. That is with the
+  // decimal point after the first digit.
+  int exponent = decimal_point - 1;
+
+  int extra_zero = ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) ? 1 : 0;
+  if ((-decimal_point + 1 > max_leading_padding_zeroes_in_precision_mode_) ||
+      (decimal_point - precision + extra_zero >
+       max_trailing_padding_zeroes_in_precision_mode_)) {
+    // Fill buffer to contain 'precision' digits.
+    // Usually the buffer is already at the correct length, but 'DoubleToAscii'
+    // is allowed to return less characters.
+    for (int i = decimal_rep_length; i < precision; ++i) {
+      decimal_rep[i] = '0';
+    }
+
+    CreateExponentialRepresentation(decimal_rep,
+                                    precision,
+                                    exponent,
+                                    result_builder);
+  } else {
+    CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point,
+                                Max(0, precision - decimal_point),
+                                result_builder);
+  }
+  return true;
+}
+#endif // not needed for ICU
+
+
+static BignumDtoaMode DtoaToBignumDtoaMode(
+    DoubleToStringConverter::DtoaMode dtoa_mode) {
+  switch (dtoa_mode) {
+    case DoubleToStringConverter::SHORTEST:  return BIGNUM_DTOA_SHORTEST;
+    case DoubleToStringConverter::SHORTEST_SINGLE:
+        return BIGNUM_DTOA_SHORTEST_SINGLE;
+    case DoubleToStringConverter::FIXED:     return BIGNUM_DTOA_FIXED;
+    case DoubleToStringConverter::PRECISION: return BIGNUM_DTOA_PRECISION;
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+void DoubleToStringConverter::DoubleToAscii(double v,
+                                            DtoaMode mode,
+                                            int requested_digits,
+                                            char* buffer,
+                                            int buffer_length,
+                                            bool* sign,
+                                            int* length,
+                                            int* point) {
+  Vector<char> vector(buffer, buffer_length);
+  ASSERT(!Double(v).IsSpecial());
+  ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE || requested_digits >= 0);
+
+  if (Double(v).Sign() < 0) {
+    *sign = true;
+    v = -v;
+  } else {
+    *sign = false;
+  }
+
+  if (mode == PRECISION && requested_digits == 0) {
+    vector[0] = '\0';
+    *length = 0;
+    return;
+  }
+
+  if (v == 0) {
+    vector[0] = '0';
+    vector[1] = '\0';
+    *length = 1;
+    *point = 1;
+    return;
+  }
+
+  bool fast_worked;
+  switch (mode) {
+    case SHORTEST:
+      fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST, 0, vector, length, point);
+      break;
+#if 0 // not needed for ICU
+    case SHORTEST_SINGLE:
+      fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST_SINGLE, 0,
+                             vector, length, point);
+      break;
+    case FIXED:
+      fast_worked = FastFixedDtoa(v, requested_digits, vector, length, point);
+      break;
+    case PRECISION:
+      fast_worked = FastDtoa(v, FAST_DTOA_PRECISION, requested_digits,
+                             vector, length, point);
+      break;
+#endif // not needed for ICU
+    default:
+      fast_worked = false;
+      UNREACHABLE();
+  }
+  if (fast_worked) return;
+
+  // If the fast dtoa didn't succeed use the slower bignum version.
+  BignumDtoaMode bignum_mode = DtoaToBignumDtoaMode(mode);
+  BignumDtoa(v, bignum_mode, requested_digits, vector, length, point);
+  vector[*length] = '\0';
+}
+
+
+#if 0 // not needed for ICU
+// Consumes the given substring from the iterator.
+// Returns false, if the substring does not match.
+template <class Iterator>
+static bool ConsumeSubString(Iterator* current,
+                             Iterator end,
+                             const char* substring) {
+  ASSERT(**current == *substring);
+  for (substring++; *substring != '\0'; substring++) {
+    ++*current;
+    if (*current == end || **current != *substring) return false;
+  }
+  ++*current;
+  return true;
+}
+
+
+// Maximum number of significant digits in decimal representation.
+// The longest possible double in decimal representation is
+// (2^53 - 1) * 2 ^ -1074 that is (2 ^ 53 - 1) * 5 ^ 1074 / 10 ^ 1074
+// (768 digits). If we parse a number whose first digits are equal to a
+// mean of 2 adjacent doubles (that could have up to 769 digits) the result
+// must be rounded to the bigger one unless the tail consists of zeros, so
+// we don't need to preserve all the digits.
+const int kMaxSignificantDigits = 772;
+
+
+static const char kWhitespaceTable7[] = { 32, 13, 10, 9, 11, 12 };
+static const int kWhitespaceTable7Length = ARRAY_SIZE(kWhitespaceTable7);
+
+
+static const uc16 kWhitespaceTable16[] = {
+  160, 8232, 8233, 5760, 6158, 8192, 8193, 8194, 8195,
+  8196, 8197, 8198, 8199, 8200, 8201, 8202, 8239, 8287, 12288, 65279
+};
+static const int kWhitespaceTable16Length = ARRAY_SIZE(kWhitespaceTable16);
+
+
+static bool isWhitespace(int x) {
+  if (x < 128) {
+    for (int i = 0; i < kWhitespaceTable7Length; i++) {
+      if (kWhitespaceTable7[i] == x) return true;
+    }
+  } else {
+    for (int i = 0; i < kWhitespaceTable16Length; i++) {
+      if (kWhitespaceTable16[i] == x) return true;
+    }
+  }
+  return false;
+}
+
+
+// Returns true if a nonspace found and false if the end has reached.
+template <class Iterator>
+static inline bool AdvanceToNonspace(Iterator* current, Iterator end) {
+  while (*current != end) {
+    if (!isWhitespace(**current)) return true;
+    ++*current;
+  }
+  return false;
+}
+
+
+static bool isDigit(int x, int radix) {
+  return (x >= '0' && x <= '9' && x < '0' + radix)
+      || (radix > 10 && x >= 'a' && x < 'a' + radix - 10)
+      || (radix > 10 && x >= 'A' && x < 'A' + radix - 10);
+}
+
+
+static double SignedZero(bool sign) {
+  return sign ? -0.0 : 0.0;
+}
+
+
+// Returns true if 'c' is a decimal digit that is valid for the given radix.
+//
+// The function is small and could be inlined, but VS2012 emitted a warning
+// because it constant-propagated the radix and concluded that the last
+// condition was always true. By moving it into a separate function the
+// compiler wouldn't warn anymore.
+#if _MSC_VER
+#pragma optimize("",off)
+static bool IsDecimalDigitForRadix(int c, int radix) {
+  return '0' <= c && c <= '9' && (c - '0') < radix;
+}
+#pragma optimize("",on)
+#else
+static bool inline IsDecimalDigitForRadix(int c, int radix) {
+	return '0' <= c && c <= '9' && (c - '0') < radix;
+}
+#endif
+// Returns true if 'c' is a character digit that is valid for the given radix.
+// The 'a_character' should be 'a' or 'A'.
+//
+// The function is small and could be inlined, but VS2012 emitted a warning
+// because it constant-propagated the radix and concluded that the first
+// condition was always false. By moving it into a separate function the
+// compiler wouldn't warn anymore.
+static bool IsCharacterDigitForRadix(int c, int radix, char a_character) {
+  return radix > 10 && c >= a_character && c < a_character + radix - 10;
+}
+
+
+// Parsing integers with radix 2, 4, 8, 16, 32. Assumes current != end.
+template <int radix_log_2, class Iterator>
+static double RadixStringToIeee(Iterator* current,
+                                Iterator end,
+                                bool sign,
+                                bool allow_trailing_junk,
+                                double junk_string_value,
+                                bool read_as_double,
+                                bool* result_is_junk) {
+  ASSERT(*current != end);
+
+  const int kDoubleSize = Double::kSignificandSize;
+  const int kSingleSize = Single::kSignificandSize;
+  const int kSignificandSize = read_as_double? kDoubleSize: kSingleSize;
+
+  *result_is_junk = true;
+
+  // Skip leading 0s.
+  while (**current == '0') {
+    ++(*current);
+    if (*current == end) {
+      *result_is_junk = false;
+      return SignedZero(sign);
+    }
+  }
+
+  int64_t number = 0;
+  int exponent = 0;
+  const int radix = (1 << radix_log_2);
+
+  do {
+    int digit;
+    if (IsDecimalDigitForRadix(**current, radix)) {
+      digit = static_cast<char>(**current) - '0';
+    } else if (IsCharacterDigitForRadix(**current, radix, 'a')) {
+      digit = static_cast<char>(**current) - 'a' + 10;
+    } else if (IsCharacterDigitForRadix(**current, radix, 'A')) {
+      digit = static_cast<char>(**current) - 'A' + 10;
+    } else {
+      if (allow_trailing_junk || !AdvanceToNonspace(current, end)) {
+        break;
+      } else {
+        return junk_string_value;
+      }
+    }
+
+    number = number * radix + digit;
+    int overflow = static_cast<int>(number >> kSignificandSize);
+    if (overflow != 0) {
+      // Overflow occurred. Need to determine which direction to round the
+      // result.
+      int overflow_bits_count = 1;
+      while (overflow > 1) {
+        overflow_bits_count++;
+        overflow >>= 1;
+      }
+
+      int dropped_bits_mask = ((1 << overflow_bits_count) - 1);
+      int dropped_bits = static_cast<int>(number) & dropped_bits_mask;
+      number >>= overflow_bits_count;
+      exponent = overflow_bits_count;
+
+      bool zero_tail = true;
+      for (;;) {
+        ++(*current);
+        if (*current == end || !isDigit(**current, radix)) break;
+        zero_tail = zero_tail && **current == '0';
+        exponent += radix_log_2;
+      }
+
+      if (!allow_trailing_junk && AdvanceToNonspace(current, end)) {
+        return junk_string_value;
+      }
+
+      int middle_value = (1 << (overflow_bits_count - 1));
+      if (dropped_bits > middle_value) {
+        number++;  // Rounding up.
+      } else if (dropped_bits == middle_value) {
+        // Rounding to even to consistency with decimals: half-way case rounds
+        // up if significant part is odd and down otherwise.
+        if ((number & 1) != 0 || !zero_tail) {
+          number++;  // Rounding up.
+        }
+      }
+
+      // Rounding up may cause overflow.
+      if ((number & ((int64_t)1 << kSignificandSize)) != 0) {
+        exponent++;
+        number >>= 1;
+      }
+      break;
+    }
+    ++(*current);
+  } while (*current != end);
+
+  ASSERT(number < ((int64_t)1 << kSignificandSize));
+  ASSERT(static_cast<int64_t>(static_cast<double>(number)) == number);
+
+  *result_is_junk = false;
+
+  if (exponent == 0) {
+    if (sign) {
+      if (number == 0) return -0.0;
+      number = -number;
+    }
+    return static_cast<double>(number);
+  }
+
+  ASSERT(number != 0);
+  return Double(DiyFp(number, exponent)).value();
+}
+
+
+template <class Iterator>
+double StringToDoubleConverter::StringToIeee(
+    Iterator input,
+    int length,
+    bool read_as_double,
+    int* processed_characters_count) const {
+  Iterator current = input;
+  Iterator end = input + length;
+
+  *processed_characters_count = 0;
+
+  const bool allow_trailing_junk = (flags_ & ALLOW_TRAILING_JUNK) != 0;
+  const bool allow_leading_spaces = (flags_ & ALLOW_LEADING_SPACES) != 0;
+  const bool allow_trailing_spaces = (flags_ & ALLOW_TRAILING_SPACES) != 0;
+  const bool allow_spaces_after_sign = (flags_ & ALLOW_SPACES_AFTER_SIGN) != 0;
+
+  // To make sure that iterator dereferencing is valid the following
+  // convention is used:
+  // 1. Each '++current' statement is followed by check for equality to 'end'.
+  // 2. If AdvanceToNonspace returned false then current == end.
+  // 3. If 'current' becomes equal to 'end' the function returns or goes to
+  // 'parsing_done'.
+  // 4. 'current' is not dereferenced after the 'parsing_done' label.
+  // 5. Code before 'parsing_done' may rely on 'current != end'.
+  if (current == end) return empty_string_value_;
+
+  if (allow_leading_spaces || allow_trailing_spaces) {
+    if (!AdvanceToNonspace(&current, end)) {
+      *processed_characters_count = static_cast<int>(current - input);
+      return empty_string_value_;
+    }
+    if (!allow_leading_spaces && (input != current)) {
+      // No leading spaces allowed, but AdvanceToNonspace moved forward.
+      return junk_string_value_;
+    }
+  }
+
+  // The longest form of simplified number is: "-<significant digits>.1eXXX\0".
+  const int kBufferSize = kMaxSignificantDigits + 10;
+  char buffer[kBufferSize];  // NOLINT: size is known at compile time.
+  int buffer_pos = 0;
+
+  // Exponent will be adjusted if insignificant digits of the integer part
+  // or insignificant leading zeros of the fractional part are dropped.
+  int exponent = 0;
+  int significant_digits = 0;
+  int insignificant_digits = 0;
+  bool nonzero_digit_dropped = false;
+
+  bool sign = false;
+
+  if (*current == '+' || *current == '-') {
+    sign = (*current == '-');
+    ++current;
+    Iterator next_non_space = current;
+    // Skip following spaces (if allowed).
+    if (!AdvanceToNonspace(&next_non_space, end)) return junk_string_value_;
+    if (!allow_spaces_after_sign && (current != next_non_space)) {
+      return junk_string_value_;
+    }
+    current = next_non_space;
+  }
+
+  if (infinity_symbol_ != NULL) {
+    if (*current == infinity_symbol_[0]) {
+      if (!ConsumeSubString(&current, end, infinity_symbol_)) {
+        return junk_string_value_;
+      }
+
+      if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
+        return junk_string_value_;
+      }
+      if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
+        return junk_string_value_;
+      }
+
+      ASSERT(buffer_pos == 0);
+      *processed_characters_count = static_cast<int>(current - input);
+      return sign ? -Double::Infinity() : Double::Infinity();
+    }
+  }
+
+  if (nan_symbol_ != NULL) {
+    if (*current == nan_symbol_[0]) {
+      if (!ConsumeSubString(&current, end, nan_symbol_)) {
+        return junk_string_value_;
+      }
+
+      if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
+        return junk_string_value_;
+      }
+      if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
+        return junk_string_value_;
+      }
+
+      ASSERT(buffer_pos == 0);
+      *processed_characters_count = static_cast<int>(current - input);
+      return sign ? -Double::NaN() : Double::NaN();
+    }
+  }
+
+  bool leading_zero = false;
+  if (*current == '0') {
+    ++current;
+    if (current == end) {
+      *processed_characters_count = static_cast<int>(current - input);
+      return SignedZero(sign);
+    }
+
+    leading_zero = true;
+
+    // It could be hexadecimal value.
+    if ((flags_ & ALLOW_HEX) && (*current == 'x' || *current == 'X')) {
+      ++current;
+      if (current == end || !isDigit(*current, 16)) {
+        return junk_string_value_;  // "0x".
+      }
+
+      bool result_is_junk;
+      double result = RadixStringToIeee<4>(&current,
+                                           end,
+                                           sign,
+                                           allow_trailing_junk,
+                                           junk_string_value_,
+                                           read_as_double,
+                                           &result_is_junk);
+      if (!result_is_junk) {
+        if (allow_trailing_spaces) AdvanceToNonspace(&current, end);
+        *processed_characters_count = static_cast<int>(current - input);
+      }
+      return result;
+    }
+
+    // Ignore leading zeros in the integer part.
+    while (*current == '0') {
+      ++current;
+      if (current == end) {
+        *processed_characters_count = static_cast<int>(current - input);
+        return SignedZero(sign);
+      }
+    }
+  }
+
+  bool octal = leading_zero && (flags_ & ALLOW_OCTALS) != 0;
+
+  // Copy significant digits of the integer part (if any) to the buffer.
+  while (*current >= '0' && *current <= '9') {
+    if (significant_digits < kMaxSignificantDigits) {
+      ASSERT(buffer_pos < kBufferSize);
+      buffer[buffer_pos++] = static_cast<char>(*current);
+      significant_digits++;
+      // Will later check if it's an octal in the buffer.
+    } else {
+      insignificant_digits++;  // Move the digit into the exponential part.
+      nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
+    }
+    octal = octal && *current < '8';
+    ++current;
+    if (current == end) goto parsing_done;
+  }
+
+  if (significant_digits == 0) {
+    octal = false;
+  }
+
+  if (*current == '.') {
+    if (octal && !allow_trailing_junk) return junk_string_value_;
+    if (octal) goto parsing_done;
+
+    ++current;
+    if (current == end) {
+      if (significant_digits == 0 && !leading_zero) {
+        return junk_string_value_;
+      } else {
+        goto parsing_done;
+      }
+    }
+
+    if (significant_digits == 0) {
+      // octal = false;
+      // Integer part consists of 0 or is absent. Significant digits start after
+      // leading zeros (if any).
+      while (*current == '0') {
+        ++current;
+        if (current == end) {
+          *processed_characters_count = static_cast<int>(current - input);
+          return SignedZero(sign);
+        }
+        exponent--;  // Move this 0 into the exponent.
+      }
+    }
+
+    // There is a fractional part.
+    // We don't emit a '.', but adjust the exponent instead.
+    while (*current >= '0' && *current <= '9') {
+      if (significant_digits < kMaxSignificantDigits) {
+        ASSERT(buffer_pos < kBufferSize);
+        buffer[buffer_pos++] = static_cast<char>(*current);
+        significant_digits++;
+        exponent--;
+      } else {
+        // Ignore insignificant digits in the fractional part.
+        nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
+      }
+      ++current;
+      if (current == end) goto parsing_done;
+    }
+  }
+
+  if (!leading_zero && exponent == 0 && significant_digits == 0) {
+    // If leading_zeros is true then the string contains zeros.
+    // If exponent < 0 then string was [+-]\.0*...
+    // If significant_digits != 0 the string is not equal to 0.
+    // Otherwise there are no digits in the string.
+    return junk_string_value_;
+  }
+
+  // Parse exponential part.
+  if (*current == 'e' || *current == 'E') {
+    if (octal && !allow_trailing_junk) return junk_string_value_;
+    if (octal) goto parsing_done;
+    ++current;
+    if (current == end) {
+      if (allow_trailing_junk) {
+        goto parsing_done;
+      } else {
+        return junk_string_value_;
+      }
+    }
+    char exponen_sign = '+';
+    if (*current == '+' || *current == '-') {
+      exponen_sign = static_cast<char>(*current);
+      ++current;
+      if (current == end) {
+        if (allow_trailing_junk) {
+          goto parsing_done;
+        } else {
+          return junk_string_value_;
+        }
+      }
+    }
+
+    if (current == end || *current < '0' || *current > '9') {
+      if (allow_trailing_junk) {
+        goto parsing_done;
+      } else {
+        return junk_string_value_;
+      }
+    }
+
+    const int max_exponent = INT_MAX / 2;
+    ASSERT(-max_exponent / 2 <= exponent && exponent <= max_exponent / 2);
+    int num = 0;
+    do {
+      // Check overflow.
+      int digit = *current - '0';
+      if (num >= max_exponent / 10
+          && !(num == max_exponent / 10 && digit <= max_exponent % 10)) {
+        num = max_exponent;
+      } else {
+        num = num * 10 + digit;
+      }
+      ++current;
+    } while (current != end && *current >= '0' && *current <= '9');
+
+    exponent += (exponen_sign == '-' ? -num : num);
+  }
+
+  if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
+    return junk_string_value_;
+  }
+  if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
+    return junk_string_value_;
+  }
+  if (allow_trailing_spaces) {
+    AdvanceToNonspace(&current, end);
+  }
+
+  parsing_done:
+  exponent += insignificant_digits;
+
+  if (octal) {
+    double result;
+    bool result_is_junk;
+    char* start = buffer;
+    result = RadixStringToIeee<3>(&start,
+                                  buffer + buffer_pos,
+                                  sign,
+                                  allow_trailing_junk,
+                                  junk_string_value_,
+                                  read_as_double,
+                                  &result_is_junk);
+    ASSERT(!result_is_junk);
+    *processed_characters_count = static_cast<int>(current - input);
+    return result;
+  }
+
+  if (nonzero_digit_dropped) {
+    buffer[buffer_pos++] = '1';
+    exponent--;
+  }
+
+  ASSERT(buffer_pos < kBufferSize);
+  buffer[buffer_pos] = '\0';
+
+  double converted;
+  if (read_as_double) {
+    converted = Strtod(Vector<const char>(buffer, buffer_pos), exponent);
+  } else {
+    converted = Strtof(Vector<const char>(buffer, buffer_pos), exponent);
+  }
+  *processed_characters_count = static_cast<int>(current - input);
+  return sign? -converted: converted;
+}
+
+
+double StringToDoubleConverter::StringToDouble(
+    const char* buffer,
+    int length,
+    int* processed_characters_count) const {
+  return StringToIeee(buffer, length, true, processed_characters_count);
+}
+
+
+double StringToDoubleConverter::StringToDouble(
+    const uc16* buffer,
+    int length,
+    int* processed_characters_count) const {
+  return StringToIeee(buffer, length, true, processed_characters_count);
+}
+
+
+float StringToDoubleConverter::StringToFloat(
+    const char* buffer,
+    int length,
+    int* processed_characters_count) const {
+  return static_cast<float>(StringToIeee(buffer, length, false,
+                                         processed_characters_count));
+}
+
+
+float StringToDoubleConverter::StringToFloat(
+    const uc16* buffer,
+    int length,
+    int* processed_characters_count) const {
+  return static_cast<float>(StringToIeee(buffer, length, false,
+                                         processed_characters_count));
+}
+#endif // not needed for ICU
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/double-conversion.h b/icu4c/source/i18n/double-conversion.h
new file mode 100644
index 0000000..0939412
--- /dev/null
+++ b/icu4c/source/i18n/double-conversion.h
@@ -0,0 +1,566 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// From the double-conversion library. Original license:
+//
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// ICU PATCH: ifdef around UCONFIG_NO_FORMATTING
+#include "unicode/utypes.h"
+#if !UCONFIG_NO_FORMATTING
+
+#ifndef DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_
+#define DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_
+
+// ICU PATCH: Customize header file paths for ICU.
+
+#include "double-conversion-utils.h"
+
+// ICU PATCH: Wrap in ICU namespace
+U_NAMESPACE_BEGIN
+
+namespace double_conversion {
+
+class DoubleToStringConverter {
+ public:
+#if 0 // not needed for ICU
+  // When calling ToFixed with a double > 10^kMaxFixedDigitsBeforePoint
+  // or a requested_digits parameter > kMaxFixedDigitsAfterPoint then the
+  // function returns false.
+  static const int kMaxFixedDigitsBeforePoint = 60;
+  static const int kMaxFixedDigitsAfterPoint = 60;
+
+  // When calling ToExponential with a requested_digits
+  // parameter > kMaxExponentialDigits then the function returns false.
+  static const int kMaxExponentialDigits = 120;
+
+  // When calling ToPrecision with a requested_digits
+  // parameter < kMinPrecisionDigits or requested_digits > kMaxPrecisionDigits
+  // then the function returns false.
+  static const int kMinPrecisionDigits = 1;
+  static const int kMaxPrecisionDigits = 120;
+
+  enum Flags {
+    NO_FLAGS = 0,
+    EMIT_POSITIVE_EXPONENT_SIGN = 1,
+    EMIT_TRAILING_DECIMAL_POINT = 2,
+    EMIT_TRAILING_ZERO_AFTER_POINT = 4,
+    UNIQUE_ZERO = 8
+  };
+
+  // Flags should be a bit-or combination of the possible Flags-enum.
+  //  - NO_FLAGS: no special flags.
+  //  - EMIT_POSITIVE_EXPONENT_SIGN: when the number is converted into exponent
+  //    form, emits a '+' for positive exponents. Example: 1.2e+2.
+  //  - EMIT_TRAILING_DECIMAL_POINT: when the input number is an integer and is
+  //    converted into decimal format then a trailing decimal point is appended.
+  //    Example: 2345.0 is converted to "2345.".
+  //  - EMIT_TRAILING_ZERO_AFTER_POINT: in addition to a trailing decimal point
+  //    emits a trailing '0'-character. This flag requires the
+  //    EXMIT_TRAILING_DECIMAL_POINT flag.
+  //    Example: 2345.0 is converted to "2345.0".
+  //  - UNIQUE_ZERO: "-0.0" is converted to "0.0".
+  //
+  // Infinity symbol and nan_symbol provide the string representation for these
+  // special values. If the string is NULL and the special value is encountered
+  // then the conversion functions return false.
+  //
+  // The exponent_character is used in exponential representations. It is
+  // usually 'e' or 'E'.
+  //
+  // When converting to the shortest representation the converter will
+  // represent input numbers in decimal format if they are in the interval
+  // [10^decimal_in_shortest_low; 10^decimal_in_shortest_high[
+  //    (lower boundary included, greater boundary excluded).
+  // Example: with decimal_in_shortest_low = -6 and
+  //               decimal_in_shortest_high = 21:
+  //   ToShortest(0.000001)  -> "0.000001"
+  //   ToShortest(0.0000001) -> "1e-7"
+  //   ToShortest(111111111111111111111.0)  -> "111111111111111110000"
+  //   ToShortest(100000000000000000000.0)  -> "100000000000000000000"
+  //   ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21"
+  //
+  // When converting to precision mode the converter may add
+  // max_leading_padding_zeroes before returning the number in exponential
+  // format.
+  // Example with max_leading_padding_zeroes_in_precision_mode = 6.
+  //   ToPrecision(0.0000012345, 2) -> "0.0000012"
+  //   ToPrecision(0.00000012345, 2) -> "1.2e-7"
+  // Similarily the converter may add up to
+  // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid
+  // returning an exponential representation. A zero added by the
+  // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit.
+  // Examples for max_trailing_padding_zeroes_in_precision_mode = 1:
+  //   ToPrecision(230.0, 2) -> "230"
+  //   ToPrecision(230.0, 2) -> "230."  with EMIT_TRAILING_DECIMAL_POINT.
+  //   ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT.
+  DoubleToStringConverter(int flags,
+                          const char* infinity_symbol,
+                          const char* nan_symbol,
+                          char exponent_character,
+                          int decimal_in_shortest_low,
+                          int decimal_in_shortest_high,
+                          int max_leading_padding_zeroes_in_precision_mode,
+                          int max_trailing_padding_zeroes_in_precision_mode)
+      : flags_(flags),
+        infinity_symbol_(infinity_symbol),
+        nan_symbol_(nan_symbol),
+        exponent_character_(exponent_character),
+        decimal_in_shortest_low_(decimal_in_shortest_low),
+        decimal_in_shortest_high_(decimal_in_shortest_high),
+        max_leading_padding_zeroes_in_precision_mode_(
+            max_leading_padding_zeroes_in_precision_mode),
+        max_trailing_padding_zeroes_in_precision_mode_(
+            max_trailing_padding_zeroes_in_precision_mode) {
+    // When 'trailing zero after the point' is set, then 'trailing point'
+    // must be set too.
+    ASSERT(((flags & EMIT_TRAILING_DECIMAL_POINT) != 0) ||
+        !((flags & EMIT_TRAILING_ZERO_AFTER_POINT) != 0));
+  }
+
+  // Returns a converter following the EcmaScript specification.
+  static const DoubleToStringConverter& EcmaScriptConverter();
+
+  // Computes the shortest string of digits that correctly represent the input
+  // number. Depending on decimal_in_shortest_low and decimal_in_shortest_high
+  // (see constructor) it then either returns a decimal representation, or an
+  // exponential representation.
+  // Example with decimal_in_shortest_low = -6,
+  //              decimal_in_shortest_high = 21,
+  //              EMIT_POSITIVE_EXPONENT_SIGN activated, and
+  //              EMIT_TRAILING_DECIMAL_POINT deactived:
+  //   ToShortest(0.000001)  -> "0.000001"
+  //   ToShortest(0.0000001) -> "1e-7"
+  //   ToShortest(111111111111111111111.0)  -> "111111111111111110000"
+  //   ToShortest(100000000000000000000.0)  -> "100000000000000000000"
+  //   ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21"
+  //
+  // Note: the conversion may round the output if the returned string
+  // is accurate enough to uniquely identify the input-number.
+  // For example the most precise representation of the double 9e59 equals
+  // "899999999999999918767229449717619953810131273674690656206848", but
+  // the converter will return the shorter (but still correct) "9e59".
+  //
+  // Returns true if the conversion succeeds. The conversion always succeeds
+  // except when the input value is special and no infinity_symbol or
+  // nan_symbol has been given to the constructor.
+  bool ToShortest(double value, StringBuilder* result_builder) const {
+    return ToShortestIeeeNumber(value, result_builder, SHORTEST);
+  }
+
+  // Same as ToShortest, but for single-precision floats.
+  bool ToShortestSingle(float value, StringBuilder* result_builder) const {
+    return ToShortestIeeeNumber(value, result_builder, SHORTEST_SINGLE);
+  }
+
+
+  // Computes a decimal representation with a fixed number of digits after the
+  // decimal point. The last emitted digit is rounded.
+  //
+  // Examples:
+  //   ToFixed(3.12, 1) -> "3.1"
+  //   ToFixed(3.1415, 3) -> "3.142"
+  //   ToFixed(1234.56789, 4) -> "1234.5679"
+  //   ToFixed(1.23, 5) -> "1.23000"
+  //   ToFixed(0.1, 4) -> "0.1000"
+  //   ToFixed(1e30, 2) -> "1000000000000000019884624838656.00"
+  //   ToFixed(0.1, 30) -> "0.100000000000000005551115123126"
+  //   ToFixed(0.1, 17) -> "0.10000000000000001"
+  //
+  // If requested_digits equals 0, then the tail of the result depends on
+  // the EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT.
+  // Examples, for requested_digits == 0,
+  //   let EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT be
+  //    - false and false: then 123.45 -> 123
+  //                             0.678 -> 1
+  //    - true and false: then 123.45 -> 123.
+  //                            0.678 -> 1.
+  //    - true and true: then 123.45 -> 123.0
+  //                           0.678 -> 1.0
+  //
+  // Returns true if the conversion succeeds. The conversion always succeeds
+  // except for the following cases:
+  //   - the input value is special and no infinity_symbol or nan_symbol has
+  //     been provided to the constructor,
+  //   - 'value' > 10^kMaxFixedDigitsBeforePoint, or
+  //   - 'requested_digits' > kMaxFixedDigitsAfterPoint.
+  // The last two conditions imply that the result will never contain more than
+  // 1 + kMaxFixedDigitsBeforePoint + 1 + kMaxFixedDigitsAfterPoint characters
+  // (one additional character for the sign, and one for the decimal point).
+  bool ToFixed(double value,
+               int requested_digits,
+               StringBuilder* result_builder) const;
+
+  // Computes a representation in exponential format with requested_digits
+  // after the decimal point. The last emitted digit is rounded.
+  // If requested_digits equals -1, then the shortest exponential representation
+  // is computed.
+  //
+  // Examples with EMIT_POSITIVE_EXPONENT_SIGN deactivated, and
+  //               exponent_character set to 'e'.
+  //   ToExponential(3.12, 1) -> "3.1e0"
+  //   ToExponential(5.0, 3) -> "5.000e0"
+  //   ToExponential(0.001, 2) -> "1.00e-3"
+  //   ToExponential(3.1415, -1) -> "3.1415e0"
+  //   ToExponential(3.1415, 4) -> "3.1415e0"
+  //   ToExponential(3.1415, 3) -> "3.142e0"
+  //   ToExponential(123456789000000, 3) -> "1.235e14"
+  //   ToExponential(1000000000000000019884624838656.0, -1) -> "1e30"
+  //   ToExponential(1000000000000000019884624838656.0, 32) ->
+  //                     "1.00000000000000001988462483865600e30"
+  //   ToExponential(1234, 0) -> "1e3"
+  //
+  // Returns true if the conversion succeeds. The conversion always succeeds
+  // except for the following cases:
+  //   - the input value is special and no infinity_symbol or nan_symbol has
+  //     been provided to the constructor,
+  //   - 'requested_digits' > kMaxExponentialDigits.
+  // The last condition implies that the result will never contain more than
+  // kMaxExponentialDigits + 8 characters (the sign, the digit before the
+  // decimal point, the decimal point, the exponent character, the
+  // exponent's sign, and at most 3 exponent digits).
+  bool ToExponential(double value,
+                     int requested_digits,
+                     StringBuilder* result_builder) const;
+
+  // Computes 'precision' leading digits of the given 'value' and returns them
+  // either in exponential or decimal format, depending on
+  // max_{leading|trailing}_padding_zeroes_in_precision_mode (given to the
+  // constructor).
+  // The last computed digit is rounded.
+  //
+  // Example with max_leading_padding_zeroes_in_precision_mode = 6.
+  //   ToPrecision(0.0000012345, 2) -> "0.0000012"
+  //   ToPrecision(0.00000012345, 2) -> "1.2e-7"
+  // Similarily the converter may add up to
+  // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid
+  // returning an exponential representation. A zero added by the
+  // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit.
+  // Examples for max_trailing_padding_zeroes_in_precision_mode = 1:
+  //   ToPrecision(230.0, 2) -> "230"
+  //   ToPrecision(230.0, 2) -> "230."  with EMIT_TRAILING_DECIMAL_POINT.
+  //   ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT.
+  // Examples for max_trailing_padding_zeroes_in_precision_mode = 3, and no
+  //    EMIT_TRAILING_ZERO_AFTER_POINT:
+  //   ToPrecision(123450.0, 6) -> "123450"
+  //   ToPrecision(123450.0, 5) -> "123450"
+  //   ToPrecision(123450.0, 4) -> "123500"
+  //   ToPrecision(123450.0, 3) -> "123000"
+  //   ToPrecision(123450.0, 2) -> "1.2e5"
+  //
+  // Returns true if the conversion succeeds. The conversion always succeeds
+  // except for the following cases:
+  //   - the input value is special and no infinity_symbol or nan_symbol has
+  //     been provided to the constructor,
+  //   - precision < kMinPericisionDigits
+  //   - precision > kMaxPrecisionDigits
+  // The last condition implies that the result will never contain more than
+  // kMaxPrecisionDigits + 7 characters (the sign, the decimal point, the
+  // exponent character, the exponent's sign, and at most 3 exponent digits).
+  bool ToPrecision(double value,
+                   int precision,
+                   StringBuilder* result_builder) const;
+#endif // not needed for ICU
+
+  enum DtoaMode {
+    // Produce the shortest correct representation.
+    // For example the output of 0.299999999999999988897 is (the less accurate
+    // but correct) 0.3.
+    SHORTEST,
+    // Same as SHORTEST, but for single-precision floats.
+    SHORTEST_SINGLE,
+    // Produce a fixed number of digits after the decimal point.
+    // For instance fixed(0.1, 4) becomes 0.1000
+    // If the input number is big, the output will be big.
+    FIXED,
+    // Fixed number of digits (independent of the decimal point).
+    PRECISION
+  };
+
+  // The maximal number of digits that are needed to emit a double in base 10.
+  // A higher precision can be achieved by using more digits, but the shortest
+  // accurate representation of any double will never use more digits than
+  // kBase10MaximalLength.
+  // Note that DoubleToAscii null-terminates its input. So the given buffer
+  // should be at least kBase10MaximalLength + 1 characters long.
+  static const int kBase10MaximalLength = 17;
+
+  // Converts the given double 'v' to ascii. 'v' must not be NaN, +Infinity, or
+  // -Infinity. In SHORTEST_SINGLE-mode this restriction also applies to 'v'
+  // after it has been casted to a single-precision float. That is, in this
+  // mode static_cast<float>(v) must not be NaN, +Infinity or -Infinity.
+  //
+  // The result should be interpreted as buffer * 10^(point-length).
+  //
+  // The output depends on the given mode:
+  //  - SHORTEST: produce the least amount of digits for which the internal
+  //   identity requirement is still satisfied. If the digits are printed
+  //   (together with the correct exponent) then reading this number will give
+  //   'v' again. The buffer will choose the representation that is closest to
+  //   'v'. If there are two at the same distance, than the one farther away
+  //   from 0 is chosen (halfway cases - ending with 5 - are rounded up).
+  //   In this mode the 'requested_digits' parameter is ignored.
+  //  - SHORTEST_SINGLE: same as SHORTEST but with single-precision.
+  //  - FIXED: produces digits necessary to print a given number with
+  //   'requested_digits' digits after the decimal point. The produced digits
+  //   might be too short in which case the caller has to fill the remainder
+  //   with '0's.
+  //   Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2.
+  //   Halfway cases are rounded towards +/-Infinity (away from 0). The call
+  //   toFixed(0.15, 2) thus returns buffer="2", point=0.
+  //   The returned buffer may contain digits that would be truncated from the
+  //   shortest representation of the input.
+  //  - PRECISION: produces 'requested_digits' where the first digit is not '0'.
+  //   Even though the length of produced digits usually equals
+  //   'requested_digits', the function is allowed to return fewer digits, in
+  //   which case the caller has to fill the missing digits with '0's.
+  //   Halfway cases are again rounded away from 0.
+  // DoubleToAscii expects the given buffer to be big enough to hold all
+  // digits and a terminating null-character. In SHORTEST-mode it expects a
+  // buffer of at least kBase10MaximalLength + 1. In all other modes the
+  // requested_digits parameter and the padding-zeroes limit the size of the
+  // output. Don't forget the decimal point, the exponent character and the
+  // terminating null-character when computing the maximal output size.
+  // The given length is only used in debug mode to ensure the buffer is big
+  // enough.
+  // ICU PATCH: Export this as U_I18N_API for unit tests.
+  static void U_I18N_API DoubleToAscii(double v,
+                            DtoaMode mode,
+                            int requested_digits,
+                            char* buffer,
+                            int buffer_length,
+                            bool* sign,
+                            int* length,
+                            int* point);
+
+#if 0 // not needed for ICU
+ private:
+  // Implementation for ToShortest and ToShortestSingle.
+  bool ToShortestIeeeNumber(double value,
+                            StringBuilder* result_builder,
+                            DtoaMode mode) const;
+
+  // If the value is a special value (NaN or Infinity) constructs the
+  // corresponding string using the configured infinity/nan-symbol.
+  // If either of them is NULL or the value is not special then the
+  // function returns false.
+  bool HandleSpecialValues(double value, StringBuilder* result_builder) const;
+  // Constructs an exponential representation (i.e. 1.234e56).
+  // The given exponent assumes a decimal point after the first decimal digit.
+  void CreateExponentialRepresentation(const char* decimal_digits,
+                                       int length,
+                                       int exponent,
+                                       StringBuilder* result_builder) const;
+  // Creates a decimal representation (i.e 1234.5678).
+  void CreateDecimalRepresentation(const char* decimal_digits,
+                                   int length,
+                                   int decimal_point,
+                                   int digits_after_point,
+                                   StringBuilder* result_builder) const;
+
+  const int flags_;
+  const char* const infinity_symbol_;
+  const char* const nan_symbol_;
+  const char exponent_character_;
+  const int decimal_in_shortest_low_;
+  const int decimal_in_shortest_high_;
+  const int max_leading_padding_zeroes_in_precision_mode_;
+  const int max_trailing_padding_zeroes_in_precision_mode_;
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter);
+};
+
+
+class StringToDoubleConverter {
+ public:
+  // Enumeration for allowing octals and ignoring junk when converting
+  // strings to numbers.
+  enum Flags {
+    NO_FLAGS = 0,
+    ALLOW_HEX = 1,
+    ALLOW_OCTALS = 2,
+    ALLOW_TRAILING_JUNK = 4,
+    ALLOW_LEADING_SPACES = 8,
+    ALLOW_TRAILING_SPACES = 16,
+    ALLOW_SPACES_AFTER_SIGN = 32
+  };
+
+  // Flags should be a bit-or combination of the possible Flags-enum.
+  //  - NO_FLAGS: no special flags.
+  //  - ALLOW_HEX: recognizes the prefix "0x". Hex numbers may only be integers.
+  //      Ex: StringToDouble("0x1234") -> 4660.0
+  //          In StringToDouble("0x1234.56") the characters ".56" are trailing
+  //          junk. The result of the call is hence dependent on
+  //          the ALLOW_TRAILING_JUNK flag and/or the junk value.
+  //      With this flag "0x" is a junk-string. Even with ALLOW_TRAILING_JUNK,
+  //      the string will not be parsed as "0" followed by junk.
+  //
+  //  - ALLOW_OCTALS: recognizes the prefix "0" for octals:
+  //      If a sequence of octal digits starts with '0', then the number is
+  //      read as octal integer. Octal numbers may only be integers.
+  //      Ex: StringToDouble("01234") -> 668.0
+  //          StringToDouble("012349") -> 12349.0  // Not a sequence of octal
+  //                                               // digits.
+  //          In StringToDouble("01234.56") the characters ".56" are trailing
+  //          junk. The result of the call is hence dependent on
+  //          the ALLOW_TRAILING_JUNK flag and/or the junk value.
+  //          In StringToDouble("01234e56") the characters "e56" are trailing
+  //          junk, too.
+  //  - ALLOW_TRAILING_JUNK: ignore trailing characters that are not part of
+  //      a double literal.
+  //  - ALLOW_LEADING_SPACES: skip over leading whitespace, including spaces,
+  //                          new-lines, and tabs.
+  //  - ALLOW_TRAILING_SPACES: ignore trailing whitespace.
+  //  - ALLOW_SPACES_AFTER_SIGN: ignore whitespace after the sign.
+  //       Ex: StringToDouble("-   123.2") -> -123.2.
+  //           StringToDouble("+   123.2") -> 123.2
+  //
+  // empty_string_value is returned when an empty string is given as input.
+  // If ALLOW_LEADING_SPACES or ALLOW_TRAILING_SPACES are set, then a string
+  // containing only spaces is converted to the 'empty_string_value', too.
+  //
+  // junk_string_value is returned when
+  //  a) ALLOW_TRAILING_JUNK is not set, and a junk character (a character not
+  //     part of a double-literal) is found.
+  //  b) ALLOW_TRAILING_JUNK is set, but the string does not start with a
+  //     double literal.
+  //
+  // infinity_symbol and nan_symbol are strings that are used to detect
+  // inputs that represent infinity and NaN. They can be null, in which case
+  // they are ignored.
+  // The conversion routine first reads any possible signs. Then it compares the
+  // following character of the input-string with the first character of
+  // the infinity, and nan-symbol. If either matches, the function assumes, that
+  // a match has been found, and expects the following input characters to match
+  // the remaining characters of the special-value symbol.
+  // This means that the following restrictions apply to special-value symbols:
+  //  - they must not start with signs ('+', or '-'),
+  //  - they must not have the same first character.
+  //  - they must not start with digits.
+  //
+  // Examples:
+  //  flags = ALLOW_HEX | ALLOW_TRAILING_JUNK,
+  //  empty_string_value = 0.0,
+  //  junk_string_value = NaN,
+  //  infinity_symbol = "infinity",
+  //  nan_symbol = "nan":
+  //    StringToDouble("0x1234") -> 4660.0.
+  //    StringToDouble("0x1234K") -> 4660.0.
+  //    StringToDouble("") -> 0.0  // empty_string_value.
+  //    StringToDouble(" ") -> NaN  // junk_string_value.
+  //    StringToDouble(" 1") -> NaN  // junk_string_value.
+  //    StringToDouble("0x") -> NaN  // junk_string_value.
+  //    StringToDouble("-123.45") -> -123.45.
+  //    StringToDouble("--123.45") -> NaN  // junk_string_value.
+  //    StringToDouble("123e45") -> 123e45.
+  //    StringToDouble("123E45") -> 123e45.
+  //    StringToDouble("123e+45") -> 123e45.
+  //    StringToDouble("123E-45") -> 123e-45.
+  //    StringToDouble("123e") -> 123.0  // trailing junk ignored.
+  //    StringToDouble("123e-") -> 123.0  // trailing junk ignored.
+  //    StringToDouble("+NaN") -> NaN  // NaN string literal.
+  //    StringToDouble("-infinity") -> -inf.  // infinity literal.
+  //    StringToDouble("Infinity") -> NaN  // junk_string_value.
+  //
+  //  flags = ALLOW_OCTAL | ALLOW_LEADING_SPACES,
+  //  empty_string_value = 0.0,
+  //  junk_string_value = NaN,
+  //  infinity_symbol = NULL,
+  //  nan_symbol = NULL:
+  //    StringToDouble("0x1234") -> NaN  // junk_string_value.
+  //    StringToDouble("01234") -> 668.0.
+  //    StringToDouble("") -> 0.0  // empty_string_value.
+  //    StringToDouble(" ") -> 0.0  // empty_string_value.
+  //    StringToDouble(" 1") -> 1.0
+  //    StringToDouble("0x") -> NaN  // junk_string_value.
+  //    StringToDouble("0123e45") -> NaN  // junk_string_value.
+  //    StringToDouble("01239E45") -> 1239e45.
+  //    StringToDouble("-infinity") -> NaN  // junk_string_value.
+  //    StringToDouble("NaN") -> NaN  // junk_string_value.
+  StringToDoubleConverter(int flags,
+                          double empty_string_value,
+                          double junk_string_value,
+                          const char* infinity_symbol,
+                          const char* nan_symbol)
+      : flags_(flags),
+        empty_string_value_(empty_string_value),
+        junk_string_value_(junk_string_value),
+        infinity_symbol_(infinity_symbol),
+        nan_symbol_(nan_symbol) {
+  }
+
+  // Performs the conversion.
+  // The output parameter 'processed_characters_count' is set to the number
+  // of characters that have been processed to read the number.
+  // Spaces than are processed with ALLOW_{LEADING|TRAILING}_SPACES are included
+  // in the 'processed_characters_count'. Trailing junk is never included.
+  double StringToDouble(const char* buffer,
+                        int length,
+                        int* processed_characters_count) const;
+
+  // Same as StringToDouble above but for 16 bit characters.
+  double StringToDouble(const uc16* buffer,
+                        int length,
+                        int* processed_characters_count) const;
+
+  // Same as StringToDouble but reads a float.
+  // Note that this is not equivalent to static_cast<float>(StringToDouble(...))
+  // due to potential double-rounding.
+  float StringToFloat(const char* buffer,
+                      int length,
+                      int* processed_characters_count) const;
+
+  // Same as StringToFloat above but for 16 bit characters.
+  float StringToFloat(const uc16* buffer,
+                      int length,
+                      int* processed_characters_count) const;
+
+ private:
+  const int flags_;
+  const double empty_string_value_;
+  const double junk_string_value_;
+  const char* const infinity_symbol_;
+  const char* const nan_symbol_;
+
+  template <class Iterator>
+  double StringToIeee(Iterator start_pointer,
+                      int length,
+                      bool read_as_double,
+                      int* processed_characters_count) const;
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter);
+#endif // not needed for ICU
+};
+
+}  // namespace double_conversion
+
+// ICU PATCH: Close ICU namespace
+U_NAMESPACE_END
+
+#endif  // DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_
+#endif // ICU PATCH: close #if !UCONFIG_NO_FORMATTING
diff --git a/icu4c/source/i18n/dtptngen.cpp b/icu4c/source/i18n/dtptngen.cpp
index 187342e..aefd704 100644
--- a/icu4c/source/i18n/dtptngen.cpp
+++ b/icu4c/source/i18n/dtptngen.cpp
@@ -261,12 +261,21 @@
     "Hour", "Minute", "Second", "*", "Timezone"
 };
 
-static const char* const CLDR_FIELD_NAME[] = {
+static const char* const CLDR_FIELD_NAME[UDATPG_FIELD_COUNT] = {
     "era", "year", "quarter", "month", "week", "weekOfMonth", "weekday",
     "dayOfYear", "weekdayOfMonth", "day", "dayperiod", // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J
     "hour", "minute", "second", "*", "zone"
 };
 
+static const char* const CLDR_FIELD_WIDTH[] = { // [UDATPG_WIDTH_COUNT]
+    "", "-short", "-narrow"
+};
+
+// TODO(ticket:13619): remove when definition uncommented in dtptngen.h.
+static const int32_t UDATPG_WIDTH_COUNT = UDATPG_NARROW + 1;
+static constexpr UDateTimePGDisplayWidth UDATPG_WIDTH_APPENDITEM = UDATPG_WIDE;
+static constexpr int32_t UDATPG_FIELD_KEY_MAX = 24; // max length of CLDR field tag (type + width)
+
 // For appendItems
 static const UChar UDATPG_ItemFormat[]= {0x7B, 0x30, 0x7D, 0x20, 0x251C, 0x7B, 0x32, 0x7D, 0x3A,
     0x20, 0x7B, 0x31, 0x7D, 0x2524, 0};  // {0} \u251C{2}: {1}\u2524
@@ -379,10 +388,11 @@
     }
     for (int32_t i=0; i< UDATPG_FIELD_COUNT; ++i ) {
         appendItemFormats[i] = other.appendItemFormats[i];
-        appendItemNames[i] = other.appendItemNames[i];
-        // NUL-terminate for the C API.
-        appendItemFormats[i].getTerminatedBuffer();
-        appendItemNames[i].getTerminatedBuffer();
+        appendItemFormats[i].getTerminatedBuffer(); // NUL-terminate for the C API.
+        for (int32_t j=0; j< UDATPG_WIDTH_COUNT; ++j ) {
+            fieldDisplayNames[i][j] = other.fieldDisplayNames[i][j];
+            fieldDisplayNames[i][j].getTerminatedBuffer(); // NUL-terminate for the C API.
+        }
     }
     UErrorCode status = U_ZERO_ERROR;
     patternMap->copyFrom(*other.patternMap, status);
@@ -399,10 +409,14 @@
     if ((pLocale==other.pLocale) && (patternMap->equals(*other.patternMap)) &&
         (dateTimeFormat==other.dateTimeFormat) && (decimal==other.decimal)) {
         for ( int32_t i=0 ; i<UDATPG_FIELD_COUNT; ++i ) {
-           if ((appendItemFormats[i] != other.appendItemFormats[i]) ||
-               (appendItemNames[i] != other.appendItemNames[i]) ) {
-               return FALSE;
-           }
+            if (appendItemFormats[i] != other.appendItemFormats[i]) {
+                return FALSE;
+            }
+            for (int32_t j=0; j< UDATPG_WIDTH_COUNT; ++j ) {
+                if (fieldDisplayNames[i][j] != other.fieldDisplayNames[i][j]) {
+                    return FALSE;
+                }
+            }
         }
         return TRUE;
     }
@@ -824,15 +838,16 @@
         ResourceTable itemsTable = value.getTable(errorCode);
         if (U_FAILURE(errorCode)) { return; }
         for (int32_t i = 0; itemsTable.getKeyAndValue(i, key, value); ++i) {
-            UDateTimePatternField field = dtpg.getAppendNameNumber(key);
+            UDateTimePGDisplayWidth width;
+            UDateTimePatternField field = dtpg.getFieldAndWidthIndices(key, &width);
             if (field == UDATPG_FIELD_COUNT) { continue; }
             ResourceTable detailsTable = value.getTable(errorCode);
             if (U_FAILURE(errorCode)) { return; }
             for (int32_t j = 0; detailsTable.getKeyAndValue(j, key, value); ++j) {
                 if (uprv_strcmp(key, "dn") != 0) { continue; }
                 const UnicodeString& valueStr = value.getUnicodeString(errorCode);
-                if (dtpg.getAppendItemName(field).isEmpty() && !valueStr.isEmpty()) {
-                    dtpg.setAppendItemName(field, valueStr);
+                if (dtpg.getFieldDisplayName(field,width).isEmpty() && !valueStr.isEmpty()) {
+                    dtpg.setFieldDisplayName(field,width,valueStr);
                 }
                 break;
             }
@@ -841,8 +856,7 @@
 
     void fillInMissing() {
         for (int32_t i = 0; i < UDATPG_FIELD_COUNT; i++) {
-            UDateTimePatternField field = (UDateTimePatternField)i;
-            UnicodeString& valueStr = dtpg.getMutableAppendItemName(field);
+            UnicodeString& valueStr = dtpg.getMutableFieldDisplayName((UDateTimePatternField)i, UDATPG_WIDE);
             if (valueStr.isEmpty()) {
                 valueStr = CAP_F;
                 U_ASSERT(i < 20);
@@ -857,6 +871,12 @@
                 // NUL-terminate for the C API.
                 valueStr.getTerminatedBuffer();
             }
+            for (int32_t j = 1; j < UDATPG_WIDTH_COUNT; j++) {
+                UnicodeString& valueStr = dtpg.getMutableFieldDisplayName((UDateTimePatternField)i, (UDateTimePGDisplayWidth)j);
+                if (valueStr.isEmpty()) {
+                    valueStr = dtpg.getFieldDisplayName((UDateTimePatternField)i, (UDateTimePGDisplayWidth)(j-1));
+                }
+            }
         }
     }
 };
@@ -969,25 +989,35 @@
 
 void
 DateTimePatternGenerator::setAppendItemName(UDateTimePatternField field, const UnicodeString& value) {
-    appendItemNames[field] = value;
-    // NUL-terminate for the C API.
-    appendItemNames[field].getTerminatedBuffer();
+    setFieldDisplayName(field, UDATPG_WIDTH_APPENDITEM, value);
 }
 
 const UnicodeString&
 DateTimePatternGenerator::getAppendItemName(UDateTimePatternField field) const {
-    return appendItemNames[field];
+    return fieldDisplayNames[field][UDATPG_WIDTH_APPENDITEM];
+}
+
+void
+DateTimePatternGenerator::setFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width, const UnicodeString& value) {
+    fieldDisplayNames[field][width] = value;
+    // NUL-terminate for the C API.
+    fieldDisplayNames[field][width].getTerminatedBuffer();
+}
+
+UnicodeString
+DateTimePatternGenerator::getFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) const {
+    return fieldDisplayNames[field][width];
 }
 
 UnicodeString&
-DateTimePatternGenerator::getMutableAppendItemName(UDateTimePatternField field) {
-    return appendItemNames[field];
+DateTimePatternGenerator::getMutableFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) {
+    return fieldDisplayNames[field][width];
 }
 
 void
 DateTimePatternGenerator::getAppendName(UDateTimePatternField field, UnicodeString& value) {
     value = SINGLE_QUOTE;
-    value += appendItemNames[field];
+    value += fieldDisplayNames[field][UDATPG_WIDTH_APPENDITEM];
     value += SINGLE_QUOTE;
 }
 
@@ -1312,9 +1342,23 @@
 }
 
 UDateTimePatternField
-DateTimePatternGenerator::getAppendNameNumber(const char* field) const {
+DateTimePatternGenerator::getFieldAndWidthIndices(const char* key, UDateTimePGDisplayWidth* widthP) const {
+    char cldrFieldKey[UDATPG_FIELD_KEY_MAX + 1];
+    uprv_strncpy(cldrFieldKey, key, UDATPG_FIELD_KEY_MAX);
+    cldrFieldKey[UDATPG_FIELD_KEY_MAX]=0; // ensure termination
+    *widthP = UDATPG_WIDE;
+    char* hyphenPtr = uprv_strchr(cldrFieldKey, '-');
+    if (hyphenPtr) {
+        for (int32_t i=UDATPG_WIDTH_COUNT-1; i>0; --i) {
+            if (uprv_strcmp(CLDR_FIELD_WIDTH[i], hyphenPtr)==0) {
+                *widthP=(UDateTimePGDisplayWidth)i;
+                break;
+            }
+        }
+        *hyphenPtr = 0; // now delete width portion of key
+    }
     for (int32_t i=0; i<UDATPG_FIELD_COUNT; ++i ) {
-        if (uprv_strcmp(CLDR_FIELD_NAME[i],field)==0) {
+        if (uprv_strcmp(CLDR_FIELD_NAME[i],cldrFieldKey)==0) {
             return (UDateTimePatternField)i;
         }
     }
diff --git a/icu4c/source/i18n/i18n.vcxproj b/icu4c/source/i18n/i18n.vcxproj
index 3dd3378..aa15d51 100644
--- a/icu4c/source/i18n/i18n.vcxproj
+++ b/icu4c/source/i18n/i18n.vcxproj
@@ -1,51 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
   <PropertyGroup Label="Globals">
     <ProjectGuid>{0178B127-6269-407D-B112-93877BB62776}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,42 +46,56 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* "i18n" project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;U_I18N_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <CompileAs>Default</CompileAs>
+    </ClCompile>
+    <ResourceCompile>
+      <AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ResourceCompile>
+    <Link>
+      <BaseAddress>0x4a900000</BaseAddress>
+    </Link>
+  </ItemDefinitionGroup>
+  <!-- Options that are common to all 'Debug' project configurations -->
+  <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+    <ClCompile>
+      <BrowseInformation>true</BrowseInformation>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <!-- Options that are common to all 'Release' project configurations -->
+  <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+    <ClCompile>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib\icuin.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_I18N_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/i18n.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin\icuin60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin\icuin61.dll</OutputFile>
+      <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib\icuin.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <BaseAddress>0x4a900000</BaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
@@ -126,43 +104,20 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib\icuind.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_I18N_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/i18n.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-      <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin\icuin60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <OutputFile>..\..\bin\icuin61d.dll</OutputFile>
+      <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib\icuind.pdb</ProgramDatabaseFile>
-      <BaseAddress>0x4a900000</BaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
@@ -171,85 +126,37 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib64\icuin.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_I18N_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/i18n.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin64\icuin60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin64\icuin61.dll</OutputFile>
+      <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib64\icuin.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <BaseAddress>0x4a900000</BaseAddress>
       <ImportLibrary>..\..\lib64\icuin.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib64\icuind.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_I18N_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/i18n.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin64\icuin60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <OutputFile>..\..\bin64\icuin61d.dll</OutputFile>
+      <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib64\icuind.pdb</ProgramDatabaseFile>
-      <BaseAddress>0x4a900000</BaseAddress>
       <ImportLibrary>..\..\lib64\icuind.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -327,6 +234,12 @@
     <ClCompile Include="decimfmt.cpp" />
     <ClCompile Include="decNumber.cpp" />
     <ClCompile Include="digitlst.cpp" />
+    <ClCompile Include="double-conversion-bignum-dtoa.cpp" />
+    <ClCompile Include="double-conversion-bignum.cpp" />
+    <ClCompile Include="double-conversion-cached-powers.cpp" />
+    <ClCompile Include="double-conversion-diy-fp.cpp" />
+    <ClCompile Include="double-conversion-fast-dtoa.cpp" />
+    <ClCompile Include="double-conversion.cpp" />
     <ClCompile Include="dtfmtsym.cpp" />
     <ClCompile Include="dtitvfmt.cpp" />
     <ClCompile Include="dtitvinf.cpp" />
@@ -413,30 +326,13 @@
     <ClCompile Include="utmscale.cpp" />
     <ClCompile Include="vtzone.cpp" />
     <ClCompile Include="vzone.cpp" />
-    <ClCompile Include="windtfmt.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>
-    </ClCompile>
-    <ClCompile Include="winnmfmt.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>
-    </ClCompile>
-    <ClCompile Include="wintzimpl.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>
-    </ClCompile>
+    <ClCompile Include="windtfmt.cpp" />
+    <ClCompile Include="winnmfmt.cpp" />
+    <ClCompile Include="wintzimpl.cpp" />
     <ClCompile Include="zonemeta.cpp" />
     <ClCompile Include="zrule.cpp" />
     <ClCompile Include="ztrans.cpp" />
-    <ClCompile Include="ucln_in.cpp">
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-    </ClCompile>
+    <ClCompile Include="ucln_in.cpp" />
     <ClCompile Include="regexcmp.cpp" />
     <ClCompile Include="regeximp.cpp" />
     <ClCompile Include="regexst.cpp" />
@@ -488,119 +384,7 @@
     <ClCompile Include="uspoof_impl.cpp" />
   </ItemGroup>
   <ItemGroup>
-    <CustomBuild Include="unicode\alphaindex.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="bocsu.h" />
-    <CustomBuild Include="unicode\coleitr.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\coll.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\search.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\sortkey.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\stsearch.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tblcoll.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucol.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="affixpatternparser.h" />
     <ClInclude Include="decimalformatpatternimpl.h" />
     <ClInclude Include="decimfmtimpl.h" />
@@ -642,548 +426,46 @@
     <ClInclude Include="tzgnames.h" />
     <ClInclude Include="tznames_impl.h" />
     <ClInclude Include="ucol_imp.h" />
-    <CustomBuild Include="unicode\ucoleitr.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\usearch.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tzfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tznames.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uitercollationiterator.h" />
-    <CustomBuild Include="unicode\region.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uregion.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="usrchimp.h" />
     <ClInclude Include="astro.h" />
-    <CustomBuild Include="unicode\basictz.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="buddhcal.h" />
-    <CustomBuild Include="unicode\calendar.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="cecal.h" />
     <ClInclude Include="chnsecal.h" />
-    <CustomBuild Include="unicode\choicfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\compactdecimalformat.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="coptccal.h" />
-    <CustomBuild Include="unicode\curramt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="currfmt.h" />
-    <CustomBuild Include="unicode\currpinf.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\currunit.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="dangical.h" />
-    <CustomBuild Include="unicode\datefmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\dcfmtsym.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="decContext.h" />
     <ClInclude Include="decfmtst.h" />
     <ClInclude Include="decimalformatpattern.h" />
-    <CustomBuild Include="unicode\decimfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="decNumber.h" />
     <ClInclude Include="decNumberLocal.h" />
     <ClInclude Include="digitlst.h" />
+    <ClInclude Include="double-conversion-bignum-dtoa.h" />
+    <ClInclude Include="double-conversion-bignum.h" />
+    <ClInclude Include="double-conversion-cached-powers.h" />
+    <ClInclude Include="double-conversion-diy-fp.h" />
+    <ClInclude Include="double-conversion-fast-dtoa.h" />
+    <ClInclude Include="double-conversion-ieee.h" />
+    <ClInclude Include="double-conversion-utils.h" />
+    <ClInclude Include="double-conversion.h" />
     <ClInclude Include="dt_impl.h" />
-    <CustomBuild Include="unicode\dtfmtsym.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="dtitv_impl.h" />
-    <CustomBuild Include="unicode\dtitvfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\dtitvinf.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\dtptngen.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="dtptngen_impl.h" />
-    <CustomBuild Include="unicode\dtrule.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ethpccal.h" />
-    <CustomBuild Include="unicode\fieldpos.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\fmtable.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uformattable.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\format.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="fphdlimp.h" />
-    <CustomBuild Include="unicode\fpositer.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\gender.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ugender.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\gregocal.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="gregoimp.h" />
     <ClInclude Include="hebrwcal.h" />
     <ClInclude Include="indiancal.h" />
     <ClInclude Include="islamcal.h" />
     <ClInclude Include="japancal.h" />
-    <CustomBuild Include="unicode\measfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\measunit.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\measure.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\msgfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="msgfmt_impl.h" />
     <ClInclude Include="nfrlist.h" />
     <ClInclude Include="nfrs.h" />
     <ClInclude Include="nfrule.h" />
     <ClInclude Include="nfsubs.h" />
-    <CustomBuild Include="unicode\numfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\numsys.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="olsontz.h" />
     <ClInclude Include="persncal.h" />
-    <CustomBuild Include="unicode\plurfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\plurrule.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="plurrule_impl.h" />
     <ClInclude Include="quantityformatter.h" />
     <ClInclude Include="sharedbreakiterator.h" />
@@ -1191,375 +473,11 @@
     <ClInclude Include="shareddateformatsymbols.h" />
     <ClInclude Include="sharednumberformat.h" />
     <ClInclude Include="sharedpluralrules.h" />
-    <CustomBuild Include="unicode\rbnf.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\rbtz.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\reldatefmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="reldtfmt.h" />
-    <CustomBuild Include="unicode\scientificnumberformatter.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\selfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\simpletz.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\smpdtfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="smpdtfst.h" />
     <ClInclude Include="standardplural.h" />
     <ClInclude Include="taiwncal.h" />
-    <CustomBuild Include="unicode\timezone.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tmunit.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tmutamt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tmutfmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tzrule.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tztrans.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucal.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\udat.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\udateintervalformat.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\udatpg.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ufieldpositer.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ulocdata.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\umsg.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="umsg_imp.h" />
-    <CustomBuild Include="unicode\unum.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unumsys.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\upluralrules.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ureldatefmt.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utmscale.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\vtzone.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="utf16collationiterator.h" />
     <ClInclude Include="utf8collationiterator.h" />
     <ClInclude Include="vzone.h" />
@@ -1570,39 +488,11 @@
     <ClInclude Include="zrule.h" />
     <ClInclude Include="ztrans.h" />
     <ClInclude Include="ucln_in.h" />
-    <CustomBuild Include="unicode\regex.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="regexcmp.h" />
     <ClInclude Include="regexcst.h" />
     <ClInclude Include="regeximp.h" />
     <ClInclude Include="regexst.h" />
     <ClInclude Include="regextxt.h" />
-    <CustomBuild Include="unicode\uregex.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="anytrans.h" />
     <ClInclude Include="brktrans.h" />
     <ClInclude Include="casetrn.h" />
@@ -1624,52 +514,10 @@
     <ClInclude Include="titletrn.h" />
     <ClInclude Include="tolowtrn.h" />
     <ClInclude Include="toupptrn.h" />
-    <CustomBuild Include="unicode\translit.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="transreg.h" />
     <ClInclude Include="tridpars.h" />
     <ClInclude Include="unesctrn.h" />
     <ClInclude Include="uni2name.h" />
-    <CustomBuild Include="unicode\unirepl.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utrans.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="csdetect.h" />
     <ClInclude Include="csmatch.h" />
     <ClInclude Include="csr2022.h" />
@@ -1679,34 +527,6 @@
     <ClInclude Include="csrucode.h" />
     <ClInclude Include="csrutf8.h" />
     <ClInclude Include="inputext.h" />
-    <CustomBuild Include="unicode\ucsdet.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uspoof.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="scriptset.h" />
     <ClInclude Include="uspoof_conf.h" />
     <ClInclude Include="uspoof_impl.h" />
@@ -1724,25 +544,13 @@
     <ClInclude Include="number_stringbuilder.h" />
     <ClInclude Include="number_types.h" />
     <ClInclude Include="number_utils.h" />
-    <CustomBuild Include="unicode\nounit.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode </Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\numberformatter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode </Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="i18n.rc" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <!-- The following import will copy all of the header files from this projects 'unicode' folder. -->
+  <Import Project="$(SolutionDir)\Windows.CopyUnicodeHeaderFiles.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/i18n/i18n.vcxproj.filters b/icu4c/source/i18n/i18n.vcxproj.filters
index 134cd21..f975913 100644
--- a/icu4c/source/i18n/i18n.vcxproj.filters
+++ b/icu4c/source/i18n/i18n.vcxproj.filters
@@ -156,6 +156,24 @@
     <ClCompile Include="digitlst.cpp">
       <Filter>formatting</Filter>
     </ClCompile>
+    <ClCompile Include="double-conversion-bignum-dtoa.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="double-conversion-bignum.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="double-conversion-cached-powers.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="double-conversion-diy-fp.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="double-conversion-fast-dtoa.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="double-conversion.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
     <ClCompile Include="dtfmtsym.cpp">
       <Filter>formatting</Filter>
     </ClCompile>
@@ -540,6 +558,60 @@
     <ClCompile Include="uregion.cpp">
       <Filter>formatting</Filter>
     </ClCompile>
+    <ClCompile Include="number_stringbuilder.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_affixutils.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_compact.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_decimalquantity.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_decimfmtprops.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_fluent.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_formatimpl.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_grouping.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_integerwidth.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_longnames.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_modifiers.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_notation.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_padding.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_patternmodifier.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_patternstring.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_rounding.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="number_scientific.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
+    <ClCompile Include="nounit.cpp">
+      <Filter>misc</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="bocsu.cpp">
@@ -707,6 +779,30 @@
     <ClInclude Include="digitlst.h">
       <Filter>formatting</Filter>
     </ClInclude>
+    <ClInclude Include="double-conversion-bignum-dtoa.h">
+      <Filter>formatting</Filter>
+    </ClInclude>
+    <ClInclude Include="double-conversion-bignum.h">
+      <Filter>formatting</Filter>
+    </ClInclude>
+    <ClInclude Include="double-conversion-cached-powers.h">
+      <Filter>formatting</Filter>
+    </ClInclude>
+    <ClInclude Include="double-conversion-diy-fp.h">
+      <Filter>formatting</Filter>
+    </ClInclude>
+    <ClInclude Include="double-conversion-fast-dtoa.h">
+      <Filter>formatting</Filter>
+    </ClInclude>
+    <ClInclude Include="double-conversion-ieee.h">
+      <Filter>formatting</Filter>
+    </ClInclude>
+    <ClInclude Include="double-conversion-utils.h">
+      <Filter>formatting</Filter>
+    </ClInclude>
+    <ClInclude Include="double-conversion.h">
+      <Filter>formatting</Filter>
+    </ClInclude>
     <ClInclude Include="dt_impl.h">
       <Filter>formatting</Filter>
     </ClInclude>
@@ -1173,12 +1269,6 @@
     <CustomBuild Include="unicode\msgfmt.h">
       <Filter>formatting</Filter>
     </CustomBuild>
-    <CustomBuild Include="unicode/nounit.h">
-      <Filter>formatting</Filter>
-    </CustomBuild>
-    <CustomBuild Include="/numberformatter.h">
-      <Filter>formatting</Filter>
-    </CustomBuild>
     <CustomBuild Include="unicode\numfmt.h">
       <Filter>formatting</Filter>
     </CustomBuild>
@@ -1317,5 +1407,11 @@
     <CustomBuild Include="unicode\uformattable.h">
       <Filter>formatting</Filter>
     </CustomBuild>
+    <CustomBuild Include="unicode\nounit.h">
+      <Filter>misc</Filter>
+    </CustomBuild>
+    <CustomBuild Include="unicode\numberformatter.h">
+      <Filter>formatting</Filter>
+    </CustomBuild>
   </ItemGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/i18n/i18n_uwp.vcxproj b/icu4c/source/i18n/i18n_uwp.vcxproj
index 7090c83..21d5032 100644
--- a/icu4c/source/i18n/i18n_uwp.vcxproj
+++ b/icu4c/source/i18n/i18n_uwp.vcxproj
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <!-- The following import will include the 'default' configuration options for VS UWP projects. -->
+  <Import Project="..\allinone\Build.Windows.UWP.ProjectConfiguration.props" />
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
       <Configuration>Debug</Configuration>
@@ -30,19 +32,12 @@
     <ProjectGuid>{6786C051-383B-47E0-9E82-B8B994E06A25}</ProjectGuid>
     <Keyword>DynamicLibrary</Keyword>
     <DefaultLanguage>en-US</DefaultLanguage>
-    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
-    <AppContainerApplication>true</AppContainerApplication>
-    <ApplicationType>Windows Store</ApplicationType>
-    <WindowsTargetPlatformVersion>10.0.10586.0</WindowsTargetPlatformVersion>
-    <WindowsTargetPlatformMinVersion>10.0.10240.0</WindowsTargetPlatformMinVersion>
-    <ApplicationTypeRevision>10.0</ApplicationTypeRevision>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -71,7 +66,6 @@
   </PropertyGroup>
   <ItemDefinitionGroup>
     <Midl>
-      <PreprocessorDefinitions>U_PLATFORM_HAS_WINUWP_API=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MkTypLibCompatible>true</MkTypLibCompatible>
       <SuppressStartupBanner>true</SuppressStartupBanner>
     </Midl>
@@ -79,7 +73,7 @@
       <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <!-- U_DISABLE_RENAMING -->
       <!-- U_HIDE_DRAFT_API & U_HIDE_DEPRECATED_API -->
-      <PreprocessorDefinitions>U_PLATFORM_HAS_WINUWP_API=1;U_ATTRIBUTE_DEPRECATED=;_CRT_SECURE_NO_DEPRECATE;U_I18N_IMPLEMENTATION;U_PLATFORM_USES_ONLY_WIN32_API=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;_CRT_SECURE_NO_DEPRECATE;U_I18N_IMPLEMENTATION;U_PLATFORM_USES_ONLY_WIN32_API=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <ExceptionHandling>
       </ExceptionHandling>
@@ -93,8 +87,7 @@
       <CompileAsWinRT>false</CompileAsWinRT>
       <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>U_PLATFORM_HAS_WINUWP_API=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    <ResourceCompile>      
       <Culture>0x0409</Culture>
       <AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
@@ -182,7 +175,7 @@
       <ProgramDataBaseFileName>.\x86\ReleaseUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin32uwp\icuin60.dll</OutputFile>
+      <OutputFile>..\..\bin32uwp\icuin61.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\lib32uwp\icuin.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\lib32uwp\icuin.lib</ImportLibrary>
       <AdditionalDependencies>..\..\lib32uwp\icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -199,7 +192,7 @@
       <ProgramDataBaseFileName>.\x86\DebugUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin32uwp\icuin60d.dll</OutputFile>
+      <OutputFile>..\..\bin32uwp\icuin61d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\lib32uwp\icuind.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\lib32uwp\icuind.lib</ImportLibrary>
       <AdditionalDependencies>..\..\lib32uwp\icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -216,7 +209,7 @@
       <ProgramDataBaseFileName>.\x64\ReleaseUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin64uwp\icuin60.dll</OutputFile>
+      <OutputFile>..\..\bin64uwp\icuin61.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\lib64uwp\icuin.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\lib64uwp\icuin.lib</ImportLibrary>
       <AdditionalDependencies>..\..\lib64uwp\icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -233,7 +226,7 @@
       <ProgramDataBaseFileName>.\x64\DebugUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin64uwp\icuin60d.dll</OutputFile>
+      <OutputFile>..\..\bin64uwp\icuin61d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\lib64uwp\icuind.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\lib64uwp\icuind.lib</ImportLibrary>
       <AdditionalDependencies>..\..\lib64uwp\icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -250,7 +243,7 @@
       <ProgramDataBaseFileName>.\ARM\ReleaseUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\binARMuwp\icuin60.dll</OutputFile>
+      <OutputFile>..\..\binARMuwp\icuin61.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\libARMuwp\icuin.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\libARMuwp\icuin.lib</ImportLibrary>
       <AdditionalDependencies>..\..\libARMuwp\icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -267,7 +260,7 @@
       <ProgramDataBaseFileName>.\ARM\DebugUWP/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\binARMuwp\icuin60d.dll</OutputFile>
+      <OutputFile>..\..\binARMuwp\icuin61d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\libARMuwp\icuind.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\libARMuwp\icuind.lib</ImportLibrary>
       <AdditionalDependencies>..\..\libARMuwp\icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -348,6 +341,12 @@
     <ClCompile Include="decimfmt.cpp" />
     <ClCompile Include="decNumber.cpp" />
     <ClCompile Include="digitlst.cpp" />
+    <ClCompile Include="double-conversion-bignum-dtoa.cpp" />
+    <ClCompile Include="double-conversion-bignum.cpp" />
+    <ClCompile Include="double-conversion-cached-powers.cpp" />
+    <ClCompile Include="double-conversion-diy-fp.cpp" />
+    <ClCompile Include="double-conversion-fast-dtoa.cpp" />
+    <ClCompile Include="double-conversion.cpp" />
     <ClCompile Include="dtfmtsym.cpp" />
     <ClCompile Include="dtitvfmt.cpp" />
     <ClCompile Include="dtitvinf.cpp" />
@@ -490,47 +489,7 @@
     <ClCompile Include="uspoof_impl.cpp" />
   </ItemGroup>
   <ItemGroup>
-    <CustomBuild Include="unicode\alphaindex.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="bocsu.h" />
-    <CustomBuild Include="unicode\coleitr.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\coll.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\search.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\sortkey.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\stsearch.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tblcoll.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucol.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="affixpatternparser.h" />
     <ClInclude Include="decimalformatpatternimpl.h" />
     <ClInclude Include="decimfmtimpl.h" />
@@ -572,221 +531,46 @@
     <ClInclude Include="tzgnames.h" />
     <ClInclude Include="tznames_impl.h" />
     <ClInclude Include="ucol_imp.h" />
-    <CustomBuild Include="unicode\ucoleitr.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\usearch.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tzfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tznames.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="uitercollationiterator.h" />
-    <CustomBuild Include="unicode\region.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uregion.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="usrchimp.h" />
     <ClInclude Include="astro.h" />
-    <CustomBuild Include="unicode\basictz.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="buddhcal.h" />
-    <CustomBuild Include="unicode\calendar.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="cecal.h" />
     <ClInclude Include="chnsecal.h" />
-    <CustomBuild Include="unicode\choicfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\compactdecimalformat.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="coptccal.h" />
-    <CustomBuild Include="unicode\curramt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="currfmt.h" />
-    <CustomBuild Include="unicode\currpinf.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\currunit.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="dangical.h" />
-    <CustomBuild Include="unicode\datefmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\dcfmtsym.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="decContext.h" />
     <ClInclude Include="decfmtst.h" />
     <ClInclude Include="decimalformatpattern.h" />
-    <CustomBuild Include="unicode\decimfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="decNumber.h" />
     <ClInclude Include="decNumberLocal.h" />
     <ClInclude Include="digitlst.h" />
+    <ClInclude Include="double-conversion-bignum-dtoa.h" />
+    <ClInclude Include="double-conversion-bignum.h" />
+    <ClInclude Include="double-conversion-cached-powers.h" />
+    <ClInclude Include="double-conversion-diy-fp.h" />
+    <ClInclude Include="double-conversion-fast-dtoa.h" />
+    <ClInclude Include="double-conversion-ieee.h" />
+    <ClInclude Include="double-conversion-utils.h" />
+    <ClInclude Include="double-conversion.h" />
     <ClInclude Include="dt_impl.h" />
-    <CustomBuild Include="unicode\dtfmtsym.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="dtitv_impl.h" />
-    <CustomBuild Include="unicode\dtitvfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\dtitvinf.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\dtptngen.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="dtptngen_impl.h" />
-    <CustomBuild Include="unicode\dtrule.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="ethpccal.h" />
-    <CustomBuild Include="unicode\fieldpos.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\fmtable.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uformattable.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\format.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="fphdlimp.h" />
-    <CustomBuild Include="unicode\fpositer.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\gender.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ugender.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\gregocal.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="gregoimp.h" />
     <ClInclude Include="hebrwcal.h" />
     <ClInclude Include="indiancal.h" />
     <ClInclude Include="islamcal.h" />
     <ClInclude Include="japancal.h" />
-    <CustomBuild Include="unicode\measfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\measunit.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\measure.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\msgfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="msgfmt_impl.h" />
     <ClInclude Include="nfrlist.h" />
     <ClInclude Include="nfrs.h" />
     <ClInclude Include="nfrule.h" />
     <ClInclude Include="nfsubs.h" />
-    <CustomBuild Include="unicode\numfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\numsys.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="olsontz.h" />
     <ClInclude Include="persncal.h" />
-    <CustomBuild Include="unicode\plurfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\plurrule.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="plurrule_impl.h" />
     <ClInclude Include="quantityformatter.h" />
     <ClInclude Include="sharedbreakiterator.h" />
@@ -794,141 +578,11 @@
     <ClInclude Include="shareddateformatsymbols.h" />
     <ClInclude Include="sharednumberformat.h" />
     <ClInclude Include="sharedpluralrules.h" />
-    <CustomBuild Include="unicode\rbnf.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\rbtz.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\reldatefmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="reldtfmt.h" />
-    <CustomBuild Include="unicode\scientificnumberformatter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\selfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\simpletz.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\smpdtfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="smpdtfst.h" />
     <ClInclude Include="standardplural.h" />
     <ClInclude Include="taiwncal.h" />
-    <CustomBuild Include="unicode\timezone.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tmunit.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tmutamt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tmutfmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tzrule.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\tztrans.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ucal.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\udat.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\udateintervalformat.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\udatpg.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ufieldpositer.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ulocdata.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\umsg.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="umsg_imp.h" />
-    <CustomBuild Include="unicode\unum.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\unumsys.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\upluralrules.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ureldatefmt.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utmscale.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\vtzone.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="utf16collationiterator.h" />
     <ClInclude Include="utf8collationiterator.h" />
     <ClInclude Include="vzone.h" />
@@ -939,21 +593,11 @@
     <ClInclude Include="zrule.h" />
     <ClInclude Include="ztrans.h" />
     <ClInclude Include="ucln_in.h" />
-    <CustomBuild Include="unicode\regex.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="regexcmp.h" />
     <ClInclude Include="regexcst.h" />
     <ClInclude Include="regeximp.h" />
     <ClInclude Include="regexst.h" />
     <ClInclude Include="regextxt.h" />
-    <CustomBuild Include="unicode\uregex.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="anytrans.h" />
     <ClInclude Include="brktrans.h" />
     <ClInclude Include="casetrn.h" />
@@ -975,25 +619,10 @@
     <ClInclude Include="titletrn.h" />
     <ClInclude Include="tolowtrn.h" />
     <ClInclude Include="toupptrn.h" />
-    <CustomBuild Include="unicode\translit.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="transreg.h" />
     <ClInclude Include="tridpars.h" />
     <ClInclude Include="unesctrn.h" />
     <ClInclude Include="uni2name.h" />
-    <CustomBuild Include="unicode\unirepl.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\utrans.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="csdetect.h" />
     <ClInclude Include="csmatch.h" />
     <ClInclude Include="csr2022.h" />
@@ -1003,16 +632,6 @@
     <ClInclude Include="csrucode.h" />
     <ClInclude Include="csrutf8.h" />
     <ClInclude Include="inputext.h" />
-    <CustomBuild Include="unicode\ucsdet.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\uspoof.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
     <ClInclude Include="scriptset.h" />
     <ClInclude Include="uspoof_conf.h" />
     <ClInclude Include="uspoof_impl.h" />
@@ -1030,24 +649,10 @@
     <ClInclude Include="number_stringbuilder.h" />
     <ClInclude Include="number_types.h" />
     <ClInclude Include="number_utils.h" />
-    <CustomBuild Include="unicode\nounit.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode </Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\numberformatter.h">
-      <Command>copy "%(FullPath)" ..\..\include\unicode </Command>
-      <Outputs>..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="i18n.rc" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\common\common_uwp.vcxproj">
-      <Project>{C10CF34B-3F79-430E-AD38-5A32DC0589C2}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
diff --git a/icu4c/source/i18n/islamcal.cpp b/icu4c/source/i18n/islamcal.cpp
index 4fd0e07..b84bedf 100644
--- a/icu4c/source/i18n/islamcal.cpp
+++ b/icu4c/source/i18n/islamcal.cpp
@@ -614,7 +614,7 @@
             days = julianDay - ASTRONOMICAL_EPOC;
         }
         // Use the civil calendar approximation, which is just arithmetic
-        year  = (int)ClockMath::floorDivide( (double)(30 * days + 10646) , 10631.0 );
+        year  = (int32_t)ClockMath::floorDivide(30 * (int64_t)days + 10646, (int64_t)10631);
         month = (int32_t)uprv_ceil((days - 29 - yearStart(year)) / 29.5 );
         month = month<11?month:11;
         startDate = monthStart(year, month);
diff --git a/icu4c/source/i18n/measfmt.cpp b/icu4c/source/i18n/measfmt.cpp
index 2ef5329..5970262 100644
--- a/icu4c/source/i18n/measfmt.cpp
+++ b/icu4c/source/i18n/measfmt.cpp
@@ -764,10 +764,11 @@
     if (U_FAILURE(status)) {
         return appendTo;
     }
-    MeasureUnit *resolvedUnit =
-            MeasureUnit::resolveUnitPerUnit(measure.getUnit(), perUnit);
-    if (resolvedUnit != NULL) {
-        Measure newMeasure(measure.getNumber(), resolvedUnit, status);
+    bool isResolved = false;
+    MeasureUnit resolvedUnit =
+        MeasureUnit::resolveUnitPerUnit(measure.getUnit(), perUnit, &isResolved);
+    if (isResolved) {
+        Measure newMeasure(measure.getNumber(), new MeasureUnit(resolvedUnit), status);
         return formatMeasure(
                 newMeasure, **numberFormat, appendTo, pos, status);
     }
@@ -1061,9 +1062,13 @@
     }
 
     // Format time. draft becomes something like '5:30:45'
+    // #13606: DateFormat is not thread-safe, but MeasureFormat advertises itself as thread-safe.
     FieldPosition smallestFieldPosition(smallestField);
     UnicodeString draft;
+    static UMutex dateFmtMutex = U_MUTEX_INITIALIZER;
+    umtx_lock(&dateFmtMutex);
     dateFmt.format(date, draft, smallestFieldPosition, status);
+    umtx_unlock(&dateFmtMutex);
 
     // If we find field for smallest amount replace it with the formatted
     // smallest amount from above taking care to replace the integer part
diff --git a/icu4c/source/i18n/measunit.cpp b/icu4c/source/i18n/measunit.cpp
index e9e1417..4322134 100644
--- a/icu4c/source/i18n/measunit.cpp
+++ b/icu4c/source/i18n/measunit.cpp
@@ -1211,8 +1211,8 @@
     return gIndexes[t] + st - gOffsets[t];
 }
 
-MeasureUnit *MeasureUnit::resolveUnitPerUnit(
-        const MeasureUnit &unit, const MeasureUnit &perUnit) {
+MeasureUnit MeasureUnit::resolveUnitPerUnit(
+        const MeasureUnit &unit, const MeasureUnit &perUnit, bool* isResolved) {
     int32_t unitOffset = unit.getOffset();
     int32_t perUnitOffset = perUnit.getOffset();
 
@@ -1233,10 +1233,13 @@
         } else {
             // We found a resolution for our unit / per-unit combo
             // return it.
-            return new MeasureUnit(midRow[2], midRow[3]);
+            *isResolved = true;
+            return MeasureUnit(midRow[2], midRow[3]);
         }
     }
-    return NULL;
+
+    *isResolved = false;
+    return MeasureUnit();
 }
 
 MeasureUnit *MeasureUnit::create(int typeId, int subTypeId, UErrorCode &status) {
diff --git a/icu4c/source/i18n/nfrs.cpp b/icu4c/source/i18n/nfrs.cpp
index 769fad3..e7b17b4 100644
--- a/icu4c/source/i18n/nfrs.cpp
+++ b/icu4c/source/i18n/nfrs.cpp
@@ -681,7 +681,7 @@
 #endif
 
 UBool
-NFRuleSet::parse(const UnicodeString& text, ParsePosition& pos, double upperBound, Formattable& result) const
+NFRuleSet::parse(const UnicodeString& text, ParsePosition& pos, double upperBound, uint32_t nonNumericalExecutedRuleMask, Formattable& result) const
 {
     // try matching each rule in the rule set against the text being
     // parsed.  Whichever one matches the most characters is the one
@@ -707,9 +707,12 @@
 #endif
     // Try each of the negative rules, fraction rules, infinity rules and NaN rules
     for (int i = 0; i < NON_NUMERICAL_RULE_LENGTH; i++) {
-        if (nonNumericalRules[i]) {
+        if (nonNumericalRules[i] && ((nonNumericalExecutedRuleMask >> i) & 1) == 0) {
+            // Mark this rule as being executed so that we don't try to execute it again.
+            nonNumericalExecutedRuleMask |= 1 << i;
+
             Formattable tempResult;
-            UBool success = nonNumericalRules[i]->doParse(text, workingPos, 0, upperBound, tempResult);
+            UBool success = nonNumericalRules[i]->doParse(text, workingPos, 0, upperBound, nonNumericalExecutedRuleMask, tempResult);
             if (success && (workingPos.getIndex() > highWaterMark.getIndex())) {
                 result = tempResult;
                 highWaterMark = workingPos;
@@ -748,7 +751,7 @@
                 continue;
             }
             Formattable tempResult;
-            UBool success = rules[i]->doParse(text, workingPos, fIsFractionRuleSet, upperBound, tempResult);
+            UBool success = rules[i]->doParse(text, workingPos, fIsFractionRuleSet, upperBound, nonNumericalExecutedRuleMask, tempResult);
             if (success && workingPos.getIndex() > highWaterMark.getIndex()) {
                 result = tempResult;
                 highWaterMark = workingPos;
diff --git a/icu4c/source/i18n/nfrs.h b/icu4c/source/i18n/nfrs.h
index 1e39b28..db03c90 100644
--- a/icu4c/source/i18n/nfrs.h
+++ b/icu4c/source/i18n/nfrs.h
@@ -55,7 +55,7 @@
     void  format(int64_t number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const;
     void  format(double number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const;
 
-    UBool parse(const UnicodeString& text, ParsePosition& pos, double upperBound, Formattable& result) const;
+    UBool parse(const UnicodeString& text, ParsePosition& pos, double upperBound, uint32_t nonNumericalExecutedRuleMask, Formattable& result) const;
 
     void appendRules(UnicodeString& result) const; // toString
 
diff --git a/icu4c/source/i18n/nfrule.cpp b/icu4c/source/i18n/nfrule.cpp
index f24be11..c75ecf0 100644
--- a/icu4c/source/i18n/nfrule.cpp
+++ b/icu4c/source/i18n/nfrule.cpp
@@ -900,6 +900,7 @@
                 ParsePosition& parsePosition,
                 UBool isFractionRule,
                 double upperBound,
+                uint32_t nonNumericalExecutedRuleMask,
                 Formattable& resVal) const
 {
     // internally we operate on a copy of the string being parsed
@@ -1002,6 +1003,7 @@
         temp.setTo(ruleText, sub1Pos, sub2Pos - sub1Pos);
         double partialResult = matchToDelimiter(workText, start, tempBaseValue,
             temp, pp, sub1,
+            nonNumericalExecutedRuleMask,
             upperBound);
 
         // if we got a successful match (or were trying to match a
@@ -1022,6 +1024,7 @@
             temp.setTo(ruleText, sub2Pos, ruleText.length() - sub2Pos);
             partialResult = matchToDelimiter(workText2, 0, partialResult,
                 temp, pp2, sub2,
+                nonNumericalExecutedRuleMask,
                 upperBound);
 
             // if we got a successful match on this second
@@ -1158,6 +1161,7 @@
                          const UnicodeString& delimiter,
                          ParsePosition& pp,
                          const NFSubstitution* sub,
+                         uint32_t nonNumericalExecutedRuleMask,
                          double upperBound) const
 {
 	UErrorCode status = U_ZERO_ERROR;
@@ -1191,6 +1195,7 @@
 #else
                     formatter->isLenient(),
 #endif
+                    nonNumericalExecutedRuleMask,
                     result);
 
                 // if the substitution could match all the text up to
@@ -1244,6 +1249,7 @@
 #else
             formatter->isLenient(),
 #endif
+            nonNumericalExecutedRuleMask,
             result);
         if (success && (tempPP.getIndex() != 0)) {
             // if there's a successful match (or it's a null
diff --git a/icu4c/source/i18n/nfrule.h b/icu4c/source/i18n/nfrule.h
index 809119c..698b75b 100644
--- a/icu4c/source/i18n/nfrule.h
+++ b/icu4c/source/i18n/nfrule.h
@@ -74,6 +74,7 @@
                   ParsePosition& pos, 
                   UBool isFractional, 
                   double upperBound,
+                  uint32_t nonNumericalExecutedRuleMask,
                   Formattable& result) const;
 
     UBool shouldRollBack(int64_t number) const;
@@ -94,6 +95,7 @@
     int32_t indexOfAnyRulePrefix() const;
     double matchToDelimiter(const UnicodeString& text, int32_t startPos, double baseValue,
                             const UnicodeString& delimiter, ParsePosition& pp, const NFSubstitution* sub, 
+                            uint32_t nonNumericalExecutedRuleMask,
                             double upperBound) const;
     void stripPrefix(UnicodeString& text, const UnicodeString& prefix, ParsePosition& pp) const;
 
diff --git a/icu4c/source/i18n/nfsubs.cpp b/icu4c/source/i18n/nfsubs.cpp
index b5da982..4c17aa2 100644
--- a/icu4c/source/i18n/nfsubs.cpp
+++ b/icu4c/source/i18n/nfsubs.cpp
@@ -155,6 +155,7 @@
         double baseValue,
         double upperBound,
         UBool lenientParse,
+        uint32_t nonNumericalExecutedRuleMask,
         Formattable& result) const;
 
     virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const {
@@ -221,6 +222,7 @@
         double baseValue,
         double upperBound,
         UBool lenientParse,
+        uint32_t nonNumericalExecutedRuleMask,
         Formattable& result) const;
 
     virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue + oldRuleValue; }
@@ -292,6 +294,7 @@
         double baseValue,
         double upperBound,
         UBool /*lenientParse*/,
+        uint32_t nonNumericalExecutedRuleMask,
         Formattable& result) const;
 
     virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue / oldRuleValue; }
@@ -689,6 +692,7 @@
                         double baseValue,
                         double upperBound,
                         UBool lenientParse,
+                        uint32_t nonNumericalExecutedRuleMask,
                         Formattable& result) const
 {
 #ifdef RBNF_DEBUG
@@ -709,7 +713,7 @@
     // on), then also try parsing the text using a default-
     // constructed NumberFormat
     if (ruleSet != NULL) {
-        ruleSet->parse(text, parsePosition, upperBound, result);
+        ruleSet->parse(text, parsePosition, upperBound, nonNumericalExecutedRuleMask, result);
         if (lenientParse && !ruleSet->isFractionRuleSet() && parsePosition.getIndex() == 0) {
             UErrorCode status = U_ZERO_ERROR;
             NumberFormat* fmt = NumberFormat::createInstance(status);
@@ -931,18 +935,19 @@
                              double baseValue,
                              double upperBound,
                              UBool lenientParse,
+                             uint32_t nonNumericalExecutedRuleMask,
                              Formattable& result) const
 {
     // if this isn't a >>> substitution, we can just use the
     // inherited parse() routine to do the parsing
     if (ruleToUse == NULL) {
-        return NFSubstitution::doParse(text, parsePosition, baseValue, upperBound, lenientParse, result);
+        return NFSubstitution::doParse(text, parsePosition, baseValue, upperBound, lenientParse, nonNumericalExecutedRuleMask, result);
 
         // but if it IS a >>> substitution, we have to do it here: we
         // use the specific rule's doParse() method, and then we have to
         // do some of the other work of NFRuleSet.parse()
     } else {
-        ruleToUse->doParse(text, parsePosition, FALSE, upperBound, result);
+        ruleToUse->doParse(text, parsePosition, FALSE, upperBound, nonNumericalExecutedRuleMask, result);
 
         if (parsePosition.getIndex() != 0) {
             UErrorCode status = U_ZERO_ERROR;
@@ -1118,12 +1123,13 @@
                 double baseValue,
                 double /*upperBound*/,
                 UBool lenientParse,
+                uint32_t nonNumericalExecutedRuleMask,
                 Formattable& resVal) const
 {
     // if we're not in byDigits mode, we can just use the inherited
     // doParse()
     if (!byDigits) {
-        return NFSubstitution::doParse(text, parsePosition, baseValue, 0, lenientParse, resVal);
+        return NFSubstitution::doParse(text, parsePosition, baseValue, 0, lenientParse, nonNumericalExecutedRuleMask, resVal);
 
         // if we ARE in byDigits mode, parse the text one digit at a time
         // using this substitution's owning rule set (we do this by setting
@@ -1141,7 +1147,7 @@
         while (workText.length() > 0 && workPos.getIndex() != 0) {
             workPos.setIndex(0);
             Formattable temp;
-            getRuleSet()->parse(workText, workPos, 10, temp);
+            getRuleSet()->parse(workText, workPos, 10, nonNumericalExecutedRuleMask, temp);
             UErrorCode status = U_ZERO_ERROR;
             digit = temp.getLong(status);
 //            digit = temp.getType() == Formattable::kLong ?
@@ -1249,6 +1255,7 @@
                                double baseValue,
                                double upperBound,
                                UBool /*lenientParse*/,
+                               uint32_t nonNumericalExecutedRuleMask,
                                Formattable& result) const
 {
     // we don't have to do anything special to do the parsing here,
@@ -1267,7 +1274,7 @@
 
         while (workText.length() > 0 && workPos.getIndex() != 0) {
             workPos.setIndex(0);
-            getRuleSet()->parse(workText, workPos, 1, temp); // parse zero or nothing at all
+            getRuleSet()->parse(workText, workPos, 1, nonNumericalExecutedRuleMask, temp); // parse zero or nothing at all
             if (workPos.getIndex() == 0) {
                 // we failed, either there were no more zeros, or the number was formatted with digits
                 // either way, we're done
@@ -1289,7 +1296,7 @@
     }
 
     // we've parsed off the zeros, now let's parse the rest from our current position
-    NFSubstitution::doParse(workText, parsePosition, withZeros ? 1 : baseValue, upperBound, FALSE, result);
+    NFSubstitution::doParse(workText, parsePosition, withZeros ? 1 : baseValue, upperBound, FALSE, nonNumericalExecutedRuleMask, result);
 
     if (withZeros) {
         // any base value will do in this case.  is there a way to
diff --git a/icu4c/source/i18n/nfsubs.h b/icu4c/source/i18n/nfsubs.h
index e8b2591..948627c 100644
--- a/icu4c/source/i18n/nfsubs.h
+++ b/icu4c/source/i18n/nfsubs.h
@@ -191,6 +191,7 @@
         double baseValue,
         double upperBound, 
         UBool lenientParse,
+        uint32_t nonNumericalExecutedRuleMask,
         Formattable& result) const;
     
     /**
diff --git a/icu4c/source/i18n/number_affixutils.cpp b/icu4c/source/i18n/number_affixutils.cpp
index 4dfdbc7..df4b267 100644
--- a/icu4c/source/i18n/number_affixutils.cpp
+++ b/icu4c/source/i18n/number_affixutils.cpp
@@ -70,6 +70,7 @@
         case STATE_FIRST_QUOTE:
         case STATE_INSIDE_QUOTE:
             status = U_ILLEGAL_ARGUMENT_ERROR;
+            break;
         default:
             break;
     }
diff --git a/icu4c/source/i18n/number_compact.cpp b/icu4c/source/i18n/number_compact.cpp
index 8ceee13..cc0d8fd 100644
--- a/icu4c/source/i18n/number_compact.cpp
+++ b/icu4c/source/i18n/number_compact.cpp
@@ -262,7 +262,6 @@
         buildReference.setPatternInfo(&patternInfo);
         info.mod = buildReference.createImmutable(status);
         if (U_FAILURE(status)) { return; }
-        info.numDigits = patternInfo.positive.integerTotal;
         info.patternString = patternString;
     }
 }
@@ -286,7 +285,6 @@
 
     StandardPlural::Form plural = quantity.getStandardPlural(rules);
     const UChar *patternString = data.getPattern(magnitude, plural);
-    int numDigits = -1;
     if (patternString == nullptr) {
         // Use the default (non-compact) modifier.
         // No need to take any action.
@@ -299,7 +297,6 @@
             const CompactModInfo &info = precomputedMods[i];
             if (u_strcmp(patternString, info.patternString) == 0) {
                 info.mod->applyToMicros(micros, quantity);
-                numDigits = info.numDigits;
                 break;
             }
         }
@@ -313,12 +310,8 @@
         PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status);
         static_cast<MutablePatternModifier*>(const_cast<Modifier*>(micros.modMiddle))
             ->setPatternInfo(&patternInfo);
-        numDigits = patternInfo.positive.integerTotal;
     }
 
-    // FIXME: Deal with numDigits == 0 (Awaiting a test case)
-    (void)numDigits;
-
     // We already performed rounding. Do not perform it again.
     micros.rounding = Rounder::constructPassThrough();
 }
diff --git a/icu4c/source/i18n/number_compact.h b/icu4c/source/i18n/number_compact.h
index 2344abf..f7adf36 100644
--- a/icu4c/source/i18n/number_compact.h
+++ b/icu4c/source/i18n/number_compact.h
@@ -52,7 +52,6 @@
 struct CompactModInfo {
     const ImmutablePatternModifier *mod;
     const UChar* patternString;
-    int32_t numDigits;
 };
 
 class CompactHandler : public MicroPropsGenerator, public UMemory {
diff --git a/icu4c/source/i18n/number_decimalquantity.cpp b/icu4c/source/i18n/number_decimalquantity.cpp
index 7246357..b68df26 100644
--- a/icu4c/source/i18n/number_decimalquantity.cpp
+++ b/icu4c/source/i18n/number_decimalquantity.cpp
@@ -14,12 +14,15 @@
 #include "decContext.h"
 #include "decNumber.h"
 #include "number_roundingutils.h"
+#include "double-conversion.h"
 #include "unicode/plurrule.h"
 
 using namespace icu;
 using namespace icu::number;
 using namespace icu::number::impl;
 
+using icu::double_conversion::DoubleToStringConverter;
+
 namespace {
 
 int8_t NEGATIVE_FLAG = 1;
@@ -265,6 +268,10 @@
     return (flags & NEGATIVE_FLAG) != 0;
 }
 
+int8_t DecimalQuantity::signum() const {
+    return isNegative() ? -1 : isZero() ? 0 : 1;
+}
+
 bool DecimalQuantity::isInfinite() const {
     return (flags & INFINITY_FLAG) != 0;
 }
@@ -392,31 +399,27 @@
 }
 
 void DecimalQuantity::convertToAccurateDouble() {
-    double n = origDouble;
-    U_ASSERT(n != 0);
+    U_ASSERT(origDouble != 0);
     int32_t delta = origDelta;
+
+    // Call the slow oracle function (Double.toString in Java, DoubleToAscii in C++).
+    char buffer[DoubleToStringConverter::kBase10MaximalLength + 1];
+    bool sign; // unused; always positive
+    int32_t length;
+    int32_t point;
+    DoubleToStringConverter::DoubleToAscii(
+        origDouble,
+        DoubleToStringConverter::DtoaMode::SHORTEST,
+        0,
+        buffer,
+        sizeof(buffer),
+        &sign,
+        &length,
+        &point
+    );
+
     setBcdToZero();
-
-    // Call the slow oracle function (Double.toString in Java, sprintf in C++).
-    // The <float.h> constant DBL_DIG defines a platform-specific number of digits in a double.
-    // However, this tends to be too low (see #11318). Instead, we always use 14 decimal places.
-    static constexpr size_t CAP = 1 + 14 + 8; // Extra space for '+', '.', e+NNN, and '\0'
-    char dstr[CAP];
-    snprintf(dstr, CAP, "%+1.14e", n);
-
-    // uprv_decNumberFromString() will parse the string expecting '.' as a
-    // decimal separator, however sprintf() can use ',' in certain locales.
-    // Overwrite a ',' with '.' here before proceeding.
-    char *decimalSeparator = strchr(dstr, ',');
-    if (decimalSeparator != nullptr) {
-        *decimalSeparator = '.';
-    }
-
-    StringPiece sp(dstr);
-    DecNumberWithStorage dn;
-    stringToDecNumber(dstr, dn);
-    _setToDecNumber(dn.getAlias());
-
+    readDoubleConversionToBcd(buffer, length, point);
     scale += delta;
     explicitExactDouble = true;
 }
@@ -833,6 +836,26 @@
     precision = dn->digits;
 }
 
+void DecimalQuantity::readDoubleConversionToBcd(
+        const char* buffer, int32_t length, int32_t point) {
+    // NOTE: Despite the fact that double-conversion's API is called
+    // "DoubleToAscii", they actually use '0' (as opposed to u8'0').
+    if (length > 16) {
+        ensureCapacity(length);
+        for (int32_t i = 0; i < length; i++) {
+            fBCD.bcdBytes.ptr[i] = buffer[length-i-1] - '0';
+        }
+    } else {
+        uint64_t result = 0L;
+        for (int32_t i = 0; i < length; i++) {
+            result |= static_cast<uint64_t>(buffer[length-i-1] - '0') << (4 * i);
+        }
+        fBCD.bcdLong = result;
+    }
+    scale = point - length;
+    precision = length;
+}
+
 void DecimalQuantity::compact() {
     if (usingBytes) {
         int32_t delta = 0;
diff --git a/icu4c/source/i18n/number_decimalquantity.h b/icu4c/source/i18n/number_decimalquantity.h
index ccb8326..4309c3c 100644
--- a/icu4c/source/i18n/number_decimalquantity.h
+++ b/icu4c/source/i18n/number_decimalquantity.h
@@ -115,6 +115,9 @@
     /** @return Whether the value represented by this {@link DecimalQuantity} is less than zero. */
     bool isNegative() const;
 
+    /** @return -1 if the value is negative; 1 if positive; or 0 if zero. */
+    int8_t signum() const;
+
     /** @return Whether the value represented by this {@link DecimalQuantity} is infinite. */
     bool isInfinite() const U_OVERRIDE;
 
@@ -395,6 +398,8 @@
 
     void readDecNumberToBcd(decNumber *dn);
 
+    void readDoubleConversionToBcd(const char* buffer, int32_t length, int32_t point);
+
     void copyBcdFrom(const DecimalQuantity &other);
 
     /**
diff --git a/icu4c/source/i18n/number_decimfmtprops.h b/icu4c/source/i18n/number_decimfmtprops.h
index 3e25966..96356ca 100644
--- a/icu4c/source/i18n/number_decimfmtprops.h
+++ b/icu4c/source/i18n/number_decimfmtprops.h
@@ -19,8 +19,8 @@
 
 // Export an explicit template instantiation of the LocalPointer that is used as a
 // data member of CurrencyPluralInfoWrapper.
-// (MSVC requires this, even though it should not be necessary.)
-#if defined (_MSC_VER)
+// (When building DLLs for Windows this is required.)
+#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
 // Ignore warning 4661 as LocalPointerBase does not use operator== or operator!=
 #pragma warning(suppress: 4661)
 template class U_I18N_API LocalPointerBase<CurrencyPluralInfo>;
diff --git a/icu4c/source/i18n/number_fluent.cpp b/icu4c/source/i18n/number_fluent.cpp
index 76c3a7c..2711310 100644
--- a/icu4c/source/i18n/number_fluent.cpp
+++ b/icu4c/source/i18n/number_fluent.cpp
@@ -33,12 +33,13 @@
 }
 
 template<typename Derived>
-Derived NumberFormatterSettings<Derived>::adoptUnit(const icu::MeasureUnit *unit) const {
+Derived NumberFormatterSettings<Derived>::adoptUnit(icu::MeasureUnit *unit) const {
     Derived copy(*this);
     // Just copy the unit into the MacroProps by value, and delete it since we have ownership.
     // NOTE: Slicing occurs here. However, CurrencyUnit can be restored from MeasureUnit.
     // TimeUnit may be affected, but TimeUnit is not as relevant to number formatting.
     if (unit != nullptr) {
+      // TODO: On nullptr, reset to default value?
         copy.fMacros.unit = *unit;
         delete unit;
     }
@@ -46,6 +47,26 @@
 }
 
 template<typename Derived>
+Derived NumberFormatterSettings<Derived>::perUnit(const icu::MeasureUnit &perUnit) const {
+    Derived copy(*this);
+    // See comments above about slicing.
+    copy.fMacros.perUnit = perUnit;
+    return copy;
+}
+
+template<typename Derived>
+Derived NumberFormatterSettings<Derived>::adoptPerUnit(icu::MeasureUnit *perUnit) const {
+    Derived copy(*this);
+    // See comments above about slicing and ownership.
+    if (perUnit != nullptr) {
+      // TODO: On nullptr, reset to default value?
+        copy.fMacros.perUnit = *perUnit;
+        delete perUnit;
+    }
+    return copy;
+}
+
+template<typename Derived>
 Derived NumberFormatterSettings<Derived>::rounding(const Rounder &rounder) const {
     Derived copy(*this);
     // NOTE: Slicing is OK.
@@ -54,9 +75,11 @@
 }
 
 template<typename Derived>
-Derived NumberFormatterSettings<Derived>::grouping(const Grouper &grouper) const {
+Derived NumberFormatterSettings<Derived>::grouping(const UGroupingStrategy &strategy) const {
     Derived copy(*this);
-    copy.fMacros.grouper = grouper;
+    // NOTE: This is slightly different than how the setting is stored in Java
+    // because we want to put it on the stack.
+    copy.fMacros.grouper = Grouper::forStrategy(strategy);
     return copy;
 }
 
@@ -75,7 +98,7 @@
 }
 
 template<typename Derived>
-Derived NumberFormatterSettings<Derived>::adoptSymbols(const NumberingSystem *ns) const {
+Derived NumberFormatterSettings<Derived>::adoptSymbols(NumberingSystem *ns) const {
     Derived copy(*this);
     copy.fMacros.symbols.setTo(ns);
     return copy;
diff --git a/icu4c/source/i18n/number_formatimpl.cpp b/icu4c/source/i18n/number_formatimpl.cpp
index 9986ce6..bc96cb1 100644
--- a/icu4c/source/i18n/number_formatimpl.cpp
+++ b/icu4c/source/i18n/number_formatimpl.cpp
@@ -17,6 +17,8 @@
 #include "unicode/dcfmtsym.h"
 #include "number_scientific.h"
 #include "number_compact.h"
+#include "uresimp.h"
+#include "ureslocs.h"
 
 using namespace icu;
 using namespace icu::number;
@@ -88,6 +90,37 @@
     return pattern;
 }
 
+struct CurrencyFormatInfoResult {
+    bool exists;
+    const char16_t* pattern;
+    const char16_t* decimalSeparator;
+    const char16_t* groupingSeparator;
+};
+CurrencyFormatInfoResult getCurrencyFormatInfo(const Locale& locale, const char* isoCode, UErrorCode& status) {
+    // TODO: Load this data in a centralized location like ICU4J?
+    // TODO: Parts of this same data are loaded in dcfmtsym.cpp; should clean up.
+    CurrencyFormatInfoResult result = { false, nullptr, nullptr, nullptr };
+    if (U_FAILURE(status)) return result;
+    CharString key;
+    key.append("Currencies/", status);
+    key.append(isoCode, status);
+    UErrorCode localStatus = status;
+    LocalUResourceBundlePointer bundle(ures_open(U_ICUDATA_CURR, locale.getName(), &localStatus));
+    ures_getByKeyWithFallback(bundle.getAlias(), key.data(), bundle.getAlias(), &localStatus);
+    if (U_SUCCESS(localStatus) && ures_getSize(bundle.getAlias())>2) { // the length is 3 if more data is present
+        ures_getByIndex(bundle.getAlias(), 2, bundle.getAlias(), &localStatus);
+        int32_t dummy;
+        result.exists = true;
+        result.pattern = ures_getStringByIndex(bundle.getAlias(), 0, &dummy, &localStatus);
+        result.decimalSeparator = ures_getStringByIndex(bundle.getAlias(), 1, &dummy, &localStatus);
+        result.groupingSeparator = ures_getStringByIndex(bundle.getAlias(), 2, &dummy, &localStatus);
+        status = localStatus;
+    } else if (localStatus != U_MISSING_RESOURCE_ERROR) {
+        status = localStatus;
+    }
+    return result;
+}
+
 inline bool unitIsCurrency(const MeasureUnit &unit) {
     return uprv_strcmp("currency", unit.getType()) == 0;
 }
@@ -161,8 +194,9 @@
     bool isPercent = isNoUnit && unitIsPercent(macros.unit);
     bool isPermille = isNoUnit && unitIsPermille(macros.unit);
     bool isCldrUnit = !isCurrency && !isNoUnit;
-    bool isAccounting =
-            macros.sign == UNUM_SIGN_ACCOUNTING || macros.sign == UNUM_SIGN_ACCOUNTING_ALWAYS;
+    bool isAccounting = macros.sign == UNUM_SIGN_ACCOUNTING
+            || macros.sign == UNUM_SIGN_ACCOUNTING_ALWAYS
+            || macros.sign == UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO;
     CurrencyUnit currency(kDefaultCurrency, status);
     if (isCurrency) {
         currency = CurrencyUnit(macros.unit, status); // Restore CurrencyUnit from MeasureUnit
@@ -185,29 +219,7 @@
     }
     const char *nsName = U_SUCCESS(status) ? ns->getName() : "latn";
 
-    // Load and parse the pattern string.  It is used for grouping sizes and affixes only.
-    CldrPatternStyle patternStyle;
-    if (isPercent || isPermille) {
-        patternStyle = CLDR_PATTERN_STYLE_PERCENT;
-    } else if (!isCurrency || unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) {
-        patternStyle = CLDR_PATTERN_STYLE_DECIMAL;
-    } else if (isAccounting) {
-        // NOTE: Although ACCOUNTING and ACCOUNTING_ALWAYS are only supported in currencies right now,
-        // the API contract allows us to add support to other units in the future.
-        patternStyle = CLDR_PATTERN_STYLE_ACCOUNTING;
-    } else {
-        patternStyle = CLDR_PATTERN_STYLE_CURRENCY;
-    }
-    const char16_t *pattern = getPatternForStyle(macros.locale, nsName, patternStyle, status);
-    auto patternInfo = new ParsedPatternInfo();
-    fPatternInfo.adoptInstead(patternInfo);
-    PatternParser::parseToPatternInfo(UnicodeString(pattern), *patternInfo, status);
-
-    /////////////////////////////////////////////////////////////////////////////////////
-    /// START POPULATING THE DEFAULT MICROPROPS AND BUILDING THE MICROPROPS GENERATOR ///
-    /////////////////////////////////////////////////////////////////////////////////////
-
-    // Symbols
+    // Resolve the symbols. Do this here because currency may need to customize them.
     if (macros.symbols.isDecimalFormatSymbols()) {
         fMicros.symbols = macros.symbols.getDecimalFormatSymbols();
     } else {
@@ -216,6 +228,50 @@
         fSymbols.adoptInstead(fMicros.symbols);
     }
 
+    // Load and parse the pattern string. It is used for grouping sizes and affixes only.
+    // If we are formatting currency, check for a currency-specific pattern.
+    const char16_t* pattern = nullptr;
+    if (isCurrency) {
+        CurrencyFormatInfoResult info = getCurrencyFormatInfo(macros.locale, currency.getSubtype(), status);
+        if (info.exists) {
+            pattern = info.pattern;
+            // It's clunky to clone an object here, but this code is not frequently executed.
+            DecimalFormatSymbols* symbols = new DecimalFormatSymbols(*fMicros.symbols);
+            fMicros.symbols = symbols;
+            fSymbols.adoptInstead(symbols);
+            symbols->setSymbol(
+                DecimalFormatSymbols::ENumberFormatSymbol::kMonetarySeparatorSymbol,
+                UnicodeString(info.decimalSeparator),
+                FALSE);
+            symbols->setSymbol(
+                DecimalFormatSymbols::ENumberFormatSymbol::kMonetaryGroupingSeparatorSymbol,
+                UnicodeString(info.groupingSeparator),
+                FALSE);
+        }
+    }
+    if (pattern == nullptr) {
+        CldrPatternStyle patternStyle;
+        if (isPercent || isPermille) {
+            patternStyle = CLDR_PATTERN_STYLE_PERCENT;
+        } else if (!isCurrency || unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) {
+            patternStyle = CLDR_PATTERN_STYLE_DECIMAL;
+        } else if (isAccounting) {
+            // NOTE: Although ACCOUNTING and ACCOUNTING_ALWAYS are only supported in currencies right now,
+            // the API contract allows us to add support to other units in the future.
+            patternStyle = CLDR_PATTERN_STYLE_ACCOUNTING;
+        } else {
+            patternStyle = CLDR_PATTERN_STYLE_CURRENCY;
+        }
+        pattern = getPatternForStyle(macros.locale, nsName, patternStyle, status);
+    }
+    auto patternInfo = new ParsedPatternInfo();
+    fPatternInfo.adoptInstead(patternInfo);
+    PatternParser::parseToPatternInfo(UnicodeString(pattern), *patternInfo, status);
+
+    /////////////////////////////////////////////////////////////////////////////////////
+    /// START POPULATING THE DEFAULT MICROPROPS AND BUILDING THE MICROPROPS GENERATOR ///
+    /////////////////////////////////////////////////////////////////////////////////////
+
     // Rounding strategy
     if (!macros.rounder.isBogus()) {
         fMicros.rounding = macros.rounder;
@@ -233,11 +289,11 @@
         fMicros.grouping = macros.grouper;
     } else if (macros.notation.fType == Notation::NTN_COMPACT) {
         // Compact notation uses minGrouping by default since ICU 59
-        fMicros.grouping = Grouper::minTwoDigits();
+        fMicros.grouping = Grouper::forStrategy(UNUM_GROUPING_MIN2);
     } else {
-        fMicros.grouping = Grouper::defaults();
+        fMicros.grouping = Grouper::forStrategy(UNUM_GROUPING_AUTO);
     }
-    fMicros.grouping.setLocaleData(*fPatternInfo);
+    fMicros.grouping.setLocaleData(*fPatternInfo, macros.locale);
 
     // Padding strategy
     if (!macros.padder.isBogus()) {
@@ -308,6 +364,7 @@
                         LongNameHandler::forMeasureUnit(
                                 macros.locale,
                                 macros.unit,
+                                macros.perUnit,
                                 unitWidth,
                                 resolvePluralRules(macros.rules, macros.locale, status),
                                 chain,
diff --git a/icu4c/source/i18n/number_grouping.cpp b/icu4c/source/i18n/number_grouping.cpp
index 1536282..a2b1bbd 100644
--- a/icu4c/source/i18n/number_grouping.cpp
+++ b/icu4c/source/i18n/number_grouping.cpp
@@ -7,36 +7,70 @@
 
 #include "unicode/numberformatter.h"
 #include "number_patternstring.h"
+#include "uresimp.h"
 
 using namespace icu;
 using namespace icu::number;
 using namespace icu::number::impl;
 
-Grouper Grouper::defaults() {
-    return {-2, -2, false};
+namespace {
+
+int16_t getMinGroupingForLocale(const Locale& locale) {
+    // TODO: Cache this?
+    UErrorCode localStatus = U_ZERO_ERROR;
+    LocalUResourceBundlePointer bundle(ures_open(NULL, locale.getName(), &localStatus));
+    int32_t resultLen = 0;
+    const char16_t* result = ures_getStringByKeyWithFallback(
+        bundle.getAlias(),
+        "NumberElements/minimumGroupingDigits",
+        &resultLen,
+        &localStatus);
+    // TODO: Is it safe to assume resultLen == 1? Would locales set minGrouping >= 10?
+    if (U_FAILURE(localStatus) || resultLen != 1) {
+        return 1;
+    }
+    return result[0] - u'0';
 }
 
-Grouper Grouper::minTwoDigits() {
-    return {-2, -2, true};
 }
 
-Grouper Grouper::none() {
-    return {-1, -1, false};
+Grouper Grouper::forStrategy(UGroupingStrategy grouping) {
+    switch (grouping) {
+    case UNUM_GROUPING_OFF:
+        return {-1, -1, -2};
+    case UNUM_GROUPING_AUTO:
+        return {-2, -2, -2};
+    case UNUM_GROUPING_MIN2:
+        return {-2, -2, -3};
+    case UNUM_GROUPING_ON_ALIGNED:
+        return {-4, -4, 1};
+    case UNUM_GROUPING_THOUSANDS:
+        return {3, 3, 1};
+    default:
+        U_ASSERT(FALSE);
+    }
 }
 
-void Grouper::setLocaleData(const impl::ParsedPatternInfo &patternInfo) {
-    if (fGrouping1 != -2) {
+void Grouper::setLocaleData(const impl::ParsedPatternInfo &patternInfo, const Locale& locale) {
+    if (fGrouping1 != -2 && fGrouping2 != -4) {
         return;
     }
-    auto grouping1 = static_cast<int8_t> (patternInfo.positive.groupingSizes & 0xffff);
-    auto grouping2 = static_cast<int8_t> ((patternInfo.positive.groupingSizes >> 16) & 0xffff);
-    auto grouping3 = static_cast<int8_t> ((patternInfo.positive.groupingSizes >> 32) & 0xffff);
+    auto grouping1 = static_cast<int16_t> (patternInfo.positive.groupingSizes & 0xffff);
+    auto grouping2 = static_cast<int16_t> ((patternInfo.positive.groupingSizes >> 16) & 0xffff);
+    auto grouping3 = static_cast<int16_t> ((patternInfo.positive.groupingSizes >> 32) & 0xffff);
     if (grouping2 == -1) {
-        grouping1 = -1;
+        grouping1 = fGrouping1 == -4 ? (short) 3 : (short) -1;
     }
     if (grouping3 == -1) {
         grouping2 = grouping1;
     }
+    if (fMinGrouping == -2) {
+        fMinGrouping = getMinGroupingForLocale(locale);
+    } else if (fMinGrouping == -3) {
+        fMinGrouping = uprv_max(2, getMinGroupingForLocale(locale));
+    } else {
+        // leave fMinGrouping alone
+    }
     fGrouping1 = grouping1;
     fGrouping2 = grouping2;
 }
@@ -49,7 +83,7 @@
     }
     position -= fGrouping1;
     return position >= 0 && (position % fGrouping2) == 0
-           && value.getUpperDisplayMagnitude() - fGrouping1 + 1 >= (fMin2 ? 2 : 1);
+           && value.getUpperDisplayMagnitude() - fGrouping1 + 1 >= fMinGrouping;
 }
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/i18n/number_integerwidth.cpp b/icu4c/source/i18n/number_integerwidth.cpp
index 10dacfc..4a61227 100644
--- a/icu4c/source/i18n/number_integerwidth.cpp
+++ b/icu4c/source/i18n/number_integerwidth.cpp
@@ -13,25 +13,28 @@
 using namespace icu::number;
 using namespace icu::number::impl;
 
-IntegerWidth::IntegerWidth(int8_t minInt, int8_t maxInt) {
+IntegerWidth::IntegerWidth(digits_t minInt, digits_t maxInt) {
     fUnion.minMaxInt.fMinInt = minInt;
     fUnion.minMaxInt.fMaxInt = maxInt;
 }
 
 IntegerWidth IntegerWidth::zeroFillTo(int32_t minInt) {
     if (minInt >= 0 && minInt <= kMaxIntFracSig) {
-        return {static_cast<int8_t>(minInt), -1};
+        return {static_cast<digits_t>(minInt), -1};
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
 IntegerWidth IntegerWidth::truncateAt(int32_t maxInt) {
     if (fHasError) { return *this; }  // No-op on error
-    if (maxInt >= 0 && maxInt <= kMaxIntFracSig) {
-        return {fUnion.minMaxInt.fMinInt, static_cast<int8_t>(maxInt)};
+    digits_t minInt = fUnion.minMaxInt.fMinInt;
+    if (maxInt >= 0 && maxInt <= kMaxIntFracSig && minInt <= maxInt) {
+        return {minInt, static_cast<digits_t>(maxInt)};
+    } else if (maxInt == -1) {
+        return {minInt, -1};
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
diff --git a/icu4c/source/i18n/number_longnames.cpp b/icu4c/source/i18n/number_longnames.cpp
index 88b3413..5c36344 100644
--- a/icu4c/source/i18n/number_longnames.cpp
+++ b/icu4c/source/i18n/number_longnames.cpp
@@ -5,6 +5,7 @@
 
 #if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT
 
+#include "unicode/simpleformatter.h"
 #include "unicode/ures.h"
 #include "ureslocs.h"
 #include "charstr.h"
@@ -19,6 +20,37 @@
 
 namespace {
 
+constexpr int32_t DNAM_INDEX = StandardPlural::Form::COUNT;
+constexpr int32_t PER_INDEX = StandardPlural::Form::COUNT + 1;
+constexpr int32_t ARRAY_LENGTH = StandardPlural::Form::COUNT + 2;
+
+static int32_t getIndex(const char* pluralKeyword, UErrorCode& status) {
+    // pluralKeyword can also be "dnam" or "per"
+    if (uprv_strcmp(pluralKeyword, "dnam") == 0) {
+        return DNAM_INDEX;
+    } else if (uprv_strcmp(pluralKeyword, "per") == 0) {
+        return PER_INDEX;
+    } else {
+        StandardPlural::Form plural = StandardPlural::fromString(pluralKeyword, status);
+        return plural;
+    }
+}
+
+static UnicodeString getWithPlural(
+        const UnicodeString* strings,
+        int32_t plural,
+        UErrorCode& status) {
+    UnicodeString result = strings[plural];
+    if (result.isBogus()) {
+        result = strings[StandardPlural::Form::OTHER];
+    }
+    if (result.isBogus()) {
+        // There should always be data in the "other" plural variant.
+        status = U_INTERNAL_PROGRAM_ERROR;
+    }
+    return result;
+}
+
 
 //////////////////////////
 /// BEGIN DATA LOADING ///
@@ -28,7 +60,7 @@
   public:
     explicit PluralTableSink(UnicodeString *outArray) : outArray(outArray) {
         // Initialize the array to bogus strings.
-        for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) {
+        for (int32_t i = 0; i < ARRAY_LENGTH; i++) {
             outArray[i].setToBogus();
         }
     }
@@ -36,17 +68,13 @@
     void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) U_OVERRIDE {
         ResourceTable pluralsTable = value.getTable(status);
         if (U_FAILURE(status)) { return; }
-        for (int i = 0; pluralsTable.getKeyAndValue(i, key, value); ++i) {
-            // In MeasureUnit data, ignore dnam and per units for now.
-            if (uprv_strcmp(key, "dnam") == 0 || uprv_strcmp(key, "per") == 0) {
-                continue;
-            }
-            StandardPlural::Form plural = StandardPlural::fromString(key, status);
+        for (int32_t i = 0; pluralsTable.getKeyAndValue(i, key, value); ++i) {
+            int32_t index = getIndex(key, status);
             if (U_FAILURE(status)) { return; }
-            if (!outArray[plural].isBogus()) {
+            if (!outArray[index].isBogus()) {
                 continue;
             }
-            outArray[plural] = value.getUnicodeString(status);
+            outArray[index] = value.getUnicodeString(status);
             if (U_FAILURE(status)) { return; }
         }
     }
@@ -105,6 +133,22 @@
     }
 }
 
+UnicodeString getPerUnitFormat(const Locale& locale, const UNumberUnitWidth &width, UErrorCode& status) {
+    LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_UNIT, locale.getName(), &status));
+    if (U_FAILURE(status)) { return {}; }
+    CharString key;
+    key.append("units", status);
+    if (width == UNUM_UNIT_WIDTH_NARROW) {
+        key.append("Narrow", status);
+    } else if (width == UNUM_UNIT_WIDTH_SHORT) {
+        key.append("Short", status);
+    }
+    key.append("/compound/per", status);
+    int32_t len = 0;
+    const UChar* ptr = ures_getStringByKeyWithFallback(unitsBundle.getAlias(), key.data(), &len, &status);
+    return UnicodeString(ptr, len);
+}
+
 ////////////////////////
 /// END DATA LOADING ///
 ////////////////////////
@@ -112,11 +156,24 @@
 } // namespace
 
 LongNameHandler
-LongNameHandler::forMeasureUnit(const Locale &loc, const MeasureUnit &unit, const UNumberUnitWidth &width,
-                                const PluralRules *rules, const MicroPropsGenerator *parent,
-                                UErrorCode &status) {
+LongNameHandler::forMeasureUnit(const Locale &loc, const MeasureUnit &unitRef, const MeasureUnit &perUnit,
+                                const UNumberUnitWidth &width, const PluralRules *rules,
+                                const MicroPropsGenerator *parent, UErrorCode &status) {
+    MeasureUnit unit = unitRef;
+    if (uprv_strcmp(perUnit.getType(), "none") != 0) {
+        // Compound unit: first try to simplify (e.g., meters per second is its own unit).
+        bool isResolved = false;
+        MeasureUnit resolved = MeasureUnit::resolveUnitPerUnit(unit, perUnit, &isResolved);
+        if (isResolved) {
+            unit = resolved;
+        } else {
+            // No simplified form is available.
+            return forCompoundUnit(loc, unit, perUnit, width, rules, parent, status);
+        }
+    }
+
     LongNameHandler result(rules, parent);
-    UnicodeString simpleFormats[StandardPlural::Form::COUNT];
+    UnicodeString simpleFormats[ARRAY_LENGTH];
     getMeasureData(loc, unit, width, simpleFormats, status);
     if (U_FAILURE(status)) { return result; }
     // TODO: What field to use for units?
@@ -124,12 +181,47 @@
     return result;
 }
 
+LongNameHandler
+LongNameHandler::forCompoundUnit(const Locale &loc, const MeasureUnit &unit, const MeasureUnit &perUnit,
+                                 const UNumberUnitWidth &width, const PluralRules *rules,
+                                 const MicroPropsGenerator *parent, UErrorCode &status) {
+    LongNameHandler result(rules, parent);
+    UnicodeString primaryData[ARRAY_LENGTH];
+    getMeasureData(loc, unit, width, primaryData, status);
+    if (U_FAILURE(status)) { return result; }
+    UnicodeString secondaryData[ARRAY_LENGTH];
+    getMeasureData(loc, perUnit, width, secondaryData, status);
+    if (U_FAILURE(status)) { return result; }
+
+    UnicodeString perUnitFormat;
+    if (!secondaryData[PER_INDEX].isBogus()) {
+        perUnitFormat = secondaryData[PER_INDEX];
+    } else {
+        UnicodeString rawPerUnitFormat = getPerUnitFormat(loc, width, status);
+        if (U_FAILURE(status)) { return result; }
+        // rawPerUnitFormat is something like "{0}/{1}"; we need to substitute in the secondary unit.
+        SimpleFormatter compiled(rawPerUnitFormat, 2, 2, status);
+        if (U_FAILURE(status)) { return result; }
+        UnicodeString secondaryFormat = getWithPlural(secondaryData, StandardPlural::Form::ONE, status);
+        if (U_FAILURE(status)) { return result; }
+        SimpleFormatter secondaryCompiled(secondaryFormat, 1, 1, status);
+        if (U_FAILURE(status)) { return result; }
+        UnicodeString secondaryString = secondaryCompiled.getTextWithNoArguments().trim();
+        // TODO: Why does UnicodeString need to be explicit in the following line?
+        compiled.format(UnicodeString(u"{0}"), secondaryString, perUnitFormat, status);
+        if (U_FAILURE(status)) { return result; }
+    }
+    // TODO: What field to use for units?
+    multiSimpleFormatsToModifiers(primaryData, perUnitFormat, UNUM_FIELD_COUNT, result.fModifiers, status);
+    return result;
+}
+
 LongNameHandler LongNameHandler::forCurrencyLongNames(const Locale &loc, const CurrencyUnit &currency,
                                                       const PluralRules *rules,
                                                       const MicroPropsGenerator *parent,
                                                       UErrorCode &status) {
     LongNameHandler result(rules, parent);
-    UnicodeString simpleFormats[StandardPlural::Form::COUNT];
+    UnicodeString simpleFormats[ARRAY_LENGTH];
     getCurrencyLongNameData(loc, currency, simpleFormats, status);
     if (U_FAILURE(status)) { return result; }
     simpleFormatsToModifiers(simpleFormats, UNUM_CURRENCY_FIELD, result.fModifiers, status);
@@ -139,20 +231,30 @@
 void LongNameHandler::simpleFormatsToModifiers(const UnicodeString *simpleFormats, Field field,
                                                SimpleModifier *output, UErrorCode &status) {
     for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) {
-        UnicodeString simpleFormat = simpleFormats[i];
-        if (simpleFormat.isBogus()) {
-            simpleFormat = simpleFormats[StandardPlural::Form::OTHER];
-        }
-        if (simpleFormat.isBogus()) {
-            // There should always be data in the "other" plural variant.
-            status = U_INTERNAL_PROGRAM_ERROR;
-            return;
-        }
-        SimpleFormatter compiledFormatter(simpleFormat, 1, 1, status);
+        UnicodeString simpleFormat = getWithPlural(simpleFormats, i, status);
+        if (U_FAILURE(status)) { return; }
+        SimpleFormatter compiledFormatter(simpleFormat, 0, 1, status);
+        if (U_FAILURE(status)) { return; }
         output[i] = SimpleModifier(compiledFormatter, field, false);
     }
 }
 
+void LongNameHandler::multiSimpleFormatsToModifiers(const UnicodeString *leadFormats, UnicodeString trailFormat,
+                                                    Field field, SimpleModifier *output, UErrorCode &status) {
+    SimpleFormatter trailCompiled(trailFormat, 1, 1, status);
+    if (U_FAILURE(status)) { return; }
+    for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) {
+        UnicodeString leadFormat = getWithPlural(leadFormats, i, status);
+        if (U_FAILURE(status)) { return; }
+        UnicodeString compoundFormat;
+        trailCompiled.format(leadFormat, compoundFormat, status);
+        if (U_FAILURE(status)) { return; }
+        SimpleFormatter compoundCompiled(compoundFormat, 0, 1, status);
+        if (U_FAILURE(status)) { return; }
+        output[i] = SimpleModifier(compoundCompiled, field, false);
+    }
+}
+
 void LongNameHandler::processQuantity(DecimalQuantity &quantity, MicroProps &micros,
                                       UErrorCode &status) const {
     parent->processQuantity(quantity, micros, status);
diff --git a/icu4c/source/i18n/number_longnames.h b/icu4c/source/i18n/number_longnames.h
index 22ecbac..8738bb9 100644
--- a/icu4c/source/i18n/number_longnames.h
+++ b/icu4c/source/i18n/number_longnames.h
@@ -21,8 +21,9 @@
                          const MicroPropsGenerator *parent, UErrorCode &status);
 
     static LongNameHandler
-    forMeasureUnit(const Locale &loc, const MeasureUnit &unit, const UNumberUnitWidth &width,
-                   const PluralRules *rules, const MicroPropsGenerator *parent, UErrorCode &status);
+    forMeasureUnit(const Locale &loc, const MeasureUnit &unit, const MeasureUnit &perUnit,
+                   const UNumberUnitWidth &width, const PluralRules *rules,
+                   const MicroPropsGenerator *parent, UErrorCode &status);
 
     void
     processQuantity(DecimalQuantity &quantity, MicroProps &micros, UErrorCode &status) const U_OVERRIDE;
@@ -35,8 +36,15 @@
     LongNameHandler(const PluralRules *rules, const MicroPropsGenerator *parent)
             : rules(rules), parent(parent) {}
 
+    static LongNameHandler
+    forCompoundUnit(const Locale &loc, const MeasureUnit &unit, const MeasureUnit &perUnit,
+                    const UNumberUnitWidth &width, const PluralRules *rules,
+                    const MicroPropsGenerator *parent, UErrorCode &status);
+
     static void simpleFormatsToModifiers(const UnicodeString *simpleFormats, Field field,
                                          SimpleModifier *output, UErrorCode &status);
+    static void multiSimpleFormatsToModifiers(const UnicodeString *leadFormats, UnicodeString trailFormat,
+                                         Field field, SimpleModifier *output, UErrorCode &status);
 };
 
 }  // namespace impl
diff --git a/icu4c/source/i18n/number_modifiers.cpp b/icu4c/source/i18n/number_modifiers.cpp
index a19b12d..872b970 100644
--- a/icu4c/source/i18n/number_modifiers.cpp
+++ b/icu4c/source/i18n/number_modifiers.cpp
@@ -74,19 +74,29 @@
 
 SimpleModifier::SimpleModifier(const SimpleFormatter &simpleFormatter, Field field, bool strong)
         : fCompiledPattern(simpleFormatter.compiledPattern), fField(field), fStrong(strong) {
-    U_ASSERT(1 ==
-             SimpleFormatter::getArgumentLimit(fCompiledPattern.getBuffer(), fCompiledPattern.length()));
-    if (fCompiledPattern.charAt(1) != 0) {
+    int32_t argLimit = SimpleFormatter::getArgumentLimit(
+            fCompiledPattern.getBuffer(), fCompiledPattern.length());
+    if (argLimit == 0) {
+        // No arguments in compiled pattern
         fPrefixLength = fCompiledPattern.charAt(1) - ARG_NUM_LIMIT;
-        fSuffixOffset = 3 + fPrefixLength;
-    } else {
-        fPrefixLength = 0;
-        fSuffixOffset = 2;
-    }
-    if (3 + fPrefixLength < fCompiledPattern.length()) {
-        fSuffixLength = fCompiledPattern.charAt(fSuffixOffset) - ARG_NUM_LIMIT;
-    } else {
+        U_ASSERT(2 + fPrefixLength == fCompiledPattern.length());
+        // Set suffixOffset = -1 to indicate no arguments in compiled pattern.
+        fSuffixOffset = -1;
         fSuffixLength = 0;
+    } else {
+        U_ASSERT(argLimit == 1);
+        if (fCompiledPattern.charAt(1) != 0) {
+            fPrefixLength = fCompiledPattern.charAt(1) - ARG_NUM_LIMIT;
+            fSuffixOffset = 3 + fPrefixLength;
+        } else {
+            fPrefixLength = 0;
+            fSuffixOffset = 2;
+        }
+        if (3 + fPrefixLength < fCompiledPattern.length()) {
+            fSuffixLength = fCompiledPattern.charAt(fSuffixOffset) - ARG_NUM_LIMIT;
+        } else {
+            fSuffixLength = 0;
+        }
     }
 }
 
@@ -123,26 +133,37 @@
 int32_t
 SimpleModifier::formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startIndex, int32_t endIndex,
                                      Field field, UErrorCode &status) const {
-    if (fPrefixLength > 0) {
-        result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status);
+    if (fSuffixOffset == -1) {
+        // There is no argument for the inner number; overwrite the entire segment with our string.
+        return result.splice(startIndex, endIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status);
+    } else {
+        if (fPrefixLength > 0) {
+            result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status);
+        }
+        if (fSuffixLength > 0) {
+            result.insert(
+                    endIndex + fPrefixLength,
+                    fCompiledPattern,
+                    1 + fSuffixOffset,
+                    1 + fSuffixOffset + fSuffixLength,
+                    field,
+                    status);
+        }
+        return fPrefixLength + fSuffixLength;
     }
-    if (fSuffixLength > 0) {
-        result.insert(
-                endIndex + fPrefixLength,
-                fCompiledPattern,
-                1 + fSuffixOffset,
-                1 + fSuffixOffset + fSuffixLength,
-                field,
-                status);
-    }
-    return fPrefixLength + fSuffixLength;
 }
 
 int32_t ConstantMultiFieldModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex,
                                           UErrorCode &status) const {
-    // Insert the suffix first since inserting the prefix will change the rightIndex
-    int32_t length = output.insert(rightIndex, fSuffix, status);
-    length += output.insert(leftIndex, fPrefix, status);
+    int32_t length = output.insert(leftIndex, fPrefix, status);
+    if (fOverwrite) {
+        length += output.splice(
+            leftIndex + length,
+            rightIndex + length,
+            UnicodeString(), 0, 0,
+            UNUM_FIELD_COUNT, status);
+    }
+    length += output.insert(rightIndex + length, fSuffix, status);
     return length;
 }
 
@@ -162,10 +183,11 @@
 
 CurrencySpacingEnabledModifier::CurrencySpacingEnabledModifier(const NumberStringBuilder &prefix,
                                                                const NumberStringBuilder &suffix,
+                                                               bool overwrite,
                                                                bool strong,
                                                                const DecimalFormatSymbols &symbols,
                                                                UErrorCode &status)
-        : ConstantMultiFieldModifier(prefix, suffix, strong) {
+        : ConstantMultiFieldModifier(prefix, suffix, overwrite, strong) {
     // Check for currency spacing. Do not build the UnicodeSets unless there is
     // a currency code point at a boundary.
     if (prefix.length() > 0 && prefix.fieldAt(prefix.length() - 1) == UNUM_CURRENCY_FIELD) {
diff --git a/icu4c/source/i18n/number_modifiers.h b/icu4c/source/i18n/number_modifiers.h
index 6a88828..4762a6f 100644
--- a/icu4c/source/i18n/number_modifiers.h
+++ b/icu4c/source/i18n/number_modifiers.h
@@ -103,8 +103,15 @@
  */
 class U_I18N_API ConstantMultiFieldModifier : public Modifier, public UMemory {
   public:
-    ConstantMultiFieldModifier(const NumberStringBuilder &prefix, const NumberStringBuilder &suffix,
-                               bool strong) : fPrefix(prefix), fSuffix(suffix), fStrong(strong) {}
+    ConstantMultiFieldModifier(
+            const NumberStringBuilder &prefix,
+            const NumberStringBuilder &suffix,
+            bool overwrite,
+            bool strong)
+      : fPrefix(prefix),
+        fSuffix(suffix),
+        fOverwrite(overwrite),
+        fStrong(strong) {}
 
     int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
                   UErrorCode &status) const U_OVERRIDE;
@@ -120,6 +127,7 @@
     // value and is treated internally as immutable.
     NumberStringBuilder fPrefix;
     NumberStringBuilder fSuffix;
+    bool fOverwrite;
     bool fStrong;
 };
 
@@ -127,8 +135,13 @@
 class U_I18N_API CurrencySpacingEnabledModifier : public ConstantMultiFieldModifier {
   public:
     /** Safe code path */
-    CurrencySpacingEnabledModifier(const NumberStringBuilder &prefix, const NumberStringBuilder &suffix,
-                                   bool strong, const DecimalFormatSymbols &symbols, UErrorCode &status);
+    CurrencySpacingEnabledModifier(
+            const NumberStringBuilder &prefix,
+            const NumberStringBuilder &suffix,
+            bool overwrite,
+            bool strong,
+            const DecimalFormatSymbols &symbols,
+            UErrorCode &status);
 
     int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex,
                   UErrorCode &status) const U_OVERRIDE;
@@ -216,31 +229,33 @@
         }
     }
 
-    void adoptPositiveNegativeModifiers(const Modifier *positive, const Modifier *negative) {
-        mods[0] = positive;
-        mods[1] = negative;
+    void adoptPositiveNegativeModifiers(
+            const Modifier *positive, const Modifier *zero, const Modifier *negative) {
+        mods[2] = positive;
+        mods[1] = zero;
+        mods[0] = negative;
     }
 
     /** The modifier is ADOPTED. */
-    void adoptSignPluralModifier(bool isNegative, StandardPlural::Form plural, const Modifier *mod) {
-        mods[getModIndex(isNegative, plural)] = mod;
+    void adoptSignPluralModifier(int8_t signum, StandardPlural::Form plural, const Modifier *mod) {
+        mods[getModIndex(signum, plural)] = mod;
     }
 
     /** Returns a reference to the modifier; no ownership change. */
-    const Modifier *getModifier(bool isNegative) const {
-        return mods[isNegative ? 1 : 0];
+    const Modifier *getModifier(int8_t signum) const {
+        return mods[signum + 1];
     }
 
     /** Returns a reference to the modifier; no ownership change. */
-    const Modifier *getModifier(bool isNegative, StandardPlural::Form plural) const {
-        return mods[getModIndex(isNegative, plural)];
+    const Modifier *getModifier(int8_t signum, StandardPlural::Form plural) const {
+        return mods[getModIndex(signum, plural)];
     }
 
   private:
-    const Modifier *mods[2 * StandardPlural::COUNT];
+    const Modifier *mods[3 * StandardPlural::COUNT];
 
-    inline static int32_t getModIndex(bool isNegative, StandardPlural::Form plural) {
-        return static_cast<int32_t>(plural) * 2 + (isNegative ? 1 : 0);
+    inline static int32_t getModIndex(int8_t signum, StandardPlural::Form plural) {
+        return static_cast<int32_t>(plural) * 3 + (signum + 1);
     }
 };
 
diff --git a/icu4c/source/i18n/number_notation.cpp b/icu4c/source/i18n/number_notation.cpp
index ff0cd95..f4ad333 100644
--- a/icu4c/source/i18n/number_notation.cpp
+++ b/icu4c/source/i18n/number_notation.cpp
@@ -54,13 +54,13 @@
 
 ScientificNotation
 ScientificNotation::withMinExponentDigits(int32_t minExponentDigits) const {
-    if (minExponentDigits >= 0 && minExponentDigits < kMaxIntFracSig) {
+    if (minExponentDigits >= 1 && minExponentDigits <= kMaxIntFracSig) {
         ScientificSettings settings = fUnion.scientific;
-        settings.fMinExponentDigits = (int8_t) minExponentDigits;
+        settings.fMinExponentDigits = static_cast<digits_t>(minExponentDigits);
         NotationUnion union_ = {settings};
         return {NTN_SCIENTIFIC, union_};
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
diff --git a/icu4c/source/i18n/number_padding.cpp b/icu4c/source/i18n/number_padding.cpp
index a478af6..b1db349 100644
--- a/icu4c/source/i18n/number_padding.cpp
+++ b/icu4c/source/i18n/number_padding.cpp
@@ -43,7 +43,7 @@
     if (targetWidth >= 0) {
         return {cp, targetWidth, position};
     } else {
-        return {U_NUMBER_PADDING_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
diff --git a/icu4c/source/i18n/number_patternmodifier.cpp b/icu4c/source/i18n/number_patternmodifier.cpp
index 0599f92..e182104 100644
--- a/icu4c/source/i18n/number_patternmodifier.cpp
+++ b/icu4c/source/i18n/number_patternmodifier.cpp
@@ -38,8 +38,8 @@
     this->rules = rules;
 }
 
-void MutablePatternModifier::setNumberProperties(bool isNegative, StandardPlural::Form plural) {
-    this->isNegative = isNegative;
+void MutablePatternModifier::setNumberProperties(int8_t signum, StandardPlural::Form plural) {
+    this->signum = signum;
     this->plural = plural;
 }
 
@@ -74,10 +74,12 @@
     if (needsPlurals()) {
         // Slower path when we require the plural keyword.
         for (StandardPlural::Form plural : STANDARD_PLURAL_VALUES) {
-            setNumberProperties(false, plural);
-            pm->adoptSignPluralModifier(false, plural, createConstantModifier(status));
-            setNumberProperties(true, plural);
-            pm->adoptSignPluralModifier(true, plural, createConstantModifier(status));
+            setNumberProperties(1, plural);
+            pm->adoptSignPluralModifier(1, plural, createConstantModifier(status));
+            setNumberProperties(0, plural);
+            pm->adoptSignPluralModifier(0, plural, createConstantModifier(status));
+            setNumberProperties(-1, plural);
+            pm->adoptSignPluralModifier(-1, plural, createConstantModifier(status));
         }
         if (U_FAILURE(status)) {
             delete pm;
@@ -86,11 +88,13 @@
         return new ImmutablePatternModifier(pm, rules, parent);  // adopts pm
     } else {
         // Faster path when plural keyword is not needed.
-        setNumberProperties(false, StandardPlural::Form::COUNT);
+        setNumberProperties(1, StandardPlural::Form::COUNT);
         Modifier *positive = createConstantModifier(status);
-        setNumberProperties(true, StandardPlural::Form::COUNT);
+        setNumberProperties(0, StandardPlural::Form::COUNT);
+        Modifier *zero = createConstantModifier(status);
+        setNumberProperties(-1, StandardPlural::Form::COUNT);
         Modifier *negative = createConstantModifier(status);
-        pm->adoptPositiveNegativeModifiers(positive, negative);
+        pm->adoptPositiveNegativeModifiers(positive, zero, negative);
         if (U_FAILURE(status)) {
             delete pm;
             return nullptr;
@@ -105,9 +109,9 @@
     insertPrefix(a, 0, status);
     insertSuffix(b, 0, status);
     if (patternInfo->hasCurrencySign()) {
-        return new CurrencySpacingEnabledModifier(a, b, fStrong, *symbols, status);
+        return new CurrencySpacingEnabledModifier(a, b, !patternInfo->hasBody(), fStrong, *symbols, status);
     } else {
-        return new ConstantMultiFieldModifier(a, b, fStrong);
+        return new ConstantMultiFieldModifier(a, b, !patternInfo->hasBody(), fStrong);
     }
 }
 
@@ -123,13 +127,13 @@
 
 void ImmutablePatternModifier::applyToMicros(MicroProps &micros, DecimalQuantity &quantity) const {
     if (rules == nullptr) {
-        micros.modMiddle = pm->getModifier(quantity.isNegative());
+        micros.modMiddle = pm->getModifier(quantity.signum());
     } else {
         // TODO: Fix this. Avoid the copy.
         DecimalQuantity copy(quantity);
         copy.roundToInfinity();
         StandardPlural::Form plural = copy.getStandardPlural(rules);
-        micros.modMiddle = pm->getModifier(quantity.isNegative(), plural);
+        micros.modMiddle = pm->getModifier(quantity.signum(), plural);
     }
 }
 
@@ -149,9 +153,9 @@
         // TODO: Fix this. Avoid the copy.
         DecimalQuantity copy(fq);
         micros.rounding.apply(copy, status);
-        nonConstThis->setNumberProperties(fq.isNegative(), copy.getStandardPlural(rules));
+        nonConstThis->setNumberProperties(fq.signum(), copy.getStandardPlural(rules));
     } else {
-        nonConstThis->setNumberProperties(fq.isNegative(), StandardPlural::Form::COUNT);
+        nonConstThis->setNumberProperties(fq.signum(), StandardPlural::Form::COUNT);
     }
     micros.modMiddle = this;
 }
@@ -163,9 +167,23 @@
     auto nonConstThis = const_cast<MutablePatternModifier *>(this);
     int32_t prefixLen = nonConstThis->insertPrefix(output, leftIndex, status);
     int32_t suffixLen = nonConstThis->insertSuffix(output, rightIndex + prefixLen, status);
+    // If the pattern had no decimal stem body (like #,##0.00), overwrite the value.
+    int32_t overwriteLen = 0;
+    if (!patternInfo->hasBody()) {
+        overwriteLen = output.splice(
+            leftIndex + prefixLen, rightIndex + prefixLen,
+            UnicodeString(), 0, 0, UNUM_FIELD_COUNT,
+            status);
+    }
     CurrencySpacingEnabledModifier::applyCurrencySpacing(
-            output, leftIndex, prefixLen, rightIndex + prefixLen, suffixLen, *symbols, status);
-    return prefixLen + suffixLen;
+            output,
+            leftIndex,
+            prefixLen,
+            rightIndex + overwriteLen + prefixLen,
+            suffixLen,
+            *symbols,
+            status);
+    return prefixLen + overwriteLen + suffixLen;
 }
 
 int32_t MutablePatternModifier::getPrefixLength(UErrorCode &status) const {
@@ -230,13 +248,16 @@
             } else if (unitWidth == UNumberUnitWidth::UNUM_UNIT_WIDTH_HIDDEN) {
                 return UnicodeString();
             } else {
+                UCurrNameStyle selector = (unitWidth == UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW)
+                        ? UCurrNameStyle::UCURR_NARROW_SYMBOL_NAME
+                        : UCurrNameStyle::UCURR_SYMBOL_NAME;
                 UErrorCode status = U_ZERO_ERROR;
                 UBool isChoiceFormat = FALSE;
                 int32_t symbolLen = 0;
                 const char16_t *symbol = ucurr_getName(
                         currencyCode,
                         symbols->getLocale().getName(),
-                        UCurrNameStyle::UCURR_SYMBOL_NAME,
+                        selector,
                         &isChoiceFormat,
                         &symbolLen,
                         &status);
@@ -278,14 +299,17 @@
     inCharSequenceMode = true;
 
     // Should the output render '+' where '-' would normally appear in the pattern?
-    plusReplacesMinusSign = !isNegative && (
-            signDisplay == UNUM_SIGN_ALWAYS ||
-            signDisplay == UNUM_SIGN_ACCOUNTING_ALWAYS) &&
-                            patternInfo->positiveHasPlusSign() == false;
+    plusReplacesMinusSign = signum != -1
+            && (signDisplay == UNUM_SIGN_ALWAYS
+                    || signDisplay == UNUM_SIGN_ACCOUNTING_ALWAYS
+                    || (signum == 1
+                            && (signDisplay == UNUM_SIGN_EXCEPT_ZERO
+                                    || signDisplay == UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO)))
+            && patternInfo->positiveHasPlusSign() == false;
 
     // Should we use the affix from the negative subpattern? (If not, we will use the positive subpattern.)
     bool useNegativeAffixPattern = patternInfo->hasNegativeSubpattern() && (
-            isNegative || (patternInfo->negativeHasMinusSign() && plusReplacesMinusSign));
+            signum == -1 || (patternInfo->negativeHasMinusSign() && plusReplacesMinusSign));
 
     // Resolve the flags for the affix pattern.
     fFlags = 0;
@@ -303,7 +327,7 @@
     // Should we prepend a sign to the pattern?
     if (!isPrefix || useNegativeAffixPattern) {
         prependSign = false;
-    } else if (isNegative) {
+    } else if (signum == -1) {
         prependSign = signDisplay != UNUM_SIGN_NEVER;
     } else {
         prependSign = plusReplacesMinusSign;
diff --git a/icu4c/source/i18n/number_patternmodifier.h b/icu4c/source/i18n/number_patternmodifier.h
index 705037f..9c8b95f 100644
--- a/icu4c/source/i18n/number_patternmodifier.h
+++ b/icu4c/source/i18n/number_patternmodifier.h
@@ -18,8 +18,8 @@
 
 // Export an explicit template instantiation of the LocalPointer that is used as a
 // data member of ParameterizedModifier.
-// (MSVC requires this, even though it should not be necessary.)
-#if defined (_MSC_VER)
+// (When building DLLs for Windows this is required.)
+#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
 // Ignore warning 4661 as LocalPointerBase does not use operator== or operator!=
 #pragma warning(suppress: 4661)
 template class U_I18N_API LocalPointerBase<number::impl::ParameterizedModifier>;
@@ -125,13 +125,13 @@
     /**
      * Sets attributes of the current number being processed.
      *
-     * @param isNegative
-     *            Whether the number is negative.
+     * @param signum
+     *            -1 if negative; +1 if positive; or 0 if zero.
      * @param plural
-     *            The plural form of the number, required only if the pattern contains the triple currency sign, "¤¤¤"
-     *            (and as indicated by {@link #needsPlurals()}).
+     *            The plural form of the number, required only if the pattern contains the triple
+     *            currency sign, "¤¤¤" (and as indicated by {@link #needsPlurals()}).
      */
-    void setNumberProperties(bool isNegative, StandardPlural::Form plural);
+    void setNumberProperties(int8_t signum, StandardPlural::Form plural);
 
     /**
      * Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order to localize.
@@ -211,7 +211,7 @@
     const PluralRules *rules;
 
     // Number details (initialized in setNumberProperties)
-    bool isNegative;
+    int8_t signum;
     StandardPlural::Form plural;
 
     // QuantityChain details (initialized in addToChain)
diff --git a/icu4c/source/i18n/number_patternstring.cpp b/icu4c/source/i18n/number_patternstring.cpp
index c67e354..2017882 100644
--- a/icu4c/source/i18n/number_patternstring.cpp
+++ b/icu4c/source/i18n/number_patternstring.cpp
@@ -95,6 +95,10 @@
     return AffixUtils::containsType(UnicodeStringCharSequence(pattern), type, status);
 }
 
+bool ParsedPatternInfo::hasBody() const {
+    return positive.integerTotal > 0;
+}
+
 /////////////////////////////////////////////////////
 /// BEGIN RECURSIVE DESCENT PARSER IMPLEMENTATION ///
 /////////////////////////////////////////////////////
diff --git a/icu4c/source/i18n/number_patternstring.h b/icu4c/source/i18n/number_patternstring.h
index 6e1bb7f..ec44290 100644
--- a/icu4c/source/i18n/number_patternstring.h
+++ b/icu4c/source/i18n/number_patternstring.h
@@ -84,6 +84,8 @@
 
     bool containsSymbolType(AffixPatternType type, UErrorCode &status) const U_OVERRIDE;
 
+    bool hasBody() const U_OVERRIDE;
+
   private:
     struct U_I18N_API ParserState {
         const UnicodeString &pattern; // reference to the parent
diff --git a/icu4c/source/i18n/number_rounding.cpp b/icu4c/source/i18n/number_rounding.cpp
index 5c494f0..fd4dafd 100644
--- a/icu4c/source/i18n/number_rounding.cpp
+++ b/icu4c/source/i18n/number_rounding.cpp
@@ -58,7 +58,7 @@
     if (minMaxFractionPlaces >= 0 && minMaxFractionPlaces <= kMaxIntFracSig) {
         return constructFraction(minMaxFractionPlaces, minMaxFractionPlaces);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
@@ -66,7 +66,7 @@
     if (minFractionPlaces >= 0 && minFractionPlaces <= kMaxIntFracSig) {
         return constructFraction(minFractionPlaces, -1);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
@@ -74,7 +74,7 @@
     if (maxFractionPlaces >= 0 && maxFractionPlaces <= kMaxIntFracSig) {
         return constructFraction(0, maxFractionPlaces);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
@@ -83,40 +83,40 @@
         minFractionPlaces <= maxFractionPlaces) {
         return constructFraction(minFractionPlaces, maxFractionPlaces);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
 Rounder Rounder::fixedDigits(int32_t minMaxSignificantDigits) {
-    if (minMaxSignificantDigits >= 0 && minMaxSignificantDigits <= kMaxIntFracSig) {
+    if (minMaxSignificantDigits >= 1 && minMaxSignificantDigits <= kMaxIntFracSig) {
         return constructSignificant(minMaxSignificantDigits, minMaxSignificantDigits);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
 Rounder Rounder::minDigits(int32_t minSignificantDigits) {
-    if (minSignificantDigits >= 0 && minSignificantDigits <= kMaxIntFracSig) {
+    if (minSignificantDigits >= 1 && minSignificantDigits <= kMaxIntFracSig) {
         return constructSignificant(minSignificantDigits, -1);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
 Rounder Rounder::maxDigits(int32_t maxSignificantDigits) {
-    if (maxSignificantDigits >= 0 && maxSignificantDigits <= kMaxIntFracSig) {
-        return constructSignificant(0, maxSignificantDigits);
+    if (maxSignificantDigits >= 1 && maxSignificantDigits <= kMaxIntFracSig) {
+        return constructSignificant(1, maxSignificantDigits);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
 Rounder Rounder::minMaxDigits(int32_t minSignificantDigits, int32_t maxSignificantDigits) {
-    if (minSignificantDigits >= 0 && maxSignificantDigits <= kMaxIntFracSig &&
+    if (minSignificantDigits >= 1 && maxSignificantDigits <= kMaxIntFracSig &&
         minSignificantDigits <= maxSignificantDigits) {
         return constructSignificant(minSignificantDigits, maxSignificantDigits);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
@@ -124,7 +124,7 @@
     if (roundingIncrement > 0.0) {
         return constructIncrement(roundingIncrement, 0);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
@@ -139,19 +139,19 @@
 
 Rounder FractionRounder::withMinDigits(int32_t minSignificantDigits) const {
     if (fType == RND_ERROR) { return *this; } // no-op in error state
-    if (minSignificantDigits >= 0 && minSignificantDigits <= kMaxIntFracSig) {
+    if (minSignificantDigits >= 1 && minSignificantDigits <= kMaxIntFracSig) {
         return constructFractionSignificant(*this, minSignificantDigits, -1);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
 Rounder FractionRounder::withMaxDigits(int32_t maxSignificantDigits) const {
     if (fType == RND_ERROR) { return *this; } // no-op in error state
-    if (maxSignificantDigits >= 0 && maxSignificantDigits <= kMaxIntFracSig) {
+    if (maxSignificantDigits >= 1 && maxSignificantDigits <= kMaxIntFracSig) {
         return constructFractionSignificant(*this, -1, maxSignificantDigits);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
@@ -185,14 +185,14 @@
     if (minFrac >= 0 && minFrac <= kMaxIntFracSig) {
         return constructIncrement(fUnion.increment.fIncrement, minFrac);
     } else {
-        return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR};
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
 FractionRounder Rounder::constructFraction(int32_t minFrac, int32_t maxFrac) {
     FractionSignificantSettings settings;
-    settings.fMinFrac = static_cast<int8_t> (minFrac);
-    settings.fMaxFrac = static_cast<int8_t> (maxFrac);
+    settings.fMinFrac = static_cast<digits_t>(minFrac);
+    settings.fMaxFrac = static_cast<digits_t>(maxFrac);
     settings.fMinSig = -1;
     settings.fMaxSig = -1;
     RounderUnion union_;
@@ -204,8 +204,8 @@
     FractionSignificantSettings settings;
     settings.fMinFrac = -1;
     settings.fMaxFrac = -1;
-    settings.fMinSig = static_cast<int8_t>(minSig);
-    settings.fMaxSig = static_cast<int8_t>(maxSig);
+    settings.fMinSig = static_cast<digits_t>(minSig);
+    settings.fMaxSig = static_cast<digits_t>(maxSig);
     RounderUnion union_;
     union_.fracSig = settings;
     return {RND_SIGNIFICANT, union_, kDefaultMode};
@@ -214,8 +214,8 @@
 Rounder
 Rounder::constructFractionSignificant(const FractionRounder &base, int32_t minSig, int32_t maxSig) {
     FractionSignificantSettings settings = base.fUnion.fracSig;
-    settings.fMinSig = static_cast<int8_t>(minSig);
-    settings.fMaxSig = static_cast<int8_t>(maxSig);
+    settings.fMinSig = static_cast<digits_t>(minSig);
+    settings.fMaxSig = static_cast<digits_t>(maxSig);
     RounderUnion union_;
     union_.fracSig = settings;
     return {RND_FRACTION_SIGNIFICANT, union_, kDefaultMode};
@@ -224,7 +224,7 @@
 IncrementRounder Rounder::constructIncrement(double increment, int32_t minFrac) {
     IncrementSettings settings;
     settings.fIncrement = increment;
-    settings.fMinFrac = minFrac;
+    settings.fMinFrac = static_cast<digits_t>(minFrac);
     RounderUnion union_;
     union_.increment = settings;
     return {RND_INCREMENT, union_, kDefaultMode};
@@ -251,28 +251,39 @@
 int32_t
 Rounder::chooseMultiplierAndApply(impl::DecimalQuantity &input, const impl::MultiplierProducer &producer,
                                   UErrorCode &status) {
-    // TODO: Make a better and more efficient implementation.
-    // TODO: Avoid the object creation here.
-    DecimalQuantity copy(input);
-
+    // Do not call this method with zero.
     U_ASSERT(!input.isZero());
-    int32_t magnitude = input.getMagnitude();
-    int32_t multiplier = producer.getMultiplier(magnitude);
+
+    // Perform the first attempt at rounding.
+    int magnitude = input.getMagnitude();
+    int multiplier = producer.getMultiplier(magnitude);
     input.adjustMagnitude(multiplier);
     apply(input, status);
 
-    // If the number turned to zero when rounding, do not re-attempt the rounding.
-    if (!input.isZero() && input.getMagnitude() == magnitude + multiplier + 1) {
-        magnitude += 1;
-        input = copy;
-        multiplier = producer.getMultiplier(magnitude);
-        input.adjustMagnitude(multiplier);
-        U_ASSERT(input.getMagnitude() == magnitude + multiplier - 1);
-        apply(input, status);
-        U_ASSERT(input.getMagnitude() == magnitude + multiplier);
+    // If the number rounded to zero, exit.
+    if (input.isZero() || U_FAILURE(status)) {
+        return multiplier;
     }
 
-    return multiplier;
+    // If the new magnitude after rounding is the same as it was before rounding, then we are done.
+    // This case applies to most numbers.
+    if (input.getMagnitude() == magnitude + multiplier) {
+        return multiplier;
+    }
+
+    // If the above case DIDN'T apply, then we have a case like 99.9 -> 100 or 999.9 -> 1000:
+    // The number rounded up to the next magnitude. Check if the multiplier changes; if it doesn't,
+    // we do not need to make any more adjustments.
+    int _multiplier = producer.getMultiplier(magnitude + 1);
+    if (multiplier == _multiplier) {
+        return multiplier;
+    }
+
+    // We have a case like 999.9 -> 1000, where the correct output is "1K", not "1000".
+    // Fix the magnitude and re-apply the rounding strategy.
+    input.adjustMagnitude(_multiplier - multiplier);
+    apply(input, status);
+    return _multiplier;
 }
 
 /** This is the method that contains the actual rounding logic. */
@@ -331,6 +342,7 @@
         case RND_CURRENCY:
             // Call .withCurrency() before .apply()!
             U_ASSERT(false);
+            break;
 
         case RND_PASS_THROUGH:
             break;
diff --git a/icu4c/source/i18n/number_stringbuilder.cpp b/icu4c/source/i18n/number_stringbuilder.cpp
index e6e86bd..37159d7 100644
--- a/icu4c/source/i18n/number_stringbuilder.cpp
+++ b/icu4c/source/i18n/number_stringbuilder.cpp
@@ -191,6 +191,30 @@
     return count;
 }
 
+int32_t
+NumberStringBuilder::splice(int32_t startThis, int32_t endThis,  const UnicodeString &unistr,
+                            int32_t startOther, int32_t endOther, Field field, UErrorCode& status) {
+    int32_t thisLength = endThis - startThis;
+    int32_t otherLength = endOther - startOther;
+    int32_t count = otherLength - thisLength;
+    int32_t position;
+    if (count > 0) {
+        // Overall, chars need to be added.
+        position = prepareForInsert(startThis, count, status);
+    } else {
+        // Overall, chars need to be removed or kept the same.
+        position = remove(startThis, -count);
+    }
+    if (U_FAILURE(status)) {
+        return count;
+    }
+    for (int32_t i = 0; i < otherLength; i++) {
+        getCharPtr()[position + i] = unistr.charAt(startOther + i);
+        getFieldPtr()[position + i] = field;
+    }
+    return count;
+}
+
 int32_t NumberStringBuilder::append(const NumberStringBuilder &other, UErrorCode &status) {
     return insert(fLength, other, status);
 }
@@ -296,6 +320,19 @@
     return fZero + index;
 }
 
+int32_t NumberStringBuilder::remove(int32_t index, int32_t count) {
+    // TODO: Reset the heap here?  (If the string after removal can fit on stack?)
+    int32_t position = index + fZero;
+    uprv_memmove2(getCharPtr() + position,
+            getCharPtr() + position + count,
+            sizeof(char16_t) * (fLength - index - count));
+    uprv_memmove2(getFieldPtr() + position,
+            getFieldPtr() + position + count,
+            sizeof(Field) * (fLength - index - count));
+    fLength -= count;
+    return position;
+}
+
 UnicodeString NumberStringBuilder::toUnicodeString() const {
     return UnicodeString(getCharPtr() + fZero, fLength);
 }
diff --git a/icu4c/source/i18n/number_stringbuilder.h b/icu4c/source/i18n/number_stringbuilder.h
index f08dcb1..a97cc9c 100644
--- a/icu4c/source/i18n/number_stringbuilder.h
+++ b/icu4c/source/i18n/number_stringbuilder.h
@@ -77,6 +77,9 @@
     int32_t insert(int32_t index, const UnicodeString &unistr, int32_t start, int32_t end, Field field,
                    UErrorCode &status);
 
+    int32_t splice(int32_t startThis, int32_t endThis,  const UnicodeString &unistr,
+                   int32_t startOther, int32_t endOther, Field field, UErrorCode& status);
+
     int32_t append(const NumberStringBuilder &other, UErrorCode &status);
 
     int32_t insert(int32_t index, const NumberStringBuilder &other, UErrorCode &status);
@@ -123,6 +126,8 @@
     int32_t prepareForInsert(int32_t index, int32_t count, UErrorCode &status);
 
     int32_t prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status);
+
+    int32_t remove(int32_t index, int32_t count);
 };
 
 } // namespace impl
diff --git a/icu4c/source/i18n/number_types.h b/icu4c/source/i18n/number_types.h
index 2bc21bd..c01765e 100644
--- a/icu4c/source/i18n/number_types.h
+++ b/icu4c/source/i18n/number_types.h
@@ -31,7 +31,7 @@
 typedef UNumberCompactStyle CompactStyle;
 
 // ICU4J Equivalent: RoundingUtils.MAX_INT_FRAC_SIG
-static constexpr int32_t kMaxIntFracSig = 100;
+static constexpr int32_t kMaxIntFracSig = 999;
 
 // ICU4J Equivalent: RoundingUtils.DEFAULT_ROUNDING_MODE
 static constexpr RoundingMode kDefaultMode = RoundingMode::UNUM_FOUND_HALFEVEN;
@@ -42,10 +42,6 @@
 // ICU4J Equivalent: NumberFormatterImpl.DEFAULT_CURRENCY
 static constexpr char16_t kDefaultCurrency[] = u"XXX";
 
-// FIXME: New error codes:
-static constexpr UErrorCode U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR = U_ILLEGAL_ARGUMENT_ERROR;
-static constexpr UErrorCode U_NUMBER_PADDING_WIDTH_OUTOFBOUNDS_ERROR = U_ILLEGAL_ARGUMENT_ERROR;
-
 // Forward declarations:
 
 class Modifier;
@@ -142,6 +138,13 @@
     virtual bool negativeHasMinusSign() const = 0;
 
     virtual bool containsSymbolType(AffixPatternType, UErrorCode &) const = 0;
+
+    /**
+     * True if the pattern has a number placeholder like "0" or "#,##0.00"; false if the pattern does not
+     * have one. This is used in cases like compact notation, where the pattern replaces the entire
+     * number instead of rendering the number.
+     */
+    virtual bool hasBody() const = 0;
 };
 
 /**
@@ -230,10 +233,21 @@
     virtual void processQuantity(DecimalQuantity& quantity, MicroProps& micros, UErrorCode& status) const = 0;
 };
 
+/**
+ * An interface used by compact notation and scientific notation to choose a multiplier while rounding.
+ */
 class MultiplierProducer {
   public:
     virtual ~MultiplierProducer() = default;
 
+    /**
+     * Maps a magnitude to a multiplier in powers of ten. For example, in compact notation in English, a magnitude of 5
+     * (e.g., 100,000) should return a multiplier of -3, since the number is displayed in thousands.
+     *
+     * @param magnitude
+     *            The power of ten of the input number.
+     * @return The shift in powers of ten.
+     */
     virtual int32_t getMultiplier(int32_t magnitude) const = 0;
 };
 
diff --git a/icu4c/source/i18n/rbnf.cpp b/icu4c/source/i18n/rbnf.cpp
index 66f532e..1b75e5e 100644
--- a/icu4c/source/i18n/rbnf.cpp
+++ b/icu4c/source/i18n/rbnf.cpp
@@ -1371,7 +1371,7 @@
             ParsePosition working_pp(0);
             Formattable working_result;
 
-            rp->parse(workingText, working_pp, kMaxDouble, working_result);
+            rp->parse(workingText, working_pp, kMaxDouble, 0, working_result);
             if (working_pp.getIndex() > high_pp.getIndex()) {
                 high_pp = working_pp;
                 high_result = working_result;
diff --git a/icu4c/source/i18n/regexcmp.cpp b/icu4c/source/i18n/regexcmp.cpp
index 4e9ad6a..ca1008c 100644
--- a/icu4c/source/i18n/regexcmp.cpp
+++ b/icu4c/source/i18n/regexcmp.cpp
@@ -4450,11 +4450,9 @@
     //    See if the property looks like a Java "InBlockName", which
     //    we will recast as "Block=BlockName"
     //
-    static const UChar IN[] = {0x49, 0x6E, 0};  // "In"
-    static const UChar BLOCK[] = {0x42, 0x6C, 0x6f, 0x63, 0x6b, 0x3d, 00};  // "Block="
-    if (mPropName.startsWith(IN, 2) && propName.length()>=3) {
+    if (mPropName.startsWith(u"In", 2) && propName.length()>=3) {
         setExpr.truncate(4);   // Leaves "[\p{", or "[\P{"
-        setExpr.append(BLOCK, -1);
+        setExpr.append(u"Block=", -1);
         setExpr.append(UnicodeString(mPropName, 2));  // Property with the leading "In" removed.
         setExpr.append(chRBrace);
         setExpr.append(chRBracket);
diff --git a/icu4c/source/i18n/rematch.cpp b/icu4c/source/i18n/rematch.cpp
index f252182..efa3909 100644
--- a/icu4c/source/i18n/rematch.cpp
+++ b/icu4c/source/i18n/rematch.cpp
@@ -5818,3 +5818,4 @@
 U_NAMESPACE_END
 
 #endif  // !UCONFIG_NO_REGULAR_EXPRESSIONS
+
diff --git a/icu4c/source/i18n/simpletz.cpp b/icu4c/source/i18n/simpletz.cpp
index e17d14c..57a7ba8 100644
--- a/icu4c/source/i18n/simpletz.cpp
+++ b/icu4c/source/i18n/simpletz.cpp
@@ -177,7 +177,7 @@
 
     decodeRules(status);
 
-    if (savingsDST <= 0) {
+    if (savingsDST == 0) {
         status = U_ILLEGAL_ARGUMENT_ERROR;
     }
 }
@@ -686,7 +686,7 @@
 void 
 SimpleTimeZone::setDSTSavings(int32_t millisSavedDuringDST, UErrorCode& status) 
 {
-    if (millisSavedDuringDST <= 0) {
+    if (millisSavedDuringDST == 0) {
         status = U_ILLEGAL_ARGUMENT_ERROR;
     }
     else {
diff --git a/icu4c/source/i18n/ucol.cpp b/icu4c/source/i18n/ucol.cpp
index e53dc92..f59333e 100644
--- a/icu4c/source/i18n/ucol.cpp
+++ b/icu4c/source/i18n/ucol.cpp
@@ -95,6 +95,7 @@
     Collator *newColl = Collator::fromUCollator(coll)->clone();
     if (newColl == NULL) {
         *status = U_MEMORY_ALLOCATION_ERROR;
+        return nullptr;
     } else {
         *status = U_SAFECLONE_ALLOCATED_WARNING;
     }
diff --git a/icu4c/source/i18n/ucol_res.cpp b/icu4c/source/i18n/ucol_res.cpp
index 0f1d6d2..76975ec 100644
--- a/icu4c/source/i18n/ucol_res.cpp
+++ b/icu4c/source/i18n/ucol_res.cpp
@@ -451,6 +451,7 @@
     const CollationCacheEntry *entry = new CollationCacheEntry(validLocale, t.getAlias());
     if(entry == NULL) {
         errorCode = U_MEMORY_ALLOCATION_ERROR;
+        return nullptr;
     } else {
         t.orphan();
     }
diff --git a/icu4c/source/i18n/udatpg.cpp b/icu4c/source/i18n/udatpg.cpp
index 9ba82b5..febf73b 100644
--- a/icu4c/source/i18n/udatpg.cpp
+++ b/icu4c/source/i18n/udatpg.cpp
@@ -181,6 +181,25 @@
     return result.getBuffer();
 }
 
+U_CAPI int32_t U_EXPORT2
+udatpg_getFieldDisplayName(const UDateTimePatternGenerator *dtpg,
+                           UDateTimePatternField field,
+                           UDateTimePGDisplayWidth width,
+                           UChar *fieldName, int32_t capacity,
+                           UErrorCode *pErrorCode) {
+    if (U_FAILURE(*pErrorCode))
+        return -1;
+    if (fieldName == NULL ? capacity != 0 : capacity < 0) {
+        *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return -1;
+    }
+    UnicodeString result = ((const DateTimePatternGenerator *)dtpg)->getFieldDisplayName(field,width);
+    if (fieldName == NULL) {
+        return result.length();
+    }
+    return result.extract(fieldName, capacity, *pErrorCode);
+}
+
 U_CAPI void U_EXPORT2
 udatpg_setDateTimeFormat(const UDateTimePatternGenerator *dtpg,
                          const UChar *dtFormat, int32_t length) {
diff --git a/icu4c/source/i18n/unicode/compactdecimalformat.h b/icu4c/source/i18n/unicode/compactdecimalformat.h
index 3fbe5da..d682d2d 100644
--- a/icu4c/source/i18n/unicode/compactdecimalformat.h
+++ b/icu4c/source/i18n/unicode/compactdecimalformat.h
@@ -16,7 +16,7 @@
 #include "unicode/utypes.h"
 /**
  * \file
- * \brief C++ API: Formats decimal numbers in compact form.
+ * \brief C++ API: Compatibility APIs for compact decimal number formatting.
  */
 
 #if !UCONFIG_NO_FORMATTING
@@ -30,6 +30,11 @@
 class PluralRules;
 
 /**
+ * <p><strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * numberformatter.h fits their use case.  Although not deprecated, this header
+ * is provided for backwards compatibility only.
+ * <hr/>
+ *
  * The CompactDecimalFormat produces abbreviated numbers, suitable for display in
  * environments will limited real estate. For example, 'Hits: 1.2B' instead of
  * 'Hits: 1,200,000,000'. The format will be appropriate for the given language,
@@ -56,6 +61,9 @@
 
      /**
       * Returns a compact decimal instance for specified locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
       * @param inLocale the given locale.
       * @param style whether to use short or long style.
       * @param status error code returned  here.
diff --git a/icu4c/source/i18n/unicode/datefmt.h b/icu4c/source/i18n/unicode/datefmt.h
index 3da0797..f8bcf54 100644
--- a/icu4c/source/i18n/unicode/datefmt.h
+++ b/icu4c/source/i18n/unicode/datefmt.h
@@ -44,7 +44,8 @@
 class DateTimePatternGenerator;
 
 // explicit template instantiation. see digitlst.h
-#if defined (_MSC_VER)
+// (When building DLLs for Windows this is required.)
+#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
 template class U_I18N_API EnumSet<UDateFormatBooleanAttribute,
             0, 
             UDAT_BOOLEAN_ATTRIBUTE_COUNT>;
diff --git a/icu4c/source/i18n/unicode/dcfmtsym.h b/icu4c/source/i18n/unicode/dcfmtsym.h
index 4dc6f95..e58befa 100644
--- a/icu4c/source/i18n/unicode/dcfmtsym.h
+++ b/icu4c/source/i18n/unicode/dcfmtsym.h
@@ -80,10 +80,6 @@
  * If you supply a pattern with multiple grouping characters, the interval
  * between the last one and the end of the integer is the one that is
  * used. So "#,##,###,####" == "######,####" == "##,####,####".
- * <P>
- * This class only handles localized digits where the 10 digits are
- * contiguous in Unicode, from 0 to 9. Other digits sets (such as
- * superscripts) would need a different subclass.
  */
 class U_I18N_API DecimalFormatSymbols : public UObject {
 public:
@@ -396,6 +392,13 @@
     inline UBool isCustomIntlCurrencySymbol() const {
         return fIsCustomIntlCurrencySymbol;
     }
+
+    /**
+     * @internal For ICU use only
+     */
+    inline UChar32 getCodePointZero() const {
+        return fCodePointZero;
+    }
 #endif  /* U_HIDE_INTERNAL_API */
 
     /**
@@ -410,10 +413,23 @@
      * @return the format symbol by the param 'symbol'
      * @internal
      */
-    inline const UnicodeString &getConstSymbol(ENumberFormatSymbol symbol) const;
+    inline const UnicodeString& getConstSymbol(ENumberFormatSymbol symbol) const;
 
 #ifndef U_HIDE_INTERNAL_API
     /**
+     * Returns the const UnicodeString reference, like getConstSymbol,
+     * corresponding to the digit with the given value.  This is equivalent
+     * to accessing the symbol from getConstSymbol with the corresponding
+     * key, such as kZeroDigitSymbol or kOneDigitSymbol.
+     *
+     * @param digit The digit, an integer between 0 and 9 inclusive.
+     *              If outside the range 0 to 9, the zero digit is returned.
+     * @return the format symbol for the given digit.
+     * @internal This API is currently for ICU use only.
+     */
+    inline const UnicodeString& getConstDigitSymbol(int32_t digit) const;
+
+    /**
      * Returns that pattern stored in currecy info. Internal API for use by NumberFormat API.
      * @internal
      */
@@ -444,6 +460,22 @@
      */
     UnicodeString fNoSymbol;
 
+    /**
+     * Dealing with code points is faster than dealing with strings when formatting. Because of
+     * this, we maintain a value containing the zero code point that is used whenever digitStrings
+     * represents a sequence of ten code points in order.
+     *
+     * <p>If the value stored here is positive, it means that the code point stored in this value
+     * corresponds to the digitStrings array, and codePointZero can be used instead of the
+     * digitStrings array for the purposes of efficient formatting; if -1, then digitStrings does
+     * *not* contain a sequence of code points, and it must be used directly.
+     *
+     * <p>It is assumed that codePointZero always shadows the value in digitStrings. codePointZero
+     * should never be set directly; rather, it should be updated only when digitStrings mutates.
+     * That is, the flow of information is digitStrings -> codePointZero, not the other way.
+     */
+    UChar32 fCodePointZero;
+
     Locale locale;
 
     char actualLocale[ULOC_FULLNAME_CAPACITY];
@@ -469,7 +501,7 @@
     return *strPtr;
 }
 
-// See comments above for this function. Not hidden with #ifndef U_HIDE_INTERNAL_API
+// See comments above for this function. Not hidden with #ifdef U_HIDE_INTERNAL_API
 inline const UnicodeString &
 DecimalFormatSymbols::getConstSymbol(ENumberFormatSymbol symbol) const {
     const UnicodeString *strPtr;
@@ -481,6 +513,19 @@
     return *strPtr;
 }
 
+#ifndef U_HIDE_INTERNAL_API
+inline const UnicodeString& DecimalFormatSymbols::getConstDigitSymbol(int32_t digit) const {
+    if (digit < 0 || digit > 9) {
+        digit = 0;
+    }
+    if (digit == 0) {
+        return fSymbols[kZeroDigitSymbol];
+    }
+    ENumberFormatSymbol key = static_cast<ENumberFormatSymbol>(kOneDigitSymbol + digit - 1);
+    return fSymbols[key];
+}
+#endif
+
 // -------------------------------------
 
 inline void
@@ -497,14 +542,20 @@
 
     // If the zero digit is being set to a known zero digit according to Unicode,
     // then we automatically set the corresponding 1-9 digits
-    if ( propogateDigits && symbol == kZeroDigitSymbol && value.countChar32() == 1 ) {
+    // Also record updates to fCodePointZero. Be conservative if in doubt.
+    if (symbol == kZeroDigitSymbol) {
         UChar32 sym = value.char32At(0);
-        if ( u_charDigitValue(sym) == 0 ) {
+        if ( propogateDigits && u_charDigitValue(sym) == 0 && value.countChar32() == 1 ) {
+            fCodePointZero = sym;
             for ( int8_t i = 1 ; i<= 9 ; i++ ) {
                 sym++;
                 fSymbols[(int)kOneDigitSymbol+i-1] = UnicodeString(sym);
             }
+        } else {
+            fCodePointZero = -1;
         }
+    } else if (symbol >= kOneDigitSymbol && symbol <= kNineDigitSymbol) {
+        fCodePointZero = -1;
     }
 }
 
diff --git a/icu4c/source/i18n/unicode/decimfmt.h b/icu4c/source/i18n/unicode/decimfmt.h
index 7900536..b062208 100644
--- a/icu4c/source/i18n/unicode/decimfmt.h
+++ b/icu4c/source/i18n/unicode/decimfmt.h
@@ -30,7 +30,7 @@
 #include "unicode/utypes.h"
 /**
  * \file
- * \brief C++ API: Formats decimal numbers.
+ * \brief C++ API: Compatibility APIs for decimal formatting.
  */
 
 #if !UCONFIG_NO_FORMATTING
@@ -67,13 +67,19 @@
 class VisibleDigitsWithExponent;
 
 // explicit template instantiation. see digitlst.h
-#if defined (_MSC_VER)
+// (When building DLLs for Windows this is required.)
+#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
 template class U_I18N_API    EnumSet<UNumberFormatAttribute,
             UNUM_MAX_NONBOOLEAN_ATTRIBUTE+1,
             UNUM_LIMIT_BOOLEAN_ATTRIBUTE>;
 #endif
 
 /**
+ * <p><strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * numberformatter.h fits their use case.  Although not deprecated, this header
+ * is provided for backwards compatibility only.
+ * <hr/>
+ *
  * DecimalFormat is a concrete subclass of NumberFormat that formats decimal
  * numbers. It has a variety of features designed to make it possible to parse
  * and format numbers in any locale, including support for Western, Arabic, or
@@ -688,6 +694,9 @@
      * on NumberFormat such as createInstance. These factories will
      * return the most appropriate sub-class of NumberFormat for a given
      * locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of DecimalFormat.
      * @param status    Output param set to success/failure code. If the
      *                  pattern is invalid this will be set to a failure code.
      * @stable ICU 2.0
@@ -703,6 +712,9 @@
      * on NumberFormat such as createInstance. These factories will
      * return the most appropriate sub-class of NumberFormat for a given
      * locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of DecimalFormat.
      * @param pattern   A non-localized pattern string.
      * @param status    Output param set to success/failure code. If the
      *                  pattern is invalid this will be set to a failure code.
@@ -721,6 +733,9 @@
      * createInstance or createCurrencyInstance. If you need only minor adjustments
      * to a standard format, you can modify the format returned by
      * a NumberFormat factory method.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of DecimalFormat.
      *
      * @param pattern           a non-localized pattern string
      * @param symbolsToAdopt    the set of symbols to be used.  The caller should not
@@ -826,6 +841,9 @@
      * createInstance or createCurrencyInstance. If you need only minor adjustments
      * to a standard format, you can modify the format returned by
      * a NumberFormat factory method.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of DecimalFormat.
      *
      * @param pattern           a non-localized pattern string
      * @param symbolsToAdopt    the set of symbols to be used.  The caller should not
@@ -849,6 +867,9 @@
      * createInstance or createCurrencyInstance. If you need only minor adjustments
      * to a standard format, you can modify the format returned by
      * a NumberFormat factory method.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of DecimalFormat.
      *
      * @param pattern           a non-localized pattern string
      * @param symbols   the set of symbols to be used
@@ -1964,12 +1985,14 @@
     UCurrencyUsage getCurrencyUsage() const;
 
 
+#ifndef U_HIDE_DEPRECATED_API
     /**
      * The resource tags we use to retrieve decimal format data from
      * locale resource bundles.
      * @deprecated ICU 3.4. This string has no public purpose. Please don't use it.
      */
     static const char fgNumberPatterns[];
+#endif  // U_HIDE_DEPRECATED_API
 
 #ifndef U_HIDE_INTERNAL_API
     /**
diff --git a/icu4c/source/i18n/unicode/dtptngen.h b/icu4c/source/i18n/unicode/dtptngen.h
index 5712edb..feb465e 100644
--- a/icu4c/source/i18n/unicode/dtptngen.h
+++ b/icu4c/source/i18n/unicode/dtptngen.h
@@ -263,14 +263,29 @@
 
     /**
      * Getter corresponding to setAppendItemNames. Values below 0 or at or above
-     * UDATPG_FIELD_COUNT are illegal arguments.
+     * UDATPG_FIELD_COUNT are illegal arguments. Note: The more general method
+     * for getting date/time field display names is getFieldDisplayName.
      *
      * @param field  such as UDATPG_ERA_FIELD.
      * @return name for field
+     * @see getFieldDisplayName
      * @stable ICU 3.8
      */
     const UnicodeString& getAppendItemName(UDateTimePatternField field) const;
 
+#ifndef U_HIDE_DRAFT_API
+    /**
+     * The general interface to get a display name for a particular date/time field,
+     * in one of several possible display widths.
+     *
+     * @param field  The desired UDateTimePatternField, such as UDATPG_ERA_FIELD.
+     * @param width  The desired UDateTimePGDisplayWidth, such as UDATPG_ABBREVIATED.
+     * @return.      The display name for field
+     * @draft ICU 61
+     */
+    UnicodeString getFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) const;
+#endif  // U_HIDE_DRAFT_API
+
     /**
      * The DateTimeFormat is a message format pattern used to compose date and
      * time patterns. The default pattern in the root locale is "{1} {0}", where
@@ -507,13 +522,17 @@
      */
     DateTimePatternGenerator& operator=(const DateTimePatternGenerator& other);
 
+    // TODO(ticket:13619): re-enable when UDATPG_NARROW no longer in  draft mode.
+    // static const int32_t UDATPG_WIDTH_COUNT = UDATPG_NARROW + 1;
+
     Locale pLocale;  // pattern locale
     FormatParser *fp;
     DateTimeMatcher* dtMatcher;
     DistanceInfo *distanceInfo;
     PatternMap *patternMap;
     UnicodeString appendItemFormats[UDATPG_FIELD_COUNT];
-    UnicodeString appendItemNames[UDATPG_FIELD_COUNT];
+    // TODO(ticket:13619): [3] -> UDATPG_WIDTH_COUNT
+    UnicodeString fieldDisplayNames[UDATPG_FIELD_COUNT][3];
     UnicodeString dateTimeFormat;
     UnicodeString decimal;
     DateTimeMatcher *skipMatcher;
@@ -543,8 +562,11 @@
     void setDateTimeFromCalendar(const Locale& locale, UErrorCode& status);
     void setDecimalSymbols(const Locale& locale, UErrorCode& status);
     UDateTimePatternField getAppendFormatNumber(const char* field) const;
-    UDateTimePatternField getAppendNameNumber(const char* field) const;
-    UnicodeString& getMutableAppendItemName(UDateTimePatternField field);
+#ifndef U_HIDE_DRAFT_API
+    UDateTimePatternField getFieldAndWidthIndices(const char* key, UDateTimePGDisplayWidth* widthP) const;
+    void setFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width, const UnicodeString& value);
+    UnicodeString& getMutableFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width);
+#endif  // U_HIDE_DRAFT_API
     void getAppendName(UDateTimePatternField field, UnicodeString& value);
     UnicodeString mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status);
     int32_t getCanonicalIndex(const UnicodeString& field);
diff --git a/icu4c/source/i18n/unicode/measfmt.h b/icu4c/source/i18n/unicode/measfmt.h
index 156bb81..00f2d47 100644
--- a/icu4c/source/i18n/unicode/measfmt.h
+++ b/icu4c/source/i18n/unicode/measfmt.h
@@ -22,7 +22,7 @@
 
 /**
  * \file 
- * \brief C++ API: Formatter for measure objects.
+ * \brief C++ API: Compatibility APIs for measure formatting.
  */
 
 /**
@@ -87,8 +87,9 @@
 class DateFormat;
 
 /**
- * 
- * A formatter for measure objects.
+ * <p><strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * numberformatter.h fits their use case.  Although not deprecated, this header
+ * is provided for backwards compatibility only.
  *
  * @see Format
  * @author Alan Liu
@@ -101,6 +102,9 @@
 
     /**
      * Constructor.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @stable ICU 53
      */
     MeasureFormat(
@@ -108,6 +112,9 @@
 
     /**
      * Constructor.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @stable ICU 53
      */
     MeasureFormat(
@@ -227,6 +234,9 @@
     /**
      * Return a formatter for CurrencyAmount objects in the given
      * locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @param locale desired locale
      * @param ec input-output error code
      * @return a formatter object, or NULL upon error
@@ -238,6 +248,9 @@
     /**
      * Return a formatter for CurrencyAmount objects in the default
      * locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @param ec input-output error code
      * @return a formatter object, or NULL upon error
      * @stable ICU 3.0
diff --git a/icu4c/source/i18n/unicode/measunit.h b/icu4c/source/i18n/unicode/measunit.h
index 4140ae3..9559724 100644
--- a/icu4c/source/i18n/unicode/measunit.h
+++ b/icu4c/source/i18n/unicode/measunit.h
@@ -196,8 +196,8 @@
      * ICU use only.
      * @internal
      */
-    static MeasureUnit *resolveUnitPerUnit(
-            const MeasureUnit &unit, const MeasureUnit &perUnit);
+    static MeasureUnit resolveUnitPerUnit(
+            const MeasureUnit &unit, const MeasureUnit &perUnit, bool* isResolved);
 #endif /* U_HIDE_INTERNAL_API */
 
 // All code between the "Start generated createXXX methods" comment and
@@ -832,15 +832,13 @@
      */
     static MeasureUnit *createPicometer(UErrorCode &status);
 
-#ifndef U_HIDE_DRAFT_API
     /**
      * Returns unit of length: point.
      * Caller owns returned value and must free it.
      * @param status ICU error code.
-     * @draft ICU 59
+     * @stable ICU 59
      */
     static MeasureUnit *createPoint(UErrorCode &status);
-#endif  /* U_HIDE_DRAFT_API */
 
     /**
      * Returns unit of length: yard.
diff --git a/icu4c/source/i18n/unicode/nounit.h b/icu4c/source/i18n/unicode/nounit.h
index 04fc84b..290e77e 100644
--- a/icu4c/source/i18n/unicode/nounit.h
+++ b/icu4c/source/i18n/unicode/nounit.h
@@ -10,17 +10,17 @@
 #ifndef __NOUNIT_H__
 #define __NOUNIT_H__
 
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "unicode/measunit.h"
 
 /**
  * \file
  * \brief C++ API: units for percent and permille
  */
 
-
-#include "unicode/measunit.h"
-
-#if !UCONFIG_NO_FORMATTING
-
 U_NAMESPACE_BEGIN
 
 #ifndef U_HIDE_DRAFT_API
diff --git a/icu4c/source/i18n/unicode/numberformatter.h b/icu4c/source/i18n/unicode/numberformatter.h
index 4a11c2f..3fbb33c 100644
--- a/icu4c/source/i18n/unicode/numberformatter.h
+++ b/icu4c/source/i18n/unicode/numberformatter.h
@@ -88,10 +88,6 @@
  * </ul>
  *
  * <p>
- * * The narrow format for currencies is not currently supported; this is a known issue that will be fixed in a
- * future version. See #11666 for more information.
- *
- * <p>
  * This enum is similar to {@link com.ibm.icu.text.MeasureFormat.FormatWidth}.
  *
  * @draft ICU 60
@@ -155,27 +151,122 @@
      *
      * @draft ICU 60
      */
-            UNUM_UNIT_WIDTH_HIDDEN,
+            UNUM_UNIT_WIDTH_HIDDEN
 
+#ifndef U_HIDE_INTERNAL_API
+    ,
     /**
      * One more than the highest UNumberUnitWidth value.
      *
      * @internal ICU 60: The numeric value may change over time; see ICU ticket #12420.
      */
             UNUM_UNIT_WIDTH_COUNT
+#endif  // U_HIDE_INTERNAL_API
 } UNumberUnitWidth;
 
 /**
- * An enum declaring how to denote positive and negative numbers. Example outputs when formatting 123 and -123 in
- * <em>en-US</em>:
+ * An enum declaring the strategy for when and how to display grouping separators (i.e., the
+ * separator, often a comma or period, after every 2-3 powers of ten). The choices are several
+ * pre-built strategies for different use cases that employ locale data whenever possible. Example
+ * outputs for 1234 and 1234567 in <em>en-IN</em>:
+ *
+ * <ul>
+ * <li>OFF: 1234 and 12345
+ * <li>MIN2: 1234 and 12,34,567
+ * <li>AUTO: 1,234 and 12,34,567
+ * <li>ON_ALIGNED: 1,234 and 12,34,567
+ * <li>THOUSANDS: 1,234 and 1,234,567
+ * </ul>
  *
  * <p>
+ * The default is AUTO, which displays grouping separators unless the locale data says that grouping
+ * is not customary. To force grouping for all numbers greater than 1000 consistently across locales,
+ * use ON_ALIGNED. On the other hand, to display grouping less frequently than the default, use MIN2
+ * or OFF. See the docs of each option for details.
+ *
+ * <p>
+ * Note: This enum specifies the strategy for grouping sizes. To set which character to use as the
+ * grouping separator, use the "symbols" setter.
+ *
+ * @draft ICU 61
+ */
+typedef enum UGroupingStrategy {
+    /**
+     * Do not display grouping separators in any locale.
+     *
+     * @draft ICU 61
+     */
+    UNUM_GROUPING_OFF,
+
+    /**
+     * Display grouping using locale defaults, except do not show grouping on values smaller than
+     * 10000 (such that there is a <em>minimum of two digits</em> before the first separator).
+     *
+     * <p>
+     * Note that locales may restrict grouping separators to be displayed only on 1 million or
+     * greater (for example, ee and hu) or disable grouping altogether (for example, bg currency).
+     *
+     * <p>
+     * Locale data is used to determine whether to separate larger numbers into groups of 2
+     * (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
+     *
+     * @draft ICU 61
+     */
+    UNUM_GROUPING_MIN2,
+
+    /**
+     * Display grouping using the default strategy for all locales. This is the default behavior.
+     *
+     * <p>
+     * Note that locales may restrict grouping separators to be displayed only on 1 million or
+     * greater (for example, ee and hu) or disable grouping altogether (for example, bg currency).
+     *
+     * <p>
+     * Locale data is used to determine whether to separate larger numbers into groups of 2
+     * (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
+     *
+     * @draft ICU 61
+     */
+    UNUM_GROUPING_AUTO,
+
+    /**
+     * Always display the grouping separator on values of at least 1000.
+     *
+     * <p>
+     * This option ignores the locale data that restricts or disables grouping, described in MIN2 and
+     * AUTO. This option may be useful to normalize the alignment of numbers, such as in a
+     * spreadsheet.
+     *
+     * <p>
+     * Locale data is used to determine whether to separate larger numbers into groups of 2
+     * (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
+     *
+     * @draft ICU 61
+     */
+    UNUM_GROUPING_ON_ALIGNED,
+
+    /**
+     * Use the Western defaults: groups of 3 and enabled for all numbers 1000 or greater. Do not use
+     * locale data for determining the grouping strategy.
+     *
+     * @draft ICU 61
+     */
+    UNUM_GROUPING_THOUSANDS
+
+} UGroupingStrategy;
+
+/**
+ * An enum declaring how to denote positive and negative numbers. Example outputs when formatting
+ * 123, 0, and -123 in <em>en-US</em>:
+ *
  * <ul>
- * <li>AUTO: "123", "-123"
- * <li>ALWAYS: "+123", "-123"
- * <li>NEVER: "123", "123"
- * <li>ACCOUNTING: "$123", "($123)"
- * <li>ACCOUNTING_ALWAYS: "+$123", "($123)"
+ * <li>AUTO: "123", "0", and "-123"
+ * <li>ALWAYS: "+123", "+0", and "-123"
+ * <li>NEVER: "123", "0", and "123"
+ * <li>ACCOUNTING: "$123", "$0", and "($123)"
+ * <li>ACCOUNTING_ALWAYS: "+$123", "+$0", and "($123)"
+ * <li>EXCEPT_ZERO: "+123", "0", and "-123"
+ * <li>ACCOUNTING_EXCEPT_ZERO: "+$123", "$0", and "($123)"
  * </ul>
  *
  * <p>
@@ -190,21 +281,22 @@
      *
      * @draft ICU 60
      */
-            UNUM_SIGN_AUTO,
+    UNUM_SIGN_AUTO,
 
     /**
-     * Show the minus sign on negative numbers and the plus sign on positive numbers.
+     * Show the minus sign on negative numbers and the plus sign on positive numbers, including zero.
+     * To hide the sign on zero, see {@link UNUM_SIGN_EXCEPT_ZERO}.
      *
      * @draft ICU 60
      */
-            UNUM_SIGN_ALWAYS,
+    UNUM_SIGN_ALWAYS,
 
     /**
      * Do not show the sign on positive or negative numbers.
      *
      * @draft ICU 60
      */
-            UNUM_SIGN_NEVER,
+    UNUM_SIGN_NEVER,
 
     /**
      * Use the locale-dependent accounting format on negative numbers, and do not show the sign on positive numbers.
@@ -220,22 +312,44 @@
      *
      * @draft ICU 60
      */
-            UNUM_SIGN_ACCOUNTING,
+    UNUM_SIGN_ACCOUNTING,
 
     /**
-     * Use the locale-dependent accounting format on negative numbers, and show the plus sign on positive numbers.
-     * For more information on the accounting format, see the ACCOUNTING sign display strategy.
+     * Use the locale-dependent accounting format on negative numbers, and show the plus sign on
+     * positive numbers, including zero. For more information on the accounting format, see the
+     * ACCOUNTING sign display strategy. To hide the sign on zero, see
+     * {@link UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO}.
      *
      * @draft ICU 60
      */
-            UNUM_SIGN_ACCOUNTING_ALWAYS,
+    UNUM_SIGN_ACCOUNTING_ALWAYS,
 
     /**
+     * Show the minus sign on negative numbers and the plus sign on positive numbers. Do not show a
+     * sign on zero.
+     *
+     * @draft ICU 61
+     */
+    UNUM_SIGN_EXCEPT_ZERO,
+
+    /**
+     * Use the locale-dependent accounting format on negative numbers, and show the plus sign on
+     * positive numbers. Do not show a sign on zero. For more information on the accounting format,
+     * see the ACCOUNTING sign display strategy.
+     *
+     * @draft ICU 61
+     */
+    UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO
+
+#ifndef U_HIDE_INTERNAL_API
+    ,
+    /**
      * One more than the highest UNumberSignDisplay value.
      *
      * @internal ICU 60: The numeric value may change over time; see ICU ticket #12420.
      */
-            UNUM_SIGN_COUNT
+    UNUM_SIGN_COUNT
+#endif  // U_HIDE_INTERNAL_API
 } UNumberSignDisplay;
 
 /**
@@ -261,14 +375,17 @@
      *
      * @draft ICU 60
      */
-            UNUM_DECIMAL_SEPARATOR_ALWAYS,
+            UNUM_DECIMAL_SEPARATOR_ALWAYS
 
+#ifndef U_HIDE_INTERNAL_API
+    ,
     /**
      * One more than the highest UNumberDecimalSeparatorDisplay value.
      *
      * @internal ICU 60: The numeric value may change over time; see ICU ticket #12420.
      */
             UNUM_DECIMAL_SEPARATOR_COUNT
+#endif  // U_HIDE_INTERNAL_API
 } UNumberDecimalMarkDisplay;
 
 U_NAMESPACE_BEGIN namespace number {  // icu::number
@@ -283,11 +400,27 @@
 class FractionRounder;
 class CurrencyRounder;
 class IncrementRounder;
-class Grouper;
 class IntegerWidth;
 
 namespace impl {
 
+#ifndef U_HIDE_INTERNAL_API
+/**
+ * Datatype for minimum/maximum fraction digits. Must be able to hold kMaxIntFracSig.
+ *
+ * @internal
+ */
+typedef int16_t digits_t;
+
+/**
+ * Use a default threshold of 3. This means that the third time .format() is called, the data structures get built
+ * using the "safe" code path. The first two calls to .format() will trigger the unsafe code path.
+ *
+ * @internal
+ */
+static constexpr int32_t DEFAULT_THRESHOLD = 3;
+#endif  // U_HIDE_INTERNAL_API
+
 // Forward declarations:
 class Padder;
 struct MacroProps;
@@ -471,7 +604,7 @@
         struct ScientificSettings {
             int8_t fEngineeringInterval;
             bool fRequireMinInt;
-            int8_t fMinExponentDigits;
+            impl::digits_t fMinExponentDigits;
             UNumberSignDisplay fExponentSignDisplay;
         } scientific;
 
@@ -786,14 +919,14 @@
     union RounderUnion {
         struct FractionSignificantSettings {
             // For RND_FRACTION, RND_SIGNIFICANT, and RND_FRACTION_SIGNIFICANT
-            int8_t fMinFrac;
-            int8_t fMaxFrac;
-            int8_t fMinSig;
-            int8_t fMaxSig;
+            impl::digits_t fMinFrac;
+            impl::digits_t fMaxFrac;
+            impl::digits_t fMinSig;
+            impl::digits_t fMaxSig;
         } fracSig;
         struct IncrementSettings {
             double fIncrement;
-            int32_t fMinFrac;
+            impl::digits_t fMinFrac;
         } increment; // For RND_INCREMENT
         UCurrencyUsage currencyUsage; // For RND_CURRENCY
         UErrorCode errorCode; // For RND_ERROR
@@ -836,6 +969,20 @@
     /** Version of {@link #apply} that obeys minInt constraints. Used for scientific notation compatibility mode. */
     void apply(impl::DecimalQuantity &value, int32_t minInt, UErrorCode status);
 
+    /**
+     * Rounding endpoint used by Engineering and Compact notation. Chooses the most appropriate multiplier (magnitude
+     * adjustment), applies the adjustment, rounds, and returns the chosen multiplier.
+     *
+     * <p>
+     * In most cases, this is simple. However, when rounding the number causes it to cross a multiplier boundary, we
+     * need to re-do the rounding. For example, to display 999,999 in Engineering notation with 2 sigfigs, first you
+     * guess the multiplier to be -3. However, then you end up getting 1000E3, which is not the correct output. You then
+     * change your multiplier to be -6, and you get 1.0E6, which is correct.
+     *
+     * @param input The quantity to process.
+     * @param producer Function to call to return a multiplier based on a magnitude.
+     * @return The number of orders of magnitude the input was adjusted by this method.
+     */
     int32_t
     chooseMultiplierAndApply(impl::DecimalQuantity &input, const impl::MultiplierProducer &producer,
                              UErrorCode &status);
@@ -1003,53 +1150,6 @@
 };
 
 /**
- * @internal This API is a technical preview.  It is likely to change in an upcoming release.
- */
-class U_I18N_API Grouper : public UMemory {
-  public:
-    /**
-     * @internal This API is a technical preview.  It is likely to change in an upcoming release.
-     */
-    static Grouper defaults();
-
-    /**
-     * @internal This API is a technical preview.  It is likely to change in an upcoming release.
-     */
-    static Grouper minTwoDigits();
-
-    /**
-     * @internal This API is a technical preview.  It is likely to change in an upcoming release.
-     */
-    static Grouper none();
-
-  private:
-    int8_t fGrouping1; // -3 means "bogus"; -2 means "needs locale data"; -1 means "no grouping"
-    int8_t fGrouping2;
-    bool fMin2;
-
-    Grouper(int8_t grouping1, int8_t grouping2, bool min2)
-            : fGrouping1(grouping1), fGrouping2(grouping2), fMin2(min2) {}
-
-    Grouper() : fGrouping1(-3) {};
-
-    bool isBogus() const {
-        return fGrouping1 == -3;
-    }
-
-    /** NON-CONST: mutates the current instance. */
-    void setLocaleData(const impl::ParsedPatternInfo &patternInfo);
-
-    bool groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const;
-
-    // To allow MacroProps/MicroProps to initialize empty instances:
-    friend struct impl::MacroProps;
-    friend struct impl::MicroProps;
-
-    // To allow NumberFormatterImpl to access isBogus() and perform other operations:
-    friend class impl::NumberFormatterImpl;
-};
-
-/**
  * A class that defines the strategy for padding and truncating integers before the decimal separator.
  *
  * <p>
@@ -1080,7 +1180,8 @@
      * For example, with maxInt=3, the number 1234 will get printed as "234".
      *
      * @param maxInt
-     *            The maximum number of places before the decimal separator.
+     *            The maximum number of places before the decimal separator. maxInt == -1 means no
+     *            truncation.
      * @return An IntegerWidth for passing to the NumberFormatter integerWidth() setter.
      * @draft ICU 60
      * @see NumberFormatter
@@ -1090,14 +1191,14 @@
   private:
     union {
         struct {
-            int8_t fMinInt;
-            int8_t fMaxInt;
+            impl::digits_t fMinInt;
+            impl::digits_t fMaxInt;
         } minMaxInt;
         UErrorCode errorCode;
     } fUnion;
     bool fHasError = false;
 
-    IntegerWidth(int8_t minInt, int8_t maxInt);
+    IntegerWidth(impl::digits_t minInt, impl::digits_t maxInt);
 
     IntegerWidth(UErrorCode errorCode) { // NOLINT
         fUnion.errorCode = errorCode;
@@ -1132,14 +1233,7 @@
 
 namespace impl {
 
-/**
- * Use a default threshold of 3. This means that the third time .format() is called, the data structures get built
- * using the "safe" code path. The first two calls to .format() will trigger the unsafe code path.
- *
- * @internal
- */
-static constexpr int32_t DEFAULT_THRESHOLD = 3;
-
+// Do not enclose entire SymbolsWrapper with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
 /** @internal */
 class U_I18N_API SymbolsWrapper : public UMemory {
   public:
@@ -1155,6 +1249,7 @@
     /** @internal */
     SymbolsWrapper &operator=(const SymbolsWrapper &other);
 
+#ifndef U_HIDE_INTERNAL_API
     /**
      * The provided object is copied, but we do not adopt it.
      * @internal
@@ -1202,6 +1297,7 @@
         }
         return FALSE;
     }
+#endif  // U_HIDE_INTERNAL_API
 
   private:
     enum SymbolsPointerType {
@@ -1218,14 +1314,72 @@
     void doCleanup();
 };
 
+// Do not enclose entire Grouper with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
+/** @internal */
+class U_I18N_API Grouper : public UMemory {
+  public:
+#ifndef U_HIDE_INTERNAL_API
+    /** @internal */
+    static Grouper forStrategy(UGroupingStrategy grouping);
+
+    // Future: static Grouper forProperties(DecimalFormatProperties& properties);
+
+    /** @internal */
+    Grouper(int16_t grouping1, int16_t grouping2, int16_t minGrouping)
+            : fGrouping1(grouping1), fGrouping2(grouping2), fMinGrouping(minGrouping) {}
+#endif  // U_HIDE_INTERNAL_API
+
+  private:
+    /**
+     * The grouping sizes, with the following special values:
+     * <ul>
+     * <li>-1 = no grouping
+     * <li>-2 = needs locale data
+     * <li>-4 = fall back to Western grouping if not in locale
+     * </ul>
+     */
+    int16_t fGrouping1;
+    int16_t fGrouping2;
+
+    /**
+     * The minimum gropuing size, with the following special values:
+     * <ul>
+     * <li>-2 = needs locale data
+     * <li>-3 = no less than 2
+     * </ul>
+     */
+    int16_t fMinGrouping;
+
+    Grouper() : fGrouping1(-3) {};
+
+    bool isBogus() const {
+        return fGrouping1 == -3;
+    }
+
+    /** NON-CONST: mutates the current instance. */
+    void setLocaleData(const impl::ParsedPatternInfo &patternInfo, const Locale& locale);
+
+    bool groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const;
+
+    // To allow MacroProps/MicroProps to initialize empty instances:
+    friend struct MacroProps;
+    friend struct MicroProps;
+
+    // To allow NumberFormatterImpl to access isBogus() and perform other operations:
+    friend class NumberFormatterImpl;
+};
+
+// Do not enclose entire Padder with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
 /** @internal */
 class U_I18N_API Padder : public UMemory {
   public:
+#ifndef U_HIDE_INTERNAL_API
     /** @internal */
     static Padder none();
 
     /** @internal */
     static Padder codePoints(UChar32 cp, int32_t targetWidth, UNumberFormatPadPosition position);
+#endif  // U_HIDE_INTERNAL_API
 
   private:
     UChar32 fWidth;  // -3 = error; -2 = bogus; -1 = no padding
@@ -1275,6 +1429,7 @@
     friend class impl::NumberFormatterImpl;
 };
 
+// Do not enclose entire MacroProps with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
 /** @internal */
 struct U_I18N_API MacroProps : public UMemory {
     /** @internal */
@@ -1284,6 +1439,9 @@
     MeasureUnit unit; // = NoUnit::base();
 
     /** @internal */
+    MeasureUnit perUnit; // = NoUnit::base();
+
+    /** @internal */
     Rounder rounder;  // = Rounder();  (bogus)
 
     /** @internal */
@@ -1375,29 +1533,30 @@
      * <li>Percent: "12.3%"
      * </ul>
      *
-     * <p>
      * All units will be properly localized with locale data, and all units are compatible with notation styles,
      * rounding strategies, and other number formatter settings.
      *
-     * <p>
-     * Pass this method any instance of {@link MeasureUnit}. For units of measure:
+     * Pass this method any instance of {@link MeasureUnit}. For units of measure (which often involve the
+     * factory methods that return a pointer):
      *
      * <pre>
-     * NumberFormatter.with().adoptUnit(MeasureUnit::createMeter(status))
+     * NumberFormatter::with().adoptUnit(MeasureUnit::createMeter(status))
      * </pre>
      *
      * Currency:
      *
      * <pre>
-     * NumberFormatter.with()::unit(CurrencyUnit(u"USD", status))
+     * NumberFormatter::with().unit(CurrencyUnit(u"USD", status))
      * </pre>
      *
      * Percent:
      *
      * <pre>
-     * NumberFormatter.with()::unit(NoUnit.percent())
+     * NumberFormatter::with().unit(NoUnit.percent())
      * </pre>
      *
+     * See {@link #perUnit} for information on how to format strings like "5 meters per second".
+     *
      * The default is to render without units (equivalent to NoUnit.base()).
      *
      * @param unit
@@ -1406,22 +1565,65 @@
      * @see MeasureUnit
      * @see Currency
      * @see NoUnit
+     * @see #perUnit
      * @draft ICU 60
      */
     Derived unit(const icu::MeasureUnit &unit) const;
 
     /**
      * Like unit(), but takes ownership of a pointer.  Convenient for use with the MeasureFormat factory
-     * methods, which return pointers that need ownership.
+     * methods, which return pointers that need ownership.  Example:
+     *
+     * <pre>
+     * NumberFormatter::with().adoptUnit(MeasureUnit::createMeter(status))
+     * </pre>
      *
      * @param unit
-     * The unit to render.
+     *            The unit to render.
      * @return The fluent chain.
      * @see #unit
      * @see MeasureUnit
      * @draft ICU 60
      */
-    Derived adoptUnit(const icu::MeasureUnit *unit) const;
+    Derived adoptUnit(icu::MeasureUnit *unit) const;
+
+    /**
+     * Sets a unit to be used in the denominator. For example, to format "3 m/s", pass METER to the unit and SECOND to
+     * the perUnit.
+     *
+     * Pass this method any instance of {@link MeasureUnit}.  Since MeasureUnit factory methods return pointers, the
+     * {@link #adoptPerUnit} version of this method is often more useful.
+     *
+     * The default is not to display any unit in the denominator.
+     *
+     * If a per-unit is specified without a primary unit via {@link #unit}, the behavior is undefined.
+     *
+     * @param perUnit
+     *            The unit to render in the denominator.
+     * @return The fluent chain
+     * @see #unit
+     * @draft ICU 61
+     */
+    Derived perUnit(const icu::MeasureUnit &perUnit) const;
+
+    /**
+     * Like perUnit(), but takes ownership of a pointer.  Convenient for use with the MeasureFormat factory
+     * methods, which return pointers that need ownership.  Example:
+     *
+     * <pre>
+     * NumberFormatter::with()
+     *      .adoptUnit(MeasureUnit::createMeter(status))
+     *      .adoptPerUnit(MeasureUnit::createSecond(status))
+     * </pre>
+     *
+     * @param perUnit
+     *            The unit to render in the denominator.
+     * @return The fluent chain.
+     * @see #perUnit
+     * @see MeasureUnit
+     * @draft ICU 61
+     */
+    Derived adoptPerUnit(icu::MeasureUnit *perUnit) const;
 
     /**
      * Specifies the rounding strategy to use when formatting numbers.
@@ -1456,8 +1658,6 @@
      */
     Derived rounding(const Rounder &rounder) const;
 
-#ifndef U_HIDE_INTERNAL_API
-
     /**
      * Specifies the grouping strategy to use when formatting numbers.
      *
@@ -1471,25 +1671,21 @@
      * The exact grouping widths will be chosen based on the locale.
      *
      * <p>
-     * Pass this method the return value of one of the factory methods on {@link Grouper}. For example:
+     * Pass this method an element from the {@link UGroupingStrategy} enum. For example:
      *
      * <pre>
-     * NumberFormatter::with().grouping(Grouper::min2())
+     * NumberFormatter::with().grouping(UNUM_GROUPING_MIN2)
      * </pre>
      *
-     * The default is to perform grouping without concern for the minimum grouping digits.
+     * The default is to perform grouping according to locale data; most locales, but not all locales,
+     * enable it by default.
      *
-     * @param grouper
+     * @param strategy
      *            The grouping strategy to use.
      * @return The fluent chain.
-     * @see Grouper
-     * @see Notation
-     * @internal
-     * @internal ICU 60: This API is technical preview.
+     * @draft ICU 61
      */
-    Derived grouping(const Grouper &grouper) const;
-
-#endif  /* U_HIDE_INTERNAL_API */
+    Derived grouping(const UGroupingStrategy &strategy) const;
 
     /**
      * Specifies the minimum and maximum number of digits to render before the decimal mark.
@@ -1592,7 +1788,7 @@
      * @see NumberingSystem
      * @draft ICU 60
      */
-    Derived adoptSymbols(const NumberingSystem *symbols) const;
+    Derived adoptSymbols(NumberingSystem *symbols) const;
 
     /**
      * Sets the width of the unit (measure unit or currency).  Most common values:
diff --git a/icu4c/source/i18n/unicode/numfmt.h b/icu4c/source/i18n/unicode/numfmt.h
index 68be021..3937985 100644
--- a/icu4c/source/i18n/unicode/numfmt.h
+++ b/icu4c/source/i18n/unicode/numfmt.h
@@ -28,7 +28,7 @@
 
 /**
  * \file
- * \brief C++ API: Abstract base class for all number formats.
+ * \brief C++ API: Compatibility APIs for number formatting.
  */
 
 #if !UCONFIG_NO_FORMATTING
@@ -53,16 +53,16 @@
 #endif
 
 /**
+ * <p><strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * numberformatter.h fits their use case.  Although not deprecated, this header
+ * is provided for backwards compatibility only.
+ * <hr/>
  *
  * Abstract base class for all number formats.  Provides interface for
  * formatting and parsing a number.  Also provides methods for
  * determining which locales have number formats, and what their names
  * are.
  *
- * <p><strong>NOTE:</strong> Starting in ICU 60, there is a new set of APIs for localized number
- * formatting that are designed to be an improvement over DecimalFormat.  New users are discouraged
- * from using DecimalFormat.  For more information, see numberformatter.h.
- *
  * \headerfile unicode/numfmt.h "unicode/numfmt.h"
  * <P>
  * NumberFormat helps you to format and parse numbers for any locale.
@@ -708,6 +708,9 @@
     /**
      * Create a default style NumberFormat for the current default locale.
      * The default formatting style is locale dependent.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @stable ICU 2.0
      */
     static NumberFormat* U_EXPORT2 createInstance(UErrorCode&);
@@ -716,6 +719,9 @@
      * Create a default style NumberFormat for the specified locale.
      * The default formatting style is locale dependent.
      * @param inLocale    the given locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @stable ICU 2.0
      */
     static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale,
@@ -723,6 +729,9 @@
 
     /**
      * Create a specific style NumberFormat for the specified locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @param desiredLocale    the given locale.
      * @param style            the given style.
      * @param errorCode        Output param filled with success/failure status.
@@ -759,12 +768,18 @@
 
     /**
      * Returns a currency format for the current default locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @stable ICU 2.0
      */
     static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&);
 
     /**
      * Returns a currency format for the specified locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @param inLocale    the given locale.
      * @stable ICU 2.0
      */
@@ -773,12 +788,18 @@
 
     /**
      * Returns a percentage format for the current default locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @stable ICU 2.0
      */
     static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&);
 
     /**
      * Returns a percentage format for the specified locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @param inLocale    the given locale.
      * @stable ICU 2.0
      */
@@ -787,12 +808,18 @@
 
     /**
      * Returns a scientific format for the current default locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @stable ICU 2.0
      */
     static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&);
 
     /**
      * Returns a scientific format for the specified locale.
+     * <p>
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
      * @param inLocale    the given locale.
      * @stable ICU 2.0
      */
diff --git a/icu4c/source/i18n/unicode/simpletz.h b/icu4c/source/i18n/unicode/simpletz.h
index 5b80263..3ae0807 100644
--- a/icu4c/source/i18n/unicode/simpletz.h
+++ b/icu4c/source/i18n/unicode/simpletz.h
@@ -647,7 +647,8 @@
      * Sets the amount of time in ms that the clock is advanced during DST.
      * @param millisSavedDuringDST the number of milliseconds the time is
      * advanced with respect to standard time when the daylight savings rules
-     * are in effect. A positive number, typically one hour (3600000).
+     * are in effect. Typically one hour (+3600000). The amount could be negative,
+     * but not 0.
      * @param status  An UErrorCode to receive the status.
      * @stable ICU 2.0
      */
@@ -657,7 +658,8 @@
      * Returns the amount of time in ms that the clock is advanced during DST.
      * @return the number of milliseconds the time is
      * advanced with respect to standard time when the daylight savings rules
-     * are in effect. A positive number, typically one hour (3600000).
+     * are in effect. Typically one hour (+3600000). The amount could be negative,
+     * but not 0.
      * @stable ICU 2.0
      */
     virtual int32_t getDSTSavings(void) const;
diff --git a/icu4c/source/i18n/unicode/udatpg.h b/icu4c/source/i18n/unicode/udatpg.h
index 76baa3d..beae756 100644
--- a/icu4c/source/i18n/unicode/udatpg.h
+++ b/icu4c/source/i18n/unicode/udatpg.h
@@ -95,6 +95,21 @@
     UDATPG_FIELD_COUNT
 } UDateTimePatternField;
 
+#ifndef U_HIDE_DRAFT_API
+/**
+ * Field display name width constants for udatpg_getFieldDisplayName().
+ * @draft ICU 61
+ */
+typedef enum UDateTimePGDisplayWidth {
+    /** @draft ICU 61 */
+    UDATPG_WIDE,
+    /** @draft ICU 61 */
+    UDATPG_ABBREVIATED,
+    /** @draft ICU 61 */
+    UDATPG_NARROW
+} UDateTimePGDisplayWidth;
+#endif  // U_HIDE_DRAFT_API
+
 /**
  * Masks to control forcing the length of specified fields in the returned
  * pattern to match those in the skeleton (when this would not happen
@@ -410,12 +425,14 @@
 
 /**
  * Getter corresponding to setAppendItemNames. Values below 0 or at or above
- * UDATPG_FIELD_COUNT are illegal arguments.
+ * UDATPG_FIELD_COUNT are illegal arguments. Note: The more general function
+ * for getting date/time field display names is udatpg_getFieldDisplayName.
  *
  * @param dtpg   a pointer to UDateTimePatternGenerator.
  * @param field  UDateTimePatternField, such as UDATPG_ERA_FIELD
  * @param pLength A pointer that will receive the length of the name for field.
  * @return name for field
+ * @see udatpg_getFieldDisplayName
  * @stable ICU 3.8
  */
 U_STABLE const UChar * U_EXPORT2
@@ -423,6 +440,40 @@
                          UDateTimePatternField field,
                          int32_t *pLength);
 
+#ifndef U_HIDE_DRAFT_API
+/**
+ * The general interface to get a display name for a particular date/time field,
+ * in one of several possible display widths.
+ *
+ * @param dtpg
+ *          A pointer to the UDateTimePatternGenerator object with the localized
+ *          display names.
+ * @param field
+ *          The desired UDateTimePatternField, such as UDATPG_ERA_FIELD.
+ * @param width
+ *          The desired UDateTimePGDisplayWidth, such as UDATPG_ABBREVIATED.
+ * @param fieldName
+ *          A pointer to a buffer to receive the NULL-terminated display name. If the name
+ *          fits into fieldName but cannot be  NULL-terminated (length == capacity) then
+ *          the error code is set to U_STRING_NOT_TERMINATED_WARNING. If the name doesn't
+ *          fit into fieldName then the error code is set to U_BUFFER_OVERFLOW_ERROR.
+ * @param capacity
+ *          The size of fieldName (in UChars).
+ * @param pErrorCode
+ *          A pointer to a UErrorCode to receive any errors
+ * @return
+ *         The full length of the name; if greater than capacity, fieldName contains a
+ *         truncated result.
+ * @draft ICU 61
+ */
+U_DRAFT int32_t U_EXPORT2
+udatpg_getFieldDisplayName(const UDateTimePatternGenerator *dtpg,
+                           UDateTimePatternField field,
+                           UDateTimePGDisplayWidth width,
+                           UChar *fieldName, int32_t capacity,
+                           UErrorCode *pErrorCode);
+#endif  // U_HIDE_DRAFT_API
+
 /**
  * The DateTimeFormat is a message format pattern used to compose date and
  * time patterns. The default pattern in the root locale is "{1} {0}", where
diff --git a/icu4c/source/i18n/unicode/unum.h b/icu4c/source/i18n/unicode/unum.h
index 2ab09b5..ff251ff 100644
--- a/icu4c/source/i18n/unicode/unum.h
+++ b/icu4c/source/i18n/unicode/unum.h
@@ -32,6 +32,9 @@
  * \brief C API: NumberFormat
  *
  * <h2> Number Format C API </h2>
+ * 
+ * <p><strong>IMPORTANT:</strong> New users with C++ capabilities are
+ * strongly encouraged to see if numberformatter.h fits their use case.
  *
  * Number Format C API  Provides functions for
  * formatting and parsing a number.  Also provides methods for
@@ -559,7 +562,6 @@
             UFieldPosition  *pos, /* 0 if ignore */
             UErrorCode*     status);
 
-#ifndef U_HIDE_DRAFT_API
 /**
 * Format a double using a UNumberFormat according to the UNumberFormat's locale,
 * and initialize a UFieldPositionIterator that enumerates the subcomponents of
@@ -600,9 +602,9 @@
 * @see unum_parseDouble
 * @see UFieldPositionIterator
 * @see UNumberFormatFields
-* @draft ICU 59
+* @stable ICU 59
 */
-U_DRAFT int32_t U_EXPORT2
+U_STABLE int32_t U_EXPORT2
 unum_formatDoubleForFields(const UNumberFormat* format,
                            double number,
                            UChar* result,
@@ -610,7 +612,6 @@
                            UFieldPositionIterator* fpositer,
                            UErrorCode* status);
 
-#endif  /* U_HIDE_DRAFT_API */
 
 /**
 * Format a decimal number using a UNumberFormat.
diff --git a/icu4c/source/i18n/unicode/upluralrules.h b/icu4c/source/i18n/unicode/upluralrules.h
index 99d93a4..690846b 100644
--- a/icu4c/source/i18n/unicode/upluralrules.h
+++ b/icu4c/source/i18n/unicode/upluralrules.h
@@ -175,7 +175,6 @@
 
 #endif  /* U_HIDE_INTERNAL_API */
 
-#ifndef U_HIDE_DRAFT_API
 /**
  * Creates a string enumeration of all plural rule keywords used in this
  * UPluralRules object. The rule "other" is always present by default.
@@ -184,12 +183,11 @@
  * @param status A pointer to a UErrorCode to receive any errors.
  * @return a string enumeration over plural rule keywords, or NULL
  * upon error. The caller is responsible for closing the result.
- * @draft ICU 59
+ * @stable ICU 59
  */
-U_DRAFT UEnumeration* U_EXPORT2
+U_STABLE UEnumeration* U_EXPORT2
 uplrules_getKeywords(const UPluralRules *uplrules,
                      UErrorCode *status);
-#endif  /* U_HIDE_DRAFT_API */
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
 
diff --git a/icu4c/source/i18n/unicode/utrans.h b/icu4c/source/i18n/unicode/utrans.h
index d0f05cf..697681a 100644
--- a/icu4c/source/i18n/unicode/utrans.h
+++ b/icu4c/source/i18n/unicode/utrans.h
@@ -382,7 +382,7 @@
 U_STABLE void U_EXPORT2 
 utrans_trans(const UTransliterator* trans,
              UReplaceable* rep,
-             UReplaceableCallbacks* repFunc,
+             const UReplaceableCallbacks* repFunc,
              int32_t start,
              int32_t* limit,
              UErrorCode* status);
@@ -433,7 +433,7 @@
 U_STABLE void U_EXPORT2 
 utrans_transIncremental(const UTransliterator* trans,
                         UReplaceable* rep,
-                        UReplaceableCallbacks* repFunc,
+                        const UReplaceableCallbacks* repFunc,
                         UTransPosition* pos,
                         UErrorCode* status);
 
diff --git a/icu4c/source/i18n/uregex.cpp b/icu4c/source/i18n/uregex.cpp
index 0c26bdf..12f3689 100644
--- a/icu4c/source/i18n/uregex.cpp
+++ b/icu4c/source/i18n/uregex.cpp
@@ -1465,8 +1465,10 @@
 
         int32_t groupNum  = 0;
         U_ASSERT(c == DOLLARSIGN);
-        UChar32 c32;
-        U16_GET(replacementText, 0, replIdx, replacementLength, c32);
+        UChar32 c32 = -1;
+        if (replIdx < replacementLength) {
+            U16_GET(replacementText, 0, replIdx, replacementLength, c32);
+        }
         if (u_isdigit(c32)) {
             int32_t numDigits = 0;
             int32_t numCaptureGroups = m->fPattern->fGroupMap->size();
diff --git a/icu4c/source/i18n/utrans.cpp b/icu4c/source/i18n/utrans.cpp
index 5124833..29013ea 100644
--- a/icu4c/source/i18n/utrans.cpp
+++ b/icu4c/source/i18n/utrans.cpp
@@ -41,12 +41,12 @@
 class ReplaceableGlue : public Replaceable {
 
     UReplaceable *rep;
-    UReplaceableCallbacks *func;
+    const UReplaceableCallbacks *func;
 
 public:
 
     ReplaceableGlue(UReplaceable *replaceable,
-                    UReplaceableCallbacks *funcCallback);
+                    const UReplaceableCallbacks *funcCallback);
 
     virtual ~ReplaceableGlue();
 
@@ -88,7 +88,7 @@
 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ReplaceableGlue)
 
 ReplaceableGlue::ReplaceableGlue(UReplaceable *replaceable,
-                                 UReplaceableCallbacks *funcCallback)
+                                 const UReplaceableCallbacks *funcCallback)
   : Replaceable()
 {
     this->rep = replaceable;
@@ -398,7 +398,7 @@
 U_CAPI void U_EXPORT2
 utrans_trans(const UTransliterator* trans,
              UReplaceable* rep,
-             UReplaceableCallbacks* repFunc,
+             const UReplaceableCallbacks* repFunc,
              int32_t start,
              int32_t* limit,
              UErrorCode* status) {
@@ -418,7 +418,7 @@
 U_CAPI void U_EXPORT2
 utrans_transIncremental(const UTransliterator* trans,
                         UReplaceable* rep,
-                        UReplaceableCallbacks* repFunc,
+                        const UReplaceableCallbacks* repFunc,
                         UTransPosition* pos,
                         UErrorCode* status) {
 
diff --git a/icu4c/source/io/io.vcxproj b/icu4c/source/io/io.vcxproj
index 375b716..ac7d6f6 100644
--- a/icu4c/source/io/io.vcxproj
+++ b/icu4c/source/io/io.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{C2B04507-2521-4801-BF0D-5FD79D6D518C}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,42 +47,39 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>U_IO_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+    <ResourceCompile>
+      <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ResourceCompile>
+    <Link>
+      <BaseAddress>0x4ab00000</BaseAddress>
+    </Link>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib\icuio.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_IO_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/icuio.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin\icuio60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin\icuio61.dll</OutputFile>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib\icuio.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <BaseAddress>0x4ab00000</BaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
@@ -126,43 +88,24 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib\icuio.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_IO_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/icuio.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin\icuio60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin\icuio61d.dll</OutputFile>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\..\..\lib\icuiod.pdb</ProgramDatabaseFile>
-      <BaseAddress>0x4ab00000</BaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
@@ -171,85 +114,46 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib64\icuio.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_IO_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/icuio.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin64\icuio60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin64\icuio61.dll</OutputFile>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib64\icuio.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <BaseAddress>0x4ab00000</BaseAddress>
       <ImportLibrary>..\..\lib64\icuio.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib64\icuio.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_IO_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/icuio.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin64\icuio60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin64\icuio61d.dll</OutputFile>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\..\..\lib64\icuiod.pdb</ProgramDatabaseFile>
-      <BaseAddress>0x4ab00000</BaseAddress>
       <ImportLibrary>..\..\lib64\icuiod.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -267,10 +171,7 @@
     <ClCompile Include="uscanf_p.cpp" />
     <ClCompile Include="ustdio.cpp" />
     <ClCompile Include="ustream.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
@@ -280,49 +181,13 @@
     <ClInclude Include="ufmt_cmn.h" />
     <ClInclude Include="uprintf.h" />
     <ClInclude Include="uscanf.h" />
-    <CustomBuild Include="unicode\ustdio.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
-    <CustomBuild Include="unicode\ustream.h">
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">copy "%(FullPath)" ..\..\include\unicode
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\include\unicode\%(Filename)%(Extension);%(Outputs)</Outputs>
-    </CustomBuild>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="io.rc" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <!-- The following import will copy all of the header files from this projects 'unicode' folder. -->
+  <Import Project="$(SolutionDir)\Windows.CopyUnicodeHeaderFiles.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/layoutex/layout/plruns.h b/icu4c/source/layoutex/layout/plruns.h
index 2a7a397..6cbece8 100644
--- a/icu4c/source/layoutex/layout/plruns.h
+++ b/icu4c/source/layoutex/layout/plruns.h
@@ -20,14 +20,17 @@
 
 /**
  * Opaque datatype representing an array of font runs
+ * @internal
  */
 typedef void pl_fontRuns;
 /**
  * Opaque datatype representing an array of value runs
+ * @internal
  */
 typedef void pl_valueRuns;
 /**
  * Opaque datatype representing an array of locale runs
+ * @internal
  */
 typedef void pl_localeRuns;
 
diff --git a/icu4c/source/layoutex/layoutex.vcxproj b/icu4c/source/layoutex/layoutex.vcxproj
index 63fec11..74ea3c0 100644
--- a/icu4c/source/layoutex/layoutex.vcxproj
+++ b/icu4c/source/layoutex/layoutex.vcxproj
@@ -1,51 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{37FC2C7F-1904-4811-8955-2F478830EAD1}</ProjectGuid>
     <RootNamespace>layoutex</RootNamespace>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,41 +48,36 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+    <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>U_LAYOUTEX_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+    <Link>
+      <BaseAddress>0x4ac80000</BaseAddress>
+    </Link>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib\iculx.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_LAYOUTEX_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/layoutex.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin\iculx60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin\iculx61.dll</OutputFile>
+      <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib\iculx.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <BaseAddress>0x4ac80000</BaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
@@ -125,42 +86,25 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib\iculxd.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_LAYOUTEX_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
       <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/layoutex.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin\iculx60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin\iculx61d.dll</OutputFile>
+      <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\..\..\lib\iculxd.pdb</ProgramDatabaseFile>
-      <BaseAddress>0x4ac80000</BaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
@@ -169,99 +113,61 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib64\iculx.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_LAYOUTEX_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/layoutex.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin64\iculx60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin64\iculx61.dll</OutputFile>
+      <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib64\iculx.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <BaseAddress>0x4ac80000</BaseAddress>
       <ImportLibrary>..\..\lib64\iculx.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\lib64\iculxd.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_LAYOUTEX_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
       <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/layoutex.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\bin64\iculx60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin64\iculx61d.dll</OutputFile>
+      <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\..\..\lib64\iculxd.pdb</ProgramDatabaseFile>
-      <BaseAddress>0x4ac80000</BaseAddress>
       <ImportLibrary>..\..\lib64\iculxd.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="LXUtilities.cpp" />
     <ClCompile Include="ParagraphLayout.cpp" />
     <ClCompile Include="playout.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
     </ClCompile>
     <ClCompile Include="plruns.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
     </ClCompile>
     <ClCompile Include="RunArrays.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
@@ -325,17 +231,10 @@
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="layoutex.rc">
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\common</AdditionalIncludeDirectories>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\common</AdditionalIncludeDirectories>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\common</AdditionalIncludeDirectories>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\common</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\common</AdditionalIncludeDirectories>
     </ResourceCompile>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
     <ProjectReference Include="..\layout\layout.vcxproj">
       <Project>{c920062a-0647-4553-a3b2-37c58065664b}</Project>
       <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
@@ -344,4 +243,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/all/all.sln b/icu4c/source/samples/all/all.sln
index 7020e4c..fb4f726 100644
--- a/icu4c/source/samples/all/all.sln
+++ b/icu4c/source/samples/all/all.sln
@@ -1,5 +1,7 @@
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27130.2036
+MinimumVisualStudioVersion = 10.0.40219.1
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "break", "..\break\break.vcxproj", "{DEEADF02-9C14-4854-A395-E505D2904D65}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cal", "..\cal\cal.vcxproj", "{F7659D77-09CF-4FE9-ACEE-927287AA9509}"
@@ -10,10 +12,6 @@
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "datefmt", "..\datefmt\datefmt.vcxproj", "{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "layout", "..\layout\layout.vcxproj", "{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "legacy", "..\legacy\legacy.vcxproj", "{57F56795-1802-4605-88A0-013AAE9998F6}"
-EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msgfmt", "..\msgfmt\msgfmt.vcxproj", "{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "numfmt", "..\numfmt\numfmt.vcxproj", "{721FBD47-E458-4C35-90DA-FF192907D5E2}"
@@ -56,224 +54,216 @@
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
 		Debug|x64 = Debug|x64
-		Release|Win32 = Release|Win32
+		Debug|x86 = Debug|x86
 		Release|x64 = Release|x64
+		Release|x86 = Release|x86
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|Win32.ActiveCfg = Debug|Win32
-		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|Win32.Build.0 = Debug|Win32
 		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|x64.ActiveCfg = Debug|x64
 		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|x64.Build.0 = Debug|x64
-		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|Win32.ActiveCfg = Release|Win32
-		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|Win32.Build.0 = Release|Win32
+		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|x86.ActiveCfg = Debug|Win32
+		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|x86.Build.0 = Debug|Win32
 		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|x64.ActiveCfg = Release|x64
 		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|x64.Build.0 = Release|x64
-		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|Win32.ActiveCfg = Debug|Win32
-		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|Win32.Build.0 = Debug|Win32
+		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|x86.ActiveCfg = Release|Win32
+		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|x86.Build.0 = Release|Win32
 		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x64.ActiveCfg = Debug|x64
 		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x64.Build.0 = Debug|x64
-		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|Win32.ActiveCfg = Release|Win32
-		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|Win32.Build.0 = Release|Win32
+		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x86.ActiveCfg = Debug|Win32
+		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x86.Build.0 = Debug|Win32
 		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x64.ActiveCfg = Release|x64
 		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x64.Build.0 = Release|x64
-		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|Win32.ActiveCfg = Debug|Win32
-		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|Win32.Build.0 = Debug|Win32
+		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x86.ActiveCfg = Release|Win32
+		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x86.Build.0 = Release|Win32
 		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|x64.ActiveCfg = Debug|x64
 		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|x64.Build.0 = Debug|x64
-		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|Win32.ActiveCfg = Release|Win32
-		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|Win32.Build.0 = Release|Win32
+		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|x86.ActiveCfg = Debug|Win32
+		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|x86.Build.0 = Debug|Win32
 		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|x64.ActiveCfg = Release|x64
 		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|x64.Build.0 = Release|x64
-		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|Win32.ActiveCfg = Debug|Win32
-		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|Win32.Build.0 = Debug|Win32
+		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|x86.ActiveCfg = Release|Win32
+		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|x86.Build.0 = Release|Win32
 		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x64.ActiveCfg = Debug|x64
 		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x64.Build.0 = Debug|x64
-		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|Win32.ActiveCfg = Release|Win32
-		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|Win32.Build.0 = Release|Win32
+		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x86.ActiveCfg = Debug|Win32
+		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x86.Build.0 = Debug|Win32
 		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x64.ActiveCfg = Release|x64
 		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x64.Build.0 = Release|x64
-		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|Win32.ActiveCfg = Debug|Win32
-		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|Win32.Build.0 = Debug|Win32
+		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x86.ActiveCfg = Release|Win32
+		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x86.Build.0 = Release|Win32
 		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|x64.ActiveCfg = Debug|x64
 		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|x64.Build.0 = Debug|x64
-		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|Win32.ActiveCfg = Release|Win32
-		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|Win32.Build.0 = Release|Win32
+		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|x86.ActiveCfg = Debug|Win32
+		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|x86.Build.0 = Debug|Win32
 		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|x64.ActiveCfg = Release|x64
 		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|x64.Build.0 = Release|x64
-		{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}.Debug|Win32.ActiveCfg = Debug|Win32
-		{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}.Debug|Win32.Build.0 = Debug|Win32
-		{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}.Debug|x64.ActiveCfg = Debug|x64
-		{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}.Debug|x64.Build.0 = Debug|x64
-		{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}.Release|Win32.ActiveCfg = Release|Win32
-		{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}.Release|Win32.Build.0 = Release|Win32
-		{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}.Release|x64.ActiveCfg = Release|x64
-		{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}.Release|x64.Build.0 = Release|x64
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Debug|Win32.ActiveCfg = Debug|Win32
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Debug|Win32.Build.0 = Debug|Win32
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Debug|x64.ActiveCfg = Debug|x64
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Debug|x64.Build.0 = Debug|x64
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Release|Win32.ActiveCfg = Release|Win32
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Release|Win32.Build.0 = Release|Win32
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Release|x64.ActiveCfg = Release|x64
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Release|x64.Build.0 = Release|x64
-		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|Win32.ActiveCfg = Debug|Win32
-		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|Win32.Build.0 = Debug|Win32
+		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|x86.ActiveCfg = Release|Win32
+		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|x86.Build.0 = Release|Win32
 		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|x64.ActiveCfg = Debug|x64
 		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|x64.Build.0 = Debug|x64
-		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|Win32.ActiveCfg = Release|Win32
-		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|Win32.Build.0 = Release|Win32
+		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|x86.ActiveCfg = Debug|Win32
+		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|x86.Build.0 = Debug|Win32
 		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|x64.ActiveCfg = Release|x64
 		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|x64.Build.0 = Release|x64
-		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|Win32.ActiveCfg = Debug|Win32
-		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|Win32.Build.0 = Debug|Win32
+		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|x86.ActiveCfg = Release|Win32
+		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|x86.Build.0 = Release|Win32
 		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|x64.ActiveCfg = Debug|x64
 		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|x64.Build.0 = Debug|x64
-		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|Win32.ActiveCfg = Release|Win32
-		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|Win32.Build.0 = Release|Win32
+		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|x86.ActiveCfg = Debug|Win32
+		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|x86.Build.0 = Debug|Win32
 		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|x64.ActiveCfg = Release|x64
 		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|x64.Build.0 = Release|x64
-		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|Win32.ActiveCfg = Debug|Win32
-		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|Win32.Build.0 = Debug|Win32
+		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|x86.ActiveCfg = Release|Win32
+		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|x86.Build.0 = Release|Win32
 		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|x64.ActiveCfg = Debug|x64
 		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|x64.Build.0 = Debug|x64
-		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|Win32.ActiveCfg = Release|Win32
-		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|Win32.Build.0 = Release|Win32
+		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|x86.ActiveCfg = Debug|Win32
+		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|x86.Build.0 = Debug|Win32
 		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|x64.ActiveCfg = Release|x64
 		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|x64.Build.0 = Release|x64
-		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|Win32.ActiveCfg = Debug|Win32
-		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|Win32.Build.0 = Debug|Win32
+		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|x86.ActiveCfg = Release|Win32
+		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|x86.Build.0 = Release|Win32
 		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|x64.ActiveCfg = Debug|x64
 		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|x64.Build.0 = Debug|x64
-		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|Win32.ActiveCfg = Release|Win32
-		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|Win32.Build.0 = Release|Win32
+		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|x86.ActiveCfg = Debug|Win32
+		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|x86.Build.0 = Debug|Win32
 		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|x64.ActiveCfg = Release|x64
 		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|x64.Build.0 = Release|x64
-		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|Win32.ActiveCfg = Debug|Win32
-		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|Win32.Build.0 = Debug|Win32
+		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|x86.ActiveCfg = Release|Win32
+		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|x86.Build.0 = Release|Win32
 		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|x64.ActiveCfg = Debug|x64
 		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|x64.Build.0 = Debug|x64
-		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|Win32.ActiveCfg = Release|Win32
-		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|Win32.Build.0 = Release|Win32
+		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|x86.ActiveCfg = Debug|Win32
+		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|x86.Build.0 = Debug|Win32
 		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|x64.ActiveCfg = Release|x64
 		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|x64.Build.0 = Release|x64
-		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|Win32.ActiveCfg = Debug|Win32
-		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|Win32.Build.0 = Debug|Win32
+		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|x86.ActiveCfg = Release|Win32
+		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|x86.Build.0 = Release|Win32
 		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|x64.ActiveCfg = Debug|x64
 		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|x64.Build.0 = Debug|x64
-		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|Win32.ActiveCfg = Release|Win32
-		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|Win32.Build.0 = Release|Win32
+		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|x86.ActiveCfg = Debug|Win32
+		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|x86.Build.0 = Debug|Win32
 		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|x64.ActiveCfg = Release|x64
 		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|x64.Build.0 = Release|x64
-		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|Win32.ActiveCfg = Debug|Win32
-		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|Win32.Build.0 = Debug|Win32
+		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|x86.ActiveCfg = Release|Win32
+		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|x86.Build.0 = Release|Win32
 		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|x64.ActiveCfg = Debug|x64
 		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|x64.Build.0 = Debug|x64
-		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|Win32.ActiveCfg = Release|Win32
-		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|Win32.Build.0 = Release|Win32
+		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|x86.ActiveCfg = Debug|Win32
+		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|x86.Build.0 = Debug|Win32
 		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|x64.ActiveCfg = Release|x64
 		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|x64.Build.0 = Release|x64
-		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|Win32.ActiveCfg = Debug|Win32
-		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|Win32.Build.0 = Debug|Win32
+		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|x86.ActiveCfg = Release|Win32
+		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|x86.Build.0 = Release|Win32
 		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|x64.ActiveCfg = Debug|x64
 		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|x64.Build.0 = Debug|x64
-		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|Win32.ActiveCfg = Release|Win32
-		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|Win32.Build.0 = Release|Win32
+		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|x86.ActiveCfg = Debug|Win32
+		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|x86.Build.0 = Debug|Win32
 		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|x64.ActiveCfg = Release|x64
 		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|x64.Build.0 = Release|x64
-		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|Win32.ActiveCfg = Debug|Win32
-		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|Win32.Build.0 = Debug|Win32
+		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|x86.ActiveCfg = Release|Win32
+		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|x86.Build.0 = Release|Win32
 		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|x64.ActiveCfg = Debug|x64
 		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|x64.Build.0 = Debug|x64
-		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|Win32.ActiveCfg = Release|Win32
-		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|Win32.Build.0 = Release|Win32
+		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|x86.ActiveCfg = Debug|Win32
+		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|x86.Build.0 = Debug|Win32
 		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|x64.ActiveCfg = Release|x64
 		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|x64.Build.0 = Release|x64
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|Win32.ActiveCfg = Debug|Win32
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|Win32.Build.0 = Debug|Win32
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|x64.ActiveCfg = Debug|x64
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|x64.Build.0 = Debug|x64
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|Win32.ActiveCfg = Release|Win32
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|Win32.Build.0 = Release|Win32
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|x64.ActiveCfg = Release|x64
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|x64.Build.0 = Release|x64
-		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|Win32.ActiveCfg = Debug|Win32
-		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|Win32.Build.0 = Debug|Win32
+		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|x86.ActiveCfg = Release|Win32
+		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|x86.Build.0 = Release|Win32
+		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|x64.ActiveCfg = Debug|Win32
+		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|x86.ActiveCfg = Debug|Win32
+		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|x86.Build.0 = Debug|Win32
+		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|x64.ActiveCfg = Release|Win32
+		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|x86.ActiveCfg = Release|Win32
+		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|x86.Build.0 = Release|Win32
 		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|x64.ActiveCfg = Debug|x64
 		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|x64.Build.0 = Debug|x64
-		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|Win32.ActiveCfg = Release|Win32
-		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|Win32.Build.0 = Release|Win32
+		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|x86.ActiveCfg = Debug|Win32
+		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|x86.Build.0 = Debug|Win32
 		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|x64.ActiveCfg = Release|x64
 		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|x64.Build.0 = Release|x64
-		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|Win32.ActiveCfg = Debug|Win32
-		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|Win32.Build.0 = Debug|Win32
+		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|x86.ActiveCfg = Release|Win32
+		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|x86.Build.0 = Release|Win32
 		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|x64.ActiveCfg = Debug|x64
 		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|x64.Build.0 = Debug|x64
-		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|Win32.ActiveCfg = Release|Win32
-		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|Win32.Build.0 = Release|Win32
+		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|x86.ActiveCfg = Debug|Win32
+		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|x86.Build.0 = Debug|Win32
 		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|x64.ActiveCfg = Release|x64
 		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|x64.Build.0 = Release|x64
-		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|Win32.ActiveCfg = Debug|Win32
-		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|Win32.Build.0 = Debug|Win32
+		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|x86.ActiveCfg = Release|Win32
+		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|x86.Build.0 = Release|Win32
 		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|x64.ActiveCfg = Debug|x64
 		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|x64.Build.0 = Debug|x64
-		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|Win32.ActiveCfg = Release|Win32
-		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|Win32.Build.0 = Release|Win32
+		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|x86.ActiveCfg = Debug|Win32
+		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|x86.Build.0 = Debug|Win32
 		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|x64.ActiveCfg = Release|x64
 		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|x64.Build.0 = Release|x64
-		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|Win32.ActiveCfg = Debug|Win32
-		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|Win32.Build.0 = Debug|Win32
+		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|x86.ActiveCfg = Release|Win32
+		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|x86.Build.0 = Release|Win32
 		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|x64.ActiveCfg = Debug|x64
 		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|x64.Build.0 = Debug|x64
-		{40A90302-F173-4629-A003-F571D2D93D16}.Release|Win32.ActiveCfg = Release|Win32
-		{40A90302-F173-4629-A003-F571D2D93D16}.Release|Win32.Build.0 = Release|Win32
+		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|x86.ActiveCfg = Debug|Win32
+		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|x86.Build.0 = Debug|Win32
 		{40A90302-F173-4629-A003-F571D2D93D16}.Release|x64.ActiveCfg = Release|x64
 		{40A90302-F173-4629-A003-F571D2D93D16}.Release|x64.Build.0 = Release|x64
-		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Debug|Win32.ActiveCfg = Debug|Win32
-		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Debug|Win32.Build.0 = Debug|Win32
+		{40A90302-F173-4629-A003-F571D2D93D16}.Release|x86.ActiveCfg = Release|Win32
+		{40A90302-F173-4629-A003-F571D2D93D16}.Release|x86.Build.0 = Release|Win32
 		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Debug|x64.ActiveCfg = Debug|x64
 		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Debug|x64.Build.0 = Debug|x64
-		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Release|Win32.ActiveCfg = Release|Win32
-		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Release|Win32.Build.0 = Release|Win32
+		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Debug|x86.ActiveCfg = Debug|Win32
+		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Debug|x86.Build.0 = Debug|Win32
 		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Release|x64.ActiveCfg = Release|x64
 		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Release|x64.Build.0 = Release|x64
-		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|Win32.ActiveCfg = Debug|Win32
-		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|Win32.Build.0 = Debug|Win32
+		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Release|x86.ActiveCfg = Release|Win32
+		{247E2681-6C84-408B-B40C-5DB50BC5E18F}.Release|x86.Build.0 = Release|Win32
 		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|x64.ActiveCfg = Debug|x64
 		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|x64.Build.0 = Debug|x64
-		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|Win32.ActiveCfg = Release|Win32
-		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|Win32.Build.0 = Release|Win32
+		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|x86.ActiveCfg = Debug|Win32
+		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|x86.Build.0 = Debug|Win32
 		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|x64.ActiveCfg = Release|x64
 		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|x64.Build.0 = Release|x64
-		{683745AD-3BC2-4B89-898B-93490D7F2757}.Debug|Win32.ActiveCfg = Debug|Win32
-		{683745AD-3BC2-4B89-898B-93490D7F2757}.Debug|Win32.Build.0 = Debug|Win32
+		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|x86.ActiveCfg = Release|Win32
+		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|x86.Build.0 = Release|Win32
 		{683745AD-3BC2-4B89-898B-93490D7F2757}.Debug|x64.ActiveCfg = Debug|x64
 		{683745AD-3BC2-4B89-898B-93490D7F2757}.Debug|x64.Build.0 = Debug|x64
-		{683745AD-3BC2-4B89-898B-93490D7F2757}.Release|Win32.ActiveCfg = Release|Win32
-		{683745AD-3BC2-4B89-898B-93490D7F2757}.Release|Win32.Build.0 = Release|Win32
+		{683745AD-3BC2-4B89-898B-93490D7F2757}.Debug|x86.ActiveCfg = Debug|Win32
+		{683745AD-3BC2-4B89-898B-93490D7F2757}.Debug|x86.Build.0 = Debug|Win32
 		{683745AD-3BC2-4B89-898B-93490D7F2757}.Release|x64.ActiveCfg = Release|x64
 		{683745AD-3BC2-4B89-898B-93490D7F2757}.Release|x64.Build.0 = Release|x64
-		{8945255B-473B-4C47-9425-E92384338CAA}.Debug|Win32.ActiveCfg = Debug|Win32
-		{8945255B-473B-4C47-9425-E92384338CAA}.Debug|Win32.Build.0 = Debug|Win32
-		{8945255B-473B-4C47-9425-E92384338CAA}.Debug|x64.ActiveCfg = Debug|Win32
-		{8945255B-473B-4C47-9425-E92384338CAA}.Release|Win32.ActiveCfg = Release|Win32
-		{8945255B-473B-4C47-9425-E92384338CAA}.Release|Win32.Build.0 = Release|Win32
-		{8945255B-473B-4C47-9425-E92384338CAA}.Release|x64.ActiveCfg = Release|Win32
-		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Debug|Win32.ActiveCfg = Debug|Win32
-		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Debug|Win32.Build.0 = Debug|Win32
-		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Debug|x64.ActiveCfg = Debug|Win32
-		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Release|Win32.ActiveCfg = Release|Win32
-		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Release|Win32.Build.0 = Release|Win32
-		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Release|x64.ActiveCfg = Release|Win32
-		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Debug|Win32.ActiveCfg = Debug|Win32
-		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Debug|Win32.Build.0 = Debug|Win32
-		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Debug|x64.ActiveCfg = Debug|Win32
-		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Release|Win32.ActiveCfg = Release|Win32
-		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Release|Win32.Build.0 = Release|Win32
-		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Release|x64.ActiveCfg = Release|Win32
+		{683745AD-3BC2-4B89-898B-93490D7F2757}.Release|x86.ActiveCfg = Release|Win32
+		{683745AD-3BC2-4B89-898B-93490D7F2757}.Release|x86.Build.0 = Release|Win32
+		{8945255B-473B-4C47-9425-E92384338CAA}.Debug|x64.ActiveCfg = Debug|x64
+		{8945255B-473B-4C47-9425-E92384338CAA}.Debug|x64.Build.0 = Debug|x64
+		{8945255B-473B-4C47-9425-E92384338CAA}.Debug|x86.ActiveCfg = Debug|Win32
+		{8945255B-473B-4C47-9425-E92384338CAA}.Debug|x86.Build.0 = Debug|Win32
+		{8945255B-473B-4C47-9425-E92384338CAA}.Release|x64.ActiveCfg = Release|x64
+		{8945255B-473B-4C47-9425-E92384338CAA}.Release|x64.Build.0 = Release|x64
+		{8945255B-473B-4C47-9425-E92384338CAA}.Release|x86.ActiveCfg = Release|Win32
+		{8945255B-473B-4C47-9425-E92384338CAA}.Release|x86.Build.0 = Release|Win32
+		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Debug|x64.ActiveCfg = Debug|x64
+		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Debug|x64.Build.0 = Debug|x64
+		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Debug|x86.ActiveCfg = Debug|Win32
+		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Debug|x86.Build.0 = Debug|Win32
+		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Release|x64.ActiveCfg = Release|x64
+		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Release|x64.Build.0 = Release|x64
+		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Release|x86.ActiveCfg = Release|Win32
+		{B500B731-ED1A-4761-94ED-B22DFE25FF2B}.Release|x86.Build.0 = Release|Win32
+		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Debug|x64.ActiveCfg = Debug|x64
+		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Debug|x64.Build.0 = Debug|x64
+		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Debug|x86.ActiveCfg = Debug|Win32
+		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Debug|x86.Build.0 = Debug|Win32
+		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Release|x64.ActiveCfg = Release|x64
+		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Release|x64.Build.0 = Release|x64
+		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Release|x86.ActiveCfg = Release|Win32
+		{115886F0-7DFB-4B8B-BE79-83162EE8713B}.Release|x86.Build.0 = Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		        SolutionGuid = {DB7CDCAF-F002-40F8-9E0E-F25F68EEC77B}
+		SolutionGuid = {60B84F6E-86EE-46F7-9AF4-8A3ABB09A513}
+	EndGlobalSection
 EndGlobal
diff --git a/icu4c/source/samples/break/break.cpp b/icu4c/source/samples/break/break.cpp
index 4965aac..8b4ad61 100644
--- a/icu4c/source/samples/break/break.cpp
+++ b/icu4c/source/samples/break/break.cpp
@@ -17,8 +17,9 @@
 #include <unicode/brkiter.h>
 #include <stdlib.h>
 
-U_CFUNC int c_main(void);
+using namespace icu;
 
+U_CFUNC int c_main(void);
 
 void printUnicodeString(const UnicodeString &s) {
     char charBuf[1000];
diff --git a/icu4c/source/samples/break/break.sln b/icu4c/source/samples/break/break.sln
index 131bb04..80cca42 100644
--- a/icu4c/source/samples/break/break.sln
+++ b/icu4c/source/samples/break/break.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|Win32.ActiveCfg = Debug|Win32
 		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|Win32.Build.0 = Debug|Win32
-		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|x64.ActiveCfg = Debug|Win32
-		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|x64.Build.0 = Debug|Win32
+		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|x64.ActiveCfg = Debug|x64
+		{DEEADF02-9C14-4854-A395-E505D2904D65}.Debug|x64.Build.0 = Debug|x64
 		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|Win32.ActiveCfg = Release|Win32
 		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|Win32.Build.0 = Release|Win32
-		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|x64.ActiveCfg = Release|Win32
-		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|x64.Build.0 = Release|Win32
+		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|x64.ActiveCfg = Release|x64
+		{DEEADF02-9C14-4854-A395-E505D2904D65}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/break/break.vcxproj b/icu4c/source/samples/break/break.vcxproj
index 0ac3e59..1737d93 100644
--- a/icu4c/source/samples/break/break.vcxproj
+++ b/icu4c/source/samples/break/break.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{DEEADF02-9C14-4854-A395-E505D2904D65}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,40 +47,32 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\x86\Release/break.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/break.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/break.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/break.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -126,81 +83,50 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/break.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/break.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/break.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/break.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\x86\Debug/break.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/break.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/break.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/break.pdb</ProgramDatabaseFile>
@@ -212,38 +138,23 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/break.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/break.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/break.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/break.pdb</ProgramDatabaseFile>
@@ -251,7 +162,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -261,4 +171,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/cal/cal.sln b/icu4c/source/samples/cal/cal.sln
index 1cee7da..19f41e9 100644
--- a/icu4c/source/samples/cal/cal.sln
+++ b/icu4c/source/samples/cal/cal.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|Win32.ActiveCfg = Debug|Win32
 		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|Win32.Build.0 = Debug|Win32
-		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x64.ActiveCfg = Debug|Win32
-		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x64.Build.0 = Debug|Win32
+		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x64.ActiveCfg = Debug|x64
+		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Debug|x64.Build.0 = Debug|x64
 		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|Win32.ActiveCfg = Release|Win32
 		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|Win32.Build.0 = Release|Win32
-		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x64.ActiveCfg = Release|Win32
-		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x64.Build.0 = Release|Win32
+		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x64.ActiveCfg = Release|x64
+		{F7659D77-09CF-4FE9-ACEE-927287AA9509}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/cal/cal.vcxproj b/icu4c/source/samples/cal/cal.vcxproj
index 95a0a53..a5aad70 100644
--- a/icu4c/source/samples/cal/cal.vcxproj
+++ b/icu4c/source/samples/cal/cal.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{F7659D77-09CF-4FE9-ACEE-927287AA9509}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,36 +47,33 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <WarningLevel>Level3</WarningLevel>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Release/cal.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/cal.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/cal.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/cal.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -122,42 +84,29 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/cal.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/cal.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/cal.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/cal.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -165,12 +114,8 @@
       <TypeLibraryName>.\x86\Debug/cal.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/cal.pch</PrecompiledHeaderOutputFile>
@@ -178,19 +123,12 @@
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/cal.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/cal.pdb</ProgramDatabaseFile>
@@ -202,16 +140,10 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/cal.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/cal.pch</PrecompiledHeaderOutputFile>
@@ -219,19 +151,12 @@
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/cal.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/cal.pdb</ProgramDatabaseFile>
@@ -239,31 +164,16 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClCompile Include="cal.c">
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-    </ClCompile>
-    <ClCompile Include="uprint.c">
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-    </ClCompile>
+    <ClCompile Include="cal.c" />
+    <ClCompile Include="uprint.c" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="uprint.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/case/case.cpp b/icu4c/source/samples/case/case.cpp
index f111818..c0f7216 100644
--- a/icu4c/source/samples/case/case.cpp
+++ b/icu4c/source/samples/case/case.cpp
@@ -18,6 +18,8 @@
 #include <unicode/brkiter.h>
 #include <stdlib.h>
 
+using namespace icu;
+
 U_CFUNC int c_main(UFILE *out);
 
 void printUnicodeString(UFILE *out, const UnicodeString &s) {
diff --git a/icu4c/source/samples/case/case.sln b/icu4c/source/samples/case/case.sln
index e834d4d..46622a2 100644
--- a/icu4c/source/samples/case/case.sln
+++ b/icu4c/source/samples/case/case.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|Win32.ActiveCfg = Debug|Win32
 		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|Win32.Build.0 = Debug|Win32
-		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|x64.ActiveCfg = Debug|Win32
-		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|x64.Build.0 = Debug|Win32
+		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|x64.ActiveCfg = Debug|x64
+		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Debug|x64.Build.0 = Debug|x64
 		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|Win32.ActiveCfg = Release|Win32
 		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|Win32.Build.0 = Release|Win32
-		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|x64.ActiveCfg = Release|Win32
-		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|x64.Build.0 = Release|Win32
+		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|x64.ActiveCfg = Release|x64
+		{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/case/case.vcxproj b/icu4c/source/samples/case/case.vcxproj
index 3596766..222ebed 100644
--- a/icu4c/source/samples/case/case.vcxproj
+++ b/icu4c/source/samples/case/case.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{2316BE8C-189D-4C8B-B506-9D9EE25AC46D}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,38 +47,33 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <WarningLevel>Level3</WarningLevel>
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Debug/case.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..;..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/case.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/case.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/case.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -123,31 +83,19 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/case.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..;..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/case.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/case.exe</OutputFile>
@@ -159,7 +107,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -168,30 +115,19 @@
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/case.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/case.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/case.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -202,42 +138,29 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/case.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/case.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/case.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/case.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -247,4 +170,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/case/ucase.c b/icu4c/source/samples/case/ucase.c
index eafa934..2dd272a 100644
--- a/icu4c/source/samples/case/ucase.c
+++ b/icu4c/source/samples/case/ucase.c
@@ -63,7 +63,7 @@
   u_fprintf(out, "u_strToLower(%S, turkish) -> %S\n", upper, buffer);
 
 
-  /* ustring.h APIs, UChar * string case mapping with a Engish locale */
+  /* ustring.h APIs, UChar * string case mapping with a English locale */
   /* result buffer = "ABI" latin CAPITAL letter A, latin capital letter B,
      latin capital letter I */
   length = u_strToUpper(buffer, sizeof(buffer)/sizeof(buffer[0]), upper, 
diff --git a/icu4c/source/samples/citer/citer.cpp b/icu4c/source/samples/citer/citer.cpp
index 3a16dc1..43e5a00 100644
--- a/icu4c/source/samples/citer/citer.cpp
+++ b/icu4c/source/samples/citer/citer.cpp
@@ -23,6 +23,11 @@
 
 static UFILE *out;
 
+using icu::CharacterIterator;
+using icu::StringCharacterIterator;
+using icu::UCharCharacterIterator;
+using icu::UnicodeString;
+
 void printUnicodeString(const UnicodeString &s)
 {
     u_fprintf(out, "%S", &s);
diff --git a/icu4c/source/samples/citer/citer.vcxproj b/icu4c/source/samples/citer/citer.vcxproj
index bf6355e..9e7250d 100644
--- a/icu4c/source/samples/citer/citer.vcxproj
+++ b/icu4c/source/samples/citer/citer.vcxproj
@@ -1,48 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+  
   <PropertyGroup Label="Globals">
     <ProjectGuid>{247E2681-6C84-408B-B40C-5DB50BC5E18F}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -81,13 +49,9 @@
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
@@ -95,7 +59,7 @@
     </ClCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>./Debug/citer.exe</OutputFile>
+      <OutputFile>.\x86\Debug\citer.exe</OutputFile>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>$(OutDir)citer.pdb</ProgramDatabaseFile>
@@ -103,21 +67,13 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX86</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-    </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
@@ -125,7 +81,7 @@
     </ClCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>./Debug/citer.exe</OutputFile>
+      <OutputFile>.\x64\Debug\citer.exe</OutputFile>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>$(OutDir)citer.pdb</ProgramDatabaseFile>
@@ -133,15 +89,12 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
@@ -149,27 +102,20 @@
     </ClCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>./Release/citer.exe</OutputFile>
+      <OutputFile>.\x86\Release\citer.exe</OutputFile>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Console</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX86</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-    </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
@@ -177,16 +123,14 @@
     </ClCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>./Release/citer.exe</OutputFile>
+      <OutputFile>.\x64\Release\citer.exe</OutputFile>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Console</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -195,4 +139,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/coll/coll.cpp b/icu4c/source/samples/coll/coll.cpp
index e29755d..afa57d0 100644
--- a/icu4c/source/samples/coll/coll.cpp
+++ b/icu4c/source/samples/coll/coll.cpp
@@ -25,7 +25,7 @@
     "-lower           Lower case first\n"
     "-upper           Upper case first\n"
     "-case            Enable separate case level\n"
-    "-level n         Sort level, 1 to 5, for Primary, Secndary, Tertiary, Quaternary, Identical\n"
+    "-level n         Sort level, 1 to 5, for Primary, Secondary, Tertiary, Quaternary, Identical\n"
 	"-source string   Source string for comparison\n"
 	"-target string   Target string for comparison\n"
     "Example coll -rules \\u0026b\\u003ca -source a -target b\n"
diff --git a/icu4c/source/samples/coll/coll.sln b/icu4c/source/samples/coll/coll.sln
index 3f6757a..5a4acc8 100644
--- a/icu4c/source/samples/coll/coll.sln
+++ b/icu4c/source/samples/coll/coll.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|Win32.ActiveCfg = Debug|Win32
 		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|Win32.Build.0 = Debug|Win32
-		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|x64.ActiveCfg = Debug|Win32
-		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|x64.Build.0 = Debug|Win32
+		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|x64.ActiveCfg = Debug|x64
+		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Debug|x64.Build.0 = Debug|x64
 		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|Win32.ActiveCfg = Release|Win32
 		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|Win32.Build.0 = Release|Win32
-		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|x64.ActiveCfg = Release|Win32
-		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|x64.Build.0 = Release|Win32
+		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|x64.ActiveCfg = Release|x64
+		{7664D0D2-0263-4BFB-AE19-9A1CAD231440}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/coll/coll.vcxproj b/icu4c/source/samples/coll/coll.vcxproj
index 85d0341..453bcd4 100644
--- a/icu4c/source/samples/coll/coll.vcxproj
+++ b/icu4c/source/samples/coll/coll.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+  
   <PropertyGroup Label="Globals">
     <ProjectGuid>{7664D0D2-0263-4BFB-AE19-9A1CAD231440}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -89,11 +54,8 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/coll.pch</PrecompiledHeaderOutputFile>
@@ -101,17 +63,11 @@
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <AdditionalDependencies>icuind.lib;icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>icuin.lib;icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/coll.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/coll.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -122,17 +78,13 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/coll.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/coll.pch</PrecompiledHeaderOutputFile>
@@ -140,24 +92,17 @@
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <AdditionalDependencies>icuind.lib;icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>icuin.lib;icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/coll.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/coll.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -165,12 +110,8 @@
       <TypeLibraryName>.\x86\Debug/coll.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/coll.pch</PrecompiledHeaderOutputFile>
@@ -183,14 +124,9 @@
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuind.lib;icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/coll.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/coll.pdb</ProgramDatabaseFile>
@@ -202,16 +138,12 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/coll.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/coll.pch</PrecompiledHeaderOutputFile>
@@ -220,18 +152,12 @@
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuind.lib;icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/coll.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/coll.pdb</ProgramDatabaseFile>
@@ -239,7 +165,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -248,4 +173,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/csdet/csdet.vcxproj b/icu4c/source/samples/csdet/csdet.vcxproj
index 6d2a0ad..fc4cb59 100644
--- a/icu4c/source/samples/csdet/csdet.vcxproj
+++ b/icu4c/source/samples/csdet/csdet.vcxproj
@@ -1,48 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+  
   <PropertyGroup Label="Globals">
     <ProjectGuid>{683745AD-3BC2-4B89-898B-93490D7F2757}</ProjectGuid>
     <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -81,13 +50,10 @@
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>true</MinimalRebuild>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
@@ -103,7 +69,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX86</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -113,11 +78,9 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>true</MinimalRebuild>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
@@ -133,15 +96,12 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <ClCompile>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
@@ -154,22 +114,15 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Console</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX86</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-    </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
@@ -182,11 +135,9 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Console</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -195,4 +146,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/date/date.sln b/icu4c/source/samples/date/date.sln
index 63749a2..0ec4cd5 100644
--- a/icu4c/source/samples/date/date.sln
+++ b/icu4c/source/samples/date/date.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|Win32.ActiveCfg = Debug|Win32
 		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|Win32.Build.0 = Debug|Win32
-		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x64.ActiveCfg = Debug|Win32
-		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x64.Build.0 = Debug|Win32
+		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x64.ActiveCfg = Debug|x64
+		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Debug|x64.Build.0 = Debug|x64
 		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|Win32.ActiveCfg = Release|Win32
 		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|Win32.Build.0 = Release|Win32
-		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x64.ActiveCfg = Release|Win32
-		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x64.Build.0 = Release|Win32
+		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x64.ActiveCfg = Release|x64
+		{38B5751A-C6F9-4409-950C-F4F9DA17275F}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/date/date.vcxproj b/icu4c/source/samples/date/date.vcxproj
index f8241c1..83ab770 100644
--- a/icu4c/source/samples/date/date.vcxproj
+++ b/icu4c/source/samples/date/date.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+  
   <PropertyGroup Label="Globals">
     <ProjectGuid>{38B5751A-C6F9-4409-950C-F4F9DA17275F}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -89,29 +54,20 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <PrecompiledHeaderOutputFile>.\x86\Release/date.pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <PrecompiledHeaderFile />
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/date.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/date.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -122,42 +78,30 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/date.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <PrecompiledHeaderOutputFile>.\x64\Release/date.pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <PrecompiledHeaderFile />
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/date.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/date.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -167,29 +111,20 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <PrecompiledHeaderOutputFile>.\x86\Debug/date.pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <PrecompiledHeaderFile />
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/date.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/date.pdb</ProgramDatabaseFile>
@@ -201,35 +136,23 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/date.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <PrecompiledHeaderOutputFile>.\x64\Debug/date.pch</PrecompiledHeaderOutputFile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <PrecompiledHeaderFile />
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/date.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/date.pdb</ProgramDatabaseFile>
@@ -237,7 +160,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -247,17 +169,7 @@
   <ItemGroup>
     <ClInclude Include="uprint.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/datefmt/datefmt.sln b/icu4c/source/samples/datefmt/datefmt.sln
index a82993d..346439a 100644
--- a/icu4c/source/samples/datefmt/datefmt.sln
+++ b/icu4c/source/samples/datefmt/datefmt.sln
@@ -14,12 +14,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|Win32.ActiveCfg = Debug|Win32
 		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|Win32.Build.0 = Debug|Win32
-		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|x64.ActiveCfg = Debug|Win32
-		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|x64.Build.0 = Debug|Win32
+		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|x64.ActiveCfg = Debug|x64
+		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Debug|x64.Build.0 = Debug|x64
 		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|Win32.ActiveCfg = Release|Win32
 		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|Win32.Build.0 = Release|Win32
-		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|x64.ActiveCfg = Release|Win32
-		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|x64.Build.0 = Release|Win32
+		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|x64.ActiveCfg = Release|x64
+		{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/datefmt/datefmt.vcxproj b/icu4c/source/samples/datefmt/datefmt.vcxproj
index 078ca49..ca610f5 100644
--- a/icu4c/source/samples/datefmt/datefmt.vcxproj
+++ b/icu4c/source/samples/datefmt/datefmt.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+  
   <PropertyGroup Label="Globals">
     <ProjectGuid>{6D592DB7-B9C8-4B1B-A1C1-F9A9EB4FD4E4}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -87,12 +52,8 @@
       <TypeLibraryName>.\x86\Debug/datefmt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/datefmt.pch</PrecompiledHeaderOutputFile>
@@ -100,18 +61,12 @@
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/datefmt.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/datefmt.pdb</ProgramDatabaseFile>
@@ -123,16 +78,11 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/datefmt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/datefmt.pch</PrecompiledHeaderOutputFile>
@@ -140,18 +90,12 @@
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/datefmt.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/datefmt.pdb</ProgramDatabaseFile>
@@ -159,7 +103,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -169,11 +112,8 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/datefmt.pch</PrecompiledHeaderOutputFile>
@@ -181,17 +121,11 @@
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/datefmt.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/datefmt.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -202,17 +136,13 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/datefmt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/datefmt.pch</PrecompiledHeaderOutputFile>
@@ -220,24 +150,17 @@
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/datefmt.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/datefmt.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -247,4 +170,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/datefmt/main.cpp b/icu4c/source/samples/datefmt/main.cpp
index a655328..dd1796a 100644
--- a/icu4c/source/samples/datefmt/main.cpp
+++ b/icu4c/source/samples/datefmt/main.cpp
@@ -15,6 +15,8 @@
 #include <stdlib.h>
 #include "util.h"
 
+using namespace icu;
+
 /**
  * If the ID supplied to TimeZone is not a valid system ID,
  * TimeZone::createTimeZone() will return a GMT zone object.  In order
diff --git a/icu4c/source/samples/datefmt/util.cpp b/icu4c/source/samples/datefmt/util.cpp
index 6068d0e..240b405 100644
--- a/icu4c/source/samples/datefmt/util.cpp
+++ b/icu4c/source/samples/datefmt/util.cpp
@@ -12,6 +12,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+using namespace icu;
+
 // Verify that a UErrorCode is successful; exit(1) if not
 void check(UErrorCode& status, const char* msg) {
     if (U_FAILURE(status)) {
diff --git a/icu4c/source/samples/datefmt/util.h b/icu4c/source/samples/datefmt/util.h
index 3a15a9e..2fd538b 100644
--- a/icu4c/source/samples/datefmt/util.h
+++ b/icu4c/source/samples/datefmt/util.h
@@ -10,6 +10,8 @@
 
 #include "unicode/unistr.h"
 
+using namespace icu;
+
 // Verify that a UErrorCode is successful; exit(1) if not
 void check(UErrorCode& status, const char* msg);
 
diff --git a/icu4c/source/samples/dtitvfmtsample/dtitvfmtsample.cpp b/icu4c/source/samples/dtitvfmtsample/dtitvfmtsample.cpp
index da6f746..c4f7b18 100644
--- a/icu4c/source/samples/dtitvfmtsample/dtitvfmtsample.cpp
+++ b/icu4c/source/samples/dtitvfmtsample/dtitvfmtsample.cpp
@@ -12,6 +12,7 @@
 //! [dtitvfmtPreDefined1]
 
 using namespace std;
+using namespace icu;
 
 static void dtitvfmtPreDefined() {
 	  
diff --git a/icu4c/source/samples/dtitvfmtsample/dtitvfmtsample.vcxproj b/icu4c/source/samples/dtitvfmtsample/dtitvfmtsample.vcxproj
index 701d806..db22407 100644
--- a/icu4c/source/samples/dtitvfmtsample/dtitvfmtsample.vcxproj
+++ b/icu4c/source/samples/dtitvfmtsample/dtitvfmtsample.vcxproj
@@ -1,33 +1,34 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{8945255B-473B-4C47-9425-E92384338CAA}</ProjectGuid>
-    <RootNamespace>dtitvfmtsample</RootNamespace>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
+    <RootNamespace>samples</RootNamespace>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -35,25 +36,43 @@
   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <OutDir>.\x86\debug\</OutDir>
+    <OutDir>.\x86\Debug\</OutDir>
+    <IntDir>.\x86\Debug\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <IntDir>.\x86\debug\</IntDir>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <OutDir>.\x64\Debug\</OutDir>
+    <IntDir>.\x64\Debug\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <OutDir>.\x86\release</OutDir>
-    <IntDir>.\x86\release</IntDir>
+    <OutDir>.\x86\Release\</OutDir>
+    <IntDir>.\x86\Release\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <OutDir>.\x64\Release\</OutDir>
+    <IntDir>.\x64\Release\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
+      <ObjectFileName>.\x86\Debug/</ObjectFileName>
+      <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -62,36 +81,61 @@
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
     </Link>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
+      <ObjectFileName>.\x64\Debug/</ObjectFileName>
+      <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <OutputFile>.\x64\Debug/dtitvfmtsample.exe</OutputFile>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Link>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
+      <ObjectFileName>.\x86\Release/</ObjectFileName>
+      <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
+      <ObjectFileName>.\x64\Release/</ObjectFileName>
+      <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClCompile Include="dtitvfmtsample.cpp">
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\io\io.vcxproj">
-      <Project>{c2b04507-2521-4801-bf0d-5fd79d6d518c}</Project>
-    </ProjectReference>
+    <ClCompile Include="dtitvfmtsample.cpp" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/dtptngsample/dtptngsample.cpp b/icu4c/source/samples/dtptngsample/dtptngsample.cpp
index b119f4b..58d394d 100644
--- a/icu4c/source/samples/dtptngsample/dtptngsample.cpp
+++ b/icu4c/source/samples/dtptngsample/dtptngsample.cpp
@@ -13,6 +13,7 @@
 //! [getBestPatternExample1]
 
 using namespace std;
+using namespace icu;
 
 static void getBestPatternExample() {
 	    
diff --git a/icu4c/source/samples/dtptngsample/dtptngsample.vcxproj b/icu4c/source/samples/dtptngsample/dtptngsample.vcxproj
index c49ee6a..d2e9466 100644
--- a/icu4c/source/samples/dtptngsample/dtptngsample.vcxproj
+++ b/icu4c/source/samples/dtptngsample/dtptngsample.vcxproj
@@ -1,34 +1,34 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{115886F0-7DFB-4B8B-BE79-83162EE8713B}</ProjectGuid>
     <RootNamespace>samples</RootNamespace>
-    <ProjectName>dtptngsample</ProjectName>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -36,30 +36,39 @@
   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <OutDir>.\x86\debug\</OutDir>
+    <OutDir>.\x86\Debug\</OutDir>
+    <IntDir>.\x86\Debug\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <IntDir>.\x86\debug\</IntDir>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <OutDir>.\x64\Debug\</OutDir>
+    <IntDir>.\x64\Debug\</IntDir>
     <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <OutDir>.\x86\release</OutDir>
+    <OutDir>.\x86\Release\</OutDir>
+    <IntDir>.\x86\Release\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <IntDir>.\x86\release</IntDir>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <OutDir>.\x64\Release\</OutDir>
+    <IntDir>.\x64\Release\</IntDir>
     <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
@@ -69,6 +78,21 @@
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
     </Link>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <AdditionalIncludeDirectories>..\..\common;..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
+      <ObjectFileName>.\x64\Debug/</ObjectFileName>
+      <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <OutputFile>.\x64\debug/dtptngsample.exe</OutputFile>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Link>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
@@ -79,26 +103,33 @@
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <OutputFile>\x86\debug\samples.exe</OutputFile>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
+      <ObjectFileName>.\x64\Release/</ObjectFileName>
+      <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="dtptngsample.cpp" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\io\io.vcxproj">
-      <Project>{c2b04507-2521-4801-bf0d-5fd79d6d518c}</Project>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/layout/layout.vcxproj b/icu4c/source/samples/layout/layout.vcxproj
index c27af9d..b49dca6 100644
--- a/icu4c/source/samples/layout/layout.vcxproj
+++ b/icu4c/source/samples/layout/layout.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{497500ED-DE1D-4B20-B529-F41B5A0FBEEB}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -89,7 +54,7 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\..\include\layout;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>NDEBUG;_CONSOLE;WIN32;UNICODE;_CRT_SECURE_NO_DEPRECATE;LE_USE_CMEMORY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;NDEBUG;_CONSOLE;WIN32;UNICODE;_CRT_SECURE_NO_DEPRECATE;LE_USE_CMEMORY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -165,7 +130,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\..\include\layout;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>_DEBUG;WIN32;UNICODE;LE_USE_CMEMORY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;_DEBUG;WIN32;UNICODE;LE_USE_CMEMORY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
@@ -269,4 +234,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/legacy/legacy.sln b/icu4c/source/samples/legacy/legacy.sln
index f74cf11..b2b176f 100644
--- a/icu4c/source/samples/legacy/legacy.sln
+++ b/icu4c/source/samples/legacy/legacy.sln
@@ -14,12 +14,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{57F56795-1802-4605-88A0-013AAE9998F6}.Debug|Win32.ActiveCfg = Debug|Win32
 		{57F56795-1802-4605-88A0-013AAE9998F6}.Debug|Win32.Build.0 = Debug|Win32
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Debug|x64.ActiveCfg = Debug|Win32
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Debug|x64.Build.0 = Debug|Win32
+		{57F56795-1802-4605-88A0-013AAE9998F6}.Debug|x64.ActiveCfg = Debug|x64
+		{57F56795-1802-4605-88A0-013AAE9998F6}.Debug|x64.Build.0 = Debug|x64
 		{57F56795-1802-4605-88A0-013AAE9998F6}.Release|Win32.ActiveCfg = Release|Win32
 		{57F56795-1802-4605-88A0-013AAE9998F6}.Release|Win32.Build.0 = Release|Win32
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Release|x64.ActiveCfg = Release|Win32
-		{57F56795-1802-4605-88A0-013AAE9998F6}.Release|x64.Build.0 = Release|Win32
+		{57F56795-1802-4605-88A0-013AAE9998F6}.Release|x64.ActiveCfg = Release|x64
+		{57F56795-1802-4605-88A0-013AAE9998F6}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/legacy/legacy.vcxproj b/icu4c/source/samples/legacy/legacy.vcxproj
index 56b7fde..2436983 100644
--- a/icu4c/source/samples/legacy/legacy.vcxproj
+++ b/icu4c/source/samples/legacy/legacy.vcxproj
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
       <Configuration>Debug</Configuration>
@@ -27,25 +27,25 @@
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+    <PlatformToolset>v141</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+    <PlatformToolset>v141</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+    <PlatformToolset>v141</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+    <PlatformToolset>v141</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -89,7 +89,7 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -128,7 +128,7 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -151,7 +151,7 @@
       <AdditionalDependencies>icuuc.lib;icuin.lib;../../../../icu-1-8-1/lib/icuuc.lib;../../../../icu-1-8-1/lib/icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/legacy.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/legacy.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -167,7 +167,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
       <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
@@ -207,7 +207,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
       <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
@@ -230,7 +230,7 @@
       <AdditionalDependencies>icuucd.lib;icuind.lib;../../../../icu-1-8-1/lib/icuucd.lib;../../../../icu-1-8-1/lib/icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/legacy.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/legacy.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -253,4 +253,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/msgfmt/msgfmt.sln b/icu4c/source/samples/msgfmt/msgfmt.sln
index b163631..f90def0 100644
--- a/icu4c/source/samples/msgfmt/msgfmt.sln
+++ b/icu4c/source/samples/msgfmt/msgfmt.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|Win32.ActiveCfg = Debug|Win32
 		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|Win32.Build.0 = Debug|Win32
-		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|x64.ActiveCfg = Debug|Win32
-		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|x64.Build.0 = Debug|Win32
+		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|x64.ActiveCfg = Debug|x64
+		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Debug|x64.Build.0 = Debug|x64
 		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|Win32.ActiveCfg = Release|Win32
 		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|Win32.Build.0 = Release|Win32
-		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|x64.ActiveCfg = Release|Win32
-		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|x64.Build.0 = Release|Win32
+		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|x64.ActiveCfg = Release|x64
+		{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/msgfmt/msgfmt.vcxproj b/icu4c/source/samples/msgfmt/msgfmt.vcxproj
index eebe956..fd90eac 100644
--- a/icu4c/source/samples/msgfmt/msgfmt.vcxproj
+++ b/icu4c/source/samples/msgfmt/msgfmt.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{5FF1D1A2-1630-446C-B6EA-93EFD4F975C3}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -89,11 +54,8 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/msgfmt.pch</PrecompiledHeaderOutputFile>
@@ -104,14 +66,9 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/msgfmt.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/msgfmt.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -122,17 +79,13 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/msgfmt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/msgfmt.pch</PrecompiledHeaderOutputFile>
@@ -140,24 +93,17 @@
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/msgfmt.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/msgfmt.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -165,12 +111,8 @@
       <TypeLibraryName>.\x86\Debug/msgfmt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/msgfmt.pch</PrecompiledHeaderOutputFile>
@@ -182,14 +124,9 @@
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/msgfmt.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/msgfmt.pdb</ProgramDatabaseFile>
@@ -201,16 +138,11 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/msgfmt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/msgfmt.pch</PrecompiledHeaderOutputFile>
@@ -218,14 +150,9 @@
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/msgfmt.exe</OutputFile>
@@ -237,7 +164,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -247,4 +173,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/msgfmt/util.cpp b/icu4c/source/samples/msgfmt/util.cpp
index fb353a0..7966e7a 100644
--- a/icu4c/source/samples/msgfmt/util.cpp
+++ b/icu4c/source/samples/msgfmt/util.cpp
@@ -12,6 +12,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+using namespace icu;
+
 // Verify that a UErrorCode is successful; exit(1) if not
 void check(UErrorCode& status, const char* msg) {
     if (U_FAILURE(status)) {
diff --git a/icu4c/source/samples/msgfmt/util.h b/icu4c/source/samples/msgfmt/util.h
index b66e019..590e545 100644
--- a/icu4c/source/samples/msgfmt/util.h
+++ b/icu4c/source/samples/msgfmt/util.h
@@ -10,6 +10,8 @@
 
 #include "unicode/unistr.h"
 
+using namespace icu;
+
 // Verify that a UErrorCode is successful; exit(1) if not
 void check(UErrorCode& status, const char* msg);
 
diff --git a/icu4c/source/samples/numfmt/numfmt.sln b/icu4c/source/samples/numfmt/numfmt.sln
index d855731..f691efd 100644
--- a/icu4c/source/samples/numfmt/numfmt.sln
+++ b/icu4c/source/samples/numfmt/numfmt.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|Win32.ActiveCfg = Debug|Win32
 		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|Win32.Build.0 = Debug|Win32
-		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|x64.ActiveCfg = Debug|Win32
-		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|x64.Build.0 = Debug|Win32
+		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|x64.ActiveCfg = Debug|x64
+		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Debug|x64.Build.0 = Debug|x64
 		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|Win32.ActiveCfg = Release|Win32
 		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|Win32.Build.0 = Release|Win32
-		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|x64.ActiveCfg = Release|Win32
-		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|x64.Build.0 = Release|Win32
+		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|x64.ActiveCfg = Release|x64
+		{721FBD47-E458-4C35-90DA-FF192907D5E2}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/numfmt/numfmt.vcxproj b/icu4c/source/samples/numfmt/numfmt.vcxproj
index 2e29537..0cd1e17 100644
--- a/icu4c/source/samples/numfmt/numfmt.vcxproj
+++ b/icu4c/source/samples/numfmt/numfmt.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{721FBD47-E458-4C35-90DA-FF192907D5E2}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -87,12 +52,8 @@
       <TypeLibraryName>.\x86\Debug/numfmt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/numfmt.pch</PrecompiledHeaderOutputFile>
@@ -100,18 +61,12 @@
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/numfmt.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/numfmt.pdb</ProgramDatabaseFile>
@@ -129,10 +84,8 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/numfmt.pch</PrecompiledHeaderOutputFile>
@@ -140,14 +93,9 @@
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/numfmt.exe</OutputFile>
@@ -159,7 +107,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -169,11 +116,8 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/numfmt.pch</PrecompiledHeaderOutputFile>
@@ -181,17 +125,11 @@
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/numfmt.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/numfmt.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -202,17 +140,13 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/numfmt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>../../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/numfmt.pch</PrecompiledHeaderOutputFile>
@@ -220,24 +154,17 @@
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/numfmt.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/numfmt.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -251,4 +178,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/numfmt/util.cpp b/icu4c/source/samples/numfmt/util.cpp
index f5db0e1..ad6f008 100644
--- a/icu4c/source/samples/numfmt/util.cpp
+++ b/icu4c/source/samples/numfmt/util.cpp
@@ -13,6 +13,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+using namespace icu;
+
 enum {
     U_SPACE=0x20,
     U_DQUOTE=0x22,
diff --git a/icu4c/source/samples/numfmt/util.h b/icu4c/source/samples/numfmt/util.h
index b1c2679..8c048fc 100644
--- a/icu4c/source/samples/numfmt/util.h
+++ b/icu4c/source/samples/numfmt/util.h
@@ -11,6 +11,8 @@
 #include "unicode/unistr.h"
 #include "unicode/fmtable.h"
 
+using namespace icu;
+
 #ifndef UPRV_LENGTHOF 
 #define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 
 #endif 
diff --git a/icu4c/source/samples/plurfmtsample/plurfmtsample.cpp b/icu4c/source/samples/plurfmtsample/plurfmtsample.cpp
index 87d77e3..c4c2879 100644
--- a/icu4c/source/samples/plurfmtsample/plurfmtsample.cpp
+++ b/icu4c/source/samples/plurfmtsample/plurfmtsample.cpp
@@ -13,9 +13,11 @@
 #include "unicode/plurfmt.h"
 #include "unicode/msgfmt.h"
 #include "unicode/ustdio.h"
-//! [PluralFormatExample1] 
+//! [PluralFormatExample1]
 
 using namespace std;
+using namespace icu;
+
 static void PluralFormatExample() {
 	  
 	u_printf("=============================================================================\n");
diff --git a/icu4c/source/samples/plurfmtsample/plurfmtsample.vcxproj b/icu4c/source/samples/plurfmtsample/plurfmtsample.vcxproj
index 1276c9a..859213e 100644
--- a/icu4c/source/samples/plurfmtsample/plurfmtsample.vcxproj
+++ b/icu4c/source/samples/plurfmtsample/plurfmtsample.vcxproj
@@ -1,33 +1,33 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{B500B731-ED1A-4761-94ED-B22DFE25FF2B}</ProjectGuid>
-    <RootNamespace>plurfmtsample</RootNamespace>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -35,64 +35,100 @@
   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <OutDir>.\x86\debug</OutDir>
+    <OutDir>.\x86\Debug\</OutDir>
+    <IntDir>.\x86\Debug\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <IntDir>.\x86\debug</IntDir>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <OutDir>.\x64\Debug\</OutDir>
+    <IntDir>.\x64\Debug\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <OutDir>.\x86\release</OutDir>
+    <OutDir>.\x86\Release\</OutDir>
+    <IntDir>.\x86\Release\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <IntDir>.\x86\release</IntDir>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <OutDir>.\x64\Release\</OutDir>
+    <IntDir>.\x64\Release\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <OutputFile>.\x86\debug/plurfmtsample.exe</OutputFile>
+      <OutputFile>.\x86\Debug\plurfmtsample.exe</OutputFile>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <OutputFile>.\x64\Debug\plurfmtsample.exe</OutputFile>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <OutputFile>.\x86\debug/plurfmtsample.exe</OutputFile>
+      <OutputFile>.\x86\Release\plurfmtsample.exe</OutputFile>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <OutputFile>.\x64\Release\plurfmtsample.exe</OutputFile>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="plurfmtsample.cpp" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\io\io.vcxproj">
-      <Project>{c2b04507-2521-4801-bf0d-5fd79d6d518c}</Project>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/props/props.sln b/icu4c/source/samples/props/props.sln
index 065009c..7027a11 100644
--- a/icu4c/source/samples/props/props.sln
+++ b/icu4c/source/samples/props/props.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|Win32.ActiveCfg = Debug|Win32
 		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|Win32.Build.0 = Debug|Win32
-		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|x64.ActiveCfg = Debug|Win32
-		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|x64.Build.0 = Debug|Win32
+		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|x64.ActiveCfg = Debug|x64
+		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Debug|x64.Build.0 = Debug|x64
 		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|Win32.ActiveCfg = Release|Win32
 		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|Win32.Build.0 = Release|Win32
-		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|x64.ActiveCfg = Release|Win32
-		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|x64.Build.0 = Release|Win32
+		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|x64.ActiveCfg = Release|x64
+		{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/props/props.vcxproj b/icu4c/source/samples/props/props.vcxproj
index 488fe6e..839cec9 100644
--- a/icu4c/source/samples/props/props.vcxproj
+++ b/icu4c/source/samples/props/props.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{ABE4CD17-8ED8-4DE6-ABDE-CDEFC220CF60}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -89,7 +54,6 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -104,10 +68,6 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/props.exe</OutputFile>
@@ -128,7 +88,6 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -143,10 +102,6 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/props.exe</OutputFile>
@@ -157,7 +112,7 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
+      
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -167,7 +122,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
@@ -182,10 +136,6 @@
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/props.exe</OutputFile>
@@ -207,7 +157,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
@@ -222,10 +171,6 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/props.exe</OutputFile>
@@ -237,7 +182,7 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
+      
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -246,4 +191,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/strsrch/strsrch.sln b/icu4c/source/samples/strsrch/strsrch.sln
index efd7d65..399eb2f 100644
--- a/icu4c/source/samples/strsrch/strsrch.sln
+++ b/icu4c/source/samples/strsrch/strsrch.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|Win32.ActiveCfg = Debug|Win32
 		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|Win32.Build.0 = Debug|Win32
-		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|x64.ActiveCfg = Debug|Win32
-		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|x64.Build.0 = Debug|Win32
+		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|x64.ActiveCfg = Debug|x64
+		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Debug|x64.Build.0 = Debug|x64
 		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|Win32.ActiveCfg = Release|Win32
 		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|Win32.Build.0 = Release|Win32
-		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|x64.ActiveCfg = Release|Win32
-		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|x64.Build.0 = Release|Win32
+		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|x64.ActiveCfg = Release|x64
+		{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/strsrch/strsrch.vcxproj b/icu4c/source/samples/strsrch/strsrch.vcxproj
index 67efde7..35ea8ae 100644
--- a/icu4c/source/samples/strsrch/strsrch.vcxproj
+++ b/icu4c/source/samples/strsrch/strsrch.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{E97790D1-7ABE-4C8E-9627-251ABEAA3EEC}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -89,10 +54,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/strsrch.pch</PrecompiledHeaderOutputFile>
@@ -101,14 +63,9 @@
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuind.lib;icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/strsrch.exe</OutputFile>
@@ -124,16 +81,11 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/strsrch.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/strsrch.pch</PrecompiledHeaderOutputFile>
@@ -142,18 +94,12 @@
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuind.lib;icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/strsrch.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/strsrch.pdb</ProgramDatabaseFile>
@@ -161,7 +107,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -171,11 +116,8 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/strsrch.pch</PrecompiledHeaderOutputFile>
@@ -186,14 +128,9 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuin.lib;icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/strsrch.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/strsrch.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -204,17 +141,13 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/strsrch.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/strsrch.pch</PrecompiledHeaderOutputFile>
@@ -225,10 +158,6 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuin.lib;icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/strsrch.exe</OutputFile>
@@ -239,7 +168,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -248,4 +176,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/translit/translit.sln b/icu4c/source/samples/translit/translit.sln
index 6b74f1b..382e4c6 100644
--- a/icu4c/source/samples/translit/translit.sln
+++ b/icu4c/source/samples/translit/translit.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|Win32.ActiveCfg = Debug|Win32
 		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|Win32.Build.0 = Debug|Win32
-		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|x64.ActiveCfg = Debug|Win32
-		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|x64.Build.0 = Debug|Win32
+		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|x64.ActiveCfg = Debug|x64
+		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Debug|x64.Build.0 = Debug|x64
 		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|Win32.ActiveCfg = Release|Win32
 		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|Win32.Build.0 = Release|Win32
-		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|x64.ActiveCfg = Release|Win32
-		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|x64.Build.0 = Release|Win32
+		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|x64.ActiveCfg = Release|x64
+		{D1BEC124-303A-4F44-BA70-55769B8FE96A}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/translit/translit.vcxproj b/icu4c/source/samples/translit/translit.vcxproj
index 2e63d9b..6925f30 100644
--- a/icu4c/source/samples/translit/translit.vcxproj
+++ b/icu4c/source/samples/translit/translit.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{D1BEC124-303A-4F44-BA70-55769B8FE96A}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,36 +47,31 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Debug/translit.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/translit.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/translit.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/translit.pdb</ProgramDatabaseFile>
@@ -123,35 +83,22 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/translit.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/translit.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/translit.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/translit.pdb</ProgramDatabaseFile>
@@ -159,7 +106,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -168,30 +114,19 @@
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/translit.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/translit.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/translit.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -202,42 +137,29 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/translit.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/translit.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/translit.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/translit.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -251,4 +173,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/translit/unaccent.h b/icu4c/source/samples/translit/unaccent.h
index 71521b5..568cc67 100644
--- a/icu4c/source/samples/translit/unaccent.h
+++ b/icu4c/source/samples/translit/unaccent.h
@@ -11,6 +11,8 @@
 #include "unicode/translit.h"
 #include "unicode/normlzr.h"
 
+using namespace icu;
+
 class UnaccentTransliterator : public Transliterator {
     
  public:
diff --git a/icu4c/source/samples/translit/util.cpp b/icu4c/source/samples/translit/util.cpp
index fc00c4f..6f38729 100644
--- a/icu4c/source/samples/translit/util.cpp
+++ b/icu4c/source/samples/translit/util.cpp
@@ -12,6 +12,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+using namespace icu;
+
 // Verify that a UErrorCode is successful; exit(1) if not
 void check(UErrorCode& status, const char* msg) {
     if (U_FAILURE(status)) {
diff --git a/icu4c/source/samples/translit/util.h b/icu4c/source/samples/translit/util.h
index dcd6384..5ff6c02 100644
--- a/icu4c/source/samples/translit/util.h
+++ b/icu4c/source/samples/translit/util.h
@@ -10,6 +10,8 @@
 
 #include "unicode/unistr.h"
 
+using namespace icu;
+
 // Verify that a UErrorCode is successful; exit(1) if not
 void check(UErrorCode& status, const char* msg);
 
diff --git a/icu4c/source/samples/uciter8/uciter8.sln b/icu4c/source/samples/uciter8/uciter8.sln
index 6ad99e5..8fe98ff 100644
--- a/icu4c/source/samples/uciter8/uciter8.sln
+++ b/icu4c/source/samples/uciter8/uciter8.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|Win32.ActiveCfg = Debug|Win32
 		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|Win32.Build.0 = Debug|Win32
-		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|x64.ActiveCfg = Debug|Win32
-		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|x64.Build.0 = Debug|Win32
+		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|x64.ActiveCfg = Debug|x64
+		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Debug|x64.Build.0 = Debug|x64
 		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|Win32.ActiveCfg = Release|Win32
 		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|Win32.Build.0 = Release|Win32
-		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|x64.ActiveCfg = Release|Win32
-		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|x64.Build.0 = Release|Win32
+		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|x64.ActiveCfg = Release|x64
+		{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/uciter8/uciter8.vcxproj b/icu4c/source/samples/uciter8/uciter8.vcxproj
index 194a1d3..0318e70 100644
--- a/icu4c/source/samples/uciter8/uciter8.vcxproj
+++ b/icu4c/source/samples/uciter8/uciter8.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{94379DD9-E6CC-47AC-8E62-0A4ABD8EB121}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,36 +47,31 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Debug/uciter8.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/uciter8.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/uciter8.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/uciter8.pdb</ProgramDatabaseFile>
@@ -123,35 +83,22 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/uciter8.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/uciter8.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/uciter8.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/uciter8.pdb</ProgramDatabaseFile>
@@ -159,7 +106,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -168,30 +114,19 @@
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/uciter8.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/uciter8.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/uciter8.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -202,42 +137,29 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/uciter8.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/uciter8.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/uciter8.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/uciter8.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -250,4 +172,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/uciter8/uit_len8.c b/icu4c/source/samples/uciter8/uit_len8.c
index e7f8303..5f8778b 100644
--- a/icu4c/source/samples/uciter8/uit_len8.c
+++ b/icu4c/source/samples/uciter8/uit_len8.c
@@ -551,7 +551,7 @@
             if(length>=0) {
                 iter->limit=length;
             } else {
-                iter->limit=strlen(s);
+                iter->limit=(int32_t)strlen(s);
             }
             iter->length= iter->limit<=1 ? iter->limit : -1;
         } else {
diff --git a/icu4c/source/samples/ucnv/convsamp.cpp b/icu4c/source/samples/ucnv/convsamp.cpp
index 7194e6d..a692b77 100644
--- a/icu4c/source/samples/ucnv/convsamp.cpp
+++ b/icu4c/source/samples/ucnv/convsamp.cpp
@@ -130,7 +130,7 @@
   int32_t i;
 
   if( (len == -1) && (uch) ) {
-    len = strlen(uch);
+    len = static_cast<int32_t>(strlen(uch));
   }
 
   printf("%5s: ", name);
@@ -329,7 +329,7 @@
 
   // grab another buffer's worth
   while((!feof(f)) && 
-        ((count=fread(inBuf, 1, BUFFERSIZE , f)) > 0) )
+        ((count=static_cast<int32_t>(fread(inBuf, 1, BUFFERSIZE , f))) > 0) )
   {
     // Convert bytes to unicode
     source = inBuf;
@@ -424,7 +424,7 @@
   info = (CharFreqInfo*)malloc(sizeof(CharFreqInfo) * charCount);
   if(!info)
   {
-    fprintf(stderr, " Couldn't allocate %d bytes for freq counter\n", sizeof(CharFreqInfo)*charCount);
+    fprintf(stderr, " Couldn't allocate %d bytes for freq counter\n", static_cast<int>(sizeof(CharFreqInfo)*charCount));
   }
 
   /* reset frequencies */
@@ -444,7 +444,7 @@
 
   // grab another buffer's worth
   while((!feof(f)) && 
-        ((count=fread(inBuf, 1, BUFFERSIZE , f)) > 0) )
+        ((count=static_cast<int32_t>(fread(inBuf, 1, BUFFERSIZE , f))) > 0) )
   {
     // Convert bytes to unicode
     source = inBuf;
@@ -545,7 +545,7 @@
   // convert to Unicode
   // Note: we can use strlen, we know it's an 8 bit null terminated codepage
   target[6] = 0xFDCA;
-  len = ucnv_toUChars(conv, target, 100, source, strlen(source), &status);
+  len = ucnv_toUChars(conv, target, 100, source, static_cast<int32_t>(strlen(source)), &status);
   U_ASSERT(status);
   // close the converter
   ucnv_close(conv);
@@ -553,7 +553,7 @@
   // ***************************** END SAMPLE ********************
   
   // Print it out
-  printBytes("src", source, strlen(source) );
+  printBytes("src", source, static_cast<int32_t>(strlen(source)) );
   printf("\n");
   printUChars("targ", target, len);
 
@@ -590,7 +590,7 @@
   // **************************** START SAMPLE *******************
 
 
-  printBytes("src",source,sourceLimit-source);
+  printBytes("src", source, static_cast<int32_t>(sourceLimit - source));
 
   while(source < sourceLimit)
   {
@@ -640,7 +640,7 @@
   conv = ucnv_open("utf-8", &status);
   U_ASSERT(status);
 
-  len = ucnv_toUChars(conv, uchars, 100, source, strlen(source), &status);
+  len = ucnv_toUChars(conv, uchars, 100, source, static_cast<int32_t>(strlen(source)), &status);
   U_ASSERT(status);
  
   printUChars("uch", uchars, len);
@@ -719,7 +719,6 @@
   UConverter *conv = NULL, *cloneCnv = NULL;
   UErrorCode status = U_ZERO_ERROR;
   uint32_t len, len2;
-  int32_t  cloneLen;
   UBool  flagVal = FALSE;
   UConverterFromUCallback junkCB;
   
@@ -741,7 +740,7 @@
   conv = ucnv_open("utf-8", &status);
   U_ASSERT(status);
 
-  len = ucnv_toUChars(conv, uchars, 100, source, strlen(source), &status);
+  len = ucnv_toUChars(conv, uchars, 100, source, static_cast<int32_t>(strlen(source)), &status);
   U_ASSERT(status);
  
   printUChars("uch", uchars, len);
@@ -916,7 +915,7 @@
 
   // grab another buffer's worth
   while((!feof(f)) && 
-        ((count=fread(inBuf, 1, BUFFERSIZE , f)) > 0) )
+        ((count=static_cast<int32_t>(fread(inBuf, 1, BUFFERSIZE , f))) > 0) )
   {
     inbytes += count;
 
@@ -950,9 +949,8 @@
 
         // Process the Unicode
         // Todo: handle UTF-16/surrogates
-        assert(fwrite(uBuf, sizeof(uBuf[0]), (target-uBuf), out) ==
-               (size_t)(target-uBuf));
-        total += (target-uBuf);
+        assert(fwrite(uBuf, sizeof(uBuf[0]), (target-uBuf), out) == (size_t)(target-uBuf));
+        total += static_cast<uint32_t>((target-uBuf));
     } while (source < sourceLimit); // while simply out of space
   }
 
@@ -1022,7 +1020,7 @@
 
   // grab another buffer's worth
   while((!feof(f)) && 
-        ((count=fread(inBuf, sizeof(UChar), BUFFERSIZE , f)) > 0) )
+        ((count=static_cast<int32_t>(fread(inBuf, sizeof(UChar), BUFFERSIZE , f))) > 0) )
   {
     inchars += count;
 
@@ -1055,13 +1053,12 @@
         }
 
         // Process the Unicode
-        assert(fwrite(buf, sizeof(buf[0]), (target-buf), out) ==
-               (size_t)(target-buf));
-        total += (target-buf);
+        assert(fwrite(buf, sizeof(buf[0]), (target-buf), out) == (size_t)(target-buf));
+        total += static_cast<uint32_t>((target-buf));
     } while (source < sourceLimit); // while simply out of space
   }
 
-  printf("%d Uchars (%d bytes) in, %d chars out.\n", inchars, inchars * sizeof(UChar), total);
+  printf("%d Uchars (%d bytes) in, %d chars out.\n", inchars, static_cast<int>(inchars * sizeof(UChar)), total);
   
   // ***************************** END SAMPLE ********************
   ucnv_close(conv);
diff --git a/icu4c/source/samples/ucnv/ucnv.sln b/icu4c/source/samples/ucnv/ucnv.sln
index 0ae26ff..40673e3 100644
--- a/icu4c/source/samples/ucnv/ucnv.sln
+++ b/icu4c/source/samples/ucnv/ucnv.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|Win32.ActiveCfg = Debug|Win32
 		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|Win32.Build.0 = Debug|Win32
-		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|x64.ActiveCfg = Debug|Win32
-		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|x64.Build.0 = Debug|Win32
+		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|x64.ActiveCfg = Debug|x64
+		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Debug|x64.Build.0 = Debug|x64
 		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|Win32.ActiveCfg = Release|Win32
 		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|Win32.Build.0 = Release|Win32
-		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|x64.ActiveCfg = Release|Win32
-		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|x64.Build.0 = Release|Win32
+		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|x64.ActiveCfg = Release|x64
+		{8C95060E-61F5-464E-BB42-95B788C0D7E4}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/ucnv/ucnv.vcxproj b/icu4c/source/samples/ucnv/ucnv.vcxproj
index 796c700..50dec38 100644
--- a/icu4c/source/samples/ucnv/ucnv.vcxproj
+++ b/icu4c/source/samples/ucnv/ucnv.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{8C95060E-61F5-464E-BB42-95B788C0D7E4}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,36 +47,31 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Debug/ucnv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/ucnv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/ucnv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/ucnv.pdb</ProgramDatabaseFile>
@@ -123,35 +83,22 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/ucnv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/ucnv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/ucnv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/ucnv.pdb</ProgramDatabaseFile>
@@ -159,7 +106,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -168,30 +114,19 @@
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/ucnv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/ucnv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/ucnv.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -202,42 +137,29 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/ucnv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/ucnv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/ucnv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/ucnv.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -250,4 +172,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/udata/reader.vcxproj b/icu4c/source/samples/udata/reader.vcxproj
index 0faeeb6..671ba15 100644
--- a/icu4c/source/samples/udata/reader.vcxproj
+++ b/icu4c/source/samples/udata/reader.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -67,20 +32,25 @@
     <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\reader_Win32_Debug\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\reader_Win32_Debug\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\reader_Win32_Release\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\reader_Win32_Release\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <OutDir>.\x86\Debug\</OutDir>
+    <IntDir>.\x86\Debug\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <OutDir>.\x64\Debug\</OutDir>
+    <IntDir>.\x64\Debug\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <OutDir>.\x86\Release\</OutDir>
+    <IntDir>.\x86\Release\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <OutDir>.\x64\Release\</OutDir>
+    <IntDir>.\x64\Release\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
@@ -89,10 +59,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\reader_Win32_Debug/reader.pch</PrecompiledHeaderOutputFile>
@@ -100,18 +67,12 @@
       <ObjectFileName>.\reader_Win32_Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\reader_Win32_Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\reader_Win32_Debug/reader.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\reader_Win32_Debug/reader.pdb</ProgramDatabaseFile>
@@ -123,43 +84,31 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-      <TypeLibraryName>.\reader_Win32_Debug/reader.tlb</TypeLibraryName>
+      <TypeLibraryName>.\reader_x64_Debug/reader.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
-      <PrecompiledHeaderOutputFile>.\reader_Win32_Debug/reader.pch</PrecompiledHeaderOutputFile>
-      <AssemblerListingLocation>.\reader_Win32_Debug/</AssemblerListingLocation>
-      <ObjectFileName>.\reader_Win32_Debug/</ObjectFileName>
-      <ProgramDataBaseFileName>.\reader_Win32_Debug/</ProgramDataBaseFileName>
+      <PrecompiledHeaderOutputFile>.\reader_x64_Debug/reader.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>.\reader_x64_Debug/</AssemblerListingLocation>
+      <ObjectFileName>.\reader_x64_Debug/</ObjectFileName>
+      <ProgramDataBaseFileName>.\reader_x64_Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\reader_x64_Debug/reader.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>.\reader_Win32_Debug/reader.pdb</ProgramDatabaseFile>
+      <ProgramDatabaseFile>.\reader_x64_Debug/reader.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -169,11 +118,8 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\reader_Win32_Release/reader.pch</PrecompiledHeaderOutputFile>
@@ -181,17 +127,11 @@
       <ObjectFileName>.\reader_Win32_Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\reader_Win32_Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\reader_Win32_Release/reader.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\reader_Win32_Release/reader.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -202,42 +142,32 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-      <TypeLibraryName>.\reader_Win32_Release/reader.tlb</TypeLibraryName>
+      <TypeLibraryName>.\reader_x64_Release/reader.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
-      <PrecompiledHeaderOutputFile>.\reader_Win32_Release/reader.pch</PrecompiledHeaderOutputFile>
-      <AssemblerListingLocation>.\reader_Win32_Release/</AssemblerListingLocation>
-      <ObjectFileName>.\reader_Win32_Release/</ObjectFileName>
-      <ProgramDataBaseFileName>.\reader_Win32_Release/</ProgramDataBaseFileName>
+      <PrecompiledHeaderOutputFile>.\reader_x64_Release/reader.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>.\reader_x64_Release/</AssemblerListingLocation>
+      <ObjectFileName>.\reader_x64_Release/</ObjectFileName>
+      <ProgramDataBaseFileName>.\reader_x64_Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\reader_x64_Release/reader.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ProgramDatabaseFile>.\reader_Win32_Release/reader.pdb</ProgramDatabaseFile>
+      <ProgramDatabaseFile>.\reader_x64_Release/reader.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -249,4 +179,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/udata/udata.sln b/icu4c/source/samples/udata/udata.sln
index a3b2fd3..8a3747d 100644
--- a/icu4c/source/samples/udata/udata.sln
+++ b/icu4c/source/samples/udata/udata.sln
@@ -14,20 +14,20 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|Win32.ActiveCfg = Debug|Win32
 		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|Win32.Build.0 = Debug|Win32
-		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|x64.ActiveCfg = Debug|Win32
-		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|x64.Build.0 = Debug|Win32
+		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|x64.ActiveCfg = Debug|x64
+		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Debug|x64.Build.0 = Debug|x64
 		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|Win32.ActiveCfg = Release|Win32
 		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|Win32.Build.0 = Release|Win32
-		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|x64.ActiveCfg = Release|Win32
-		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|x64.Build.0 = Release|Win32
+		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|x64.ActiveCfg = Release|x64
+		{BFEFC070-C5A9-42E3-BAAE-A51FB2C4BA28}.Release|x64.Build.0 = Release|x64
 		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|Win32.ActiveCfg = Debug|Win32
 		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|Win32.Build.0 = Debug|Win32
-		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|x64.ActiveCfg = Debug|Win32
-		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|x64.Build.0 = Debug|Win32
+		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|x64.ActiveCfg = Debug|x64
+		{40A90302-F173-4629-A003-F571D2D93D16}.Debug|x64.Build.0 = Debug|x64
 		{40A90302-F173-4629-A003-F571D2D93D16}.Release|Win32.ActiveCfg = Release|Win32
 		{40A90302-F173-4629-A003-F571D2D93D16}.Release|Win32.Build.0 = Release|Win32
-		{40A90302-F173-4629-A003-F571D2D93D16}.Release|x64.ActiveCfg = Release|Win32
-		{40A90302-F173-4629-A003-F571D2D93D16}.Release|x64.Build.0 = Release|Win32
+		{40A90302-F173-4629-A003-F571D2D93D16}.Release|x64.ActiveCfg = Release|x64
+		{40A90302-F173-4629-A003-F571D2D93D16}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/udata/writer.vcxproj b/icu4c/source/samples/udata/writer.vcxproj
index 80e74ab..f6236b9 100644
--- a/icu4c/source/samples/udata/writer.vcxproj
+++ b/icu4c/source/samples/udata/writer.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{40A90302-F173-4629-A003-F571D2D93D16}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -67,32 +32,33 @@
     <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <OutDir>.\x86\Debug\</OutDir>
+    <IntDir>.\x86\Debug\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <OutDir>.\x64\Debug\</OutDir>
+    <IntDir>.\x64\Debug\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <OutDir>.\x86\Release\</OutDir>
+    <IntDir>.\x86\Release\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <OutDir>.\x64\Release\</OutDir>
+    <IntDir>.\x64\Release\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Debug/writer.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/writer.pch</PrecompiledHeaderOutputFile>
@@ -100,14 +66,9 @@
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/writer.exe</OutputFile>
@@ -123,16 +84,12 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/writer.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/writer.pch</PrecompiledHeaderOutputFile>
@@ -140,14 +97,9 @@
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/writer.exe</OutputFile>
@@ -159,7 +111,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -169,11 +120,8 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/writer.pch</PrecompiledHeaderOutputFile>
@@ -181,17 +129,11 @@
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/writer.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/writer.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -202,17 +144,13 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/writer.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/writer.pch</PrecompiledHeaderOutputFile>
@@ -220,24 +158,17 @@
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>.\x64\Release/writer.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>.\x64\Release\writer.exe</OutputFile>
       <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ProgramDatabaseFile>.\x64\Release/writer.pdb</ProgramDatabaseFile>
+      <ProgramDatabaseFile>.\x64\Release\writer.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -246,4 +177,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/ufortune/resources/fortune_resources.mak b/icu4c/source/samples/ufortune/resources/fortune_resources.mak
index d860517..707ae6b 100644
--- a/icu4c/source/samples/ufortune/resources/fortune_resources.mak
+++ b/icu4c/source/samples/ufortune/resources/fortune_resources.mak
@@ -6,7 +6,7 @@
 #  fortune_resources.mak
 #
 #      Windows nmake makefile for compiling and packaging the resources
-#      for for the ICU sample program "ufortune".
+#      for the ICU sample program "ufortune".
 #
 #      This makefile is normally invoked by the pre-link step in the
 #      MSVC project file for ufortune
@@ -45,7 +45,7 @@
 #  -t fools make into thinking there are files such as es.res, etc
 #
 .txt.res:
-	$(ICUDIR)\$(BIN)\genrb -d . $*.txt
+    $(ICUDIR)\$(BIN)\genrb -d . $*.txt
 
 #
 #  all - nmake starts here by default
@@ -53,5 +53,5 @@
 all: fortune_resources.dll
 
 fortune_resources.dll: $(RESFILES)
-	$(ICUDIR)\$(BIN)\pkgdata --name fortune_resources -v --mode dll -d . res-file-list.txt
+    $(ICUDIR)\$(BIN)\pkgdata --name fortune_resources -v --mode dll -d . res-file-list.txt
 
diff --git a/icu4c/source/samples/ufortune/ufortune.sln b/icu4c/source/samples/ufortune/ufortune.sln
index 481189b..c071818 100644
--- a/icu4c/source/samples/ufortune/ufortune.sln
+++ b/icu4c/source/samples/ufortune/ufortune.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|Win32.ActiveCfg = Debug|Win32
 		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|Win32.Build.0 = Debug|Win32
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|x64.ActiveCfg = Debug|Win32
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|x64.Build.0 = Debug|Win32
+		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|x64.ActiveCfg = Debug|x64
+		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Debug|x64.Build.0 = Debug|x64
 		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|Win32.ActiveCfg = Release|Win32
 		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|Win32.Build.0 = Release|Win32
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|x64.ActiveCfg = Release|Win32
-		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|x64.Build.0 = Release|Win32
+		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|x64.ActiveCfg = Release|x64
+		{25F534DF-93C9-4853-A88E-DB7D8CF74042}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/ufortune/ufortune.vcxproj b/icu4c/source/samples/ufortune/ufortune.vcxproj
index ff1760a..7eb88ca 100644
--- a/icu4c/source/samples/ufortune/ufortune.vcxproj
+++ b/icu4c/source/samples/ufortune/ufortune.vcxproj
@@ -1,51 +1,25 @@
 <?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
       <Configuration>Debug</Configuration>
       <Platform>Win32</Platform>
     </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
     <ProjectConfiguration Include="Release|Win32">
       <Configuration>Release</Configuration>
       <Platform>Win32</Platform>
     </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectGuid>{25F534DF-93C9-4853-A88E-DB7D8CF74042}</ProjectGuid>
     <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
+    <PlatformToolset>v141</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -58,29 +32,16 @@
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
     <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
   </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
-  </ImportGroup>
   <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\x86\Debug\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\x86\Release\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <OutDir>.\x86\Debug\</OutDir>
+    <IntDir>.\x86\Debug\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <OutDir>.\x86\Release\</OutDir>
+    <IntDir>.\x86\Release\</IntDir>
+    <TargetName>$(ProjectName)</TargetName>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
@@ -89,18 +50,15 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeaderOutputFile>.\x86\Debug/ufortune.pch</PrecompiledHeaderOutputFile>
-      <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
-      <ObjectFileName>.\x86\Debug/</ObjectFileName>
-      <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <PrecompiledHeaderFile />
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -108,56 +66,15 @@
     </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;resources\fortune_resources.lib;icuiod.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>.\x86\Debug/ufortune.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>.\x86\Debug/ufortune.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
     </Link>
   </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-      <TypeLibraryName>.\x64\Debug/ufortune.tlb</TypeLibraryName>
-    </Midl>
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeaderOutputFile>.\x64\Debug/ufortune.pch</PrecompiledHeaderOutputFile>
-      <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
-      <ObjectFileName>.\x64\Debug/</ObjectFileName>
-      <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <CompileAs>Default</CompileAs>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>icuucd.lib;resources\fortune_resources.lib;icuiod.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>.\x64\Debug/ufortune.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <ProgramDatabaseFile>.\x64\Debug/ufortune.pdb</ProgramDatabaseFile>
-      <SubSystem>Console</SubSystem>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Release/ufortune.tlb</TypeLibraryName>
@@ -165,18 +82,15 @@
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeaderOutputFile>.\x86\Release/ufortune.pch</PrecompiledHeaderOutputFile>
-      <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
-      <ObjectFileName>.\x86\Release/</ObjectFileName>
-      <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <PrecompiledHeaderFile />
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -184,54 +98,14 @@
     </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;resources\fortune_resources.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>.\x86\Release/ufortune.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ProgramDatabaseFile>.\x86\Release/ufortune.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
     </Link>
   </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-      <TypeLibraryName>.\x64\Release/ufortune.tlb</TypeLibraryName>
-    </Midl>
-    <ClCompile>
-      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeaderOutputFile>.\x64\Release/ufortune.pch</PrecompiledHeaderOutputFile>
-      <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
-      <ObjectFileName>.\x64\Release/</ObjectFileName>
-      <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <CompileAs>Default</CompileAs>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>icuuc.lib;resources\fortune_resources.lib;icuio.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>.\x64\Release/ufortune.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <AdditionalLibraryDirectories>../../../lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ProgramDatabaseFile>.\x64\Release/ufortune.pdb</ProgramDatabaseFile>
-      <SubSystem>Console</SubSystem>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
-      <DataExecutionPrevention>
-      </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="ufortune.c" />
   </ItemGroup>
@@ -245,24 +119,14 @@
 copy Fortune_Resources.DLL "$(TargetDir)"
 </Command>
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">resources\fortune_resources.DLL;%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">cd resources
-nmake -f fortune_resources.mak CFG=x64\Debug
-copy Fortune_Resources.DLL "$(TargetDir)"
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">resources\fortune_resources.DLL;%(Outputs)</Outputs>
       <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cd resources
 nmake -f fortune_resources.mak CFG=x86\Release
 copy Fortune_Resources.DLL "$(TargetDir)"
 </Command>
       <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">resources\fortune_resources.DLL;%(Outputs)</Outputs>
-      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">cd resources
-nmake -f fortune_resources.mak CFG=x64\Release
-copy Fortune_Resources.DLL "$(TargetDir)"
-</Command>
-      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">resources\fortune_resources.DLL;%(Outputs)</Outputs>
     </CustomBuild>
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/ugrep/ugrep.cpp b/icu4c/source/samples/ugrep/ugrep.cpp
index b704059..9c2f0bd 100644
--- a/icu4c/source/samples/ugrep/ugrep.cpp
+++ b/icu4c/source/samples/ugrep/ugrep.cpp
@@ -16,7 +16,7 @@
 //   ugrep  - an ICU sample program illustrating the use of ICU Regular Expressions.
 //
 //            The use of the ICU Regex API all occurs within the main()
-//            function.  The rest of the code deals with with opening files,
+//            function.  The rest of the code deals with opening files,
 //            encoding conversions, printing results, etc.
 //
 //            This is not a full-featured grep program.  The command line options
@@ -35,9 +35,10 @@
 #include "unicode/ucnv.h"
 #include "unicode/uclean.h"
 
+using namespace icu;
 
 //
-//  The following variables contain paramters that may be set from the command line.
+//  The following variables contain parameters that may be set from the command line.
 //
 const char *pattern = NULL;     // The regular expression
 int        firstFileNum;        //  argv index of the first file name
@@ -95,7 +96,7 @@
     UBool     matchFound = FALSE;
 
     //
-    //  Process the commmand line options.
+    //  Process the command line options.
     //
     processOptions(argc, argv);
 
@@ -170,7 +171,7 @@
 //   doOptions          Run through the command line options, and set
 //                      the global variables accordingly.
 //
-//                      exit without returning if an error occured and
+//                      exit without returning if an error occurred and
 //                      ugrep should not proceed further.
 //
 //------------------------------------------------------------------------------------------
@@ -290,7 +291,7 @@
     //   Read in the file
     //
     charBuf    = (char *)realloc(charBuf, rawFileLen+1);   // Need error checking...
-    int t = fread(charBuf, 1, rawFileLen, file);
+    int t = static_cast<int>(fread(charBuf, 1, rawFileLen, file));
     if (t != rawFileLen)  {
         fprintf(stderr, "Error reading file \"%s\"\n", fileName);
         fclose(file);
@@ -371,7 +372,7 @@
 //
 //   nextLine           Advance the line index variables, starting at the
 //                      specified position in the input file buffer, by
-//                      scanning forwrd until the next end-of-line.
+//                      scanning forward until the next end-of-line.
 //
 //                      Need to take into account all of the possible Unicode
 //                      line ending sequences.
diff --git a/icu4c/source/samples/ugrep/ugrep.sln b/icu4c/source/samples/ugrep/ugrep.sln
index a532698..be16908 100644
--- a/icu4c/source/samples/ugrep/ugrep.sln
+++ b/icu4c/source/samples/ugrep/ugrep.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|Win32.ActiveCfg = Debug|Win32
 		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|Win32.Build.0 = Debug|Win32
-		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|x64.ActiveCfg = Debug|Win32
-		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|x64.Build.0 = Debug|Win32
+		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|x64.ActiveCfg = Debug|x64
+		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Debug|x64.Build.0 = Debug|x64
 		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|Win32.ActiveCfg = Release|Win32
 		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|Win32.Build.0 = Release|Win32
-		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|x64.ActiveCfg = Release|Win32
-		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|x64.Build.0 = Release|Win32
+		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|x64.ActiveCfg = Release|x64
+		{63166CEB-02CC-472C-B3B7-E6C559939BDA}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/ugrep/ugrep.vcxproj b/icu4c/source/samples/ugrep/ugrep.vcxproj
index 1d42f57..799f821 100644
--- a/icu4c/source/samples/ugrep/ugrep.vcxproj
+++ b/icu4c/source/samples/ugrep/ugrep.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{63166CEB-02CC-472C-B3B7-E6C559939BDA}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -90,11 +55,8 @@
       <Optimization>MaxSpeed</Optimization>
       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/ugrep.pch</PrecompiledHeaderOutputFile>
@@ -105,10 +67,6 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalOptions>/FIXED:NO %(AdditionalOptions)</AdditionalOptions>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -120,12 +78,10 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX86</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/ugrep.tlb</TypeLibraryName>
       <HeaderFileName>
       </HeaderFileName>
@@ -134,11 +90,8 @@
       <Optimization>MaxSpeed</Optimization>
       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/ugrep.pch</PrecompiledHeaderOutputFile>
@@ -149,10 +102,6 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalOptions>/FIXED:NO %(AdditionalOptions)</AdditionalOptions>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -164,7 +113,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -176,10 +124,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/ugrep.pch</PrecompiledHeaderOutputFile>
@@ -191,10 +136,6 @@
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/ugrep.exe</OutputFile>
@@ -206,12 +147,10 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX86</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/ugrep.tlb</TypeLibraryName>
       <HeaderFileName>
       </HeaderFileName>
@@ -219,10 +158,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/ugrep.pch</PrecompiledHeaderOutputFile>
@@ -230,18 +166,12 @@
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/ugrep.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/ugrep.pdb</ProgramDatabaseFile>
@@ -249,28 +179,12 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClCompile Include="ugrep.cpp">
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ClCompile>
+    <ClCompile Include="ugrep.cpp" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/uresb/resources.vcxproj b/icu4c/source/samples/uresb/resources.vcxproj
index e121cea..55e61b4 100644
--- a/icu4c/source/samples/uresb/resources.vcxproj
+++ b/icu4c/source/samples/uresb/resources.vcxproj
@@ -1,38 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{69437707-2FEF-4E2C-8C3F-6E6B3D241366}</ProjectGuid>
     <Keyword>MakeFileProj</Keyword>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Makefile</ConfigurationType>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Makefile</ConfigurationType>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Makefile</ConfigurationType>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Makefile</ConfigurationType>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -113,4 +89,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/uresb/uresb.sln b/icu4c/source/samples/uresb/uresb.sln
index c17a5a6..8020fbb 100644
--- a/icu4c/source/samples/uresb/uresb.sln
+++ b/icu4c/source/samples/uresb/uresb.sln
@@ -17,20 +17,20 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|Win32.ActiveCfg = Debug|Win32
 		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|Win32.Build.0 = Debug|Win32
-		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|x64.ActiveCfg = Debug|Win32
-		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|x64.Build.0 = Debug|Win32
+		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|x64.ActiveCfg = Debug|x64
+		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Debug|x64.Build.0 = Debug|x64
 		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|Win32.ActiveCfg = Release|Win32
 		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|Win32.Build.0 = Release|Win32
-		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|x64.ActiveCfg = Release|Win32
-		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|x64.Build.0 = Release|Win32
+		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|x64.ActiveCfg = Release|x64
+		{69437707-2FEF-4E2C-8C3F-6E6B3D241366}.Release|x64.Build.0 = Release|x64
 		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|Win32.ActiveCfg = Debug|Win32
 		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|Win32.Build.0 = Debug|Win32
-		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|x64.ActiveCfg = Debug|Win32
-		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|x64.Build.0 = Debug|Win32
+		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|x64.ActiveCfg = Debug|x64
+		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Debug|x64.Build.0 = Debug|x64
 		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|Win32.ActiveCfg = Release|Win32
 		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|Win32.Build.0 = Release|Win32
-		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|x64.ActiveCfg = Release|Win32
-		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|x64.Build.0 = Release|Win32
+		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|x64.ActiveCfg = Release|x64
+		{92580BF4-F4DA-4024-B3F8-444F982BC72F}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/uresb/uresb.vcxproj b/icu4c/source/samples/uresb/uresb.vcxproj
index f5a2f22..6fdd4d8 100644
--- a/icu4c/source/samples/uresb/uresb.vcxproj
+++ b/icu4c/source/samples/uresb/uresb.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{92580BF4-F4DA-4024-B3F8-444F982BC72F}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,36 +47,35 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>../../../include;../../tools/toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Release/uresb.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>../../../include;../../tools/toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/uresb.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Culture>0x0c1a</Culture>
     </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;icuio.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/uresb.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib/;../../tools/toolutil/;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/uresb.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -122,29 +86,21 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/uresb.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>../../../include;../../tools/toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/uresb.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Culture>0x0c1a</Culture>
     </ResourceCompile>
     <Link>
@@ -157,7 +113,7 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
+      
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -165,31 +121,22 @@
       <TypeLibraryName>.\x86\Debug/uresb.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>../../../include;../../tools/toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/uresb.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Culture>0x0c1a</Culture>
     </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuiod.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/uresb.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib/;../../tools/toolutil/;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/uresb.pdb</ProgramDatabaseFile>
@@ -201,35 +148,25 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/uresb.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>../../../include;../../tools/toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/uresb.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Culture>0x0c1a</Culture>
     </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;icuiod.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/uresb.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>../../../lib64/;../../tools/toolutil/;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/uresb.pdb</ProgramDatabaseFile>
@@ -237,7 +174,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -252,4 +188,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/samples/ustring/ustring.cpp b/icu4c/source/samples/ustring/ustring.cpp
index af25e20..4f0101d 100644
--- a/icu4c/source/samples/ustring/ustring.cpp
+++ b/icu4c/source/samples/ustring/ustring.cpp
@@ -31,6 +31,8 @@
 #include "unicode/ucnv.h"
 #include "unicode/unistr.h"
 
+using namespace icu;
+
 #ifndef UPRV_LENGTHOF
 #define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
 #endif
diff --git a/icu4c/source/samples/ustring/ustring.sln b/icu4c/source/samples/ustring/ustring.sln
index 265ca53..a096407 100644
--- a/icu4c/source/samples/ustring/ustring.sln
+++ b/icu4c/source/samples/ustring/ustring.sln
@@ -12,12 +12,12 @@
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|Win32.ActiveCfg = Debug|Win32
 		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|Win32.Build.0 = Debug|Win32
-		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|x64.ActiveCfg = Debug|Win32
-		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|x64.Build.0 = Debug|Win32
+		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|x64.ActiveCfg = Debug|x64
+		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Debug|x64.Build.0 = Debug|x64
 		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|Win32.ActiveCfg = Release|Win32
 		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|Win32.Build.0 = Release|Win32
-		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|x64.ActiveCfg = Release|Win32
-		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|x64.Build.0 = Release|Win32
+		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|x64.ActiveCfg = Release|x64
+		{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/icu4c/source/samples/ustring/ustring.vcxproj b/icu4c/source/samples/ustring/ustring.vcxproj
index 9196a82..10316fc 100644
--- a/icu4c/source/samples/ustring/ustring.vcxproj
+++ b/icu4c/source/samples/ustring/ustring.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{FF92E6C1-BACA-41AD-BB6D-ECA19C05573E}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,36 +47,32 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Release/ustring.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Release/ustring.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Release/ustring.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/ustring.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -122,42 +83,30 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/ustring.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
       <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Release/ustring.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Release/ustring.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/ustring.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -165,31 +114,19 @@
       <TypeLibraryName>.\x86\Debug/ustring.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x86\Debug/ustring.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x86\Debug/ustring.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/ustring.pdb</ProgramDatabaseFile>
@@ -201,35 +138,22 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/ustring.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeader>
       </PrecompiledHeader>
       <PrecompiledHeaderOutputFile>.\x64\Debug/ustring.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>.\x64\Debug/ustring.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/ustring.pdb</ProgramDatabaseFile>
@@ -237,7 +161,6 @@
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -246,4 +169,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/stubdata/icudt60l.dat b/icu4c/source/stubdata/icudt60l.dat
deleted file mode 100644
index c2b4f64..0000000
--- a/icu4c/source/stubdata/icudt60l.dat
+++ /dev/null
Binary files differ
diff --git a/icu4c/source/stubdata/icudt61l.dat b/icu4c/source/stubdata/icudt61l.dat
new file mode 100644
index 0000000..222564c
--- /dev/null
+++ b/icu4c/source/stubdata/icudt61l.dat
Binary files differ
diff --git a/icu4c/source/stubdata/stubdata.vcxproj b/icu4c/source/stubdata/stubdata.vcxproj
index f296c11..971d512 100644
--- a/icu4c/source/stubdata/stubdata.vcxproj
+++ b/icu4c/source/stubdata/stubdata.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{203EC78A-0531-43F0-A636-285439BDE025}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -84,188 +49,113 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
   </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <TypeLibraryName>.\x86\Release\icudt.tlb</TypeLibraryName>
-    </Midl>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
     <ClCompile>
       <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
-      <ExceptionHandling>
-      </ExceptionHandling>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PreprocessorDefinitions>STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
-      <PrecompiledHeaderOutputFile>.\x86\Release\stubdata.pch</PrecompiledHeaderOutputFile>
-      <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
-      <ObjectFileName>.\x86\Release/</ObjectFileName>
-      <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
       <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
+      <PreprocessorDefinitions>STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
     </ResourceCompile>
     <PreLinkEvent>
       <Command>echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." &gt; "$(ProjectDir)stubdatabuilt.txt"</Command>
     </PreLinkEvent>
     <Link>
-      <OutputFile>..\..\bin\icudt60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
-      <ProgramDatabaseFile>.\x86\Release\icudt.pdb</ProgramDatabaseFile>
+      <BaseAddress>0x4ad00000</BaseAddress>
       <NoEntryPoint>true</NoEntryPoint>
       <SetChecksum>true</SetChecksum>
-      <BaseAddress>0x4ad00000</BaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
+      <TurnOffAssemblyGeneration>true</TurnOffAssemblyGeneration>
+    </Link>
+  </ItemDefinitionGroup>
+  <!-- Options that are common to all 'Debug' project configurations -->
+  <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+    <ClCompile>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+    </ClCompile>
+  </ItemDefinitionGroup>
+  <!-- Options that are common to all 'Release' project configurations -->
+  <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+    <ClCompile>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+    </ClCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Midl>
+      <TypeLibraryName>.\x86\Release\icudt.tlb</TypeLibraryName>
+    </Midl>
+    <ClCompile>
+      <ExceptionHandling>
+      </ExceptionHandling>
+      <PrecompiledHeaderOutputFile>.\x86\Release\stubdata.pch</PrecompiledHeaderOutputFile>
+      <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
+      <ObjectFileName>.\x86\Release/</ObjectFileName>
+      <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
+    </ClCompile>
+    <Link>
+      <OutputFile>..\..\bin\icudt61.dll</OutputFile>
+      <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
+      <ProgramDatabaseFile>.\x86\Release\icudt.pdb</ProgramDatabaseFile>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TurnOffAssemblyGeneration>true</TurnOffAssemblyGeneration>
       <ImportLibrary>..\..\lib\icudt.lib</ImportLibrary>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\x86\Debug/icudt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/stubdata.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
-    <PreLinkEvent>
-      <Command>echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." &gt; "$(ProjectDir)stubdatabuilt.txt"</Command>
-    </PreLinkEvent>
     <Link>
-      <OutputFile>..\..\bin\icudt60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin\icudt61.dll</OutputFile>
       <ProgramDatabaseFile>.\x86\Debug/icudt.pdb</ProgramDatabaseFile>
-      <NoEntryPoint>true</NoEntryPoint>
-      <SetChecksum>true</SetChecksum>
-      <BaseAddress>0x4ad00000</BaseAddress>
-      <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TurnOffAssemblyGeneration>true</TurnOffAssemblyGeneration>
       <ImportLibrary>..\..\lib\icudt.lib</ImportLibrary>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release\icudt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <ExceptionHandling>
       </ExceptionHandling>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release\stubdata.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
-    <PreLinkEvent>
-      <Command>echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." &gt; "$(ProjectDir)stubdatabuilt.txt"</Command>
-    </PreLinkEvent>
     <Link>
-      <OutputFile>..\..\bin64\icudt60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin64\icudt61.dll</OutputFile>
       <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
       <ProgramDatabaseFile>.\x64\Release\icudt.pdb</ProgramDatabaseFile>
-      <NoEntryPoint>true</NoEntryPoint>
-      <SetChecksum>true</SetChecksum>
-      <BaseAddress>0x4ad00000</BaseAddress>
-      <TurnOffAssemblyGeneration>true</TurnOffAssemblyGeneration>
       <ImportLibrary>..\..\lib64\icudt.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/icudt.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/stubdata.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;STUBDATA_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
-    <PreLinkEvent>
-      <Command>echo "File with stubdata build time, used as a dependency to trigger fresh data build, since stubdata dll will overwrite the real one." &gt; "$(ProjectDir)stubdatabuilt.txt"</Command>
-    </PreLinkEvent>
     <Link>
-      <OutputFile>..\..\bin64\icudt60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\bin64\icudt61.dll</OutputFile>
       <ProgramDatabaseFile>.\x64\Debug/icudt.pdb</ProgramDatabaseFile>
-      <NoEntryPoint>true</NoEntryPoint>
-      <SetChecksum>true</SetChecksum>
-      <BaseAddress>0x4ad00000</BaseAddress>
-      <TurnOffAssemblyGeneration>true</TurnOffAssemblyGeneration>
       <ImportLibrary>..\..\lib64\icudt.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -273,13 +163,10 @@
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\data\misc\icudata.rc">
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>../common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/test/cintltst/ccaltst.c b/icu4c/source/test/cintltst/ccaltst.c
index e15cb82..5783b79 100644
--- a/icu4c/source/test/cintltst/ccaltst.c
+++ b/icu4c/source/test/cintltst/ccaltst.c
@@ -111,7 +111,7 @@
     UDateFormat *datdef = 0;
     UChar *result = 0;
     int32_t resultlength, resultlengthneeded;
-    char tempMsgBuf[256];
+    char tempMsgBuf[1024];  // u_austrcpy() of some formatted dates & times.
     UChar zone1[32], zone2[32];
     const char *tzver = 0;
     UChar canonicalID[64];
diff --git a/icu4c/source/test/cintltst/cintltst.vcxproj b/icu4c/source/test/cintltst/cintltst.vcxproj
index 8b926f3..f64f9d2 100644
--- a/icu4c/source/test/cintltst/cintltst.vcxproj
+++ b/icu4c/source/test/cintltst/cintltst.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{3D1246AE-1B32-479B-BECA-AEFA97BE2321}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,38 +47,33 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;..\..\i18n;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Debug/cintltst.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;..\..\i18n;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/cintltst.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Debug/cintltst.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icutestd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Debug/cintltst.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -127,30 +87,19 @@
       <TypeLibraryName>.\x86\Release/cintltst.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;..\..\i18n;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/cintltst.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Release/cintltst.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icutest.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Release/cintltst.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -161,77 +110,48 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/cintltst.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;..\..\i18n;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/cintltst.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Debug/cintltst.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icutestd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Debug/cintltst.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
       <FixedBaseAddress>false</FixedBaseAddress>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/cintltst.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;..\..\i18n;..\..\tools\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/cintltst.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Release/cintltst.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icutest.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Release/cintltst.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -255,10 +175,7 @@
     <ClCompile Include="cturtst.c" />
     <ClCompile Include="encoll.c" />
     <ClCompile Include="usrchdat.c">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild>true</ExcludedFromBuild>
     </ClCompile>
     <ClCompile Include="usrchtst.c" />
     <ClCompile Include="chashtst.c" />
@@ -278,8 +195,7 @@
     <ClCompile Include="stdnmtst.c" />
     <ClCompile Include="ucnvseltst.c" />
     <ClCompile Include="ucsdetst.c" />
-    <ClCompile Include="udatatst.c">
-    </ClCompile>
+    <ClCompile Include="udatatst.c"/>
     <ClCompile Include="ccaltst.c" />
     <ClCompile Include="cdateintervalformattest.c" />
     <ClCompile Include="cdattst.c" />
@@ -364,25 +280,7 @@
     <ClInclude Include="cucdapi.h" />
     <ClInclude Include="nfsprep.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tools\ctestfw\ctestfw.vcxproj">
-      <Project>{eca6b435-b4fa-4f9f-bf95-f451d078fc47}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tools\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/test/cintltst/cnumtst.c b/icu4c/source/test/cintltst/cnumtst.c
index e2cd68a..d11cca7 100644
--- a/icu4c/source/test/cintltst/cnumtst.c
+++ b/icu4c/source/test/cintltst/cnumtst.c
@@ -2372,7 +2372,7 @@
     { "en",                          "latn",    10,  FALSE,  latnDesc },
     { "en@numbers=roman",            "roman",   10,  TRUE,   romanDesc },
     { "en@numbers=finance",          "latn",    10,  FALSE,  latnDesc },
-    { "ar",                          "arab",    10,  FALSE,  arabDesc },
+    { "ar-EG",                       "arab",    10,  FALSE,  arabDesc },
     { "fa",                          "arabext", 10,  FALSE,  arabextDesc },
     { "zh_Hans@numbers=hanidec",     "hanidec", 10,  FALSE,  hanidecDesc },
     { "zh_Hant@numbers=traditional", "hant",    10,  TRUE,   hantDesc },
diff --git a/icu4c/source/test/cintltst/creststn.c b/icu4c/source/test/cintltst/creststn.c
index 48717c1..098cd46 100644
--- a/icu4c/source/test/cintltst/creststn.c
+++ b/icu4c/source/test/cintltst/creststn.c
@@ -2129,7 +2129,7 @@
         UResourceBundle* tResB;
         UResourceBundle* zoneResource;
         const UChar* version = NULL;
-        static const UChar versionStr[] = { 0x0032, 0x002E, 0x0031, 0x002E, 0x0033, 0x0031, 0x002E, 0x0033, 0x0033, 0x0000}; // 2.1.31.33 in nn_NO
+        static const UChar versionStr[] = { 0x0032, 0x002E, 0x0031, 0x002E, 0x0033, 0x0038, 0x002E, 0x0036, 0x0039, 0x0000}; // 2.1.38.69 in nn_NO
 
         if(err != U_ZERO_ERROR){
             log_data_err("Expected U_ZERO_ERROR when trying to test no_NO_NY aliased to nn_NO for Version err=%s\n",u_errorName(err));
diff --git a/icu4c/source/test/cintltst/cucdtst.c b/icu4c/source/test/cintltst/cucdtst.c
index 788aa80..67b53a6 100644
--- a/icu4c/source/test/cintltst/cucdtst.c
+++ b/icu4c/source/test/cintltst/cucdtst.c
@@ -60,7 +60,6 @@
 static void TestPropertyNames(void);
 static void TestPropertyValues(void);
 static void TestConsistency(void);
-static void TestUBiDiProps(void);
 static void TestCaseFolding(void);
 
 /* internal methods used */
@@ -196,7 +195,6 @@
     addTest(root, &TestPropertyNames, "tsutil/cucdtst/TestPropertyNames");
     addTest(root, &TestPropertyValues, "tsutil/cucdtst/TestPropertyValues");
     addTest(root, &TestConsistency, "tsutil/cucdtst/TestConsistency");
-    addTest(root, &TestUBiDiProps, "tsutil/cucdtst/TestUBiDiProps");
     addTest(root, &TestCaseFolding, "tsutil/cucdtst/TestCaseFolding");
 }
 
@@ -3302,59 +3300,6 @@
     uset_close(set2);
 }
 
-/*
- * Starting with ICU4C 3.4, the core Unicode properties files
- * (uprops.icu, ucase.icu, ubidi.icu, unorm.icu)
- * are hardcoded in the common DLL and therefore not included
- * in the data package any more.
- * Test requiring these files are disabled so that
- * we need not jump through hoops (like adding snapshots of these files
- * to testdata).
- * See Jitterbug 4497.
- */
-#define HARDCODED_DATA_4497 1
-
-/* API coverage for ubidi_props.c */
-static void TestUBiDiProps() {
-#if !HARDCODED_DATA_4497
-    UDataMemory *pData;
-    UBiDiProps *bdp;
-    const UBiDiProps *cbdp;
-    UErrorCode errorCode;
-
-    /* coverage for ubidi_openBinary() */
-    errorCode=U_ZERO_ERROR;
-    pData=udata_open(NULL, UBIDI_DATA_TYPE, UBIDI_DATA_NAME, &errorCode);
-    if(U_FAILURE(errorCode)) {
-        log_data_err("unable to open " UBIDI_DATA_NAME "." UBIDI_DATA_TYPE ": %s\n",
-                    u_errorName(errorCode));
-        return;
-    }
-
-    bdp=ubidi_openBinary((const uint8_t *)pData->pHeader, -1, &errorCode);
-    if(U_FAILURE(errorCode)) {
-        log_err("ubidi_openBinary() fails for the contents of " UBIDI_DATA_NAME "." UBIDI_DATA_TYPE ": %s\n",
-                u_errorName(errorCode));
-        udata_close(pData);
-        return;
-    }
-
-    if(0x2215!=ubidi_getMirror(bdp, 0x29F5)) { /* verify some data */
-        log_err("ubidi_openBinary() does not seem to return working UBiDiProps\n");
-    }
-
-    ubidi_closeProps(bdp);
-    udata_close(pData);
-
-    /* coverage for ubidi_getDummy() */
-    errorCode=U_ZERO_ERROR;
-    cbdp=ubidi_getDummy(&errorCode);
-    if(ubidi_getClass(cbdp, 0x20)!=0) {
-        log_err("ubidi_getClass(dummy, space)!=0\n");
-    }
-#endif
-}
-
 /* test case folding, compare return values with CaseFolding.txt ------------ */
 
 /* bit set for which case foldings for a character have been tested already */
diff --git a/icu4c/source/test/cintltst/udatpg_test.c b/icu4c/source/test/cintltst/udatpg_test.c
index 8895c50..2338a2f 100644
--- a/icu4c/source/test/cintltst/udatpg_test.c
+++ b/icu4c/source/test/cintltst/udatpg_test.c
@@ -42,12 +42,14 @@
 static void TestUsage(void);
 static void TestBuilder(void);
 static void TestOptions(void);
+static void TestGetFieldDisplayNames(void);
 
 void addDateTimePatternGeneratorTest(TestNode** root) {
     TESTCASE(TestOpenClose);
     TESTCASE(TestUsage);
     TESTCASE(TestBuilder);
     TESTCASE(TestOptions);
+    TESTCASE(TestGetFieldDisplayNames);
 }
 
 /*
@@ -438,4 +440,74 @@
     }
 }
 
+typedef struct FieldDisplayNameData {
+    const char *            locale;
+    UDateTimePatternField   field;
+    UDateTimePGDisplayWidth width;
+    const char *            expected;
+} FieldDisplayNameData;
+enum { kFieldDisplayNameMax = 32, kFieldDisplayNameBytesMax  = 64};
+
+static void TestGetFieldDisplayNames() {
+    const FieldDisplayNameData testData[] = {
+        /*loc      field                              width               expectedName */
+        { "de",    UDATPG_QUARTER_FIELD,              UDATPG_WIDE,        "Quartal" },
+        { "de",    UDATPG_QUARTER_FIELD,              UDATPG_ABBREVIATED, "Quart." },
+        { "de",    UDATPG_QUARTER_FIELD,              UDATPG_NARROW,      "Q" },
+        { "en",    UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_WIDE,        "weekday of the month" },
+        { "en",    UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_ABBREVIATED, "wkday. of mo." },
+        { "en",    UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_NARROW,      "wkday. of mo." }, // fallback
+        { "en_GB", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_WIDE,        "weekday of the month" },
+        { "en_GB", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_ABBREVIATED, "wkday of mo" }, // override
+        { "en_GB", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_NARROW,      "wkday of mo" },
+        { "it",    UDATPG_SECOND_FIELD,               UDATPG_WIDE,        "secondo" },
+        { "it",    UDATPG_SECOND_FIELD,               UDATPG_ABBREVIATED, "s" },
+        { "it",    UDATPG_SECOND_FIELD,               UDATPG_NARROW,      "s" },
+    };
+
+    int count = UPRV_LENGTHOF(testData);
+    const FieldDisplayNameData * testDataPtr = testData;
+    for (; count-- > 0; ++testDataPtr) {
+        UErrorCode status = U_ZERO_ERROR;
+        UDateTimePatternGenerator * dtpgen = udatpg_open(testDataPtr->locale, &status);
+        if ( U_FAILURE(status) ) {
+            log_data_err("ERROR udatpg_open failed for locale %s : %s - (Are you missing data?)\n", testDataPtr->locale, myErrorName(status));
+        } else {
+            UChar expName[kFieldDisplayNameMax];
+            UChar getName[kFieldDisplayNameMax];
+            u_unescape(testDataPtr->expected, expName, kFieldDisplayNameMax);
+            
+            int32_t getLen = udatpg_getFieldDisplayName(dtpgen, testDataPtr->field, testDataPtr->width,
+                                                        getName, kFieldDisplayNameMax, &status);
+            if ( U_FAILURE(status) ) {
+                log_err("ERROR udatpg_getFieldDisplayName locale %s field %d width %d, got status %s, len %d\n",
+                        testDataPtr->locale, testDataPtr->field, testDataPtr->width, u_errorName(status), getLen);
+            } else if ( u_strncmp(expName, getName, kFieldDisplayNameMax) != 0 ) {
+                char expNameB[kFieldDisplayNameBytesMax];
+                char getNameB[kFieldDisplayNameBytesMax];
+                log_err("ERROR udatpg_getFieldDisplayName locale %s field %d width %d, expected %s, got %s, status %s\n",
+                        testDataPtr->locale, testDataPtr->field, testDataPtr->width,
+                        u_austrncpy(expNameB,expName,kFieldDisplayNameBytesMax),
+                        u_austrncpy(getNameB,getName,kFieldDisplayNameBytesMax), u_errorName(status) );
+            } else if (testDataPtr->width == UDATPG_WIDE && getLen > 1) {
+                // test preflight & inadequate buffer
+                int32_t getNewLen;
+                status = U_ZERO_ERROR;
+                getNewLen = udatpg_getFieldDisplayName(dtpgen, testDataPtr->field, UDATPG_WIDE, NULL, 0, &status);
+                if (U_FAILURE(status) || getNewLen != getLen) {
+                    log_err("ERROR udatpg_getFieldDisplayName locale %s field %d width %d, preflight expected len %d, got %d, status %s\n",
+                        testDataPtr->locale, testDataPtr->field, testDataPtr->width, getLen, getNewLen, u_errorName(status) );
+                }
+                status = U_ZERO_ERROR;
+                getNewLen = udatpg_getFieldDisplayName(dtpgen, testDataPtr->field, UDATPG_WIDE, getName, getLen-1, &status);
+                if (status!=U_BUFFER_OVERFLOW_ERROR || getNewLen != getLen) {
+                    log_err("ERROR udatpg_getFieldDisplayName locale %s field %d width %d, overflow expected len %d & BUFFER_OVERFLOW_ERROR, got %d & status %s\n",
+                        testDataPtr->locale, testDataPtr->field, testDataPtr->width, getLen, getNewLen, u_errorName(status) );
+                }
+            }
+            udatpg_close(dtpgen);
+        }
+    }
+}
+
 #endif
diff --git a/icu4c/source/test/cintltst/uregiontest.c b/icu4c/source/test/cintltst/uregiontest.c
index cefbfde..fb8690d 100644
--- a/icu4c/source/test/cintltst/uregiontest.c
+++ b/icu4c/source/test/cintltst/uregiontest.c
@@ -122,12 +122,12 @@
     { "BS" ,  44, "029", URGN_TERRITORY, "019" },
     { "BT" ,  64, "034", URGN_TERRITORY, "142" },
     { "BU" , 104, "035", URGN_TERRITORY, "142" },
-    { "BV" ,  74, "QO" , URGN_TERRITORY, "009" },
+    { "BV" ,  74, "005", URGN_TERRITORY, "019" },
     { "BW" ,  72, "018", URGN_TERRITORY, "002" },
     { "BY" , 112, "151", URGN_TERRITORY, "150" },
     { "BZ" ,  84, "013", URGN_TERRITORY, "019" },
     { "CA" , 124, "021", URGN_TERRITORY, "019" },
-    { "CC" , 166, "QO" , URGN_TERRITORY, "009" },
+    { "CC" , 166, "053", URGN_TERRITORY, "009" },
     { "CD" , 180, "017", URGN_TERRITORY, "002" },
     { "CF" , 140, "017", URGN_TERRITORY, "002" },
     { "CG" , 178, "017", URGN_TERRITORY, "002" },
@@ -143,7 +143,7 @@
     { "CU" , 192, "029", URGN_TERRITORY, "019" },
     { "CV" , 132, "011", URGN_TERRITORY, "002" },
     { "CW" , 531, "029", URGN_TERRITORY, "019" },
-    { "CX" , 162, "QO" , URGN_TERRITORY, "009" },
+    { "CX" , 162, "053", URGN_TERRITORY, "009" },
     { "CY" , 196, "145", URGN_TERRITORY, "142" },
     { "CZ" , 203, "151", URGN_TERRITORY, "150" },
     { "DD" , 276, "155", URGN_TERRITORY, "150" },
@@ -184,13 +184,13 @@
     { "GP" , 312, "029", URGN_TERRITORY, "019" },
     { "GQ" , 226, "017", URGN_TERRITORY, "002" },
     { "GR" , 300, "039", URGN_TERRITORY, "150" },
-    { "GS" , 239, "QO" , URGN_TERRITORY, "009" },
+    { "GS" , 239, "005", URGN_TERRITORY, "019" },
     { "GT" , 320, "013", URGN_TERRITORY, "019" },
     { "GU" , 316, "057", URGN_TERRITORY, "009" },
     { "GW" , 624, "011", URGN_TERRITORY, "002" },
     { "GY" , 328, "005", URGN_TERRITORY, "019" },
     { "HK" , 344, "030", URGN_TERRITORY, "142" },
-    { "HM" , 334, "QO" , URGN_TERRITORY, "009" },
+    { "HM" , 334, "053", URGN_TERRITORY, "009" },
     { "HN" , 340, "013", URGN_TERRITORY, "019" },
     { "HR" , 191, "039", URGN_TERRITORY, "150" },
     { "HT" , 332, "029", URGN_TERRITORY, "019" },
@@ -201,7 +201,7 @@
     { "IL" , 376, "145", URGN_TERRITORY, "142" },
     { "IM" , 833, "154", URGN_TERRITORY, "150" },
     { "IN" , 356, "034", URGN_TERRITORY, "142" },
-    { "IO" ,  86, "QO" , URGN_TERRITORY, "009" },
+    { "IO" ,  86, "014", URGN_TERRITORY, "002" },
     { "IQ" , 368, "145", URGN_TERRITORY, "142" },
     { "IR" , 364, "034", URGN_TERRITORY, "142" },
     { "IS" , 352, "154", URGN_TERRITORY, "150" },
@@ -316,7 +316,7 @@
     { "TA" ,  -1, "QO",  URGN_TERRITORY, "009" },
     { "TC" , 796, "029", URGN_TERRITORY, "019" },
     { "TD" , 148, "017", URGN_TERRITORY, "002" },
-    { "TF" , 260, "QO" , URGN_TERRITORY, "009" },
+    { "TF" , 260, "145", URGN_TERRITORY, "142" },
     { "TG" , 768, "011", URGN_TERRITORY, "002" },
     { "TH" , 764, "035", URGN_TERRITORY, "142" },
     { "TJ" , 762, "143", URGN_TERRITORY, "142" },
@@ -333,7 +333,7 @@
     { "TZ" , 834, "014", URGN_TERRITORY, "002" },
     { "UA" , 804, "151", URGN_TERRITORY, "150" },
     { "UG" , 800, "014", URGN_TERRITORY, "002" },
-    { "UM" , 581, "QO" , URGN_TERRITORY, "009" },
+    { "UM" , 581, "057", URGN_TERRITORY, "009" },
     { "US" , 840, "021", URGN_TERRITORY, "019" },
     { "UY" , 858, "005", URGN_TERRITORY, "019" },
     { "UZ" , 860, "143", URGN_TERRITORY, "142" },
diff --git a/icu4c/source/test/cintltst/utf8tst.c b/icu4c/source/test/cintltst/utf8tst.c
index 0bbb5e5..9f4109c 100644
--- a/icu4c/source/test/cintltst/utf8tst.c
+++ b/icu4c/source/test/cintltst/utf8tst.c
@@ -94,6 +94,7 @@
 static void TestFwdBackUnsafe(void);
 static void TestSetChar(void);
 static void TestSetCharUnsafe(void);
+static void TestTruncateIfIncomplete(void);
 static void TestAppendChar(void);
 static void TestAppend(void);
 static void TestSurrogates(void);
@@ -114,6 +115,7 @@
     addTest(root, &TestFwdBackUnsafe,           "utf8tst/TestFwdBackUnsafe");
     addTest(root, &TestSetChar,                 "utf8tst/TestSetChar");
     addTest(root, &TestSetCharUnsafe,           "utf8tst/TestSetCharUnsafe");
+    addTest(root, &TestTruncateIfIncomplete,    "utf8tst/TestTruncateIfIncomplete");
     addTest(root, &TestAppendChar,              "utf8tst/TestAppendChar");
     addTest(root, &TestAppend,                  "utf8tst/TestAppend");
     addTest(root, &TestSurrogates,              "utf8tst/TestSurrogates");
@@ -755,6 +757,14 @@
     }
 }
 
+/**
+* Ticket #13636 - Visual Studio 2017 has problems optimizing this function.
+* As a workaround, we will turn off optimization just for this function on VS2017 and above.
+*/
+#if defined(_MSC_VER) && (_MSC_VER > 1900)
+#pragma optimize( "", off )
+#endif
+
 static void TestFwdBackUnsafe() {
     /*
      * Use a (mostly) well-formed UTF-8 string and test at code point boundaries.
@@ -840,6 +850,13 @@
     }
 }
 
+/**
+* Ticket #13636 - Turn optimization back on.
+*/
+#if defined(_MSC_VER) && (_MSC_VER > 1900)
+#pragma optimize( "", on )
+#endif
+
 static void TestSetChar() {
     static const uint8_t input[]
         = {0x61, 0xe4, 0xba, 0x8c, 0x7f, 0xfe, 0x62, 0xc5, 0x7f, 0x61, 0x80, 0x80, 0xe0, 0x00 };
@@ -927,6 +944,64 @@
     }
 }
 
+static void TestTruncateIfIncomplete() {
+    // Difference from U8_SET_CP_START():
+    // U8_TRUNCATE_IF_INCOMPLETE() does not look at s[length].
+    // Therefore, if the last byte is a lead byte, then this macro truncates
+    // even if the byte at the input index cannot continue a valid sequence
+    // (including when that is not a trail byte).
+    // On the other hand, if the last byte is a trail byte, then the two macros behave the same.
+    static const struct {
+        const char *s;
+        int32_t expected;
+    } cases[] = {
+        { "", 0 },
+        { "a", 1 },
+        { "\x80", 1 },
+        { "\xC1", 1 },
+        { "\xC2", 0 },
+        { "\xE0", 0 },
+        { "\xF4", 0 },
+        { "\xF5", 1 },
+        { "\x80\x80", 2 },
+        { "\xC2\xA0", 2 },
+        { "\xE0\x9F", 2 },
+        { "\xE0\xA0", 0 },
+        { "\xED\x9F", 0 },
+        { "\xED\xA0", 2 },
+        { "\xF0\x8F", 2 },
+        { "\xF0\x90", 0 },
+        { "\xF4\x8F", 0 },
+        { "\xF4\x90", 2 },
+        { "\xF5\x80", 2 },
+        { "\x80\x80\x80", 3 },
+        { "\xC2\xA0\x80", 3 },
+        { "\xE0\xA0\x80", 3 },
+        { "\xF0\x8F\x80", 3 },
+        { "\xF0\x90\x80", 0 },
+        { "\xF4\x8F\x80", 0 },
+        { "\xF4\x90\x80", 3 },
+        { "\xF5\x80\x80", 3 },
+        { "\x80\x80\x80\x80", 4 },
+        { "\xC2\xA0\x80\x80", 4 },
+        { "\xE0\xA0\x80\x80", 4 },
+        { "\xF0\x90\x80\x80", 4 },
+        { "\xF5\x80\x80\x80", 4 }
+    };
+    int32_t i;
+    for (i = 0; i < UPRV_LENGTHOF(cases); ++i) {
+        const char *s = cases[i].s;
+        int32_t expected = cases[i].expected;
+        int32_t length = (int32_t)strlen(s);
+        int32_t adjusted = length;
+        U8_TRUNCATE_IF_INCOMPLETE(s, 0, adjusted);
+        if (adjusted != expected) {
+            log_err("ERROR: U8_TRUNCATE_IF_INCOMPLETE failed for i=%d, length=%d. Expected:%d Got:%d\n",
+                    (int)i, (int)length, (int)expected, (int)adjusted);
+        }
+    }
+}
+
 static void TestAppendChar(){
 #if !U_HIDE_OBSOLETE_UTF_OLD_H
     static const uint8_t s[11]={0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x00};
diff --git a/icu4c/source/test/depstest/dependencies.txt b/icu4c/source/test/depstest/dependencies.txt
index 0422318..f460554 100644
--- a/icu4c/source/test/depstest/dependencies.txt
+++ b/icu4c/source/test/depstest/dependencies.txt
@@ -16,7 +16,8 @@
 system_symbols:
   deps
     # C
-    PIC system_debug malloc_functions c_strings c_string_formatting
+    PIC system_misc system_debug malloc_functions ubsan
+    c_strings c_string_formatting
     floating_point trigonometry
     stdlib_qsort
     pthread system_locale
@@ -28,12 +29,19 @@
     # Position-Independent Code (-fPIC) requires a Global Offset Table.
     _GLOBAL_OFFSET_TABLE_
 
+group: system_misc
+    abort
+
 group: system_debug
     __assert_fail __stack_chk_fail
 
 group: malloc_functions
     free malloc realloc
 
+group: ubsan
+    # UBSan=UndefinedBehaviorSanitizer, clang -fsanitize=bounds
+    __ubsan_handle_out_of_bounds
+
 group: c_strings
     isspace isdigit
     __ctype_b_loc  # for <ctype.h>
@@ -415,7 +423,7 @@
 group: patternprops
     patternprops.o
   deps
-    PIC
+    PIC ubsan
 
 group: ushape
     ushape.o
@@ -760,6 +768,8 @@
 
 group: utypes  # u_errorName()
     utypes.o
+  deps
+    ubsan
 
 group: platform
     # Files in the "platform" group.
@@ -779,7 +789,8 @@
     utrace.o
   deps
     # The "platform" group has no ICU dependencies.
-    PIC system_debug malloc_functions c_strings c_string_formatting
+    PIC system_misc system_debug malloc_functions ubsan
+    c_strings c_string_formatting
     floating_point pthread system_locale
     stdio_input readlink_function dir_io
     dlfcn  # Move related code into icuplug.c?
@@ -793,7 +804,7 @@
     alphabetic_index collation collation_builder string_search
     dayperiodrules
     formatting formattable_cnv regex regex_cnv translit
-    numberformatter
+    double_conversion numberformatter
     universal_time_scale
     uclean_i18n
 
@@ -867,6 +878,13 @@
   deps
     resourcebundle uclean_i18n
 
+group: double_conversion
+    double-conversion.o double-conversion-bignum.o double-conversion-bignum-dtoa.o
+    double-conversion-cached-powers.o double-conversion-diy-fp.o
+    double-conversion-fast-dtoa.o
+  deps
+    platform
+
 group: numberformatter
     # ICU 60+ NumberFormatter API
     number_affixutils.o number_compact.o number_decimalquantity.o
@@ -938,7 +956,7 @@
 group: digitlist
     digitlst.o decContext.o decNumber.o visibledigits.o
   deps
-    uclean_i18n
+    double_conversion uclean_i18n
 
 group: formattable
     fmtable.o
@@ -980,6 +998,8 @@
 
 group: universal_time_scale
     utmscale.o
+  deps
+    ubsan
 
 group: uclean_i18n
     ucln_in.o
diff --git a/icu4c/source/test/intltest/Makefile.in b/icu4c/source/test/intltest/Makefile.in
index d41ef25..e8a5b72 100644
--- a/icu4c/source/test/intltest/Makefile.in
+++ b/icu4c/source/test/intltest/Makefile.in
@@ -64,7 +64,7 @@
 numberformattesttuple.o numberformat2test.o pluralmaptest.o \
 numbertest_affixutils.o numbertest_api.o numbertest_decimalquantity.o \
 numbertest_modifiers.o numbertest_patternmodifier.o numbertest_patternstring.o \
-numbertest_stringbuilder.o
+numbertest_stringbuilder.o numbertest_doubleconversion.o
 
 DEPS = $(OBJECTS:.o=.d)
 
diff --git a/icu4c/source/test/intltest/alphaindextst.cpp b/icu4c/source/test/intltest/alphaindextst.cpp
index a3ebd11..8a4edb2 100644
--- a/icu4c/source/test/intltest/alphaindextst.cpp
+++ b/icu4c/source/test/intltest/alphaindextst.cpp
@@ -22,6 +22,7 @@
 #include "unicode/localpointer.h"
 #include "unicode/tblcoll.h"
 #include "unicode/uniset.h"
+#include "unicode/uscript.h"
 
 #if !UCONFIG_NO_COLLATION && !UCONFIG_NO_NORMALIZATION
 
@@ -66,6 +67,7 @@
     TESTCASE_AUTO(TestChineseZhuyin);
     TESTCASE_AUTO(TestJapaneseKanji);
     TESTCASE_AUTO(TestChineseUnihan);
+    TESTCASE_AUTO(testHasBuckets);
     TESTCASE_AUTO_END;
 }
 
@@ -724,4 +726,27 @@
     assertEquals("getBucketIndex(U+7527)", 101, bucketIndex);
 }
 
+void AlphabeticIndexTest::testHasBuckets() {
+    checkHasBuckets(Locale("am"), USCRIPT_ETHIOPIC);
+    checkHasBuckets(Locale("haw"), USCRIPT_LATIN);
+    checkHasBuckets(Locale("hy"), USCRIPT_ARMENIAN);
+    checkHasBuckets(Locale("vai"), USCRIPT_VAI);
+}
+
+void AlphabeticIndexTest::checkHasBuckets(const Locale &locale, UScriptCode script) {
+    IcuTestErrorCode errorCode(*this, "checkHasBuckets");
+    AlphabeticIndex aindex(locale, errorCode);
+    LocalPointer<AlphabeticIndex::ImmutableIndex> index(aindex.buildImmutableIndex(errorCode), errorCode);
+    if (U_FAILURE(errorCode)) {
+      dataerrln("%s %d  Error in index creation",  __FILE__, __LINE__);
+      return;
+    }
+    UnicodeString loc = locale.getName();
+    assertTrue(loc + u" at least 3 buckets", index->getBucketCount() >= 3);
+    const AlphabeticIndex::Bucket *bucket = index->getBucket(1);
+    assertEquals(loc + u" real bucket", U_ALPHAINDEX_NORMAL, bucket->getLabelType());
+    assertEquals(loc + u" expected script", script,
+            uscript_getScript(bucket->getLabel().char32At(0), errorCode));
+}
+
 #endif
diff --git a/icu4c/source/test/intltest/alphaindextst.h b/icu4c/source/test/intltest/alphaindextst.h
index 6bbe153..a785fca 100644
--- a/icu4c/source/test/intltest/alphaindextst.h
+++ b/icu4c/source/test/intltest/alphaindextst.h
@@ -13,6 +13,7 @@
 #ifndef ALPHAINDEXTST_H
 #define ALPHAINDEXTST_H
 
+#include "unicode/uscript.h"
 #include "intltest.h"
 
 class AlphabeticIndexTest: public IntlTest {
@@ -49,6 +50,9 @@
     void TestChineseZhuyin();
     void TestJapaneseKanji();
     void TestChineseUnihan();
+
+    void testHasBuckets();
+    void checkHasBuckets(const Locale &locale, UScriptCode script);
 };
 
 #endif
diff --git a/icu4c/source/test/intltest/calregts.cpp b/icu4c/source/test/intltest/calregts.cpp
index f1eb17b..da52263 100644
--- a/icu4c/source/test/intltest/calregts.cpp
+++ b/icu4c/source/test/intltest/calregts.cpp
@@ -17,6 +17,7 @@
 #include "unicode/simpletz.h"
 #include "unicode/smpdtfmt.h"
 #include "unicode/strenum.h"
+#include "unicode/localpointer.h"
 #include "cmemory.h"
 #include "caltest.h"
 #include "unicode/localpointer.h"
@@ -93,6 +94,8 @@
         CASE(50,TestT9452);
         CASE(51,TestT11632);
         CASE(52,TestPersianCalOverflow);
+        CASE(53,TestIslamicCalOverflow);
+        CASE(54,TestWeekOfYear13548);
     default: name = ""; break;
     }
 }
@@ -3009,9 +3012,9 @@
             month = cal->get(UCAL_MONTH, status);
             dayOfMonth = cal->get(UCAL_DATE, status);
             if ( U_FAILURE(status) ) {
-                errln("FAIL: Calendar->get MONTH/DATE for localeID %s, julianDay %d, status %s\n", localeID, jd, u_errorName(status)); 
+                errln("FAIL: Calendar->get MONTH/DATE for localeID %s, julianDay %d, status %s", localeID, jd, u_errorName(status)); 
             } else if (month > maxMonth || dayOfMonth > maxDayOfMonth) {
-                errln("FAIL: localeID %s, julianDay %d; maxMonth %d, got month %d; maxDayOfMonth %d, got dayOfMonth %d\n",
+                errln("FAIL: localeID %s, julianDay %d; maxMonth %d, got month %d; maxDayOfMonth %d, got dayOfMonth %d",
                         localeID, jd, maxMonth, month, maxDayOfMonth, dayOfMonth); 
             }
         }
@@ -3019,4 +3022,51 @@
     }
 }
 
+/**
+ * @bug tickets 12661, 13538
+ */
+void CalendarRegressionTest::TestIslamicCalOverflow(void) {
+    const char* localeID = "ar@calendar=islamic-civil";
+    UErrorCode status = U_ZERO_ERROR;
+    Calendar* cal = Calendar::createInstance(Locale(localeID), status);
+    if(U_FAILURE(status)) {
+        dataerrln("FAIL: Calendar::createInstance for localeID %s: %s", localeID, u_errorName(status));
+    } else {
+        int32_t maxMonth = cal->getMaximum(UCAL_MONTH);
+        int32_t maxDayOfMonth = cal->getMaximum(UCAL_DATE);
+        int32_t jd, year, month, dayOfMonth;
+        for (jd = 73530872; jd <= 73530876; jd++) { // year 202002, int32_t overflow if jd >= 73530874
+            status = U_ZERO_ERROR;
+            cal->clear();
+            cal->set(UCAL_JULIAN_DAY, jd);
+            year = cal->get(UCAL_YEAR, status);
+            month = cal->get(UCAL_MONTH, status);
+            dayOfMonth = cal->get(UCAL_DATE, status);
+            if ( U_FAILURE(status) ) {
+                errln("FAIL: Calendar->get YEAR/MONTH/DATE for localeID %s, julianDay %d, status %s", localeID, jd, u_errorName(status)); 
+            } else if (month > maxMonth || dayOfMonth > maxDayOfMonth) {
+                errln("FAIL: localeID %s, julianDay %d; got year %d; maxMonth %d, got month %d; maxDayOfMonth %d, got dayOfMonth %d",
+                        localeID, jd, year, maxMonth, month, maxDayOfMonth, dayOfMonth); 
+            }
+        }
+        delete cal;
+    }
+}
+
+void CalendarRegressionTest::TestWeekOfYear13548(void) {
+    int32_t year = 2000;
+    UErrorCode status = U_ZERO_ERROR;
+    LocalPointer<Calendar> cal(Calendar::createInstance(status));
+    failure(status, "Calendar::createInstance(status)");
+
+    cal->set(UCAL_YEAR, year);
+    cal->set(UCAL_WEEK_OF_YEAR, 4);
+
+    int32_t resultYear = cal->get(UCAL_YEAR, status);
+    failure(status, "get(UCAL_YEAR, status)");
+    if (year != resultYear) {
+        errln((UnicodeString)"Fail: Expected year=" + year + ", actual=" + resultYear);
+    }
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/test/intltest/calregts.h b/icu4c/source/test/intltest/calregts.h
index 15d5502..b4166a0 100644
--- a/icu4c/source/test/intltest/calregts.h
+++ b/icu4c/source/test/intltest/calregts.h
@@ -79,6 +79,8 @@
     void TestT9452(void);
     void TestT11632(void);
     void TestPersianCalOverflow(void);
+    void TestIslamicCalOverflow(void);
+    void TestWeekOfYear13548(void);
 
     void printdate(GregorianCalendar *cal, const char *string);
     void dowTest(UBool lenient) ;
diff --git a/icu4c/source/test/intltest/compactdecimalformattest.cpp b/icu4c/source/test/intltest/compactdecimalformattest.cpp
index 5ced151..9bdaaad 100644
--- a/icu4c/source/test/intltest/compactdecimalformattest.cpp
+++ b/icu4c/source/test/intltest/compactdecimalformattest.cpp
@@ -279,7 +279,7 @@
 }
 
 void CompactDecimalFormatTest::TestArabicLong() {
-  CheckLocale("ar", UNUM_LONG, kArabicLong, UPRV_LENGTHOF(kArabicLong));
+  CheckLocale("ar-EG", UNUM_LONG, kArabicLong, UPRV_LENGTHOF(kArabicLong));
 }
 
 void CompactDecimalFormatTest::TestSignificantDigits() {
diff --git a/icu4c/source/test/intltest/convtest.cpp b/icu4c/source/test/intltest/convtest.cpp
index 747fefd..c0b2d32 100644
--- a/icu4c/source/test/intltest/convtest.cpp
+++ b/icu4c/source/test/intltest/convtest.cpp
@@ -760,6 +760,7 @@
     UChar *pivotSource = buffer16;
     UChar *pivotTarget = buffer16;
     const UChar *pivotLimit = buffer16 + UPRV_LENGTHOF(buffer16);
+    int32_t length;
 
     // Convert with insufficient target capacity.
     result[2] = 5;
@@ -768,7 +769,7 @@
                    buffer16, &pivotSource, &pivotTarget, pivotLimit,
                    FALSE, FALSE, errorCode);
     assertEquals("overflow", U_BUFFER_OVERFLOW_ERROR, errorCode.reset());
-    int32_t length = (int32_t)(target - result);
+    length = (int32_t)(target - result);
     assertEquals("number of bytes written", 2, length);
     assertEquals("next byte not clobbered", 5, result[2]);
 
@@ -817,6 +818,52 @@
     if (length == 5) {
         assertTrue("text2 result same as input", memcmp(text2, result, length) == 0);
     }
+
+    ucnv_reset(cnv1.getAlias());
+    ucnv_reset(cnv2.getAlias());
+    memset(result, 0, sizeof(result));
+    static const char *illFormed = "\xf1\x91\x93\x96\x91\x94";  // U+514D6 + two more trail bytes
+    source = illFormed;
+    sourceLimit = illFormed + strlen(illFormed);
+    target = result;
+    pivotSource = pivotTarget = buffer16;
+
+    ucnv_setToUCallBack(cnv1.getAlias(), UCNV_TO_U_CALLBACK_STOP, nullptr, nullptr, nullptr, errorCode);
+
+    // Convert only two bytes and flush (but expect failure).
+    char errorBytes[10];
+    int8_t errorLength;
+    result[0] = 5;
+    ucnv_convertEx(cnv2.getAlias(), cnv1.getAlias(),
+                   &target, targetLimit, &source, source + 2,
+                   buffer16, &pivotSource, &pivotTarget, pivotLimit,
+                   FALSE, TRUE, errorCode);
+    assertEquals("illFormed truncated", U_TRUNCATED_CHAR_FOUND, errorCode.reset());
+    length = (int32_t)(target - result);
+    assertEquals("illFormed number of bytes written", 0, length);
+    errorLength = UPRV_LENGTHOF(errorBytes);
+    ucnv_getInvalidChars(cnv1.getAlias(), errorBytes, &errorLength, errorCode);
+    assertEquals("illFormed truncated errorLength", 2, (int32_t)errorLength);
+    if (errorLength == 2) {
+        assertEquals("illFormed truncated errorBytes", 0xf191, 
+                     ((int32_t)(uint8_t)errorBytes[0] << 8) | (uint8_t)errorBytes[1]);
+    }
+
+    // Continue conversion starting with a trail byte.
+    ucnv_convertEx(cnv2.getAlias(), cnv1.getAlias(),
+                   &target, targetLimit, &source, sourceLimit,
+                   buffer16, &pivotSource, &pivotTarget, pivotLimit,
+                   FALSE, TRUE, errorCode);
+
+    assertEquals("illFormed trail byte", U_ILLEGAL_CHAR_FOUND, errorCode.reset());
+    length = (int32_t)(target - result);
+    assertEquals("illFormed trail byte number of bytes written", 0, length);
+    errorLength = UPRV_LENGTHOF(errorBytes);
+    ucnv_getInvalidChars(cnv1.getAlias(), errorBytes, &errorLength, errorCode);
+    assertEquals("illFormed trail byte errorLength", 1, (int32_t)errorLength);
+    if (errorLength == 1) {
+        assertEquals("illFormed trail byte errorBytes", 0x93, (int32_t)(uint8_t)errorBytes[0]);
+    }
 }
 
 // open testdata or ICU data converter ------------------------------------- ***
diff --git a/icu4c/source/test/intltest/dtfmttst.cpp b/icu4c/source/test/intltest/dtfmttst.cpp
index d381c23..4923036 100644
--- a/icu4c/source/test/intltest/dtfmttst.cpp
+++ b/icu4c/source/test/intltest/dtfmttst.cpp
@@ -1355,18 +1355,18 @@
 void
 DateFormatTest::TestFormattingLocaleTimeSeparator()
 {
-    // This test not as useful is it once was, since timeSeparator
-    // in the Arabic is changed back to ":" in CLDR 28.
+    // This test not as useful as it once was, since timeSeparator
+    // in the Arabic locale is changed back to ":" in CLDR 28.
     const UDate testDate = 874266720000.;  // Sun Sep 14 21:52:00 CET 1997
     logln((UnicodeString)"Date set to : " + dateToString(testDate));
 
     const LocalPointer<const TimeZone> tz(TimeZone::createTimeZone("CET"));
 
     const LocalPointer<DateFormat> dfArab(DateFormat::createTimeInstance(
-            DateFormat::SHORT, Locale("ar")));
+            DateFormat::SHORT, Locale("ar", "EG")));
 
     const LocalPointer<DateFormat> dfLatn(DateFormat::createTimeInstance(
-            DateFormat::SHORT, Locale("ar", NULL, NULL, "numbers=latn")));
+            DateFormat::SHORT, Locale("ar", "EG", NULL, "numbers=latn")));
 
     if (dfLatn.isNull() || dfArab.isNull()) {
         dataerrln("Error calling DateFormat::createTimeInstance()");
diff --git a/icu4c/source/test/intltest/dtptngts.cpp b/icu4c/source/test/intltest/dtptngts.cpp
index 33d248d..da262ba 100644
--- a/icu4c/source/test/intltest/dtptngts.cpp
+++ b/icu4c/source/test/intltest/dtptngts.cpp
@@ -18,6 +18,7 @@
 #include "unicode/smpdtfmt.h"
 #include "unicode/dtfmtsym.h"
 #include "unicode/dtptngen.h"
+#include "unicode/ustring.h"
 #include "cmemory.h"
 #include "loctest.h"
 
@@ -36,6 +37,7 @@
         TESTCASE(3, testStaticGetSkeleton);
         TESTCASE(4, testC);
         TESTCASE(5, testSkeletonsWithDayPeriods);
+        TESTCASE(6, testGetFieldDisplayNames);
         default: name = ""; break;
     }
 }
@@ -1210,4 +1212,51 @@
     delete gen;
 }
 
+typedef struct FieldDisplayNameData {
+    const char *            locale;
+    UDateTimePatternField   field;
+    UDateTimePGDisplayWidth width;
+    const char *            expected; // can have escapes such as \\u00E0
+} FieldDisplayNameData;
+enum { kFieldDisplayNameMax = 32 };
+
+void IntlTestDateTimePatternGeneratorAPI::testGetFieldDisplayNames() {
+    const FieldDisplayNameData testData[] = {
+        /*loc      field                              width               expectedName */
+        { "de",    UDATPG_QUARTER_FIELD,              UDATPG_WIDE,        "Quartal" },
+        { "de",    UDATPG_QUARTER_FIELD,              UDATPG_ABBREVIATED, "Quart." },
+        { "de",    UDATPG_QUARTER_FIELD,              UDATPG_NARROW,      "Q" },
+        { "en",    UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_WIDE,        "weekday of the month" },
+        { "en",    UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_ABBREVIATED, "wkday. of mo." },
+        { "en",    UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_NARROW,      "wkday. of mo." }, // fallback
+        { "en_GB", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_WIDE,        "weekday of the month" },
+        { "en_GB", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_ABBREVIATED, "wkday of mo" }, // override
+        { "en_GB", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_NARROW,      "wkday of mo" },
+        { "it",    UDATPG_SECOND_FIELD,               UDATPG_WIDE,        "secondo" },
+        { "it",    UDATPG_SECOND_FIELD,               UDATPG_ABBREVIATED, "s" },
+        { "it",    UDATPG_SECOND_FIELD,               UDATPG_NARROW,      "s" },
+    };
+
+    int count = UPRV_LENGTHOF(testData);
+    const FieldDisplayNameData * testDataPtr = testData;
+    for (; count-- > 0; ++testDataPtr) {
+        UErrorCode status = U_ZERO_ERROR;
+        Locale locale(testDataPtr->locale);
+        DateTimePatternGenerator * dtpg = DateTimePatternGenerator::createInstance(locale, status);
+        if (U_FAILURE(status)) {
+            dataerrln("FAIL: DateTimePatternGenerator::createInstance failed for locale %s", testDataPtr->locale);
+        } else {
+            UChar expName[kFieldDisplayNameMax+1];
+            u_unescape(testDataPtr->expected, expName, kFieldDisplayNameMax);
+            expName[kFieldDisplayNameMax] = 0; // ensure 0 termination
+            UnicodeString getName = dtpg->getFieldDisplayName(testDataPtr->field, testDataPtr->width);
+            if (getName.compare(expName, u_strlen(expName)) != 0) {
+                errln("ERROR: locale %s field %d width %d, expected %s\n",
+                      testDataPtr->locale, testDataPtr->field, testDataPtr->width, testDataPtr->expected);
+            }
+            delete dtpg;
+        }
+    }
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/test/intltest/dtptngts.h b/icu4c/source/test/intltest/dtptngts.h
index 03da848..adef0dc 100644
--- a/icu4c/source/test/intltest/dtptngts.h
+++ b/icu4c/source/test/intltest/dtptngts.h
@@ -31,6 +31,7 @@
     void testStaticGetSkeleton(/* char* par */);
     void testC();
     void testSkeletonsWithDayPeriods();
+    void testGetFieldDisplayNames();
 };
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/test/intltest/intltest.cpp b/icu4c/source/test/intltest/intltest.cpp
index 5edf872..c459137 100644
--- a/icu4c/source/test/intltest/intltest.cpp
+++ b/icu4c/source/test/intltest/intltest.cpp
@@ -2030,6 +2030,25 @@
     return TRUE;
 }
 
+
+UBool IntlTest::assertEquals(const char* message,
+                             UErrorCode expected,
+                             UErrorCode actual) {
+    if (expected != actual) {
+        errln((UnicodeString)"FAIL: " + message + "; got " +
+              u_errorName(actual) + 
+              "; expected " + u_errorName(expected));
+        return FALSE;
+    }
+#ifdef VERBOSE_ASSERTIONS
+    else {
+        logln((UnicodeString)"Ok: " + message + "; got " + u_errorName(actual));
+    }
+#endif
+    return TRUE;
+}
+
+
 #if !UCONFIG_NO_FORMATTING
 UBool IntlTest::assertEquals(const char* message,
                              const Formattable& expected,
@@ -2105,6 +2124,16 @@
                              int64_t actual) {
     return assertEquals(extractToAssertBuf(message), expected, actual);
 }
+UBool IntlTest::assertEquals(const UnicodeString& message,
+                             double expected,
+                             double actual) {
+    return assertEquals(extractToAssertBuf(message), expected, actual);
+}
+UBool IntlTest::assertEquals(const UnicodeString& message,
+                             UErrorCode expected,
+                             UErrorCode actual) {
+    return assertEquals(extractToAssertBuf(message), expected, actual);
+}
 
 #if !UCONFIG_NO_FORMATTING
 UBool IntlTest::assertEquals(const UnicodeString& message,
diff --git a/icu4c/source/test/intltest/intltest.h b/icu4c/source/test/intltest/intltest.h
index 1f7c80d..08765b7 100644
--- a/icu4c/source/test/intltest/intltest.h
+++ b/icu4c/source/test/intltest/intltest.h
@@ -289,13 +289,12 @@
     UBool assertSuccess(const char* message, UErrorCode ec, UBool possibleDataError=FALSE, const char *file=NULL, int line=0);
     UBool assertEquals(const char* message, const UnicodeString& expected,
                        const UnicodeString& actual, UBool possibleDataError=FALSE);
-    UBool assertEquals(const char* message, const char* expected,
-                       const char* actual);
-    UBool assertEquals(const char* message, UBool expected,
-                       UBool actual);
+    UBool assertEquals(const char* message, const char* expected, const char* actual);
+    UBool assertEquals(const char* message, UBool expected, UBool actual);
     UBool assertEquals(const char* message, int32_t expected, int32_t actual);
     UBool assertEquals(const char* message, int64_t expected, int64_t actual);
     UBool assertEquals(const char* message, double expected, double actual);
+    UBool assertEquals(const char* message, UErrorCode expected, UErrorCode actual);
 #if !UCONFIG_NO_FORMATTING
     UBool assertEquals(const char* message, const Formattable& expected,
                        const Formattable& actual, UBool possibleDataError=FALSE);
@@ -307,11 +306,12 @@
     UBool assertSuccess(const UnicodeString& message, UErrorCode ec);
     UBool assertEquals(const UnicodeString& message, const UnicodeString& expected,
                        const UnicodeString& actual, UBool possibleDataError=FALSE);
-    UBool assertEquals(const UnicodeString& message, const char* expected,
-                       const char* actual);
+    UBool assertEquals(const UnicodeString& message, const char* expected, const char* actual);
     UBool assertEquals(const UnicodeString& message, UBool expected, UBool actual);
     UBool assertEquals(const UnicodeString& message, int32_t expected, int32_t actual);
     UBool assertEquals(const UnicodeString& message, int64_t expected, int64_t actual);
+    UBool assertEquals(const UnicodeString& message, double expected, double actual);
+    UBool assertEquals(const UnicodeString& message, UErrorCode expected, UErrorCode actual);
 
     virtual void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL ); // overide !
 
diff --git a/icu4c/source/test/intltest/intltest.vcxproj b/icu4c/source/test/intltest/intltest.vcxproj
index 148b42c..32bd338 100644
--- a/icu4c/source/test/intltest/intltest.vcxproj
+++ b/icu4c/source/test/intltest/intltest.vcxproj
@@ -1,52 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{73632960-B3A6-464D-83A3-4B43365F19B8}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
     <RootNamespace>intltest</RootNamespace>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -83,38 +48,33 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;..\..\tools\toolutil;..\..\tools\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Debug/intltest.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;..\..\tools\toolutil;..\..\tools\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/intltest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Debug/intltest.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Debug/intltest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -125,41 +85,26 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/intltest.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;..\..\tools\toolutil;..\..\tools\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/intltest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Debug/intltest.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/intltest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <FixedBaseAddress>false</FixedBaseAddress>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -167,28 +112,17 @@
       <TypeLibraryName>.\x86\Release/intltest.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;..\..\tools\toolutil;..\..\tools\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/intltest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Release/intltest.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Release/intltest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -199,36 +133,23 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/intltest.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;..\..\tools\toolutil;..\..\tools\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/intltest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Release/intltest.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Release/intltest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -327,6 +248,7 @@
     <ClCompile Include="numbertest_affixutils.cpp" />
     <ClCompile Include="numbertest_api.cpp" />
     <ClCompile Include="numbertest_decimalquantity.cpp" />
+    <ClCompile Include="numbertest_doubleconversion.cpp" />
     <ClCompile Include="numbertest_modifiers.cpp" />
     <ClCompile Include="numbertest_patternmodifier.cpp" />
     <ClCompile Include="numbertest_patternstring.cpp" />
@@ -566,25 +488,7 @@
     <ClInclude Include="csdetest.h" />
     <ClInclude Include="listformattertest.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tools\ctestfw\ctestfw.vcxproj">
-      <Project>{eca6b435-b4fa-4f9f-bf95-f451d078fc47}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tools\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/test/intltest/intltest.vcxproj.filters b/icu4c/source/test/intltest/intltest.vcxproj.filters
index 384f6da..442793e 100644
--- a/icu4c/source/test/intltest/intltest.vcxproj.filters
+++ b/icu4c/source/test/intltest/intltest.vcxproj.filters
@@ -268,6 +268,9 @@
     <ClCompile Include="numbertest_decimalquantity.cpp">
       <Filter>formatting</Filter>
     </ClCompile>
+    <ClCompile Include="numbertest_doubleconversion.cpp">
+      <Filter>formatting</Filter>
+    </ClCompile>
     <ClCompile Include="numbertest_modifiers.cpp">
       <Filter>formatting</Filter>
     </ClCompile>
diff --git a/icu4c/source/test/intltest/itrbnf.cpp b/icu4c/source/test/intltest/itrbnf.cpp
index 9770025..e6e9078 100644
--- a/icu4c/source/test/intltest/itrbnf.cpp
+++ b/icu4c/source/test/intltest/itrbnf.cpp
@@ -75,6 +75,7 @@
         TESTCASE(23, TestVariableDecimalPoint);
         TESTCASE(24, TestLargeNumbers);
         TESTCASE(25, TestCompactDecimalFormatStyle);
+        TESTCASE(26, TestParseFailure);
 #else
         TESTCASE(0, TestRBNFDisabled);
 #endif
@@ -2283,6 +2284,22 @@
     doTest(&rbnf, enTestFullData, false);
 }
 
+void IntlTestRBNF::TestParseFailure() {
+    UErrorCode status = U_ZERO_ERROR;
+    RuleBasedNumberFormat rbnf(URBNF_SPELLOUT, Locale::getJapanese(), status);
+    static const UChar* testData[] = {
+        u"・・・・・・・・・・・・・・・・・・・・・・・・"
+    };
+    for (int i = 0; i < UPRV_LENGTHOF(testData); ++i) {
+        UnicodeString spelledNumberString(testData[i]);
+        Formattable actualNumber;
+        rbnf.parse(spelledNumberString, actualNumber, status);
+        if (status != U_INVALID_FORMAT_ERROR) { // I would have expected U_PARSE_ERROR, but NumberFormat::parse gives U_INVALID_FORMAT_ERROR
+            errln("FAIL: string should be unparseable index=%d %s", i, u_errorName(status));
+        }
+    }
+}
+
 void 
 IntlTestRBNF::doTest(RuleBasedNumberFormat* formatter, const char* const testData[][2], UBool testParsing) 
 {
diff --git a/icu4c/source/test/intltest/itrbnf.h b/icu4c/source/test/intltest/itrbnf.h
index 540b803..e58d321 100644
--- a/icu4c/source/test/intltest/itrbnf.h
+++ b/icu4c/source/test/intltest/itrbnf.h
@@ -147,6 +147,7 @@
     void TestRounding();
     void TestLargeNumbers();
     void TestCompactDecimalFormatStyle();
+    void TestParseFailure();
 
 protected:
   virtual void doTest(RuleBasedNumberFormat* formatter, const char* const testData[][2], UBool testParsing);
diff --git a/icu4c/source/test/intltest/measfmttest.cpp b/icu4c/source/test/intltest/measfmttest.cpp
index d997a26..7be9adf 100644
--- a/icu4c/source/test/intltest/measfmttest.cpp
+++ b/icu4c/source/test/intltest/measfmttest.cpp
@@ -1747,7 +1747,7 @@
     helperTestMultiples(en, UMEASFMT_WIDTH_SHORT,  "2 mi, 1 ft, 2.3 in");
     helperTestMultiples(en, UMEASFMT_WIDTH_NARROW, "2mi 1\\u2032 2.3\\u2033");
     helperTestMultiples(ru, UMEASFMT_WIDTH_WIDE,   "2 \\u043C\\u0438\\u043B\\u0438 1 \\u0444\\u0443\\u0442 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430");
-    helperTestMultiples(ru, UMEASFMT_WIDTH_SHORT,  "2 \\u043C\\u0438\\u043B\\u0438 1 \\u0444\\u0443\\u0442 2,3 \\u0434\\u044E\\u0439\\u043C.");
+    helperTestMultiples(ru, UMEASFMT_WIDTH_SHORT,  "2 \\u043C\\u0438\\u043B\\u0438 1 \\u0444\\u0442 2,3 \\u0434\\u044E\\u0439\\u043C.");
     helperTestMultiples(ru, UMEASFMT_WIDTH_NARROW, "2 \\u043C\\u0438\\u043B\\u044C 1 \\u0444\\u0442 2,3 \\u0434\\u044E\\u0439\\u043C\\u0430");
 }
 
diff --git a/icu4c/source/test/intltest/numberformattesttuple.cpp b/icu4c/source/test/intltest/numberformattesttuple.cpp
index 01c2815..496aaec 100644
--- a/icu4c/source/test/intltest/numberformattesttuple.cpp
+++ b/icu4c/source/test/intltest/numberformattesttuple.cpp
@@ -325,6 +325,7 @@
     FIELD_INIT(positiveSuffix, &gStrOps),
     FIELD_INIT(negativePrefix, &gStrOps),
     FIELD_INIT(negativeSuffix, &gStrOps),
+    FIELD_INIT(signAlwaysShown, &gIntOps),
     FIELD_INIT(localizedPattern, &gStrOps),
     FIELD_INIT(toPattern, &gStrOps),
     FIELD_INIT(toLocalizedPattern, &gStrOps),
diff --git a/icu4c/source/test/intltest/numberformattesttuple.h b/icu4c/source/test/intltest/numberformattesttuple.h
index f417b3e..685c3d6 100644
--- a/icu4c/source/test/intltest/numberformattesttuple.h
+++ b/icu4c/source/test/intltest/numberformattesttuple.h
@@ -55,6 +55,7 @@
     kPositiveSuffix,
     kNegativePrefix,
     kNegativeSuffix,
+    kSignAlwaysShown,
     kLocalizedPattern,
     kToPattern,
     kToLocalizedPattern,
@@ -118,6 +119,7 @@
     UnicodeString positiveSuffix;
     UnicodeString negativePrefix;
     UnicodeString negativeSuffix;
+    int32_t signAlwaysShown;
     UnicodeString localizedPattern;
     UnicodeString toPattern;
     UnicodeString toLocalizedPattern;
@@ -164,6 +166,7 @@
     UBool positiveSuffixFlag;
     UBool negativePrefixFlag;
     UBool negativeSuffixFlag;
+    UBool signAlwaysShownFlag;
     UBool localizedPatternFlag;
     UBool toPatternFlag;
     UBool toLocalizedPatternFlag;
diff --git a/icu4c/source/test/intltest/numbertest.h b/icu4c/source/test/intltest/numbertest.h
index 3e60031..c1d5044 100644
--- a/icu4c/source/test/intltest/numbertest.h
+++ b/icu4c/source/test/intltest/numbertest.h
@@ -45,6 +45,7 @@
     void notationScientific();
     void notationCompact();
     void unitMeasure();
+    void unitCompoundMeasure();
     void unitCurrency();
     void unitPercent();
     void roundingFraction();
@@ -62,6 +63,7 @@
     void locale();
     void formatTypes();
     void errors();
+    void validRanges();
 
     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
 
@@ -70,11 +72,19 @@
     CurrencyUnit GBP;
     CurrencyUnit CZK;
     CurrencyUnit CAD;
+    CurrencyUnit ESP;
+    CurrencyUnit PTE;
 
     MeasureUnit METER;
     MeasureUnit DAY;
     MeasureUnit SQUARE_METER;
     MeasureUnit FAHRENHEIT;
+    MeasureUnit SECOND;
+    MeasureUnit POUND;
+    MeasureUnit SQUARE_MILE;
+    MeasureUnit JOULE;
+    MeasureUnit FURLONG;
+    MeasureUnit KELVIN;
 
     NumberingSystem MATHSANB;
     NumberingSystem LATN;
@@ -100,6 +110,7 @@
     void testAppend();
     void testConvertToAccurateDouble();
     void testUseApproximateDoubleWhenAble();
+    void testHardDoubleConversion();
 
     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
 
@@ -110,6 +121,13 @@
     void checkDoubleBehavior(double d, bool explicitRequired);
 };
 
+class DoubleConversionTest : public IntlTest {
+  public:
+    void testDoubleConversionApi();
+
+    void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
+};
+
 class ModifiersTest : public IntlTest {
   public:
     void testConstantAffixModifier();
@@ -132,6 +150,7 @@
 class PatternModifierTest : public IntlTest {
   public:
     void testBasic();
+    void testPatternWithNoPlaceholder();
     void testMutableEqualsImmutable();
 
     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
@@ -155,6 +174,7 @@
 class NumberStringBuilderTest : public IntlTest {
   public:
     void testInsertAppendUnicodeString();
+    void testSplice();
     void testInsertAppendCodePoint();
     void testCopy();
     void testFields();
@@ -195,6 +215,7 @@
         TESTCLASS(4, PatternModifierTest);
         TESTCLASS(5, PatternStringTest);
         TESTCLASS(6, NumberStringBuilderTest);
+        TESTCLASS(7, DoubleConversionTest);
         default: name = ""; break; // needed to end loop
         }
     }
diff --git a/icu4c/source/test/intltest/numbertest_api.cpp b/icu4c/source/test/intltest/numbertest_api.cpp
index 6351404..5b1c46f 100644
--- a/icu4c/source/test/intltest/numbertest_api.cpp
+++ b/icu4c/source/test/intltest/numbertest_api.cpp
@@ -22,33 +22,31 @@
 NumberFormatterApiTest::NumberFormatterApiTest(UErrorCode &status)
               : USD(u"USD", status), GBP(u"GBP", status),
                 CZK(u"CZK", status), CAD(u"CAD", status),
+                ESP(u"ESP", status), PTE(u"PTE", status),
                 FRENCH_SYMBOLS(Locale::getFrench(), status),
                 SWISS_SYMBOLS(Locale("de-CH"), status),
                 MYANMAR_SYMBOLS(Locale("my"), status) {
 
-    MeasureUnit *unit = MeasureUnit::createMeter(status);
+    // Check for error on the first MeasureUnit in case there is no data
+    LocalPointer<MeasureUnit> unit(MeasureUnit::createMeter(status));
     if (U_FAILURE(status)) {
         dataerrln("%s %d status = %s", __FILE__, __LINE__, u_errorName(status));
         return;
     }
     METER = *unit;
-    delete unit;
-    unit = MeasureUnit::createDay(status);
-    DAY = *unit;
-    delete unit;
-    unit = MeasureUnit::createSquareMeter(status);
-    SQUARE_METER = *unit;
-    delete unit;
-    unit = MeasureUnit::createFahrenheit(status);
-    FAHRENHEIT = *unit;
-    delete unit;
 
-    NumberingSystem *ns = NumberingSystem::createInstanceByName("mathsanb", status);
-    MATHSANB = *ns;
-    delete ns;
-    ns = NumberingSystem::createInstanceByName("latn", status);
-    LATN = *ns;
-    delete ns;
+    DAY = *LocalPointer<MeasureUnit>(MeasureUnit::createDay(status));
+    SQUARE_METER = *LocalPointer<MeasureUnit>(MeasureUnit::createSquareMeter(status));
+    FAHRENHEIT = *LocalPointer<MeasureUnit>(MeasureUnit::createFahrenheit(status));
+    SECOND = *LocalPointer<MeasureUnit>(MeasureUnit::createSecond(status));
+    POUND = *LocalPointer<MeasureUnit>(MeasureUnit::createPound(status));
+    SQUARE_MILE = *LocalPointer<MeasureUnit>(MeasureUnit::createSquareMile(status));
+    JOULE = *LocalPointer<MeasureUnit>(MeasureUnit::createJoule(status));
+    FURLONG = *LocalPointer<MeasureUnit>(MeasureUnit::createFurlong(status));
+    KELVIN = *LocalPointer<MeasureUnit>(MeasureUnit::createKelvin(status));
+
+    MATHSANB = *LocalPointer<NumberingSystem>(NumberingSystem::createInstanceByName("mathsanb", status));
+    LATN = *LocalPointer<NumberingSystem>(NumberingSystem::createInstanceByName("latn", status));
 }
 
 void NumberFormatterApiTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char *) {
@@ -60,6 +58,7 @@
         TESTCASE_AUTO(notationScientific);
         TESTCASE_AUTO(notationCompact);
         TESTCASE_AUTO(unitMeasure);
+        TESTCASE_AUTO(unitCompoundMeasure);
         TESTCASE_AUTO(unitCurrency);
         TESTCASE_AUTO(unitPercent);
         TESTCASE_AUTO(roundingFraction);
@@ -77,6 +76,7 @@
         TESTCASE_AUTO(locale);
         TESTCASE_AUTO(formatTypes);
         TESTCASE_AUTO(errors);
+        TESTCASE_AUTO(validRanges);
     TESTCASE_AUTO_END;
 }
 
@@ -351,12 +351,15 @@
             Locale::getEnglish(),
             9990000,
             u"10M");
+
+    // NOTE: There is no API for compact custom data in C++
+    // and thus no "Compact Somali No Figure" test
 }
 
 void NumberFormatterApiTest::unitMeasure() {
     assertFormatDescending(
-            u"Meters Short",
-            NumberFormatter::with().adoptUnit(new MeasureUnit(METER)),
+            u"Meters Short and unit() method",
+            NumberFormatter::with().unit(METER),
             Locale::getEnglish(),
             u"87,650 m",
             u"8,765 m",
@@ -369,7 +372,7 @@
             u"0 m");
 
     assertFormatDescending(
-            u"Meters Long",
+            u"Meters Long and adoptUnit() method",
             NumberFormatter::with().adoptUnit(new MeasureUnit(METER))
                     .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME),
             Locale::getEnglish(),
@@ -386,7 +389,7 @@
     assertFormatDescending(
             u"Compact Meters Long",
             NumberFormatter::with().notation(Notation::compactLong())
-                    .adoptUnit(new MeasureUnit(METER))
+                    .unit(METER)
                     .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME),
             Locale::getEnglish(),
             u"88 thousand meters",
@@ -410,14 +413,14 @@
 //    TODO: Implement Measure in C++
 //    assertFormatSingleMeasure(
 //            u"Measure format method takes precedence over fluent chain",
-//            NumberFormatter::with().adoptUnit(new MeasureUnit(METER)),
+//            NumberFormatter::with().unit(METER),
 //            Locale::getEnglish(),
 //            new Measure(5.43, USD),
 //            u"$5.43");
 
     assertFormatSingle(
             u"Meters with Negative Sign",
-            NumberFormatter::with().adoptUnit(new MeasureUnit(METER)),
+            NumberFormatter::with().unit(METER),
             Locale::getEnglish(),
             -9876543.21,
             u"-9,876,543.21 m");
@@ -425,7 +428,7 @@
     // The locale string "सान" appears only in brx.txt:
     assertFormatSingle(
             u"Interesting Data Fallback 1",
-            NumberFormatter::with().adoptUnit(new MeasureUnit(DAY))
+            NumberFormatter::with().unit(DAY)
                     .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME),
             Locale::createFromName("brx"),
             5.43,
@@ -434,7 +437,7 @@
     // Requires following the alias from unitsNarrow to unitsShort:
     assertFormatSingle(
             u"Interesting Data Fallback 2",
-            NumberFormatter::with().adoptUnit(new MeasureUnit(DAY))
+            NumberFormatter::with().unit(DAY)
                     .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW),
             Locale::createFromName("brx"),
             5.43,
@@ -444,7 +447,7 @@
     // requiring fallback to the root.
     assertFormatSingle(
             u"Interesting Data Fallback 3",
-            NumberFormatter::with().adoptUnit(new MeasureUnit(SQUARE_METER))
+            NumberFormatter::with().unit(SQUARE_METER)
                     .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW),
             Locale::createFromName("en-GB"),
             5.43,
@@ -454,7 +457,7 @@
     // NOTE: This example is in the documentation.
     assertFormatSingle(
             u"Difference between Narrow and Short (Narrow Version)",
-            NumberFormatter::with().adoptUnit(new MeasureUnit(FAHRENHEIT))
+            NumberFormatter::with().unit(FAHRENHEIT)
                     .unitWidth(UNUM_UNIT_WIDTH_NARROW),
             Locale("es-US"),
             5.43,
@@ -462,11 +465,74 @@
 
     assertFormatSingle(
             u"Difference between Narrow and Short (Short Version)",
-            NumberFormatter::with().adoptUnit(new MeasureUnit(FAHRENHEIT))
+            NumberFormatter::with().unit(FAHRENHEIT)
                     .unitWidth(UNUM_UNIT_WIDTH_SHORT),
             Locale("es-US"),
             5.43,
             u"5.43 °F");
+
+    assertFormatSingle(
+            u"MeasureUnit form without {0} in CLDR pattern",
+            NumberFormatter::with()
+                    .unit(KELVIN)
+                    .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME),
+            Locale("es-MX"),
+            1,
+            u"kelvin");
+
+    assertFormatSingle(
+            u"MeasureUnit form without {0} in CLDR pattern and wide base form",
+            NumberFormatter::with()
+                    .rounding(Rounder::fixedFraction(20))
+                    .unit(KELVIN)
+                    .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME),
+            Locale("es-MX"),
+            1,
+            u"kelvin");
+}
+
+void NumberFormatterApiTest::unitCompoundMeasure() {
+    assertFormatDescending(
+            u"Meters Per Second Short (unit that simplifies) and perUnit method",
+            NumberFormatter::with().unit(METER).perUnit(SECOND),
+            Locale::getEnglish(),
+            u"87,650 m/s",
+            u"8,765 m/s",
+            u"876.5 m/s",
+            u"87.65 m/s",
+            u"8.765 m/s",
+            u"0.8765 m/s",
+            u"0.08765 m/s",
+            u"0.008765 m/s",
+            u"0 m/s");
+
+    assertFormatDescending(
+            u"Pounds Per Square Mile Short (secondary unit has per-format) and adoptPerUnit method",
+            NumberFormatter::with().unit(POUND).adoptPerUnit(new MeasureUnit(SQUARE_MILE)),
+            Locale::getEnglish(),
+            u"87,650 lb/mi²",
+            u"8,765 lb/mi²",
+            u"876.5 lb/mi²",
+            u"87.65 lb/mi²",
+            u"8.765 lb/mi²",
+            u"0.8765 lb/mi²",
+            u"0.08765 lb/mi²",
+            u"0.008765 lb/mi²",
+            u"0 lb/mi²");
+
+    assertFormatDescending(
+            u"Joules Per Furlong Short (unit with no simplifications or special patterns)",
+            NumberFormatter::with().unit(JOULE).perUnit(FURLONG),
+            Locale::getEnglish(),
+            u"87,650 J/fur",
+            u"8,765 J/fur",
+            u"876.5 J/fur",
+            u"87.65 J/fur",
+            u"8.765 J/fur",
+            u"0.8765 J/fur",
+            u"0.08765 J/fur",
+            u"0.008765 J/fur",
+            u"0 J/fur");
 }
 
 void NumberFormatterApiTest::unitCurrency() {
@@ -547,6 +613,66 @@
             Locale::getEnglish(),
             -9876543.21,
             u"-£9,876,543.21");
+
+    // The full currency symbol is not shown in NARROW format.
+    // NOTE: This example is in the documentation.
+    assertFormatSingle(
+            u"Currency Difference between Narrow and Short (Narrow Version)",
+            NumberFormatter::with().unit(USD).unitWidth(UNUM_UNIT_WIDTH_NARROW),
+            Locale("en-CA"),
+            5.43,
+            u"$5.43");
+
+    assertFormatSingle(
+            u"Currency Difference between Narrow and Short (Short Version)",
+            NumberFormatter::with().unit(USD).unitWidth(UNUM_UNIT_WIDTH_SHORT),
+            Locale("en-CA"),
+            5.43,
+            u"US$5.43");
+
+    assertFormatSingle(
+            u"Currency-dependent format (Control)",
+            NumberFormatter::with().unit(USD).unitWidth(UNUM_UNIT_WIDTH_SHORT),
+            Locale("ca"),
+            444444.55,
+            u"444.444,55 USD");
+
+    assertFormatSingle(
+            u"Currency-dependent format (Test)",
+            NumberFormatter::with().unit(ESP).unitWidth(UNUM_UNIT_WIDTH_SHORT),
+            Locale("ca"),
+            444444.55,
+            u"₧ 444.445");
+
+    assertFormatSingle(
+            u"Currency-dependent symbols (Control)",
+            NumberFormatter::with().unit(USD).unitWidth(UNUM_UNIT_WIDTH_SHORT),
+            Locale("pt-PT"),
+            444444.55,
+            u"444 444,55 US$");
+
+    // NOTE: This is a bit of a hack on CLDR's part. They set the currency symbol to U+200B (zero-
+    // width space), and they set the decimal separator to the $ symbol.
+    assertFormatSingle(
+            u"Currency-dependent symbols (Test Short)",
+            NumberFormatter::with().unit(PTE).unitWidth(UNUM_UNIT_WIDTH_SHORT),
+            Locale("pt-PT"),
+            444444.55,
+            u"444,444$55 \u200B");
+
+    assertFormatSingle(
+            u"Currency-dependent symbols (Test Narrow)",
+            NumberFormatter::with().unit(PTE).unitWidth(UNUM_UNIT_WIDTH_NARROW),
+            Locale("pt-PT"),
+            444444.55,
+            u"444,444$55 PTE");
+
+    assertFormatSingle(
+            u"Currency-dependent symbols (Test ISO Code)",
+            NumberFormatter::with().unit(PTE).unitWidth(UNUM_UNIT_WIDTH_ISO_CODE),
+            Locale("pt-PT"),
+            444444.55,
+            u"444,444$55 PTE");
 }
 
 void NumberFormatterApiTest::unitPercent() {
@@ -765,6 +891,20 @@
             u"0.09",
             u"0.01",
             u"0.00");
+
+    assertFormatSingle(
+            "FracSig with trailing zeros A",
+            NumberFormatter::with().rounding(Rounder::fixedFraction(2).withMinDigits(3)),
+            Locale::getEnglish(),
+            0.1,
+            u"0.10");
+
+    assertFormatSingle(
+            "FracSig with trailing zeros B",
+            NumberFormatter::with().rounding(Rounder::fixedFraction(2).withMinDigits(3)),
+            Locale::getEnglish(),
+            0.0999999,
+            u"0.10");
 }
 
 void NumberFormatterApiTest::roundingOther() {
@@ -889,7 +1029,7 @@
 void NumberFormatterApiTest::grouping() {
     assertFormatDescendingBig(
             u"Western Grouping",
-            NumberFormatter::with().grouping(Grouper::defaults()),
+            NumberFormatter::with().grouping(UNUM_GROUPING_AUTO),
             Locale::getEnglish(),
             u"87,650,000",
             u"8,765,000",
@@ -903,7 +1043,7 @@
 
     assertFormatDescendingBig(
             u"Indic Grouping",
-            NumberFormatter::with().grouping(Grouper::defaults()),
+            NumberFormatter::with().grouping(UNUM_GROUPING_AUTO),
             Locale("en-IN"),
             u"8,76,50,000",
             u"87,65,000",
@@ -917,7 +1057,7 @@
 
     assertFormatDescendingBig(
             u"Western Grouping, Wide",
-            NumberFormatter::with().grouping(Grouper::minTwoDigits()),
+            NumberFormatter::with().grouping(UNUM_GROUPING_MIN2),
             Locale::getEnglish(),
             u"87,650,000",
             u"8,765,000",
@@ -931,7 +1071,7 @@
 
     assertFormatDescendingBig(
             u"Indic Grouping, Wide",
-            NumberFormatter::with().grouping(Grouper::minTwoDigits()),
+            NumberFormatter::with().grouping(UNUM_GROUPING_MIN2),
             Locale("en-IN"),
             u"8,76,50,000",
             u"87,65,000",
@@ -945,7 +1085,7 @@
 
     assertFormatDescendingBig(
             u"No Grouping",
-            NumberFormatter::with().grouping(Grouper::none()),
+            NumberFormatter::with().grouping(UNUM_GROUPING_OFF),
             Locale("en-IN"),
             u"87650000",
             u"8765000",
@@ -956,6 +1096,111 @@
             u"87.65",
             u"8.765",
             u"0");
+
+    assertFormatDescendingBig(
+            u"Indic locale with THOUSANDS grouping",
+            NumberFormatter::with().grouping(UNUM_GROUPING_THOUSANDS),
+            Locale("en-IN"),
+            u"87,650,000",
+            u"8,765,000",
+            u"876,500",
+            u"87,650",
+            u"8,765",
+            u"876.5",
+            u"87.65",
+            u"8.765",
+            u"0");
+
+    // NOTE: Hungarian is interesting because it has minimumGroupingDigits=4 in locale data
+    // If this test breaks due to data changes, find another locale that has minimumGroupingDigits.
+    assertFormatDescendingBig(
+            u"Hungarian Grouping",
+            NumberFormatter::with().grouping(UNUM_GROUPING_AUTO),
+            Locale("hu"),
+            u"87 650 000",
+            u"8 765 000",
+            u"876500",
+            u"87650",
+            u"8765",
+            u"876,5",
+            u"87,65",
+            u"8,765",
+            u"0");
+
+    assertFormatDescendingBig(
+            u"Hungarian Grouping, Min 2",
+            NumberFormatter::with().grouping(UNUM_GROUPING_MIN2),
+            Locale("hu"),
+            u"87 650 000",
+            u"8 765 000",
+            u"876500",
+            u"87650",
+            u"8765",
+            u"876,5",
+            u"87,65",
+            u"8,765",
+            u"0");
+
+    assertFormatDescendingBig(
+            u"Hungarian Grouping, Always",
+            NumberFormatter::with().grouping(UNUM_GROUPING_ON_ALIGNED),
+            Locale("hu"),
+            u"87 650 000",
+            u"8 765 000",
+            u"876 500",
+            u"87 650",
+            u"8 765",
+            u"876,5",
+            u"87,65",
+            u"8,765",
+            u"0");
+
+    // NOTE: Bulgarian is interesting because it has no grouping in the default currency format.
+    // If this test breaks due to data changes, find another locale that has no default grouping.
+    assertFormatDescendingBig(
+            u"Bulgarian Currency Grouping",
+            NumberFormatter::with().grouping(UNUM_GROUPING_AUTO).unit(USD),
+            Locale("bg"),
+            u"87650000,00 щ.д.",
+            u"8765000,00 щ.д.",
+            u"876500,00 щ.д.",
+            u"87650,00 щ.д.",
+            u"8765,00 щ.д.",
+            u"876,50 щ.д.",
+            u"87,65 щ.д.",
+            u"8,76 щ.д.",
+            u"0,00 щ.д.");
+
+    assertFormatDescendingBig(
+            u"Bulgarian Currency Grouping, Always",
+            NumberFormatter::with().grouping(UNUM_GROUPING_ON_ALIGNED).unit(USD),
+            Locale("bg"),
+            u"87 650 000,00 щ.д.",
+            u"8 765 000,00 щ.д.",
+            u"876 500,00 щ.д.",
+            u"87 650,00 щ.д.",
+            u"8 765,00 щ.д.",
+            u"876,50 щ.д.",
+            u"87,65 щ.д.",
+            u"8,76 щ.д.",
+            u"0,00 щ.д.");
+
+    // TODO: Enable this test when macro-setter is available in C++
+    // MacroProps macros;
+    // macros.grouping = Grouper(4, 1, 3);
+    // assertFormatDescendingBig(
+    //         u"Custom Grouping via Internal API",
+    //         NumberFormatter::with().macros(macros),
+    //         Locale::getEnglish(),
+    //         u"8,7,6,5,0000",
+    //         u"8,7,6,5000",
+    //         u"876500",
+    //         u"87650",
+    //         u"8765",
+    //         u"876.5",
+    //         u"87.65",
+    //         u"8.765",
+    //         u"0");
 }
 
 void NumberFormatterApiTest::padding() {
@@ -1241,9 +1486,9 @@
             u"US$ 12,345.67");
 
     assertFormatSingle(
-            u"Currency symbol should follow number in ar with NS arab",
+            u"Currency symbol should follow number in ar-EG with NS arab",
             NumberFormatter::with().unit(USD),
-            Locale("ar"),
+            Locale("ar-EG"),
             12345.67,
             u"١٢٬٣٤٥٫٦٧ US$");
 
@@ -1254,7 +1499,22 @@
             12345.67,
             u"١٢٬٣٤٥٫٦٧ US$");
 
+    assertFormatSingle(
+            u"NumberingSystem in API should win over @numbers keyword",
+            NumberFormatter::with().adoptSymbols(new NumberingSystem(LATN)).unit(USD),
+            Locale("ar@numbers=arab"),
+            12345.67,
+            u"US$ 12,345.67");
+
     UErrorCode status = U_ZERO_ERROR;
+    assertEquals("NumberingSystem in API should win over @numbers keyword in reverse order",
+            u"US$ 12,345.67",
+            NumberFormatter::withLocale(Locale("ar@numbers=arab"))
+                .adoptSymbols(new NumberingSystem(LATN))
+                .unit(USD)
+                .formatDouble(12345.67, status)
+                .toString());
+
     DecimalFormatSymbols symbols = SWISS_SYMBOLS;
     UnlocalizedNumberFormatter f = NumberFormatter::with().symbols(symbols);
     symbols.setSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kGroupingSeparatorSymbol, u"!", status);
@@ -1305,6 +1565,13 @@
             u"-444,444");
 
     assertFormatSingle(
+            u"Sign Auto Zero",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_AUTO),
+            Locale::getEnglish(),
+            0,
+            u"0");
+
+    assertFormatSingle(
             u"Sign Always Positive",
             NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ALWAYS),
             Locale::getEnglish(),
@@ -1319,6 +1586,13 @@
             u"-444,444");
 
     assertFormatSingle(
+            u"Sign Always Zero",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ALWAYS),
+            Locale::getEnglish(),
+            0,
+            u"+0");
+
+    assertFormatSingle(
             u"Sign Never Positive",
             NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_NEVER),
             Locale::getEnglish(),
@@ -1333,6 +1607,13 @@
             u"444,444");
 
     assertFormatSingle(
+            u"Sign Never Zero",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_NEVER),
+            Locale::getEnglish(),
+            0,
+            u"0");
+
+    assertFormatSingle(
             u"Sign Accounting Positive",
             NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING).unit(USD),
             Locale::getEnglish(),
@@ -1347,6 +1628,13 @@
             u"($444,444.00)");
 
     assertFormatSingle(
+            u"Sign Accounting Zero",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING).unit(USD),
+            Locale::getEnglish(),
+            0,
+            u"$0.00");
+
+    assertFormatSingle(
             u"Sign Accounting-Always Positive",
             NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_ALWAYS).unit(USD),
             Locale::getEnglish(),
@@ -1361,6 +1649,55 @@
             u"($444,444.00)");
 
     assertFormatSingle(
+            u"Sign Accounting-Always Zero",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_ALWAYS).unit(USD),
+            Locale::getEnglish(),
+            0,
+            u"+$0.00");
+
+    assertFormatSingle(
+            u"Sign Except-Zero Positive",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_EXCEPT_ZERO),
+            Locale::getEnglish(),
+            444444,
+            u"+444,444");
+
+    assertFormatSingle(
+            u"Sign Except-Zero Negative",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_EXCEPT_ZERO),
+            Locale::getEnglish(),
+            -444444,
+            u"-444,444");
+
+    assertFormatSingle(
+            u"Sign Except-Zero Zero",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_EXCEPT_ZERO),
+            Locale::getEnglish(),
+            0,
+            u"0");
+
+    assertFormatSingle(
+            u"Sign Accounting-Except-Zero Positive",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO).unit(USD),
+            Locale::getEnglish(),
+            444444,
+            u"+$444,444.00");
+
+    assertFormatSingle(
+            u"Sign Accounting-Except-Zero Negative",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO).unit(USD),
+            Locale::getEnglish(),
+            -444444,
+            u"($444,444.00)");
+
+    assertFormatSingle(
+            u"Sign Accounting-Except-Zero Zero",
+            NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO).unit(USD),
+            Locale::getEnglish(),
+            0,
+            u"$0.00");
+
+    assertFormatSingle(
             u"Sign Accounting Negative Hidden",
             NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING)
                     .unit(USD)
@@ -1426,14 +1763,14 @@
         UErrorCode status2 = U_ZERO_ERROR;
         FormattedNumber fn = lnf.formatInt(1, status1);
         assertEquals(
-                "Should fail with U_ILLEGAL_ARGUMENT_ERROR since rounder is not legal",
-                U_ILLEGAL_ARGUMENT_ERROR,
+                "Should fail since rounder is not legal",
+                U_NUMBER_ARG_OUTOFBOUNDS_ERROR,
                 status1);
         FieldPosition fp;
         fn.populateFieldPosition(fp, status2);
         assertEquals(
-                "Should fail with U_ILLEGAL_ARGUMENT_ERROR on terminal method",
-                U_ILLEGAL_ARGUMENT_ERROR,
+                "Should fail on terminal method",
+                U_NUMBER_ARG_OUTOFBOUNDS_ERROR,
                 status2);
     }
 
@@ -1441,12 +1778,68 @@
         UErrorCode status = U_ZERO_ERROR;
         lnf.copyErrorTo(status);
         assertEquals(
-                "Should fail with U_ILLEGAL_ARGUMENT_ERROR since rounder is not legal",
-                U_ILLEGAL_ARGUMENT_ERROR,
+                "Should fail since rounder is not legal",
+                U_NUMBER_ARG_OUTOFBOUNDS_ERROR,
                 status);
     }
 }
 
+void NumberFormatterApiTest::validRanges() {
+
+#define EXPECTED_MAX_INT_FRAC_SIG 999
+
+#define VALID_RANGE_ASSERT(status, method, lowerBound, argument) { \
+    UErrorCode expectedStatus = ((lowerBound <= argument) && (argument <= EXPECTED_MAX_INT_FRAC_SIG)) \
+        ? U_ZERO_ERROR \
+        : U_NUMBER_ARG_OUTOFBOUNDS_ERROR; \
+    assertEquals( \
+        UnicodeString(u"Incorrect status for " #method " on input ") \
+            + Int64ToUnicodeString(argument), \
+        expectedStatus, \
+        status); \
+}
+
+#define VALID_RANGE_ONEARG(setting, method, lowerBound) { \
+    for (int32_t argument = -2; argument <= EXPECTED_MAX_INT_FRAC_SIG + 2; argument++) { \
+        UErrorCode status = U_ZERO_ERROR; \
+        NumberFormatter::with().setting(method(argument)).copyErrorTo(status); \
+        VALID_RANGE_ASSERT(status, method, lowerBound, argument); \
+    } \
+}
+
+#define VALID_RANGE_TWOARGS(setting, method, lowerBound) { \
+    for (int32_t argument = -2; argument <= EXPECTED_MAX_INT_FRAC_SIG + 2; argument++) { \
+        UErrorCode status = U_ZERO_ERROR; \
+        /* Pass EXPECTED_MAX_INT_FRAC_SIG as the second argument so arg1 <= arg2 in expected cases */ \
+        NumberFormatter::with().setting(method(argument, EXPECTED_MAX_INT_FRAC_SIG)).copyErrorTo(status); \
+        VALID_RANGE_ASSERT(status, method, lowerBound, argument); \
+        status = U_ZERO_ERROR; \
+        /* Pass lowerBound as the first argument so arg1 <= arg2 in expected cases */ \
+        NumberFormatter::with().setting(method(lowerBound, argument)).copyErrorTo(status); \
+        VALID_RANGE_ASSERT(status, method, lowerBound, argument); \
+        /* Check that first argument must be less than or equal to second argument */ \
+        NumberFormatter::with().setting(method(argument, argument - 1)).copyErrorTo(status); \
+        assertEquals("Incorrect status for " #method " on max < min input", \
+            U_NUMBER_ARG_OUTOFBOUNDS_ERROR, \
+            status); \
+    } \
+}
+
+    VALID_RANGE_ONEARG(rounding, Rounder::fixedFraction, 0);
+    VALID_RANGE_ONEARG(rounding, Rounder::minFraction, 0);
+    VALID_RANGE_ONEARG(rounding, Rounder::maxFraction, 0);
+    VALID_RANGE_TWOARGS(rounding, Rounder::minMaxFraction, 0);
+    VALID_RANGE_ONEARG(rounding, Rounder::fixedDigits, 1);
+    VALID_RANGE_ONEARG(rounding, Rounder::minDigits, 1);
+    VALID_RANGE_ONEARG(rounding, Rounder::maxDigits, 1);
+    VALID_RANGE_TWOARGS(rounding, Rounder::minMaxDigits, 1);
+    VALID_RANGE_ONEARG(rounding, Rounder::fixedFraction(1).withMinDigits, 1);
+    VALID_RANGE_ONEARG(rounding, Rounder::fixedFraction(1).withMaxDigits, 1);
+    VALID_RANGE_ONEARG(notation, Notation::scientific().withMinExponentDigits, 1);
+    VALID_RANGE_ONEARG(integerWidth, IntegerWidth::zeroFillTo, 0);
+    VALID_RANGE_ONEARG(integerWidth, IntegerWidth::zeroFillTo(0).truncateAt, -1);
+}
+
 
 void NumberFormatterApiTest::assertFormatDescending(const UnicodeString &message,
                                                  const UnlocalizedNumberFormatter &f,
diff --git a/icu4c/source/test/intltest/numbertest_decimalquantity.cpp b/icu4c/source/test/intltest/numbertest_decimalquantity.cpp
index b298b43..0cbcc52 100644
--- a/icu4c/source/test/intltest/numbertest_decimalquantity.cpp
+++ b/icu4c/source/test/intltest/numbertest_decimalquantity.cpp
@@ -20,6 +20,7 @@
         TESTCASE_AUTO(testAppend);
         TESTCASE_AUTO(testConvertToAccurateDouble);
         TESTCASE_AUTO(testUseApproximateDoubleWhenAble);
+        TESTCASE_AUTO(testHardDoubleConversion);
     TESTCASE_AUTO_END;
 }
 
@@ -233,7 +234,7 @@
 }
 
 void DecimalQuantityTest::testUseApproximateDoubleWhenAble() {
-    struct TestCase {
+    static const struct TestCase {
         double d;
         int32_t maxFrac;
         RoundingMode roundingMode;
@@ -264,4 +265,33 @@
     }
 }
 
+void DecimalQuantityTest::testHardDoubleConversion() {
+    static const struct TestCase {
+        double input;
+        const char16_t* expectedOutput;
+    } cases[] = {
+            { 512.0000000000017, u"512.0000000000017" },
+            { 4095.9999999999977, u"4095.9999999999977" },
+            { 4095.999999999998, u"4095.999999999998" },
+            { 4095.9999999999986, u"4095.9999999999986" },
+            { 4095.999999999999, u"4095.999999999999" },
+            { 4095.9999999999995, u"4095.9999999999995" },
+            { 4096.000000000001, u"4096.000000000001" },
+            { 4096.000000000002, u"4096.000000000002" },
+            { 4096.000000000003, u"4096.000000000003" },
+            { 4096.000000000004, u"4096.000000000004" },
+            { 4096.000000000005, u"4096.000000000005" },
+            { 4096.0000000000055, u"4096.0000000000055" },
+            { 4096.000000000006, u"4096.000000000006" },
+            { 4096.000000000007, u"4096.000000000007" } };
+
+    for (auto& cas : cases) {
+        DecimalQuantity q;
+        q.setToDouble(cas.input);
+        q.roundToInfinity();
+        UnicodeString actualOutput = q.toPlainString();
+        assertEquals("", cas.expectedOutput, actualOutput);
+    }
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/test/intltest/numbertest_doubleconversion.cpp b/icu4c/source/test/intltest/numbertest_doubleconversion.cpp
new file mode 100644
index 0000000..a52865d
--- /dev/null
+++ b/icu4c/source/test/intltest/numbertest_doubleconversion.cpp
@@ -0,0 +1,45 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT
+
+#include "numbertest.h"
+#include "double-conversion.h"
+
+using namespace double_conversion;
+
+void DoubleConversionTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char *) {
+    if (exec) {
+        logln("TestSuite DoubleConversionTest: ");
+    }
+    TESTCASE_AUTO_BEGIN;
+        TESTCASE_AUTO(testDoubleConversionApi);
+    TESTCASE_AUTO_END;
+}
+
+void DoubleConversionTest::testDoubleConversionApi() {
+    double v = 87.65;
+    char buffer[DoubleToStringConverter::kBase10MaximalLength + 1];
+    bool sign;
+    int32_t length;
+    int32_t point;
+
+    DoubleToStringConverter::DoubleToAscii(
+        v,
+        DoubleToStringConverter::DtoaMode::SHORTEST,
+        0,
+        buffer,
+        sizeof(buffer),
+        &sign,
+        &length,
+        &point
+    );
+
+    UnicodeString result(buffer, length);
+    assertEquals("Digits", u"8765", result);
+    assertEquals("Scale", 2, point);
+}
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/test/intltest/numbertest_modifiers.cpp b/icu4c/source/test/intltest/numbertest_modifiers.cpp
index 279df75..bebb3f8 100644
--- a/icu4c/source/test/intltest/numbertest_modifiers.cpp
+++ b/icu4c/source/test/intltest/numbertest_modifiers.cpp
@@ -38,13 +38,13 @@
     UErrorCode status = U_ZERO_ERROR;
     NumberStringBuilder prefix;
     NumberStringBuilder suffix;
-    ConstantMultiFieldModifier mod1(prefix, suffix, true);
+    ConstantMultiFieldModifier mod1(prefix, suffix, false, true);
     assertModifierEquals(mod1, 0, true, u"|", u"n", status);
     assertSuccess("Spot 1", status);
 
     prefix.append(u"a📻", UNUM_PERCENT_FIELD, status);
     suffix.append(u"b", UNUM_CURRENCY_FIELD, status);
-    ConstantMultiFieldModifier mod2(prefix, suffix, true);
+    ConstantMultiFieldModifier mod2(prefix, suffix, false, true);
     assertModifierEquals(mod2, 3, true, u"a📻|b", u"%%%n$", status);
     assertSuccess("Spot 2", status);
 
@@ -105,14 +105,14 @@
 
     NumberStringBuilder prefix;
     NumberStringBuilder suffix;
-    CurrencySpacingEnabledModifier mod1(prefix, suffix, true, symbols, status);
+    CurrencySpacingEnabledModifier mod1(prefix, suffix, false, true, symbols, status);
     assertSuccess("Spot 2", status);
     assertModifierEquals(mod1, 0, true, u"|", u"n", status);
     assertSuccess("Spot 3", status);
 
     prefix.append(u"USD", UNUM_CURRENCY_FIELD, status);
     assertSuccess("Spot 4", status);
-    CurrencySpacingEnabledModifier mod2(prefix, suffix, true, symbols, status);
+    CurrencySpacingEnabledModifier mod2(prefix, suffix, false, true, symbols, status);
     assertSuccess("Spot 5", status);
     assertModifierEquals(mod2, 3, true, u"USD|", u"$$$n", status);
     assertSuccess("Spot 6", status);
@@ -138,7 +138,7 @@
     symbols.setPatternForCurrencySpacing(UNUM_CURRENCY_SURROUNDING_MATCH, true, u"[|]");
     suffix.append("XYZ", UNUM_CURRENCY_FIELD, status);
     assertSuccess("Spot 11", status);
-    CurrencySpacingEnabledModifier mod3(prefix, suffix, true, symbols, status);
+    CurrencySpacingEnabledModifier mod3(prefix, suffix, false, true, symbols, status);
     assertSuccess("Spot 12", status);
     assertModifierEquals(mod3, 3, true, u"USD|\u00A0XYZ", u"$$$nn$$$", status);
     assertSuccess("Spot 13", status);
diff --git a/icu4c/source/test/intltest/numbertest_patternmodifier.cpp b/icu4c/source/test/intltest/numbertest_patternmodifier.cpp
index f30203e..79c99e9 100644
--- a/icu4c/source/test/intltest/numbertest_patternmodifier.cpp
+++ b/icu4c/source/test/intltest/numbertest_patternmodifier.cpp
@@ -14,6 +14,7 @@
     }
     TESTCASE_AUTO_BEGIN;
         TESTCASE_AUTO(testBasic);
+        TESTCASE_AUTO(testPatternWithNoPlaceholder);
         TESTCASE_AUTO(testMutableEqualsImmutable);
     TESTCASE_AUTO_END;
 }
@@ -31,13 +32,19 @@
     assertSuccess("Spot 2", status);
     mod.setSymbols(&symbols, currency, UNUM_UNIT_WIDTH_SHORT, nullptr);
 
-    mod.setNumberProperties(false, StandardPlural::Form::COUNT);
+    mod.setNumberProperties(1, StandardPlural::Form::COUNT);
     assertEquals("Pattern a0b", u"a", getPrefix(mod, status));
     assertEquals("Pattern a0b", u"b", getSuffix(mod, status));
     mod.setPatternAttributes(UNUM_SIGN_ALWAYS, false);
     assertEquals("Pattern a0b", u"+a", getPrefix(mod, status));
     assertEquals("Pattern a0b", u"b", getSuffix(mod, status));
-    mod.setNumberProperties(true, StandardPlural::Form::COUNT);
+    mod.setNumberProperties(0, StandardPlural::Form::COUNT);
+    assertEquals("Pattern a0b", u"+a", getPrefix(mod, status));
+    assertEquals("Pattern a0b", u"b", getSuffix(mod, status));
+    mod.setPatternAttributes(UNUM_SIGN_EXCEPT_ZERO, false);
+    assertEquals("Pattern a0b", u"a", getPrefix(mod, status));
+    assertEquals("Pattern a0b", u"b", getSuffix(mod, status));
+    mod.setNumberProperties(-1, StandardPlural::Form::COUNT);
     assertEquals("Pattern a0b", u"-a", getPrefix(mod, status));
     assertEquals("Pattern a0b", u"b", getSuffix(mod, status));
     mod.setPatternAttributes(UNUM_SIGN_NEVER, false);
@@ -50,24 +57,69 @@
     assertSuccess("Spot 4", status);
     mod.setPatternInfo(&patternInfo2);
     mod.setPatternAttributes(UNUM_SIGN_AUTO, false);
-    mod.setNumberProperties(false, StandardPlural::Form::COUNT);
+    mod.setNumberProperties(1, StandardPlural::Form::COUNT);
     assertEquals("Pattern a0b;c-0d", u"a", getPrefix(mod, status));
     assertEquals("Pattern a0b;c-0d", u"b", getSuffix(mod, status));
     mod.setPatternAttributes(UNUM_SIGN_ALWAYS, false);
     assertEquals("Pattern a0b;c-0d", u"c+", getPrefix(mod, status));
     assertEquals("Pattern a0b;c-0d", u"d", getSuffix(mod, status));
-    mod.setNumberProperties(true, StandardPlural::Form::COUNT);
+    mod.setNumberProperties(0, StandardPlural::Form::COUNT);
+    assertEquals("Pattern a0b;c-0d", u"c+", getPrefix(mod, status));
+    assertEquals("Pattern a0b;c-0d", u"d", getSuffix(mod, status));
+    mod.setPatternAttributes(UNUM_SIGN_EXCEPT_ZERO, false);
+    assertEquals("Pattern a0b;c-0d", u"a", getPrefix(mod, status));
+    assertEquals("Pattern a0b;c-0d", u"b", getSuffix(mod, status));
+    mod.setNumberProperties(-1, StandardPlural::Form::COUNT);
     assertEquals("Pattern a0b;c-0d", u"c-", getPrefix(mod, status));
     assertEquals("Pattern a0b;c-0d", u"d", getSuffix(mod, status));
     mod.setPatternAttributes(UNUM_SIGN_NEVER, false);
-    assertEquals(
-            "Pattern a0b;c-0d",
-            u"c-",
-            getPrefix(mod, status)); // TODO: What should this behavior be?
+    // TODO: What should this behavior be?
+    assertEquals("Pattern a0b;c-0d", u"c-", getPrefix(mod, status));
     assertEquals("Pattern a0b;c-0d", u"d", getSuffix(mod, status));
     assertSuccess("Spot 5", status);
 }
 
+void PatternModifierTest::testPatternWithNoPlaceholder() {
+    UErrorCode status = U_ZERO_ERROR;
+    MutablePatternModifier mod(false);
+    ParsedPatternInfo patternInfo;
+    PatternParser::parseToPatternInfo(u"abc", patternInfo, status);
+    assertSuccess("Spot 1", status);
+    mod.setPatternInfo(&patternInfo);
+    mod.setPatternAttributes(UNUM_SIGN_AUTO, false);
+    DecimalFormatSymbols symbols(Locale::getEnglish(), status);
+    CurrencyUnit currency(u"USD", status);
+    assertSuccess("Spot 2", status);
+    mod.setSymbols(&symbols, currency, UNUM_UNIT_WIDTH_SHORT, nullptr);
+    mod.setNumberProperties(1, StandardPlural::Form::COUNT);
+
+    // Unsafe Code Path
+    NumberStringBuilder nsb;
+    nsb.append(u"x123y", UNUM_FIELD_COUNT, status);
+    assertSuccess("Spot 3", status);
+    mod.apply(nsb, 1, 4, status);
+    assertSuccess("Spot 4", status);
+    assertEquals("Unsafe Path", u"xabcy", nsb.toUnicodeString());
+
+    // Safe Code Path
+    nsb.clear();
+    nsb.append(u"x123y", UNUM_FIELD_COUNT, status);
+    assertSuccess("Spot 5", status);
+    MicroProps micros;
+    LocalPointer<ImmutablePatternModifier> imod(mod.createImmutable(status), status);
+    if (U_FAILURE(status)) {
+      dataerrln("%s %d  Error in ImmutablePatternModifier creation",
+                __FILE__, __LINE__);
+      assertSuccess("Spot 6", status);
+      return;
+    }
+    DecimalQuantity quantity;
+    imod->applyToMicros(micros, quantity);
+    micros.modMiddle->apply(nsb, 1, 4, status);
+    assertSuccess("Spot 7", status);
+    assertEquals("Safe Path", u"xabcy", nsb.toUnicodeString());
+}
+
 void PatternModifierTest::testMutableEqualsImmutable() {
     UErrorCode status = U_ZERO_ERROR;
     MutablePatternModifier mod(false);
diff --git a/icu4c/source/test/intltest/numbertest_stringbuilder.cpp b/icu4c/source/test/intltest/numbertest_stringbuilder.cpp
index 323c4bd..76d27e1 100644
--- a/icu4c/source/test/intltest/numbertest_stringbuilder.cpp
+++ b/icu4c/source/test/intltest/numbertest_stringbuilder.cpp
@@ -23,6 +23,7 @@
     }
     TESTCASE_AUTO_BEGIN;
         TESTCASE_AUTO(testInsertAppendUnicodeString);
+        TESTCASE_AUTO(testSplice);
         TESTCASE_AUTO(testInsertAppendCodePoint);
         TESTCASE_AUTO(testCopy);
         TESTCASE_AUTO(testFields);
@@ -75,6 +76,55 @@
     }
 }
 
+void NumberStringBuilderTest::testSplice() {
+    const struct TestCase {
+        const char16_t* input;
+        const int32_t startThis;
+        const int32_t endThis;
+    } cases[] = {
+            { u"", 0, 0 },
+            { u"abc", 0, 0 },
+            { u"abc", 1, 1 },
+            { u"abc", 1, 2 },
+            { u"abc", 0, 2 },
+            { u"abc", 0, 3 },
+            { u"lorem ipsum dolor sit amet", 8, 8 },
+            { u"lorem ipsum dolor sit amet", 8, 11 }, // 3 chars, equal to replacement "xyz"
+            { u"lorem ipsum dolor sit amet", 8, 18 } }; // 10 chars, larger than several replacements
+
+    UErrorCode status = U_ZERO_ERROR;
+    UnicodeString sb1;
+    NumberStringBuilder sb2;
+    for (auto cas : cases) {
+        for (const char16_t* replacementPtr : EXAMPLE_STRINGS) {
+            UnicodeString replacement(replacementPtr);
+
+            // Test replacement with full string
+            sb1.remove();
+            sb1.append(cas.input);
+            sb1.replace(cas.startThis, cas.endThis - cas.startThis, replacement);
+            sb2.clear();
+            sb2.append(cas.input, UNUM_FIELD_COUNT, status);
+            sb2.splice(cas.startThis, cas.endThis, replacement, 0, replacement.length(), UNUM_FIELD_COUNT, status);
+            assertSuccess("Splicing into sb2 first time", status);
+            assertEqualsImpl(sb1, sb2);
+
+            // Test replacement with partial string
+            if (replacement.length() <= 2) {
+                continue;
+            }
+            sb1.remove();
+            sb1.append(cas.input);
+            sb1.replace(cas.startThis, cas.endThis - cas.startThis, UnicodeString(replacement, 1, 2));
+            sb2.clear();
+            sb2.append(cas.input, UNUM_FIELD_COUNT, status);
+            sb2.splice(cas.startThis, cas.endThis, replacement, 1, 3, UNUM_FIELD_COUNT, status);
+            assertSuccess("Splicing into sb2 second time", status);
+            assertEqualsImpl(sb1, sb2);
+        }
+    }
+}
+
 void NumberStringBuilderTest::testInsertAppendCodePoint() {
     static const UChar32 cases[] = {
             0, 1, 60, 127, 128, 0x7fff, 0x8000, 0xffff, 0x10000, 0x1f000, 0x10ffff};
@@ -230,7 +280,8 @@
     for (int32_t i = 0; i < a.length(); i++) {
         IntlTest::assertEquals(
                 UnicodeString(u"Char at position ") + Int64ToUnicodeString(i) +
-                UnicodeString(u" in string ") + a, a.charAt(i), b.charAt(i));
+                UnicodeString(u" in \"") + a + UnicodeString("\" versus \"") +
+                b.toUnicodeString() + UnicodeString("\""), a.charAt(i), b.charAt(i));
     }
 }
 
diff --git a/icu4c/source/test/intltest/numfmtst.cpp b/icu4c/source/test/intltest/numfmtst.cpp
index fc562f3..c8fce9e 100644
--- a/icu4c/source/test/intltest/numfmtst.cpp
+++ b/icu4c/source/test/intltest/numfmtst.cpp
@@ -42,7 +42,7 @@
 #include "unicode/msgfmt.h"
 
 #if (U_PLATFORM == U_PF_AIX) || (U_PLATFORM == U_PF_OS390)
-// These should not be macros. If they are, 
+// These should not be macros. If they are,
 // replace them with std::isnan and std::isinf
 #if defined(isnan)
 #undef isnan
@@ -229,6 +229,9 @@
     if (tuple.negativeSuffixFlag) {
         fmt.setNegativeSuffix(tuple.negativeSuffix);
     }
+    if (tuple.signAlwaysShownFlag) {
+        // Not currently supported
+    }
     if (tuple.localizedPatternFlag) {
         UErrorCode status = U_ZERO_ERROR;
         fmt.applyLocalizedPattern(tuple.localizedPattern, status);
@@ -581,8 +584,8 @@
   TESTCASE_AUTO(TestFieldPositionIterator);
   TESTCASE_AUTO(TestDecimal);
   TESTCASE_AUTO(TestCurrencyFractionDigits);
-  TESTCASE_AUTO(TestExponentParse); 
-  TESTCASE_AUTO(TestExplicitParents); 
+  TESTCASE_AUTO(TestExponentParse);
+  TESTCASE_AUTO(TestExplicitParents);
   TESTCASE_AUTO(TestLenientParse);
   TESTCASE_AUTO(TestAvailableNumberingSystems);
   TESTCASE_AUTO(TestRoundingPattern);
@@ -623,6 +626,8 @@
   TESTCASE_AUTO(Test11649_toPatternWithMultiCurrency);
   TESTCASE_AUTO(Test13327_numberingSystemBufferOverflow);
   TESTCASE_AUTO(Test13391_chakmaParsing);
+  TESTCASE_AUTO(Test11035_FormatCurrencyAmount);
+  TESTCASE_AUTO(Test11318_DoubleConversion);
   TESTCASE_AUTO_END;
 }
 
@@ -1458,19 +1463,19 @@
 
     Locale en_US("en_US");
     Locale sv_SE("sv_SE");
-    
+
     NumberFormat *mFormat = NumberFormat::createInstance(sv_SE, UNUM_DECIMAL, status);
-    
+
     if (mFormat == NULL || U_FAILURE(status)) {
         dataerrln("Unable to create NumberFormat (sv_SE, UNUM_DECIMAL) - %s", u_errorName(status));
     } else {
         mFormat->setLenient(TRUE);
         for (int32_t t = 0; t < UPRV_LENGTHOF(lenientMinusTestCases); t += 1) {
             UnicodeString testCase = ctou(lenientMinusTestCases[t]);
-            
+
             mFormat->parse(testCase, n, status);
             logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong());
-            
+
             if (U_FAILURE(status) || n.getType() != Formattable::kLong || n.getLong() != -5) {
                 errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientMinusTestCases[t] + (UnicodeString) "\"");
                 status = U_ZERO_ERROR;
@@ -1478,19 +1483,19 @@
         }
         delete mFormat;
     }
-    
+
     mFormat = NumberFormat::createInstance(en_US, UNUM_DECIMAL, status);
-    
+
     if (mFormat == NULL || U_FAILURE(status)) {
         dataerrln("Unable to create NumberFormat (en_US, UNUM_DECIMAL) - %s", u_errorName(status));
     } else {
         mFormat->setLenient(TRUE);
         for (int32_t t = 0; t < UPRV_LENGTHOF(lenientMinusTestCases); t += 1) {
             UnicodeString testCase = ctou(lenientMinusTestCases[t]);
-            
+
             mFormat->parse(testCase, n, status);
             logln((UnicodeString)"parse(" + testCase + ") = " + n.getLong());
-            
+
             if (U_FAILURE(status) || n.getType() != Formattable::kLong || n.getLong() != -5) {
                 errln((UnicodeString)"Lenient parse failed for \"" + (UnicodeString) lenientMinusTestCases[t] + (UnicodeString) "\"");
                 status = U_ZERO_ERROR;
@@ -1498,7 +1503,7 @@
         }
         delete mFormat;
     }
-    
+
     NumberFormat *cFormat = NumberFormat::createInstance(en_US, UNUM_CURRENCY, status);
 
     if (cFormat == NULL || U_FAILURE(status)) {
@@ -1572,10 +1577,10 @@
    // Test cases that should fail with a strict parse and pass with a
    // lenient parse.
    NumberFormat *nFormat = NumberFormat::createInstance(en_US, status);
-    
+
    if (nFormat == NULL || U_FAILURE(status)) {
        dataerrln("Unable to create NumberFormat (en_US) - %s", u_errorName(status));
-   } else { 
+   } else {
        // first, make sure that they fail with a strict parse
        for (int32_t t = 0; t < UPRV_LENGTHOF(strictFailureTestCases); t += 1) {
 	       UnicodeString testCase = ctou(strictFailureTestCases[t]);
@@ -2311,30 +2316,54 @@
     const UBool possibleDataError = TRUE;
     // Warning: HARD-CODED LOCALE DATA in this test.  If it fails, CHECK
     // THE LOCALE DATA before diving into the code.
-    assertEquals("USD.getName(SYMBOL_NAME)",
+    assertEquals("USD.getName(SYMBOL_NAME, en)",
                  UnicodeString("$"),
                  UnicodeString(ucurr_getName(USD, "en",
                                              UCURR_SYMBOL_NAME,
                                              &isChoiceFormat, &len, &ec)),
                                              possibleDataError);
-    assertEquals("USD.getName(LONG_NAME)",
+    assertEquals("USD.getName(NARROW_SYMBOL_NAME, en)",
+                 UnicodeString("$"),
+                 UnicodeString(ucurr_getName(USD, "en",
+                                             UCURR_NARROW_SYMBOL_NAME,
+                                             &isChoiceFormat, &len, &ec)),
+                                             possibleDataError);
+    assertEquals("USD.getName(LONG_NAME, en)",
                  UnicodeString("US Dollar"),
                  UnicodeString(ucurr_getName(USD, "en",
                                              UCURR_LONG_NAME,
                                              &isChoiceFormat, &len, &ec)),
                                              possibleDataError);
-    assertEquals("CAD.getName(SYMBOL_NAME)",
+    assertEquals("CAD.getName(SYMBOL_NAME, en)",
                  UnicodeString("CA$"),
                  UnicodeString(ucurr_getName(CAD, "en",
                                              UCURR_SYMBOL_NAME,
                                              &isChoiceFormat, &len, &ec)),
                                              possibleDataError);
-    assertEquals("CAD.getName(SYMBOL_NAME)",
+    assertEquals("CAD.getName(NARROW_SYMBOL_NAME, en)",
+                 UnicodeString("$"),
+                 UnicodeString(ucurr_getName(CAD, "en",
+                                             UCURR_NARROW_SYMBOL_NAME,
+                                             &isChoiceFormat, &len, &ec)),
+                                             possibleDataError);
+    assertEquals("CAD.getName(SYMBOL_NAME, en_CA)",
                  UnicodeString("$"),
                  UnicodeString(ucurr_getName(CAD, "en_CA",
                                              UCURR_SYMBOL_NAME,
                                              &isChoiceFormat, &len, &ec)),
                                              possibleDataError);
+    assertEquals("USD.getName(SYMBOL_NAME, en_CA)",
+                 UnicodeString("US$"),
+                 UnicodeString(ucurr_getName(USD, "en_CA",
+                                             UCURR_SYMBOL_NAME,
+                                             &isChoiceFormat, &len, &ec)),
+                                             possibleDataError);
+    assertEquals("USD.getName(NARROW_SYMBOL_NAME, en_CA)",
+                 UnicodeString("$"),
+                 UnicodeString(ucurr_getName(USD, "en_CA",
+                                             UCURR_NARROW_SYMBOL_NAME,
+                                             &isChoiceFormat, &len, &ec)),
+                                             possibleDataError);
     assertEquals("USD.getName(SYMBOL_NAME) in en_NZ",
                  UnicodeString("US$"),
                  UnicodeString(ucurr_getName(USD, "en_NZ",
@@ -2347,6 +2376,18 @@
                                              UCURR_SYMBOL_NAME,
                                              &isChoiceFormat, &len, &ec)),
                                              possibleDataError);
+    assertEquals("USX.getName(SYMBOL_NAME)",
+                 UnicodeString("USX"),
+                 UnicodeString(ucurr_getName(USX, "en_US",
+                                             UCURR_SYMBOL_NAME,
+                                             &isChoiceFormat, &len, &ec)),
+                                             possibleDataError);
+    assertEquals("USX.getName(NARROW_SYMBOL_NAME)",
+                 UnicodeString("USX"),
+                 UnicodeString(ucurr_getName(USX, "en_US",
+                                             UCURR_NARROW_SYMBOL_NAME,
+                                             &isChoiceFormat, &len, &ec)),
+                                             possibleDataError);
     assertEquals("USX.getName(LONG_NAME)",
                  UnicodeString("USX"),
                  UnicodeString(ucurr_getName(USX, "en_US",
@@ -2497,7 +2538,7 @@
         UnicodeString intlCurrencySymbol((UChar)0xa4);
 
         intlCurrencySymbol.append((UChar)0xa4);
-        
+
         logln("Current locale is %s", Locale::getDefault().getName());
         Locale::setDefault(locBad, status);
         logln("Current locale is %s", Locale::getDefault().getName());
@@ -3208,7 +3249,7 @@
     expectParseCurrency(*fmtJP, JPY, 1235,  "\\u00A51,235");
     logln("%s:%d - testing parse of fullwidth yen sign in JP\n", __FILE__, __LINE__);
     expectParseCurrency(*fmtJP, JPY, 1235,  "\\uFFE51,235");
-    
+
     // more..
 */
 }
@@ -3228,7 +3269,7 @@
             fmt.getLocale(ULOC_ACTUAL_LOCALE, status).getBaseName(),
             text);
     u_austrcpy(theInfo+uprv_strlen(theInfo), currency);
-    
+
     char theOperation[100];
 
     uprv_strcpy(theOperation, theInfo);
@@ -3239,7 +3280,7 @@
     uprv_strcat(theOperation, ", check currency:");
     assertEquals(theOperation, currency, currencyAmount->getISOCurrency());
 }
-  
+
 
 void NumberFormatTest::TestJB3832(){
     const char* localeID = "pt_PT@currency=PTE";
@@ -3672,7 +3713,7 @@
         NumberFormat *fmt = (NumberFormat *) origFmt->clone();
         delete origFmt;
 
-        
+
         if (item->isRBNF) {
             expect3(*fmt,item->value,CharsToUnicodeString(item->expectedResult));
         } else {
@@ -4044,7 +4085,7 @@
         UErrorCode status = U_ZERO_ERROR;
         NumberFormat* numFmt = NumberFormat::createInstance(locale, k, status);
         logln("#%d NumberFormat(%s, %s) Currency=%s\n",
-              i, localeString, currencyStyleNames[kIndex], 
+              i, localeString, currencyStyleNames[kIndex],
               currencyISOCode);
 
         if (U_FAILURE(status)) {
@@ -4063,6 +4104,8 @@
 
         UnicodeString strBuf;
         numFmt->format(numberToBeFormat, strBuf);
+        // TODO: Re-enable the following test block. It has been disabled since
+        // the code was first checked-in (r25497)
         /*
         int resultDataIndex = 3 + kIndex;
         // DATA[i][resultDataIndex] is the currency format result
@@ -6802,7 +6845,7 @@
   DecimalFormat *decFmt = (DecimalFormat *) NumberFormat::createInstance(locale, UNUM_CURRENCY, status);
     if (failure(status, "NumberFormat::createInstance", TRUE)) return;
   double val = 12345.67;
-  
+
   {
     int32_t expected[] = {
       UNUM_CURRENCY_FIELD, 0, 1,
@@ -6887,7 +6930,7 @@
 
 //
 //   Test formatting & parsing of big decimals.
-//      API test, not a comprehensive test. 
+//      API test, not a comprehensive test.
 //      See DecimalFormatTest/DataDrivenTests
 //
 #define ASSERT_SUCCESS(status) {if (U_FAILURE(status)) errln("file %s, line %d: status: %s", \
@@ -7020,7 +7063,7 @@
             delete fmtr;
         }
     }
-    
+
 #if U_PLATFORM != U_PF_CYGWIN || defined(CYGWINMSVC)
     /*
      * This test fails on Cygwin (1.7.16) using GCC because of a rounding issue with strtod().
@@ -7072,38 +7115,38 @@
     }
 }
 
-void NumberFormatTest::TestExponentParse() { 
- 
-    UErrorCode status = U_ZERO_ERROR; 
-    Formattable result; 
-    ParsePosition parsePos(0); 
- 
-    // set the exponent symbol 
-    status = U_ZERO_ERROR; 
-    DecimalFormatSymbols *symbols = new DecimalFormatSymbols(Locale::getDefault(), status); 
-    if(U_FAILURE(status)) { 
-        dataerrln((UnicodeString)"ERROR: Could not create DecimalFormatSymbols (Default)"); 
-        return; 
-    } 
-    
-    // create format instance 
-    status = U_ZERO_ERROR; 
-    DecimalFormat fmt("#####", symbols, status); 
-    if(U_FAILURE(status)) { 
-        errln((UnicodeString)"ERROR: Could not create DecimalFormat (pattern, symbols*)"); 
-    } 
-    
-    // parse the text 
-    fmt.parse("5.06e-27", result, parsePos); 
-    if(result.getType() != Formattable::kDouble &&  
-       result.getDouble() != 5.06E-27 && 
-       parsePos.getIndex() != 8 
-       ) 
-    { 
-        errln("ERROR: parse failed - expected 5.06E-27, 8  - returned %d, %i", 
-              result.getDouble(), parsePos.getIndex()); 
-    } 
-} 
+void NumberFormatTest::TestExponentParse() {
+
+    UErrorCode status = U_ZERO_ERROR;
+    Formattable result;
+    ParsePosition parsePos(0);
+
+    // set the exponent symbol
+    status = U_ZERO_ERROR;
+    DecimalFormatSymbols *symbols = new DecimalFormatSymbols(Locale::getDefault(), status);
+    if(U_FAILURE(status)) {
+        dataerrln((UnicodeString)"ERROR: Could not create DecimalFormatSymbols (Default)");
+        return;
+    }
+
+    // create format instance
+    status = U_ZERO_ERROR;
+    DecimalFormat fmt("#####", symbols, status);
+    if(U_FAILURE(status)) {
+        errln((UnicodeString)"ERROR: Could not create DecimalFormat (pattern, symbols*)");
+    }
+
+    // parse the text
+    fmt.parse("5.06e-27", result, parsePos);
+    if(result.getType() != Formattable::kDouble &&
+       result.getDouble() != 5.06E-27 &&
+       parsePos.getIndex() != 8
+       )
+    {
+        errln("ERROR: parse failed - expected 5.06E-27, 8  - returned %d, %i",
+              result.getDouble(), parsePos.getIndex());
+    }
+}
 
 void NumberFormatTest::TestExplicitParents() {
 
@@ -7186,13 +7229,13 @@
 {
     U_STRING_DECL(pattern,"#",1);
     U_STRING_INIT(pattern,"#",1);
-    
+
     U_STRING_DECL(infstr,"INF",3);
     U_STRING_INIT(infstr,"INF",3);
 
     U_STRING_DECL(nanstr,"NAN",3);
     U_STRING_INIT(nanstr,"NAN",3);
-    
+
     UChar outputbuf[50] = {0};
     UErrorCode status = U_ZERO_ERROR;
     UNumberFormat* fmt = unum_open(UNUM_PATTERN_DECIMAL,pattern,1,NULL,NULL,&status);
@@ -7214,7 +7257,7 @@
 
     UFieldPosition position = { 0, 0, 0};
     unum_formatDouble(fmt,inf,outputbuf,50,&position,&status);
-    
+
     if ( u_strcmp(infstr, outputbuf)) {
         errln((UnicodeString)"FAIL: unexpected result for infinity - expected " + infstr + " got " + outputbuf);
     }
@@ -7235,7 +7278,7 @@
     }
 #else
     infoln("NOTE: UCONFIG_FORMAT_FASTPATHS not set, test skipped.");
-#endif  
+#endif
 
     // get some additional case
     {
@@ -7498,9 +7541,9 @@
       UErrorCode int64ConversionU = U_ZERO_ERROR;
       int64_t r = ufmt_getInt64(u, &int64ConversionU);
 
-      if( (l==r) 
+      if( (l==r)
           && ( uType != UFMT_INT64 ) // int64 better not overflow
-          && (U_INVALID_FORMAT_ERROR==int64ConversionU) 
+          && (U_INVALID_FORMAT_ERROR==int64ConversionU)
           && (U_INVALID_FORMAT_ERROR==int64ConversionF) ) {
         logln("%s:%d: OK: 64 bit overflow", file, line);
       } else {
@@ -7625,7 +7668,7 @@
     numberFormat->setMinimumSignificantDigits(3);
     numberFormat->setMaximumSignificantDigits(5);
     numberFormat->setGroupingUsed(false);
-    
+
     UnicodeString result;
     UnicodeString expectedResult;
     for (unsigned int i = 0; i < UPRV_LENGTHOF(input); ++i) {
@@ -7647,7 +7690,7 @@
 
     numberFormat->setSignificantDigitsUsed(TRUE);
     numberFormat->setMaximumSignificantDigits(3);
-    
+
     UnicodeString result;
     numberFormat->format(0.0, result);
     if (result != "0") {
@@ -7664,7 +7707,7 @@
         dataerrln("File %s, Line %d: status = %s.\n", __FILE__, __LINE__, u_errorName(status));
         return;
     }
-        
+
     if (numberFormat->areSignificantDigitsUsed() == TRUE) {
         errln("File %s, Line %d: areSignificantDigitsUsed() was TRUE, expected FALSE.\n", __FILE__, __LINE__);
     }
@@ -7688,7 +7731,7 @@
     if (numberFormat->areSignificantDigitsUsed() == FALSE) {
         errln("File %s, Line %d: areSignificantDigitsUsed() was FALSE, expected TRUE.\n", __FILE__, __LINE__);
     }
- 
+
 }
 
 void NumberFormatTest::TestParseNegativeWithFaLocale() {
@@ -7779,7 +7822,7 @@
         { "en@numbers=arabext", FALSE,  CharsToUnicodeString("\\u200E-\\u200E\\u06F6\\u06F7"),          -67 },
         { "en@numbers=arabext", TRUE,   CharsToUnicodeString("\\u200E-\\u200E\\u06F6\\u06F7"),          -67 },
         { "en@numbers=arabext", TRUE,   CharsToUnicodeString("\\u200E-\\u200E \\u06F6\\u06F7"),         -67 },
- 
+
         { "he",                 FALSE,  CharsToUnicodeString("12"),                                      12 },
         { "he",                 TRUE,   CharsToUnicodeString("12"),                                      12 },
         { "he",                 FALSE,  CharsToUnicodeString("-23"),                                    -23 },
@@ -7908,7 +7951,7 @@
     // explicit padding char is specified in the new pattern.
     fmt.applyPattern("AA#,##0.00ZZ", status);
 
-    // Oops this still prints 'a' even though we changed the pattern. 
+    // Oops this still prints 'a' even though we changed the pattern.
     if (fmt.getPadCharacterString() != UnicodeString(" ")) {
         errln("applyPattern did not clear padding character.");
     }
@@ -7921,7 +7964,7 @@
         errcheckln(status, "DecimalFormat constructor failed - %s", u_errorName(status));
         return;
     }
-        
+
     DecimalFormat::ERoundingMode roundingModes[] = {
             DecimalFormat::kRoundCeiling,
             DecimalFormat::kRoundDown,
@@ -7938,7 +7981,7 @@
             "Round half even",
             "Round half up",
             "Round up"};
-        
+
     {
         double values[] = {-0.003006, -0.003005, -0.003004, 0.003014, 0.003015, 0.003016};
         // The order of these expected values correspond to the order of roundingModes and the order of values.
@@ -8231,7 +8274,7 @@
             assertEquals("Test Currency Usage 3", UnicodeString("CA$123.57"), original_rounding);
             fmt->setCurrencyUsage(UCURR_USAGE_CASH, &status);
         }else{
-            fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_CAD, UNUM_CASH_CURRENCY, status); 
+            fmt = (DecimalFormat *) NumberFormat::createInstance(enUS_CAD, UNUM_CASH_CURRENCY, status);
             if (assertSuccess("en_US@currency=CAD/CASH", status, TRUE) == FALSE) {
                 continue;
             }
@@ -8632,7 +8675,7 @@
    DigitList d;
    d.set(-0.0);
    assertFalse("", d.isPositive());
-   d.round(3); 
+   d.round(3);
    assertFalse("", d.isPositive());
 }
 
@@ -8648,7 +8691,7 @@
         DecimalFormat *dfmt = (DecimalFormat *) fmt.getAlias();
         dfmt->setCurrency(USD);
         UnicodeString result;
-    
+
         // This line should be a no-op. I am setting the positive prefix
         // to be the same thing it was before.
         dfmt->setPositivePrefix(dfmt->getPositivePrefix(result));
@@ -8772,7 +8815,7 @@
     static UChar USD[] = {0x55, 0x53, 0x44, 0x0};
     fmt.setCurrency(USD);
     UnicodeString appendTo;
-    
+
     assertEquals("", "US dollars 12.34", fmt.format(12.34, appendTo));
 
     UnicodeString topattern;
@@ -8782,7 +8825,7 @@
         return;
     }
     fmt2.setCurrency(USD);
-    
+
     appendTo.remove();
     assertEquals("", "US dollars 12.34", fmt2.format(12.34, appendTo));
 }
@@ -8883,4 +8926,49 @@
     assertEquals("Issue11735 ppos", 0, ppos.getIndex());
 }
 
+void NumberFormatTest::Test11035_FormatCurrencyAmount() {
+    UErrorCode status = U_ZERO_ERROR;
+    double amount = 12345.67;
+    const char16_t* expected = u"12,345$67 ​";
+
+    // Test two ways to set a currency via API
+
+    Locale loc1 = Locale("pt_PT");
+    LocalPointer<NumberFormat> fmt1(NumberFormat::createCurrencyInstance("loc1", status),
+                                    status);
+    if (U_FAILURE(status)) {
+      dataerrln("%s %d NumberFormat instance fmt1 is null",  __FILE__, __LINE__);
+      return;
+    }
+    fmt1->setCurrency(u"PTE", status);
+    assertSuccess("Setting currency on fmt1", status);
+    UnicodeString actualSetCurrency;
+    fmt1->format(amount, actualSetCurrency);
+
+    Locale loc2 = Locale("pt_PT@currency=PTE");
+    LocalPointer<NumberFormat> fmt2(NumberFormat::createCurrencyInstance(loc2, status));
+    assertSuccess("Creating fmt2", status);
+    UnicodeString actualLocaleString;
+    fmt2->format(amount, actualLocaleString);
+
+    // TODO: The following test will fail until DecimalFormat wraps NumberFormatter.
+    if (!logKnownIssue("13574")) {
+        assertEquals("Custom Currency Pattern, Set Currency", expected, actualSetCurrency);
+    }
+}
+
+void NumberFormatTest::Test11318_DoubleConversion() {
+    IcuTestErrorCode status(*this, "Test11318_DoubleConversion");
+    LocalPointer<NumberFormat> nf(NumberFormat::createInstance("en", status), status);
+    if (U_FAILURE(status)) {
+      dataerrln("%s %d Error in NumberFormat instance creation",  __FILE__, __LINE__);
+      return;
+    }
+    nf->setMaximumFractionDigits(40);
+    nf->setMaximumIntegerDigits(40);
+    UnicodeString appendTo;
+    nf->format(999999999999999.9, appendTo);
+    assertEquals("Should render all digits", u"999,999,999,999,999.9", appendTo);
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/test/intltest/numfmtst.h b/icu4c/source/test/intltest/numfmtst.h
index 8477fcb..c212bea 100644
--- a/icu4c/source/test/intltest/numfmtst.h
+++ b/icu4c/source/test/intltest/numfmtst.h
@@ -219,6 +219,8 @@
     void Test13391_chakmaParsing();
 
     void checkExceptionIssue11735();
+    void Test11035_FormatCurrencyAmount();
+    void Test11318_DoubleConversion();
 
  private:
     UBool testFormattableAsUFormattable(const char *file, int line, Formattable &f);
diff --git a/icu4c/source/test/intltest/rbbiapts.cpp b/icu4c/source/test/intltest/rbbiapts.cpp
index 1a87290..fa6ea06 100644
--- a/icu4c/source/test/intltest/rbbiapts.cpp
+++ b/icu4c/source/test/intltest/rbbiapts.cpp
@@ -1035,7 +1035,7 @@
 
     builtRules = (const uint8_t *)udata_getMemory(data.getAlias());
     builtSource = (const UChar *)(builtRules + ((RBBIDataHeader*)builtRules)->fRuleSource);
-    RuleBasedBreakIterator *brkItr = new RuleBasedBreakIterator(builtSource, parseError, status);
+    LocalPointer<RuleBasedBreakIterator> brkItr (new RuleBasedBreakIterator(builtSource, parseError, status));
     if (U_FAILURE(status)) {
         errln("%s:%d createRuleBasedBreakIterator: ICU Error \"%s\"  at line %d, column %d\n",
                 __FILE__, __LINE__, u_errorName(status), parseError.line, parseError.offset);
@@ -1048,7 +1048,6 @@
         errln("%s:%d Built rules and rebuilt rules are different %s", __FILE__, __LINE__, dataFile);
         return;
     }
-    delete brkItr;
 }
 
 void RBBIAPITest::TestRoundtripRules() {
diff --git a/icu4c/source/test/intltest/rbbitst.cpp b/icu4c/source/test/intltest/rbbitst.cpp
index 2503862..0278516 100644
--- a/icu4c/source/test/intltest/rbbitst.cpp
+++ b/icu4c/source/test/intltest/rbbitst.cpp
@@ -17,6 +17,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <vector>
 
 #include "unicode/brkiter.h"
 #include "unicode/localpointer.h"
@@ -39,10 +40,12 @@
 #include "cstr.h"
 #include "intltest.h"
 #include "rbbitst.h"
+#include "rbbidata.h"
 #include "utypeinfo.h"  // for 'typeid' to work
 #include "uvector.h"
 #include "uvectr32.h"
 
+
 #if !UCONFIG_NO_FILTERED_BREAK_ITERATION
 #include "unicode/filteredbrk.h"
 #endif // !UCONFIG_NO_FILTERED_BREAK_ITERATION
@@ -75,7 +78,6 @@
 #endif
 #if !UCONFIG_NO_FILE_IO
     TESTCASE_AUTO(TestUnicodeFiles);
-    TESTCASE_AUTO(TestEmptyString);
 #endif
     TESTCASE_AUTO(TestGetAvailableLocales);
     TESTCASE_AUTO(TestGetDisplayName);
@@ -106,151 +108,13 @@
     TESTCASE_AUTO(TestBug12932);
     TESTCASE_AUTO(TestEmoji);
     TESTCASE_AUTO(TestBug12519);
+    TESTCASE_AUTO(TestBug12677);
+    TESTCASE_AUTO(TestTableRedundancies);
+    TESTCASE_AUTO(TestBug13447);
     TESTCASE_AUTO_END;
 }
 
 
-//---------------------------------------------------------------------------
-//
-//   class BITestData   Holds a set of Break iterator test data and results
-//                      Includes
-//                         - the string data to be broken
-//                         - a vector of the expected break positions.
-//                         - a vector of source line numbers for the data,
-//                               (to help see where errors occured.)
-//                         - The expected break tag values.
-//                         - Vectors of actual break positions and tag values.
-//                         - Functions for comparing actual with expected and
-//                            reporting errors.
-//
-//----------------------------------------------------------------------------
-class BITestData {
-public:
-    UnicodeString    fDataToBreak;
-    UVector          fExpectedBreakPositions;
-    UVector          fExpectedTags;
-    UVector          fLineNum;
-    UVector          fActualBreakPositions;   // Test Results.
-    UVector          fActualTags;
-
-    BITestData(UErrorCode &status);
-    void             addDataChunk(const char *data, int32_t tag, int32_t lineNum, UErrorCode status);
-    void             checkResults(const char *heading, RBBITest *test);
-    void             err(const char *heading, RBBITest *test, int32_t expectedIdx, int32_t actualIdx);
-    void             clearResults();
-};
-
-//
-// Constructor.
-//
-BITestData::BITestData(UErrorCode &status)
-: fExpectedBreakPositions(status), fExpectedTags(status),  fLineNum(status), fActualBreakPositions(status),
-  fActualTags(status)
-{
-}
-
-//
-// addDataChunk.   Add a section (non-breaking) piece if data to the test data.
-//                 The macro form collects the line number, which is helpful
-//                 when tracking down failures.
-//
-//                 A null data item is inserted at the start of each test's data
-//                  to put the starting zero into the data list.  The position saved for
-//                  each non-null item is its ending position.
-//
-#define ADD_DATACHUNK(td, data, tag, status)   td.addDataChunk(data, tag, __LINE__, status);
-void BITestData::addDataChunk(const char *data, int32_t tag, int32_t lineNum, UErrorCode status) {
-    if (U_FAILURE(status)) {return;}
-    if (data != NULL) {
-        fDataToBreak.append(CharsToUnicodeString(data));
-    }
-    fExpectedBreakPositions.addElement(fDataToBreak.length(), status);
-    fExpectedTags.addElement(tag, status);
-    fLineNum.addElement(lineNum, status);
-}
-
-
-//
-//  checkResults.   Compare the actual and expected break positions, report any differences.
-//
-void BITestData::checkResults(const char *heading, RBBITest *test) {
-    int32_t   expectedIndex = 0;
-    int32_t   actualIndex = 0;
-
-    for (;;) {
-        // If we've run through both the expected and actual results vectors, we're done.
-        //   break out of the loop.
-        if (expectedIndex >= fExpectedBreakPositions.size() &&
-            actualIndex   >= fActualBreakPositions.size()) {
-            break;
-        }
-
-
-        if (expectedIndex >= fExpectedBreakPositions.size()) {
-            err(heading, test, expectedIndex-1, actualIndex);
-            actualIndex++;
-            continue;
-        }
-
-        if (actualIndex >= fActualBreakPositions.size()) {
-            err(heading, test, expectedIndex, actualIndex-1);
-            expectedIndex++;
-            continue;
-        }
-
-        if (fActualBreakPositions.elementAti(actualIndex) != fExpectedBreakPositions.elementAti(expectedIndex)) {
-            err(heading, test, expectedIndex, actualIndex);
-            // Try to resync the positions of the indices, to avoid a rash of spurious erros.
-            if (fActualBreakPositions.elementAti(actualIndex) < fExpectedBreakPositions.elementAti(expectedIndex)) {
-                actualIndex++;
-            } else {
-                expectedIndex++;
-            }
-            continue;
-        }
-
-        if (fActualTags.elementAti(actualIndex) != fExpectedTags.elementAti(expectedIndex)) {
-            test->errln("%s, tag mismatch.  Test Line = %d, expected tag=%d, got %d",
-                heading, fLineNum.elementAt(expectedIndex),
-                fExpectedTags.elementAti(expectedIndex), fActualTags.elementAti(actualIndex));
-        }
-
-        actualIndex++;
-        expectedIndex++;
-    }
-}
-
-//
-//  err   -  An error was found.  Report it, along with information about where the
-//                                incorrectly broken test data appeared in the source file.
-//
-void    BITestData::err(const char *heading, RBBITest *test, int32_t expectedIdx, int32_t actualIdx)
-{
-    int32_t   expected = fExpectedBreakPositions.elementAti(expectedIdx);
-    int32_t   actual   = fActualBreakPositions.elementAti(actualIdx);
-    int32_t   o        = 0;
-    int32_t   line     = fLineNum.elementAti(expectedIdx);
-    if (expectedIdx > 0) {
-        // The line numbers are off by one because a premature break occurs somewhere
-        //    within the previous item, rather than at the start of the current (expected) item.
-        //    We want to report the offset of the unexpected break from the start of
-        //      this previous item.
-        o    = actual - fExpectedBreakPositions.elementAti(expectedIdx-1);
-    }
-    if (actual < expected) {
-        test->errln("%s unexpected break at offset %d in test item from line %d. actual break: %d  expected break: %d", heading, o, line, actual, expected);
-    } else {
-        test->errln("%s Failed to find break at end of item from line %d. actual break: %d  expected break: %d", heading, line, actual, expected);
-    }
-}
-
-
-void BITestData::clearResults() {
-    fActualBreakPositions.removeAllElements();
-    fActualTags.removeAllElements();
-}
-
-
 //--------------------------------------------------------------------------------------
 //
 //    RBBITest    constructor and destructor
@@ -345,277 +209,12 @@
     delete bi;
 }
 
-//----------------------------------------------------------------------------
-//
-// generalIteratorTest      Given a break iterator and a set of test data,
-//                          Run the tests and report the results.
-//
-//----------------------------------------------------------------------------
-void RBBITest::generalIteratorTest(RuleBasedBreakIterator& bi, BITestData &td)
-{
-
-    bi.setText(td.fDataToBreak);
-
-    testFirstAndNext(bi, td);
-
-    testLastAndPrevious(bi, td);
-
-    testFollowing(bi, td);
-    testPreceding(bi, td);
-    testIsBoundary(bi, td);
-    doMultipleSelectionTest(bi, td);
-}
-
-
-//
-//   testFirstAndNext.   Run the iterator forwards in the obvious first(), next()
-//                       kind of loop.
-//
-void RBBITest::testFirstAndNext(RuleBasedBreakIterator& bi, BITestData &td)
-{
-    UErrorCode  status = U_ZERO_ERROR;
-    int32_t     p;
-    int32_t     lastP = -1;
-    int32_t     tag;
-
-    logln("Test first and next");
-    bi.setText(td.fDataToBreak);
-    td.clearResults();
-
-    for (p=bi.first(); p!=RuleBasedBreakIterator::DONE; p=bi.next()) {
-        td.fActualBreakPositions.addElement(p, status);  // Save result.
-        tag = bi.getRuleStatus();
-        td.fActualTags.addElement(tag, status);
-        if (p <= lastP) {
-            // If the iterator is not making forward progress, stop.
-            //  No need to raise an error here, it'll be detected in the normal check of results.
-            break;
-        }
-        lastP = p;
-    }
-    td.checkResults("testFirstAndNext", this);
-}
-
-
-//
-//  TestLastAndPrevious.   Run the iterator backwards, starting with last().
-//
-void  RBBITest::testLastAndPrevious(RuleBasedBreakIterator& bi,  BITestData &td)
-{
-    UErrorCode  status = U_ZERO_ERROR;
-    int32_t     p;
-    int32_t     lastP  = 0x7ffffffe;
-    int32_t     tag;
-
-    logln("Test last and previous");
-    bi.setText(td.fDataToBreak);
-    td.clearResults();
-
-    for (p=bi.last(); p!=RuleBasedBreakIterator::DONE; p=bi.previous()) {
-        // Save break position.  Insert it at start of vector of results, shoving
-        //    already-saved results further towards the end.
-        td.fActualBreakPositions.insertElementAt(p, 0, status);
-        // bi.previous();   // TODO:  Why does this fix things up????
-        // bi.next();
-        tag = bi.getRuleStatus();
-        td.fActualTags.insertElementAt(tag, 0, status);
-        if (p >= lastP) {
-            // If the iterator is not making progress, stop.
-            //  No need to raise an error here, it'll be detected in the normal check of results.
-            break;
-        }
-        lastP = p;
-    }
-    td.checkResults("testLastAndPrevious", this);
-}
-
-
-void RBBITest::testFollowing(RuleBasedBreakIterator& bi, BITestData &td)
-{
-    UErrorCode  status = U_ZERO_ERROR;
-    int32_t     p;
-    int32_t     tag;
-    int32_t     lastP  = -2;     // A value that will never be returned as a break position.
-                                 //   cannot be -1; that is returned for DONE.
-    int         i;
-
-    logln("testFollowing():");
-    bi.setText(td.fDataToBreak);
-    td.clearResults();
-
-    // Save the starting point, since we won't get that out of following.
-    p = bi.first();
-    td.fActualBreakPositions.addElement(p, status);  // Save result.
-    tag = bi.getRuleStatus();
-    td.fActualTags.addElement(tag, status);
-
-    for (i = 0; i <= td.fDataToBreak.length()+1; i++) {
-        p = bi.following(i);
-        if (p != lastP) {
-            if (p == RuleBasedBreakIterator::DONE) {
-                break;
-            }
-            // We've reached a new break position.  Save it.
-            td.fActualBreakPositions.addElement(p, status);  // Save result.
-            tag = bi.getRuleStatus();
-            td.fActualTags.addElement(tag, status);
-            lastP = p;
-        }
-    }
-    // The loop normally exits by means of the break in the middle.
-    // Make sure that the index was at the correct position for the break iterator to have
-    //   returned DONE.
-    if (i != td.fDataToBreak.length()) {
-        errln("testFollowing():  iterator returned DONE prematurely.");
-    }
-
-    // Full check of all results.
-    td.checkResults("testFollowing", this);
-}
-
-
-
-void RBBITest::testPreceding(RuleBasedBreakIterator& bi,  BITestData &td) {
-    UErrorCode  status = U_ZERO_ERROR;
-    int32_t     p;
-    int32_t     tag;
-    int32_t     lastP  = 0x7ffffffe;
-    int         i;
-
-    logln("testPreceding():");
-    bi.setText(td.fDataToBreak);
-    td.clearResults();
-
-    p = bi.last();
-    td.fActualBreakPositions.addElement(p, status);
-    tag = bi.getRuleStatus();
-    td.fActualTags.addElement(tag, status);
-
-    for (i = td.fDataToBreak.length(); i>=-1; i--) {
-        p = bi.preceding(i);
-        if (p != lastP) {
-            if (p == RuleBasedBreakIterator::DONE) {
-                break;
-            }
-            // We've reached a new break position.  Save it.
-            td.fActualBreakPositions.insertElementAt(p, 0, status);
-            lastP = p;
-            tag = bi.getRuleStatus();
-            td.fActualTags.insertElementAt(tag, 0, status);
-        }
-    }
-    // The loop normally exits by means of the break in the middle.
-    // Make sure that the index was at the correct position for the break iterator to have
-    //   returned DONE.
-    if (i != 0) {
-        errln("testPreceding():  iterator returned DONE prematurely.");
-    }
-
-    // Full check of all results.
-    td.checkResults("testPreceding", this);
-}
-
-
-
-void RBBITest::testIsBoundary(RuleBasedBreakIterator& bi,  BITestData &td) {
-    UErrorCode  status = U_ZERO_ERROR;
-    int         i;
-    int32_t     tag;
-
-    logln("testIsBoundary():");
-    bi.setText(td.fDataToBreak);
-    td.clearResults();
-
-    for (i = 0; i <= td.fDataToBreak.length(); i++) {
-        if (bi.isBoundary(i)) {
-            td.fActualBreakPositions.addElement(i, status);  // Save result.
-            tag = bi.getRuleStatus();
-            td.fActualTags.addElement(tag, status);
-        }
-    }
-    td.checkResults("testIsBoundary: ", this);
-}
-
-
-
-void RBBITest::doMultipleSelectionTest(RuleBasedBreakIterator& iterator, BITestData &td)
-{
-    iterator.setText(td.fDataToBreak);
-
-    RuleBasedBreakIterator* testIterator =(RuleBasedBreakIterator*)iterator.clone();
-    int32_t offset = iterator.first();
-    int32_t testOffset;
-    int32_t count = 0;
-
-    logln("doMultipleSelectionTest text of length: %d", td.fDataToBreak.length());
-
-    if (*testIterator != iterator)
-        errln("clone() or operator!= failed: two clones compared unequal");
-
-    do {
-        testOffset = testIterator->first();
-        testOffset = testIterator->next(count);
-        if (offset != testOffset)
-            errln(UnicodeString("next(n) and next() not returning consistent results: for step ") + count + ", next(n) returned " + testOffset + " and next() had " + offset);
-
-        if (offset != RuleBasedBreakIterator::DONE) {
-            count++;
-            offset = iterator.next();
-
-            if (offset != RuleBasedBreakIterator::DONE && *testIterator == iterator) {
-                errln("operator== failed: Two unequal iterators compared equal. count=%d offset=%d", count, offset);
-                if (count > 10000 || offset == -1) {
-                    errln("operator== failed too many times. Stopping test.");
-                    if (offset == -1) {
-                        errln("Does (RuleBasedBreakIterator::DONE == -1)?");
-                    }
-                    return;
-                }
-            }
-        }
-    } while (offset != RuleBasedBreakIterator::DONE);
-
-    // now do it backwards...
-    offset = iterator.last();
-    count = 0;
-
-    do {
-        testOffset = testIterator->last();
-        testOffset = testIterator->next(count);   // next() with a negative arg is same as previous
-        if (offset != testOffset)
-            errln(UnicodeString("next(n) and next() not returning consistent results: for step ") + count + ", next(n) returned " + testOffset + " and next() had " + offset);
-
-        if (offset != RuleBasedBreakIterator::DONE) {
-            count--;
-            offset = iterator.previous();
-        }
-    } while (offset != RuleBasedBreakIterator::DONE);
-
-    delete testIterator;
-}
-
 
 //---------------------------------------------
 //
 //     other tests
 //
 //---------------------------------------------
-void RBBITest::TestEmptyString()
-{
-    UnicodeString text = "";
-    UErrorCode status = U_ZERO_ERROR;
-
-    BITestData x(status);
-    ADD_DATACHUNK(x, "", 0, status);           // Break at start of data
-    RuleBasedBreakIterator* bi = (RuleBasedBreakIterator *)BreakIterator::createLineInstance(Locale::getDefault(), status);
-    if (U_FAILURE(status))
-    {
-        errcheckln(status, "Failed to create the BreakIterator for default locale in TestEmptyString. - %s", u_errorName(status));
-        return;
-    }
-    generalIteratorTest(*bi, x);
-    delete bi;
-}
 
 void RBBITest::TestGetAvailableLocales()
 {
@@ -4843,6 +4442,102 @@
     assertTrue(WHERE "after assignment of \"biDe = biFr\", they should be equal, but are not.", *biFr == *biDe);
 }
 
+void RBBITest::TestBug12677() {
+    // Check that stripping of comments from rules for getRules() is not confused by
+    // the presence of '#' characters in the rules that do not introduce comments.
+    UnicodeString rules(u"!!forward; \n"
+                         "$x = [ab#];  # a set with a # literal. \n"
+                         " # .;        # a comment that looks sort of like a rule.   \n"
+                         " '#' '?';    # a rule with a quoted #   \n"
+                       );
+
+    UErrorCode status = U_ZERO_ERROR;
+    UParseError pe;
+    RuleBasedBreakIterator bi(rules, pe, status);
+    assertSuccess(WHERE, status);
+    UnicodeString rtRules = bi.getRules();
+    assertEquals(WHERE, UnicodeString(u"!!forward; $x = [ab#]; '#' '?'; "),  rtRules);
+}
+
+
+void RBBITest::TestTableRedundancies() {
+    UErrorCode status = U_ZERO_ERROR;
+    
+    LocalPointer<RuleBasedBreakIterator> bi (
+        (RuleBasedBreakIterator *)BreakIterator::createLineInstance(Locale::getEnglish(), status));
+    assertSuccess(WHERE, status);
+    if (U_FAILURE(status)) return;
+
+    RBBIDataWrapper *dw = bi->fData;
+    const RBBIStateTable *fwtbl = dw->fForwardTable;
+    int32_t numCharClasses = dw->fHeader->fCatCount;
+    // printf("Char Classes: %d     states: %d\n", numCharClasses, fwtbl->fNumStates);
+
+    // Check for duplicate columns (character categories)
+
+    std::vector<UnicodeString> columns;
+    for (int32_t column = 0; column < numCharClasses; column++) {
+        UnicodeString s;
+        for (int32_t r = 1; r < (int32_t)fwtbl->fNumStates; r++) {
+            RBBIStateTableRow  *row = (RBBIStateTableRow *) (fwtbl->fTableData + (fwtbl->fRowLen * r));
+            s.append(row->fNextState[column]);
+        }
+        columns.push_back(s);
+    }
+    // Ignore column (char class) 0 while checking; it's special, and may have duplicates.
+    for (int c1=1; c1<numCharClasses; c1++) {
+        for (int c2 = c1+1; c2 < numCharClasses; c2++) {
+            if (columns.at(c1) == columns.at(c2)) {
+                errln("%s:%d Duplicate columns (%d, %d)\n", __FILE__, __LINE__, c1, c2);
+                goto out;
+            }
+        }
+    }
+  out:
+
+    // Check for duplicate states
+    std::vector<UnicodeString> rows;
+    for (int32_t r=0; r < (int32_t)fwtbl->fNumStates; r++) {
+        UnicodeString s;
+        RBBIStateTableRow  *row = (RBBIStateTableRow *) (fwtbl->fTableData + (fwtbl->fRowLen * r));
+        assertTrue(WHERE, row->fAccepting >= -1);
+        s.append(row->fAccepting + 1);   // values of -1 are expected.
+        s.append(row->fLookAhead);
+        s.append(row->fTagIdx);
+        for (int32_t column = 0; column < numCharClasses; column++) {
+            s.append(row->fNextState[column]);
+        }
+        rows.push_back(s);
+    }
+    for (int r1=0; r1 < (int32_t)fwtbl->fNumStates; r1++) {
+        for (int r2 = r1+1; r2 < (int32_t)fwtbl->fNumStates; r2++) {
+            if (rows.at(r1) == rows.at(r2)) {
+                errln("%s:%d Duplicate rows (%d, %d)\n", __FILE__, __LINE__, r1, r2);
+                return;
+            }
+        }
+    }
+}
+
+// Bug 13447: verify that getRuleStatus() returns the value corresponding to current(),
+//            even after next() has returned DONE.
+
+void RBBITest::TestBug13447() {
+    UErrorCode status = U_ZERO_ERROR;
+    LocalPointer<RuleBasedBreakIterator> bi(
+        (RuleBasedBreakIterator *)BreakIterator::createWordInstance(Locale::getEnglish(), status));
+    assertSuccess(WHERE, status);
+    if (U_FAILURE(status)) return;
+    UnicodeString data(u"1234");
+    bi->setText(data);
+    assertEquals(WHERE, UBRK_WORD_NONE, bi->getRuleStatus());
+    assertEquals(WHERE, 4, bi->next());
+    assertEquals(WHERE, UBRK_WORD_NUMBER, bi->getRuleStatus());
+    assertEquals(WHERE, UBRK_DONE, bi->next());
+    assertEquals(WHERE, 4, bi->current());
+    assertEquals(WHERE, UBRK_WORD_NUMBER, bi->getRuleStatus());
+}
+
 //
 //  TestDebug    -  A place-holder test for debugging purposes.
 //                  For putting in fragments of other tests that can be invoked
diff --git a/icu4c/source/test/intltest/rbbitst.h b/icu4c/source/test/intltest/rbbitst.h
index ba3c5b9..21fdfb9 100644
--- a/icu4c/source/test/intltest/rbbitst.h
+++ b/icu4c/source/test/intltest/rbbitst.h
@@ -41,7 +41,6 @@
 
     void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL );
 
-    void TestEmptyString();
     void TestGetAvailableLocales();
     void TestGetDisplayName();
     void TestEndBehaviour();
@@ -75,6 +74,9 @@
     void TestBug12932();
     void TestEmoji();
     void TestBug12519();
+    void TestBug12677();
+    void TestTableRedundancies();
+    void TestBug13447();
 
     void TestDebug();
     void TestProperties();
@@ -85,40 +87,6 @@
      * internal methods to prepare test data
      **/
 
-    /**
-     * Perform tests of BreakIterator forward and backward functionality
-     * on different kinds of iterators (word, sentence, line and character).
-     * It tests the methods first(), next(), current(), preceding(), following()
-     * previous() and isBoundary().
-     * It makes use of internal functions to achieve this.
-     **/
-    void generalIteratorTest(RuleBasedBreakIterator& bi, BITestData  &td);
-    /**
-     * Internal method to perform iteration and test the first() and next() functions
-     **/
-    void testFirstAndNext(RuleBasedBreakIterator& bi, BITestData &td);
-    /**
-     * Internal method to perform iteration and test the last() and previous() functions
-     **/
-    void testLastAndPrevious(RuleBasedBreakIterator& bi, BITestData &td);
-    /**
-     * Internal method to perform iteration and test the following() function
-     **/
-    void testFollowing(RuleBasedBreakIterator& bi, BITestData &td);
-    /**
-     * Internal method to perform iteration and test the preceding() function
-     **/
-    void testPreceding(RuleBasedBreakIterator& bi, BITestData &td);
-    /**
-     * Internal method to perform iteration and test the isBoundary() function
-     **/
-    void testIsBoundary(RuleBasedBreakIterator& bi, BITestData &td);
-    /**
-     * Internal method to perform tests of BreakIterator multiple selection functionality
-     * on different kinds of iterators (word, sentence, line and character)
-     **/
-    void doMultipleSelectionTest(RuleBasedBreakIterator& iterator, BITestData &td);
-
     void RunMonkey(BreakIterator *bi, RBBIMonkeyKind &mk, const char *name, uint32_t  seed,
         int32_t loopCount, UBool useUText);
 
diff --git a/icu4c/source/test/intltest/regextst.cpp b/icu4c/source/test/intltest/regextst.cpp
index b1d7553..4b0a2f4 100644
--- a/icu4c/source/test/intltest/regextst.cpp
+++ b/icu4c/source/test/intltest/regextst.cpp
@@ -103,6 +103,7 @@
     TESTCASE_AUTO(NamedCaptureLimits);
     TESTCASE_AUTO(TestBug12884);
     TESTCASE_AUTO(TestBug13631);
+    TESTCASE_AUTO(TestBug13632);
     TESTCASE_AUTO_END;
 }
 
@@ -5831,5 +5832,23 @@
     }
 }
 
+// Bug 13632 Out of bounds memory reference if a replacement string ends with a '$',
+//           where a following group specification would be expected.
+//           Failure shows when running the test under Clang's Address Sanitizer.
+
+void RegexTest::TestBug13632() {
+    UErrorCode status = U_ZERO_ERROR;
+    URegularExpression *re = uregex_openC(" ", 0, nullptr, &status);
+    const char16_t *sourceString = u"Hello, world.";
+    uregex_setText(re, sourceString, u_strlen(sourceString), &status);
+
+    const int32_t destCap = 20;
+    char16_t dest[destCap] = {};
+    const char16_t replacement[] = {u'x', u'$'};    // Not nul terminated string.
+    uregex_replaceAll(re, replacement, 2, dest, destCap, &status);
+
+    assertEquals("", U_REGEX_INVALID_CAPTURE_GROUP_NAME, status);
+    uregex_close(re);
+}
 
 #endif  /* !UCONFIG_NO_REGULAR_EXPRESSIONS  */
diff --git a/icu4c/source/test/intltest/regextst.h b/icu4c/source/test/intltest/regextst.h
index 7e98cd6..cfa62d7 100644
--- a/icu4c/source/test/intltest/regextst.h
+++ b/icu4c/source/test/intltest/regextst.h
@@ -58,7 +58,8 @@
     virtual void TestBug11480();
     virtual void TestBug12884();
     virtual void TestBug13631();
-    
+    virtual void TestBug13632();
+
     // The following functions are internal to the regexp tests.
     virtual void assertUText(const char *expected, UText *actual, const char *file, int line);
     virtual void assertUTextInvariant(const char *invariant, UText *actual, const char *file, int line);
diff --git a/icu4c/source/test/intltest/regiontst.cpp b/icu4c/source/test/intltest/regiontst.cpp
index 4d3561a..20d62f3 100644
--- a/icu4c/source/test/intltest/regiontst.cpp
+++ b/icu4c/source/test/intltest/regiontst.cpp
@@ -96,12 +96,12 @@
     { "BS" ,  44, "029", URGN_TERRITORY, "019" },
     { "BT" ,  64, "034", URGN_TERRITORY, "142" },
     { "BU" , 104, "035", URGN_TERRITORY, "142" },
-    { "BV" ,  74, "QO" , URGN_TERRITORY, "009" },
+    { "BV" ,  74, "005", URGN_TERRITORY, "019" },
     { "BW" ,  72, "018", URGN_TERRITORY, "002" },
     { "BY" , 112, "151", URGN_TERRITORY, "150" },
     { "BZ" ,  84, "013", URGN_TERRITORY, "019" },
     { "CA" , 124, "021", URGN_TERRITORY, "019" },
-    { "CC" , 166, "QO" , URGN_TERRITORY, "009" },
+    { "CC" , 166, "053", URGN_TERRITORY, "009" },
     { "CD" , 180, "017", URGN_TERRITORY, "002" },
     { "CF" , 140, "017", URGN_TERRITORY, "002" },
     { "CG" , 178, "017", URGN_TERRITORY, "002" },
@@ -117,7 +117,7 @@
     { "CU" , 192, "029", URGN_TERRITORY, "019" },
     { "CV" , 132, "011", URGN_TERRITORY, "002" },
     { "CW" , 531, "029", URGN_TERRITORY, "019" },
-    { "CX" , 162, "QO" , URGN_TERRITORY, "009" },
+    { "CX" , 162, "053", URGN_TERRITORY, "009" },
     { "CY" , 196, "145", URGN_TERRITORY, "142" },
     { "CZ" , 203, "151", URGN_TERRITORY, "150" },
     { "DD" , 276, "155", URGN_TERRITORY, "150" },
@@ -158,13 +158,13 @@
     { "GP" , 312, "029", URGN_TERRITORY, "019" },
     { "GQ" , 226, "017", URGN_TERRITORY, "002" },
     { "GR" , 300, "039", URGN_TERRITORY, "150" },
-    { "GS" , 239, "QO" , URGN_TERRITORY, "009" },
+    { "GS" , 239, "005", URGN_TERRITORY, "019" },
     { "GT" , 320, "013", URGN_TERRITORY, "019" },
     { "GU" , 316, "057", URGN_TERRITORY, "009" },
     { "GW" , 624, "011", URGN_TERRITORY, "002" },
     { "GY" , 328, "005", URGN_TERRITORY, "019" },
     { "HK" , 344, "030", URGN_TERRITORY, "142" },
-    { "HM" , 334, "QO" , URGN_TERRITORY, "009" },
+    { "HM" , 334, "053", URGN_TERRITORY, "009" },
     { "HN" , 340, "013", URGN_TERRITORY, "019" },
     { "HR" , 191, "039", URGN_TERRITORY, "150" },
     { "HT" , 332, "029", URGN_TERRITORY, "019" },
@@ -175,7 +175,7 @@
     { "IL" , 376, "145", URGN_TERRITORY, "142" },
     { "IM" , 833, "154", URGN_TERRITORY, "150" },
     { "IN" , 356, "034", URGN_TERRITORY, "142" },
-    { "IO" ,  86, "QO" , URGN_TERRITORY, "009" },
+    { "IO" ,  86, "014", URGN_TERRITORY, "002" },
     { "IQ" , 368, "145", URGN_TERRITORY, "142" },
     { "IR" , 364, "034", URGN_TERRITORY, "142" },
     { "IS" , 352, "154", URGN_TERRITORY, "150" },
@@ -290,7 +290,7 @@
     { "TA" ,  -1, "QO",  URGN_TERRITORY, "009" },
     { "TC" , 796, "029", URGN_TERRITORY, "019" },
     { "TD" , 148, "017", URGN_TERRITORY, "002" },
-    { "TF" , 260, "QO" , URGN_TERRITORY, "009" },
+    { "TF" , 260, "145", URGN_TERRITORY, "142" },
     { "TG" , 768, "011", URGN_TERRITORY, "002" },
     { "TH" , 764, "035", URGN_TERRITORY, "142" },
     { "TJ" , 762, "143", URGN_TERRITORY, "142" },
@@ -307,7 +307,7 @@
     { "TZ" , 834, "014", URGN_TERRITORY, "002" },
     { "UA" , 804, "151", URGN_TERRITORY, "150" },
     { "UG" , 800, "014", URGN_TERRITORY, "002" },
-    { "UM" , 581, "QO" , URGN_TERRITORY, "009" },
+    { "UM" , 581, "057", URGN_TERRITORY, "009" },
     { "US" , 840, "021", URGN_TERRITORY, "019" },
     { "UY" , 858, "005", URGN_TERRITORY, "019" },
     { "UZ" , 860, "143", URGN_TERRITORY, "142" },
diff --git a/icu4c/source/test/intltest/tsdcfmsy.cpp b/icu4c/source/test/intltest/tsdcfmsy.cpp
index 90198e0..1ed6d76 100644
--- a/icu4c/source/test/intltest/tsdcfmsy.cpp
+++ b/icu4c/source/test/intltest/tsdcfmsy.cpp
@@ -23,6 +23,7 @@
     TESTCASE_AUTO_BEGIN;
     TESTCASE_AUTO(testSymbols);
     TESTCASE_AUTO(testLastResortData);
+    TESTCASE_AUTO(testDigitSymbols);
     TESTCASE_AUTO(testNumberingSystem);
     TESTCASE_AUTO_END;
 }
@@ -249,6 +250,102 @@
     Verify(1234567.25, "#,##0.##", *lastResort, "1,234,567.25");
 }
 
+void IntlTestDecimalFormatSymbols::testDigitSymbols() {
+    // This test does more in ICU4J than in ICU4C right now.
+    // In ICU4C, it is basically just a test for codePointZero and getConstDigitSymbol.
+    UChar defZero = u'0';
+    UChar32 osmanyaZero = U'\U000104A0';
+    static const UChar* osmanyaDigitStrings[] = {
+        u"\U000104A0", u"\U000104A1", u"\U000104A2", u"\U000104A3", u"\U000104A4",
+        u"\U000104A5", u"\U000104A6", u"\U000104A7", u"\U000104A8", u"\U000104A9"
+    };
+
+    IcuTestErrorCode status(*this, "testDigitSymbols()");
+    DecimalFormatSymbols symbols(Locale("en"), status);
+
+    if (defZero != symbols.getCodePointZero()) {
+        errln("ERROR: Code point zero be ASCII 0");
+    }
+    for (int32_t i=0; i<=9; i++) {
+        assertEquals(UnicodeString("i. ASCII Digit at index ") + Int64ToUnicodeString(i),
+            UnicodeString(u'0' + i),
+            symbols.getConstDigitSymbol(i));
+    }
+
+    for (int32_t i=0; i<=9; i++) {
+        DecimalFormatSymbols::ENumberFormatSymbol key =
+            i == 0
+            ? DecimalFormatSymbols::kZeroDigitSymbol
+            : static_cast<DecimalFormatSymbols::ENumberFormatSymbol>
+                (DecimalFormatSymbols::kOneDigitSymbol + i - 1);
+        symbols.setSymbol(key, UnicodeString(osmanyaDigitStrings[i]), FALSE);
+    }
+    // NOTE: in ICU4J, the calculation of codePointZero is smarter;
+    // in ICU4C, it is more conservative and is only set if propogateDigits is true.
+    if (-1 != symbols.getCodePointZero()) {
+        errln("ERROR: Code point zero be invalid");
+    }
+    for (int32_t i=0; i<=9; i++) {
+        assertEquals(UnicodeString("ii. Osmanya digit at index ") + Int64ToUnicodeString(i),
+            UnicodeString(osmanyaDigitStrings[i]),
+            symbols.getConstDigitSymbol(i));
+    }
+
+    // Check Osmanya codePointZero
+    symbols.setSymbol(
+        DecimalFormatSymbols::kZeroDigitSymbol,
+        UnicodeString(osmanyaDigitStrings[0]), TRUE);
+    if (osmanyaZero != symbols.getCodePointZero()) {
+        errln("ERROR: Code point zero be Osmanya code point zero");
+    }
+    for (int32_t i=0; i<=9; i++) {
+        assertEquals(UnicodeString("iii. Osmanya digit at index ") + Int64ToUnicodeString(i),
+            UnicodeString(osmanyaDigitStrings[i]),
+            symbols.getConstDigitSymbol(i));
+    }
+
+    // Check after copy
+    DecimalFormatSymbols copy(symbols);
+    if (osmanyaZero != copy.getCodePointZero()) {
+        errln("ERROR: Code point zero be Osmanya code point zero");
+    }
+    for (int32_t i=0; i<=9; i++) {
+        assertEquals(UnicodeString("iv. After copy at index ") + Int64ToUnicodeString(i),
+            UnicodeString(osmanyaDigitStrings[i]),
+            copy.getConstDigitSymbol(i));
+    }
+
+    // Check when loaded from resource bundle
+    DecimalFormatSymbols fromData(Locale("en@numbers=osma"), status);
+    if (osmanyaZero != fromData.getCodePointZero()) {
+        errln("ERROR: Code point zero be Osmanya code point zero");
+    }
+    for (int32_t i=0; i<=9; i++) {
+        assertEquals(UnicodeString("v. Resource bundle at index ") + Int64ToUnicodeString(i),
+            UnicodeString(osmanyaDigitStrings[i]),
+            fromData.getConstDigitSymbol(i));
+    }
+
+    // Setting a digit somewhere in the middle should invalidate codePointZero
+    symbols.setSymbol(DecimalFormatSymbols::kOneDigitSymbol, u"foo", FALSE);
+    if (-1 != symbols.getCodePointZero()) {
+        errln("ERROR: Code point zero be invalid");
+    }
+
+    // Reset digits to Latin
+    symbols.setSymbol(
+        DecimalFormatSymbols::kZeroDigitSymbol,
+        UnicodeString(defZero));
+    if (defZero != symbols.getCodePointZero()) {
+        errln("ERROR: Code point zero be ASCII 0");
+    }
+    for (int32_t i=0; i<=9; i++) {
+        assertEquals(UnicodeString("vi. ASCII Digit at index ") + Int64ToUnicodeString(i),
+            UnicodeString(u'0' + i),
+            symbols.getConstDigitSymbol(i));
+    }
+}
+
 void IntlTestDecimalFormatSymbols::testNumberingSystem() {
     IcuTestErrorCode errorCode(*this, "testNumberingSystem");
     struct testcase {
diff --git a/icu4c/source/test/intltest/tsdcfmsy.h b/icu4c/source/test/intltest/tsdcfmsy.h
index 1fd1dfd..1922941 100644
--- a/icu4c/source/test/intltest/tsdcfmsy.h
+++ b/icu4c/source/test/intltest/tsdcfmsy.h
@@ -28,6 +28,7 @@
      */
     void testSymbols(/*char *par*/);
     void testLastResortData();
+    void testDigitSymbols();
     void testNumberingSystem();
 
      /** helper functions**/
diff --git a/icu4c/source/test/intltest/tsmthred.cpp b/icu4c/source/test/intltest/tsmthred.cpp
index 036d5e1..1a717e3 100644
--- a/icu4c/source/test/intltest/tsmthred.cpp
+++ b/icu4c/source/test/intltest/tsmthred.cpp
@@ -448,7 +448,8 @@
 // "Someone from {2} is receiving a #{0} error - {1}. Their telephone call is costing {3 number,currency}."
 
 static void formatErrorMessage(UErrorCode &realStatus, const UnicodeString& pattern, const Locale& theLocale,
-                     UErrorCode inStatus0, /* statusString 1 */ const Locale &inCountry2, double currency3, // these numbers are the message arguments.
+                     UErrorCode inStatus0,                       // statusString 1
+                     const Locale &inCountry2, double currency3, // these numbers are the message arguments.
                      UnicodeString &result)
 {
     if(U_FAILURE(realStatus))
@@ -666,13 +667,13 @@
         // Keep this data here to avoid static initialization.
         FormatThreadTestData kNumberFormatTestData[] =
         {
-            FormatThreadTestData((double)5.0, UnicodeString("5", "")),
-                FormatThreadTestData( 6.0, UnicodeString("6", "")),
-                FormatThreadTestData( 20.0, UnicodeString("20", "")),
-                FormatThreadTestData( 8.0, UnicodeString("8", "")),
-                FormatThreadTestData( 8.3, UnicodeString("8.3", "")),
-                FormatThreadTestData( 12345, UnicodeString("12,345", "")),
-                FormatThreadTestData( 81890.23, UnicodeString("81,890.23", "")),
+            FormatThreadTestData((double)5.0, UnicodeString(u"5")),
+                FormatThreadTestData( 6.0, UnicodeString(u"6")),
+                FormatThreadTestData( 20.0, UnicodeString(u"20")),
+                FormatThreadTestData( 8.0, UnicodeString(u"8")),
+                FormatThreadTestData( 8.3, UnicodeString(u"8.3")),
+                FormatThreadTestData( 12345, UnicodeString(u"12,345")),
+                FormatThreadTestData( 81890.23, UnicodeString(u"81,890.23")),
         };
         int32_t kNumberFormatTestDataLength = UPRV_LENGTHOF(kNumberFormatTestData);
 
@@ -1388,7 +1389,7 @@
     } else {
         result->addRef();
     }
-    
+ 
     // Log that we created an object. The first object was already counted,
     //    don't do it again.
     umtx_lock(&gCTMutex);
@@ -1451,7 +1452,7 @@
 
 void UnifiedCacheThread::run() {
     // Run the exercise with 2 different locales so that we can exercise
-    // eviction more. If each thread exerices just one locale, then
+    // eviction more. If each thread exercises just one locale, then
     // eviction can't start until the threads end.
     exerciseByLocale(fLoc);
     exerciseByLocale(fLoc2);
diff --git a/icu4c/source/test/intltest/tzregts.cpp b/icu4c/source/test/intltest/tzregts.cpp
index b749c2d..c5f59d9 100644
--- a/icu4c/source/test/intltest/tzregts.cpp
+++ b/icu4c/source/test/intltest/tzregts.cpp
@@ -12,6 +12,7 @@
 #include "unicode/simpletz.h"
 #include "unicode/smpdtfmt.h"
 #include "unicode/strenum.h"
+#include "unicode/gregocal.h"
 #include "tzregts.h"
 #include "calregts.h"
 #include "cmemory.h"
@@ -46,6 +47,7 @@
         CASE(16, TestJDK12API);
         CASE(17, Test4176686);
         CASE(18, Test4184229);
+        CASE(19, TestNegativeDaylightSaving);
         default: name = ""; break;
     }
 }
@@ -709,10 +711,10 @@
     int32_t DATA [] = {
         1, GOOD,
         0, BAD,
-        -1, BAD,
+        -1, GOOD,   // #13566 updates SimpleTimeZone to support negative DST saving amount
         60*60*1000, GOOD,
-        INT32_MIN, BAD,
-        // Integer.MAX_VALUE, ?, // no upper limit on DST savings at this time
+        INT32_MAX, GOOD,    // no upper limit on DST savings at this time
+        INT32_MIN, GOOD     // no lower limit as well
     };
 
     UErrorCode status = U_ZERO_ERROR;
@@ -1206,4 +1208,61 @@
     delete zone;
 }
 
+void TimeZoneRegressionTest::TestNegativeDaylightSaving() {
+    UErrorCode status = U_ZERO_ERROR;
+    int32_t stdOff = 1 * 60*60*1000;    // Standard offset UTC+1
+    int save = -1 * 60*60*1000;     // DST saving amount -1 hour
+    SimpleTimeZone stzDublin(stdOff, "Dublin-2018",
+                                UCAL_OCTOBER, -1, -UCAL_SUNDAY, 2*60*60*1000,
+                                UCAL_MARCH, -1, -UCAL_SUNDAY, 1*60*60*1000,
+                                save, status);
+    failure(status, "SimpleTimeZone constructor");
+
+    if (save != stzDublin.getDSTSavings()) {
+        errln((UnicodeString)"FAIL: DST saving is not " + save);
+    }
+
+    GregorianCalendar cal(* TimeZone::getGMT(), status);
+    failure(status, "GregorianCalendar constructor");
+
+    UDate testDate;
+    int32_t rawOffset;
+    int32_t dstOffset;
+
+    cal.set(2018, UCAL_JANUARY, 15, 0, 0, 0);
+    testDate = cal.getTime(status);
+    failure(status, "calendar getTime() - Jan 15");
+
+    if (!stzDublin.inDaylightTime(testDate, status)) {
+        errln("FAIL: The test date (Jan 15) must be in DST.");
+    }
+    failure(status, "inDaylightTime() - Jan 15");
+
+    stzDublin.getOffset(testDate, FALSE, rawOffset, dstOffset, status);
+    failure(status, "getOffset() - Jan 15");
+    if (rawOffset != stdOff || dstOffset != save) {
+        errln((UnicodeString)"FAIL: Expected [stdoff=" + stdOff + ",save=" + save
+            + "] on the test date (Jan 15), actual[stdoff=" + rawOffset
+            + ",save=" + dstOffset + "]");
+    }
+
+    cal.set(2018, UCAL_JULY, 15, 0, 0, 0);
+    testDate = cal.getTime(status);
+    failure(status, "calendar getTime() - Jul 15");
+
+    if (stzDublin.inDaylightTime(testDate, status)) {
+        errln("FAIL: The test date (Jul 15) must be in DST.");
+    }
+    failure(status, "inDaylightTime() - Jul 15");
+
+    stzDublin.getOffset(testDate, FALSE, rawOffset, dstOffset, status);
+    failure(status, "getOffset() - Jul 15");
+    if (rawOffset != stdOff || dstOffset != 0) {
+        errln((UnicodeString)"FAIL: Expected [stdoff=" + stdOff + ",save=" + 0
+            + "] on the test date (Jul 15), actual[stdoff=" + rawOffset
+            + ",save=" + dstOffset + "]");
+    }
+}
+
+
 #endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/test/intltest/tzregts.h b/icu4c/source/test/intltest/tzregts.h
index 2d7f7ef..46e43cd 100644
--- a/icu4c/source/test/intltest/tzregts.h
+++ b/icu4c/source/test/intltest/tzregts.h
@@ -49,6 +49,7 @@
     void TestJDK12API(void);
     void Test4184229(void);
     UBool checkCalendar314(GregorianCalendar *testCal, TimeZone *testTZ);
+    void TestNegativeDaylightSaving(void);
 
 
 protected:
diff --git a/icu4c/source/test/intltest/ucdtest.cpp b/icu4c/source/test/intltest/ucdtest.cpp
index 489d6cd..8a52c94 100644
--- a/icu4c/source/test/intltest/ucdtest.cpp
+++ b/icu4c/source/test/intltest/ucdtest.cpp
@@ -63,6 +63,7 @@
     TESTCASE_AUTO(TestBidiPairedBracketType);
     TESTCASE_AUTO(TestEmojiProperties);
     TESTCASE_AUTO(TestDefaultScriptExtensions);
+    TESTCASE_AUTO(TestInvalidCodePointFolding);
     TESTCASE_AUTO_END;
 }
 
@@ -546,3 +547,22 @@
                  uscript_getScriptExtensions(0x3012, scx, UPRV_LENGTHOF(scx), errorCode));
     assertEquals("U+3012 num scx[0]", USCRIPT_COMMON, scx[0]);
 }
+
+void UnicodeTest::TestInvalidCodePointFolding(void) {
+    // Test behavior when an invalid code point is passed to u_foldCase
+    static const UChar32 invalidCodePoints[] = {
+            0xD800, // lead surrogate
+            0xDFFF, // trail surrogate
+            0xFDD0, // noncharacter
+            0xFFFF, // noncharacter
+            0x110000, // out of range
+            -1 // negative
+    };
+    for (int32_t i=0; i<UPRV_LENGTHOF(invalidCodePoints); ++i) {
+        UChar32 cp = invalidCodePoints[i];
+        assertEquals("Invalid code points should be echoed back",
+                cp, u_foldCase(cp, U_FOLD_CASE_DEFAULT));
+        assertEquals("Invalid code points should be echoed back",
+                cp, u_foldCase(cp, U_FOLD_CASE_EXCLUDE_SPECIAL_I));
+    }
+}
diff --git a/icu4c/source/test/intltest/ucdtest.h b/icu4c/source/test/intltest/ucdtest.h
index 82ffb0e..8a7ae3f 100644
--- a/icu4c/source/test/intltest/ucdtest.h
+++ b/icu4c/source/test/intltest/ucdtest.h
@@ -42,6 +42,7 @@
     void TestBidiPairedBracketType();
     void TestEmojiProperties();
     void TestDefaultScriptExtensions();
+    void TestInvalidCodePointFolding();
 
 private:
 
diff --git a/icu4c/source/test/intltest/unifiedcachetest.cpp b/icu4c/source/test/intltest/unifiedcachetest.cpp
index 762194a..0525d47 100644
--- a/icu4c/source/test/intltest/unifiedcachetest.cpp
+++ b/icu4c/source/test/intltest/unifiedcachetest.cpp
@@ -153,8 +153,8 @@
     unusedReference->removeRef();
 
     // unused count not to exeed in use count
-    assertEquals("", UPRV_LENGTHOF(usedReferences), cache.unusedCount());
-    assertEquals("", 2*UPRV_LENGTHOF(usedReferences), cache.keyCount());
+    assertEquals("T1", UPRV_LENGTHOF(usedReferences), cache.unusedCount());
+    assertEquals("T2", 2*UPRV_LENGTHOF(usedReferences), cache.keyCount());
 
     // Free up those used entries.
     for (int32_t i = 0; i < UPRV_LENGTHOF(usedReferences); i++) {
@@ -162,9 +162,9 @@
     }
 
     // This should free up all cache items
-    assertEquals("", 0, cache.keyCount());
+    assertEquals("T3", 0, cache.keyCount());
 
-    assertSuccess("", status);
+    assertSuccess("T4", status);
 }
 
 
@@ -181,7 +181,7 @@
     // complete control over it. Real clients should never ever create
     // their own cache!
     UnifiedCache cache(status);
-    assertSuccess("", status);
+    assertSuccess("T0", status);
 
     // Maximum unused count is 3.
     cache.setEvictionPolicy(3, 0, status);
@@ -202,15 +202,15 @@
     const UCTItem *frFr = NULL;
     cache.get(LocaleCacheKey<UCTItem>("en_US"), &cache, enUs, status);
     cache.get(LocaleCacheKey<UCTItem>("en"), &cache, en, status);
-    assertEquals("", 1, cache.unusedCount());
+    assertEquals("T1", 1, cache.unusedCount());
     cache.get(LocaleCacheKey<UCTItem>("en_GB"), &cache, enGb, status);
     cache.get(LocaleCacheKey<UCTItem>("fr_FR"), &cache, frFr, status);
     cache.get(LocaleCacheKey<UCTItem>("fr"), &cache, fr, status);
 
     // Client holds two unique references, "en" and "fr" the other three
     // entries are eligible for eviction. 
-    assertEquals("", 3, cache.unusedCount());
-    assertEquals("", 5, cache.keyCount());
+    assertEquals("T2", 3, cache.unusedCount());
+    assertEquals("T3", 5, cache.keyCount());
 
     // Exercise cache more but don't hold the references except for
     // the last one. At the end of this, we will hold references to one
@@ -227,40 +227,40 @@
     // Client holds three unique references, "en", "fr", "de" although we
     // could have a total of 8 entries in the cache maxUnusedCount == 3
     // so we have only 6 entries.
-    assertEquals("", 3, cache.unusedCount());
-    assertEquals("", 6, cache.keyCount());
+    assertEquals("T4", 3, cache.unusedCount());
+    assertEquals("T5", 6, cache.keyCount());
 
     // For all the references we have, cache must continue to return
     // those same references (#2)
 
     cache.get(LocaleCacheKey<UCTItem>("en"), &cache, throwAway, status);
     if (throwAway != en) {
-        errln("Expected en to resolve to the same object.");
+        errln("T6: Expected en to resolve to the same object.");
     }
     cache.get(LocaleCacheKey<UCTItem>("en_US"), &cache, throwAway, status);
     if (throwAway != enUs) {
-        errln("Expected enUs to resolve to the same object.");
+        errln("T7: Expected enUs to resolve to the same object.");
     }
     cache.get(LocaleCacheKey<UCTItem>("en_GB"), &cache, throwAway, status);
     if (throwAway != enGb) {
-        errln("Expected enGb to resolve to the same object.");
+        errln("T8: Expected enGb to resolve to the same object.");
     }
     cache.get(LocaleCacheKey<UCTItem>("fr_FR"), &cache, throwAway, status);
     if (throwAway != frFr) {
-        errln("Expected frFr to resolve to the same object.");
+        errln("T9: Expected frFr to resolve to the same object.");
     }
     cache.get(LocaleCacheKey<UCTItem>("fr_FR"), &cache, throwAway, status);
     cache.get(LocaleCacheKey<UCTItem>("fr"), &cache, throwAway, status);
     if (throwAway != fr) {
-        errln("Expected fr to resolve to the same object.");
+        errln("T10: Expected fr to resolve to the same object.");
     }
     cache.get(LocaleCacheKey<UCTItem>("de_AU"), &cache, throwAway, status);
     if (throwAway != deAu) {
-        errln("Expected deAu to resolve to the same object.");
+        errln("T11: Expected deAu to resolve to the same object.");
     }
 
-    assertEquals("", 3, cache.unusedCount());
-    assertEquals("", 6, cache.keyCount());
+    assertEquals("T12", 3, cache.unusedCount());
+    assertEquals("T13", 6, cache.keyCount());
 
     // Now we hold a references to two more distinct values. Cache size 
     // should grow to 8.
@@ -268,8 +268,8 @@
     const UCTItem *ru = NULL;
     cache.get(LocaleCacheKey<UCTItem>("es"), &cache, es, status);
     cache.get(LocaleCacheKey<UCTItem>("ru"), &cache, ru, status);
-    assertEquals("", 3, cache.unusedCount());
-    assertEquals("", 8, cache.keyCount());
+    assertEquals("T14", 3, cache.unusedCount());
+    assertEquals("T15", 8, cache.keyCount());
 
     // Now release all the references we hold except for
     // es, ru, and en
@@ -284,13 +284,13 @@
     SharedObject::clearPtr(throwAway);
 
     // Size of cache should magically drop to 3.
-    assertEquals("", 3, cache.unusedCount());
-    assertEquals("", 3, cache.keyCount());
+    assertEquals("T16", 3, cache.unusedCount());
+    assertEquals("T17", 3, cache.keyCount());
 
     // Be sure nothing happens setting the eviction policy in the middle of
     // a run.
     cache.setEvictionPolicy(3, 0, status);
-    assertSuccess("", status);
+    assertSuccess("T18", status);
     
 }
 
@@ -311,7 +311,7 @@
     cache->get(LocaleCacheKey<UCTItem>("en_GB"), enGb, status);
     cache->get(LocaleCacheKey<UCTItem>("fr_FR"), frFr, status);
     cache->get(LocaleCacheKey<UCTItem>("fr"), fr, status);
-    cache->get(LocaleCacheKey<UCTItem>("en_GB"), enGb2, status);
+    cache->get(LocaleCacheKey<UCTItem>("en_GB"), enGb2, status); 
     SharedObject::clearPtr(enGb2);
     if (enGb != enUs) {
         errln("Expected en_GB and en_US to resolve to same object.");
@@ -322,16 +322,16 @@
     if (enGb == fr) {
         errln("Expected en_GB and fr to return different objects.");
     }
-    assertSuccess("", status);
+    assertSuccess("T1", status);
     // en_US, en_GB, en share one object; fr_FR and fr don't share.
     // 5 keys in all.
-    assertEquals("", baseCount + 5, cache->keyCount());
+    assertEquals("T2", baseCount + 5, cache->keyCount());
     SharedObject::clearPtr(enGb);
     cache->flush();
 
     // Only 2 unique values in the cache. flushing trims cache down
     // to this minimum size.
-    assertEquals("", baseCount + 2, cache->keyCount());
+    assertEquals("T3", baseCount + 2, cache->keyCount());
     SharedObject::clearPtr(enUs);
     SharedObject::clearPtr(en);
     cache->flush();
@@ -339,14 +339,14 @@
     // the "en" object, so it gets flushed and the keys that refer to it
     // get removed from the cache. Now we have just one unique value, fr, in
     // the cache
-    assertEquals("", baseCount + 1, cache->keyCount());
+    assertEquals("T4", baseCount + 1, cache->keyCount());
     SharedObject::clearPtr(fr);
     cache->flush();
-    assertEquals("", baseCount + 1, cache->keyCount());
+    assertEquals("T5", baseCount + 1, cache->keyCount());
     SharedObject::clearPtr(frFr);
     cache->flush();
-    assertEquals("", baseCount + 0, cache->keyCount());
-    assertSuccess("", status);
+    assertEquals("T6", baseCount + 0, cache->keyCount());
+    assertSuccess("T7", status);
 }
 
 void UnifiedCacheTest::TestError() {
diff --git a/icu4c/source/test/intltest/usettest.cpp b/icu4c/source/test/intltest/usettest.cpp
index d142f04..b6f2eab 100644
--- a/icu4c/source/test/intltest/usettest.cpp
+++ b/icu4c/source/test/intltest/usettest.cpp
@@ -42,15 +42,6 @@
     return left + UnicodeSetTest::escape(pat);
 }
 
-#define CASE(id,test) case id:                          \
-                          name = #test;                 \
-                          if (exec) {                   \
-                              logln(#test "---");       \
-                              logln();                  \
-                              test();                   \
-                          }                             \
-                          break
-
 UnicodeSetTest::UnicodeSetTest() : utf8Cnv(NULL) {
 }
 
@@ -100,6 +91,7 @@
     TESTCASE_AUTO(TestUCAUnsafeBackwards);
     TESTCASE_AUTO(TestIntOverflow);
     TESTCASE_AUTO(TestUnusedCcc);
+    TESTCASE_AUTO(TestDeepPattern);
     TESTCASE_AUTO_END;
 }
 
@@ -3970,3 +3962,19 @@
     assertTrue("[:ccc=1.1:] -> empty set", ccc1_1.isEmpty());
 #endif
 }
+
+void UnicodeSetTest::TestDeepPattern() {
+    IcuTestErrorCode errorCode(*this, "TestDeepPattern");
+    // Nested ranges are parsed via recursion which can use a lot of stack space.
+    // After a reasonable limit, we should get an error.
+    constexpr int32_t DEPTH = 20000;
+    UnicodeString pattern, suffix;
+    for (int32_t i = 0; i < DEPTH; ++i) {
+        pattern.append(u"[a", 2);
+        suffix.append(']');
+    }
+    pattern.append(suffix);
+    UnicodeSet set(pattern, errorCode);
+    assertTrue("[a[a[a...1000s...]]] -> error", errorCode.isFailure());
+    errorCode.reset();
+}
diff --git a/icu4c/source/test/intltest/usettest.h b/icu4c/source/test/intltest/usettest.h
index b34728a..e79a9e8 100644
--- a/icu4c/source/test/intltest/usettest.h
+++ b/icu4c/source/test/intltest/usettest.h
@@ -93,6 +93,7 @@
     void TestUCAUnsafeBackwards();
     void TestIntOverflow();
     void TestUnusedCcc();
+    void TestDeepPattern();
 
 private:
 
diff --git a/icu4c/source/test/iotest/iotest.vcxproj b/icu4c/source/test/iotest/iotest.vcxproj
index 5b7a404..f67c0b1 100644
--- a/icu4c/source/test/iotest/iotest.vcxproj
+++ b/icu4c/source/test/iotest/iotest.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{E4993E82-D68A-46CA-BAE0-9D35E172E46F}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,6 +47,15 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
       <TypeLibraryName>.\x86\Debug/iotest.tlb</TypeLibraryName>
@@ -89,39 +63,26 @@
       </HeaderFileName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
       <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/iotest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Debug/iotest.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/iotest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX86</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -129,117 +90,74 @@
       <TypeLibraryName>.\x86\Release/iotest.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/iotest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Release/iotest.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/iotest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
-      <TargetMachine>MachineX86</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/iotest.tlb</TypeLibraryName>
       <HeaderFileName>
       </HeaderFileName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/iotest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Debug/iotest.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/iotest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/iotest.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\tools\ctestfw;..\..\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>U_ATTRIBUTE_DEPRECATED=;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/iotest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Release/iotest.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/iotest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="filetst.c" />
     <ClCompile Include="iotest.cpp" />
     <ClCompile Include="stream.cpp">
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
     </ClCompile>
     <ClCompile Include="strtst.c" />
     <ClCompile Include="trnstst.c" />
@@ -247,25 +165,7 @@
   <ItemGroup>
     <ClInclude Include="iotest.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\io\io.vcxproj">
-      <Project>{c2b04507-2521-4801-bf0d-5fd79d6d518c}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tools\ctestfw\ctestfw.vcxproj">
-      <Project>{eca6b435-b4fa-4f9f-bf95-f451d078fc47}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/test/letest/letest.vcxproj b/icu4c/source/test/letest/letest.vcxproj
index 50c54ee..0a83aac 100644
--- a/icu4c/source/test/letest/letest.vcxproj
+++ b/icu4c/source/test/letest/letest.vcxproj
@@ -110,6 +110,8 @@
     <Link>
       <OutputFile>.\x86\Release/letest.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;iculx.lib;icutest.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/letest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -146,6 +148,8 @@
     <Link>
       <OutputFile>.\x86\Debug/letest.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;iculxd.lib;icutestd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/letest.pdb</ProgramDatabaseFile>
@@ -185,6 +189,8 @@
     <Link>
       <OutputFile>.\x64\Release/letest.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;iculx.lib;icutest.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/letest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -220,6 +226,8 @@
     <Link>
       <OutputFile>.\x64\Debug/letest.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;iculxd.lib;icutestd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/letest.pdb</ProgramDatabaseFile>
@@ -250,30 +258,10 @@
     <ClInclude Include="xmlreader.h" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\layoutex\layoutex.vcxproj">
-      <Project>{37fc2c7f-1904-4811-8955-2f478830ead1}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
     <ProjectReference Include="..\..\layout\layout.vcxproj">
       <Project>{c920062a-0647-4553-a3b2-37c58065664b}</Project>
       <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
     </ProjectReference>
-    <ProjectReference Include="..\..\tools\ctestfw\ctestfw.vcxproj">
-      <Project>{eca6b435-b4fa-4f9f-bf95-f451d078fc47}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\tools\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
diff --git a/icu4c/source/test/testdata/numberformattestspecification.txt b/icu4c/source/test/testdata/numberformattestspecification.txt
index 113473a..1f11f8d 100644
--- a/icu4c/source/test/testdata/numberformattestspecification.txt
+++ b/icu4c/source/test/testdata/numberformattestspecification.txt
@@ -13,7 +13,7 @@
 // https://docs.google.com/document/d/1T2P0p953_Lh1pRwo-5CuPVrHlIBa_wcXElG-Hhg_WHM/edit?usp=sharing
 
 test plus sign
-set locale ar
+set locale ar-EG
 set pattern +0;-#
 begin
 format	output	breaks
@@ -441,11 +441,10 @@
 en_US	0	123,456	123
 en_US	1	123.456	123.456
 en_US	0	123.456	123.456
-fr_FR	1	123,456	123.456
-fr_FR	0	123,456	123.456
-// JDK returns 123 here; not sure why.
-fr_FR	1	123.456	123456	K
-fr_FR	0	123.456	123
+it_IT	1	123,456	123.456
+it_IT	0	123,456	123.456
+it_IT	1	123.456	123456
+it_IT	0	123.456	123
 
 test no grouping in pattern with parsing
 set pattern 0
@@ -466,9 +465,8 @@
 1,2345,6789	4
 1,23,45,6789	4	K	2
 1,23,45,6789	4	K	2	2
-// Q only supports minGrouping<=2
 123,456789	6		6	3
-123456789	6	JKQ	6	4
+123456789	6	JK	6	4
 
 test multiplier setters
 set locale en_US
@@ -754,6 +752,7 @@
 +3.52EE4	3.52
 +1,234,567.8901	1234567.8901
 +1,23,4567.8901	1234567.8901
+// Fraction grouping is disabled by default
 +1,23,4567.89,01	1234567.89
 +1,23,456.78.9	123456.78
 +12.34,56	12.34
@@ -831,15 +830,14 @@
 // JDK does allow separators in the wrong place and parses as -5347.25
 (53,47.25)	fail	K
 // strict requires prefix or suffix, except in C
-65,347.25	fail	
+65,347.25	fail
 +3.52E4	35200
 (34.8E-3)	-0.0348
 (3425E-1)	-342.5
 // Strict doesn't allow separators in sci notation.
 (63,425)	-63425
-// JDK and S allow separators in sci notation and parses as -342.5
-// C passes
-(63,425E-1)	fail	CKS
+// J does not allow grouping separators in scientific notation.
+(63,425E-1)	-6342.5	J
 // Both prefix and suffix needed for strict.
 // JDK accepts this and parses as -342.5
 (3425E-1	fail	K
@@ -954,12 +952,12 @@
 begin
 parse	output	breaks
 // S is the only implementation that passes these cases.
-// C consumes the '9' as a digit and assumes number is negative
+// C and P consume the '9' as a digit and assumes number is negative
 // J and JDK bail
-6549K	654	CJK
-// C consumes the '9' as a digit and assumes number is negative
+6549K	654	CJKP
+// C and P consume the '9' as a digit and assumes number is negative
 // J and JDK bail
-6549N	-654	CJK
+6549N	-654	CJKP
 
 test really strange prefix
 set locale en
@@ -974,7 +972,7 @@
 set locale en
 set pattern '-'#y
 begin
-parse	output
+parse	output	breaks
 -45y	45
 
 test parse with locale symbols
@@ -1187,17 +1185,17 @@
 USD 53.45	53.45	USD	J
 53.45USD	53.45	USD	CJ
 USD53.45	53.45	USD
-// S fails these because '(' is an incomplete prefix.
-(7.92) USD	-7.92	USD	CJS
-(7.92) GBP	-7.92	GBP	CJS
-(7.926) USD	-7.926	USD	CJS
-(7.926 USD)	-7.926	USD	CJS
+// P fails these because '(' is an incomplete prefix.
+(7.92) USD	-7.92	USD	CJP
+(7.92) GBP	-7.92	GBP	CJP
+(7.926) USD	-7.926	USD	CJP
+(7.926 USD)	-7.926	USD	CJP
 (USD 7.926)	-7.926	USD	J
-USD (7.926)	-7.926	USD	CJS
-USD (7.92)	-7.92	USD	CJS
-(7.92)USD	-7.92	USD	CJS
-USD(7.92)	-7.92	USD	CJS
-(8) USD	-8	USD	CJS
+USD (7.926)	-7.926	USD	CJP
+USD (7.92)	-7.92	USD	CJP
+(7.92)USD	-7.92	USD	CJP
+USD(7.92)	-7.92	USD	CJP
+(8) USD	-8	USD	CJP
 -8 USD	-8	USD	C
 67 USD	67	USD	C
 53.45$	fail	USD
@@ -1223,37 +1221,38 @@
 set pattern \u00a4 0.00;\u00a4 -#
 set locale fa_IR
 begin
-parse	output	outputCurrency
+parse	output	outputCurrency	breaks
 \u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5	1235	IRR
 IRR \u06F1\u06F2\u06F3\u06F5	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR
+// P fails here because this currency name is in the Trie only, but it has the same prefix as the non-Trie currency
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR	P
 IRR 1235	1235	IRR
 \u0631\u06cc\u0627\u0644 1235	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR	P
 
 test parse foreign currency ISO
 set pattern \u00a4\u00a4 0.00;\u00a4\u00a4 -#
 set locale fa_IR
 begin
-parse	output	outputCurrency
+parse	output	outputCurrency	breaks
 \u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5	1235	IRR
 IRR \u06F1\u06F2\u06F3\u06F5	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR	P
 IRR 1235	1235	IRR
 \u0631\u06cc\u0627\u0644 1235	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR	P
 
 test parse foreign currency full
 set pattern \u00a4\u00a4\u00a4 0.00;\u00a4\u00a4\u00a4 -#
 set locale fa_IR
 begin
-parse	output	outputCurrency
+parse	output	outputCurrency	breaks
 \u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5	1235	IRR
 IRR \u06F1\u06F2\u06F3\u06F5	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR	P
 IRR 1235	1235	IRR
 \u0631\u06cc\u0627\u0644 1235	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR	P
 
 test parse currency with foreign symbols symbol english
 set pattern \u00a4 0.00;\u00a4 (#)
@@ -1288,16 +1287,17 @@
 test parse currency without currency mode
 // Should accept a symbol associated with the currency specified by the API,
 // but should not traverse the full currency data.
+// P always traverses full currency data.
 set locale en_US
 set pattern \u00a4#,##0.00
 begin
 parse	currency	output	breaks
 $52.41	USD	52.41
 USD52.41	USD	52.41	K
-\u20ac52.41	USD	fail
-EUR52.41	USD	fail
-$52.41	EUR	fail
-USD52.41	EUR	fail
+\u20ac52.41	USD	fail	P
+EUR52.41	USD	fail	P
+$52.41	EUR	fail	P
+USD52.41	EUR	fail	P
 \u20ac52.41	EUR	52.41	K
 EUR52.41	EUR	52.41
 
@@ -1307,11 +1307,11 @@
 set lenient 0
 begin
 parse	output	outputCurrency	breaks
-$53.45	53.45	USD
+$53.45	53.45	USD	P
 53.45 USD	53.45	USD
 USD 53.45	fail	USD
 53.45USD	fail	USD
-USD53.45	53.45	USD
+USD53.45	53.45	USD	P
 (7.92) USD	-7.92	USD
 (7.92) EUR	-7.92	EUR
 (7.926) USD	-7.926	USD
@@ -1329,9 +1329,9 @@
 53.45 US Dollars	53.45	USD
 US Dollar 53.45	fail	USD
 53.45 US Dollar	53.45	USD
-US Dollars53.45	53.45	USD
+US Dollars53.45	53.45	USD	P
 53.45US Dollars	fail	USD
-US Dollar53.45	53.45	USD
+US Dollar53.45	53.45	USD	P
 US Dollat53.45	fail	USD
 53.45US Dollar	fail	USD
 US Dollars (53.45)	fail	USD
@@ -1376,13 +1376,15 @@
 set locale en
 set pattern #
 begin
-parse	output	breaks
--123	-123
-- 123	-123	JK
- -123	-123	JK
- - 123	-123	JK
-123-	-123	CJKS
-123 -	-123	CJKS
+pattern	parse	output	breaks
+#	-123	-123
+#	- 123	-123	JK
+#	 -123	-123	JK
+#	 - 123	-123	JK
+#	123-	123
+#	123 -	123
+#;#-	123-	-123
+#;#-	123 -	-123	JK
 
 test parse case sensitive
 set locale en
@@ -1423,8 +1425,8 @@
 1E2147483646	1E2147483646
 1E-2147483649	0
 1E-2147483648	0
-// S returns zero here
-1E-2147483647	1E-2147483647	S
+// P returns zero here
+1E-2147483647	1E-2147483647	P
 1E-2147483646	1E-2147483646
 
 test format push limits
@@ -1439,7 +1441,7 @@
 100	9999999999999.9950000000001	9999999999999.9950000000001	C
 2	9999999999999.9950000000001	10000000000000.00	C
 2	9999999.99499999	9999999.99
-// K doesn't support halfDowm rounding mode?
+// K doesn't support halfDown rounding mode?
 2	9999999.995	9999999.99	K
 2	9999999.99500001	10000000.00
 100	56565656565656565656565656565656565656565656565656565656565656	56565656565656565656565656565656565656565656565656565656565656.00	C
@@ -1453,8 +1455,8 @@
 set pattern #,##0
 begin
 parse	output	breaks
-// K and J return null; S and C return 99
- 9 9	9	CJKS
+// K and J return null; S, C, and P return 99
+ 9 9	9	CJKP
 // K returns null
  9 999	9999	K
 
@@ -1497,7 +1499,7 @@
 56i j‎k 	-56	CJK
 56‎i jk 	-56	CJK
 // S and C get 56 (accepts ' ' gs grouping); J and K get null
-5 6	fail	CS
+5 6	fail	CP
 5‎6	5	JK
 
 test parse spaces in grouping
@@ -1507,9 +1509,9 @@
 set pattern #,##0
 begin
 parse	output	breaks
-// C, J and S get "12" here
-1 2	1	CJS
-1 23	1	CJS
+// C, J, S, and P get "12" here
+1 2	1	CJP
+1 23	1	CJP
 // K gets 1 here; doesn't pick up the grouping separator
 1 234	1234	K
 
@@ -1543,7 +1545,8 @@
 parse	output	breaks
 55%	0.55
 // J and K get null
-55	0.55	JK
+// P requires the symbol to be present and gets 55
+55	0.55	JKP
 
 test trailing grouping separators in pattern
 // This test is for #13115
@@ -1573,6 +1576,34 @@
 parse	output	breaks
 9223372036854775807%	92233720368547758.07
 
+test sign always shown
+set locale en
+set pattern 0
+set signAlwaysShown 1
+begin
+format	output	breaks
+// C, J and K do not support this feature
+42	+42	CJK
+0	+0	CJK
+-42	-42
+
+test parse strict with plus sign
+set locale en
+set pattern 0
+set signAlwaysShown 1
+begin
+lenient	parse	output	breaks
+1	42	42
+1	-42	-42
+1	+42	42	CJK
+1	0	0
+1	+0	0	CJK
+0	42	fail	CJK
+0	-42	-42
+0	+42	42	CJK
+0	0	fail	CJK
+0	+0	0	CJK
+
 
 
 
diff --git a/icu4c/source/test/testdata/rbbitst.txt b/icu4c/source/test/testdata/rbbitst.txt
index 1450a98..761b3e0 100644
--- a/icu4c/source/test/testdata/rbbitst.txt
+++ b/icu4c/source/test/testdata/rbbitst.txt
@@ -38,19 +38,8 @@
 
 
 #   Temp debugging tests
-<locale en>
-<word>
-<data><0>コンピューター<400>は<400>、<0>本質<400>的<400>に<400>は<400>数字<400>しか<400>扱う<400>こと<400>が<400>でき<400>ま<400>せん<400>。<0>\
-コンピューター<400>は<400>、<0>文字<400>や<400>記号<400>など<400>の<400>それぞれに<400>番号<400>を<400>割り振る<400>こと<400>によって<400>扱える<400>\
-よう<400>にし<400>ます<400>。<0>ユニ<400>コード<400>が<400>出来る<400>まで<400>は<400>、<0>これらの<400>番号<400>を<400>割り振る<400>仕組み<400>が<400>\
-何<400>百<400>種類<400>も<400>存在<400>しま<400>した<400>。<0>どの<400>一つ<400>を<400>とっても<400>、<0>十分<400>な<400>文字<400>を<400>含<400>\
-んで<400>は<400>いま<400>せん<400>で<400>した<400>。<0>例えば<400>、<0>欧州<400>連合<400>一つ<400>を<400>見<400>て<400>も<400>、<0>その<400>\
-すべて<400>の<400>言語<400>を<400>カバー<400>する<400>ため<400>に<400>は<400>、<0>いくつか<400>の<400>異なる<400>符号<400>化<400>の<400>仕組み<400>\
-が<400>必要<400>で<400>した<400>。<0>英語<400>の<400>よう<400>な<400>一つ<400>の<400>言語<400>に<400>限<400>って<400>も<400>、<0>一つ<400>だけ<400>\
-の<400>符号<400>化<400>の<400>仕組み<400>では<400>、<0>一般<400>的<400>に<400>使<400>われる<400>すべて<400>の<400>文字<400>、<0>句読点<400>、<0>\
-。<0></data>
+#
 
-#<data><0>コンピューター<400>は<400>、<0>本質<400>的<400>に<400>は<400>数字<400>しか<400>扱う<400>こと<400>が<400>でき<400>ま<400>せん<400>。<0>\
 
 ## FILTERED BREAK TESTS
 
@@ -330,6 +319,15 @@
 <data>•\U00011700<200>ロ<400>から<400>売却<400>完了<400>時<400>の<400>時価<400>が<400>提示<400>さ<400>れ<400>て<400>いる<400></data>
 
 #
+# Ticket #13549
+#   CjiBreakEngine::divideUpDictionaryRange: assertion failure.
+#
+<locale en>
+<word>
+<data>•\U00020029<400>\u3300<400>\U0002C400<400></data>
+<data>•\uFAD7<400>\u331B<400>\u87DF<400>\u006D<200>\uFFFD•</data>
+
+#
 # What Is Unicode in Japanese
 # From http://unicode.org/standard/translations/japanese.html
 
diff --git a/icu4c/source/test/testdata/root.txt b/icu4c/source/test/testdata/root.txt
index d619b63..8ba0f07 100644
--- a/icu4c/source/test/testdata/root.txt
+++ b/icu4c/source/test/testdata/root.txt
@@ -13,8 +13,8 @@
 root
 {
     Version { 44.0 }
-    ExpectCLDRVersionAtLeast { 32.0 } // 'base' cldr version. Allow up to version =.=.* of this
-    CurrentCLDRVersion { 32.0 } // Current CLDR version as of the test update. Warn if not an exact match.
+    ExpectCLDRVersionAtLeast { 33.0 } // 'base' cldr version. Allow up to version =.=.* of this
+    CurrentCLDRVersion { 33.0 } // Current CLDR version as of the test update. Warn if not an exact match.
 
     ShortLanguage { xxx }
 
diff --git a/icu4c/source/test/testdata/structLocale.txt b/icu4c/source/test/testdata/structLocale.txt
index bd3d2b9..983a744 100644
--- a/icu4c/source/test/testdata/structLocale.txt
+++ b/icu4c/source/test/testdata/structLocale.txt
@@ -4134,6 +4134,10 @@
             2,
             2,
         }
+        typographicNames:intvector{
+            2,
+            2,
+        }
         unit-pattern:intvector{
             2,
             2,
@@ -8349,6 +8353,7 @@
             }
         }
         default{""}
+        default_latn{""}
         deva{
             miscPatterns{
                 atLeast{""}
diff --git a/icu4c/source/tools/ctestfw/ctestfw.vcxproj b/icu4c/source/tools/ctestfw/ctestfw.vcxproj
index 444860f..de4818c 100644
--- a/icu4c/source/tools/ctestfw/ctestfw.vcxproj
+++ b/icu4c/source/tools/ctestfw/ctestfw.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{ECA6B435-B4FA-4F9F-BF95-F451D078FC47}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,6 +47,15 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -92,31 +66,19 @@
     </Midl>
     <ClCompile>
       <WholeProgramOptimization>true</WholeProgramOptimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/icutest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\..\bin\icutest60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\..\bin\icutest61.dll</OutputFile>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\..\lib\icutest.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
@@ -126,39 +88,22 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\..\lib\icutestd.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/icutest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\..\bin\icutest60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\..\bin\icutest61d.dll</OutputFile>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\..\..\..\lib\icutestd.pdb</ProgramDatabaseFile>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -169,83 +114,48 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\..\lib64\icutest.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <WholeProgramOptimization>true</WholeProgramOptimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/icutest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\..\bin64\icutest60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\..\bin64\icutest61.dll</OutputFile>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\..\lib64\icutest.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
       <ImportLibrary>.\..\..\..\lib64\icutest.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\..\lib64\icutestd.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/icutest.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\..\bin64\icutest60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\..\bin64\icutest61d.dll</OutputFile>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\..\..\..\lib64\icutestd.pdb</ProgramDatabaseFile>
       <ImportLibrary>.\..\..\..\lib64\icutestd.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -274,17 +184,7 @@
     <ClInclude Include="unicode\uperf.h" />
     <ClInclude Include="unicode\utimer.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/escapesrc/escapesrc.cpp b/icu4c/source/tools/escapesrc/escapesrc.cpp
index 5e96484..c90dafa 100644
--- a/icu4c/source/tools/escapesrc/escapesrc.cpp
+++ b/icu4c/source/tools/escapesrc/escapesrc.cpp
@@ -4,39 +4,71 @@
 #include <stdio.h>
 #include <string>
 #include <stdlib.h>
-#include <unistd.h>
 #include <errno.h>
 #include <string.h>
 #include <iostream>
 #include <fstream>
 
-// with caution:
+// We only use U8_* macros, which are entirely inline.
 #include "unicode/utf8.h"
 
+// This contains a codepage and ISO 14882:1998 illegality table.
+// Use "make gen-table" to rebuild it.
+#include "cptbl.h"
+
+/**
+ * What is this?
+ *
+ * "This" is a preprocessor that makes an attempt to convert fully valid C++11 source code
+ * in utf-8 into something consumable by certain compilers (Solaris, xlC)
+ * which aren't quite standards compliant.
+ *
+ * - u"<unicode>" or u'<unicode>' gets converted to u"\uNNNN" or u'\uNNNN'
+ * - u8"<unicode>" gets converted to "\xAA\xBB\xCC\xDD" etc.
+ *   (some compilers do not support the u8 prefix correctly.)
+ * - if the system is EBCDIC-based, that is used to correct the input characters.
+ *
+ * Usage:
+ *   escapesrc infile.cpp outfile.cpp
+ * Normally this is invoked by the build stage, with a rule such as:
+ *
+ * _%.cpp: $(srcdir)/%.cpp
+ *       @$(BINDIR)/escapesrc$(EXEEXT) $< $@
+ * %.o: _%.cpp
+ *       $(COMPILE.cc) ... $@ $<
+ *
+ * In the Makefiles, SKIP_ESCAPING=YES is used to prevent escapesrc.cpp 
+ * from being itself escaped.
+ */
+
+
 static const char
   kSPACE   = 0x20,
   kTAB     = 0x09,
   kLF      = 0x0A,
   kCR      = 0x0D;
-  // kHASH    = 0x23,
-  // kSLASH   = 0x2f,
-  // kSTAR    = 0x2A,
 
-# include "cptbl.h"
-
+// For convenience
 # define cp1047_to_8859(c) cp1047_8859_1[c]
 
+// Our app's name
 std::string prog;
 
+/**
+ * Give the usual 1-line documentation and exit
+ */
 void usage() {
   fprintf(stderr, "%s: usage: %s infile.cpp outfile.cpp\n", prog.c_str(), prog.c_str());
 }
 
-
+/**
+ * Delete the output file (if any)
+ * We want to delete even if we didn't generate, because it might be stale.
+ */
 int cleanup(const std::string &outfile) {
   const char *outstr = outfile.c_str();
   if(outstr && *outstr) {
-    int rc = unlink(outstr);
+    int rc = std::remove(outstr);
     if(rc == 0) {
       fprintf(stderr, "%s: deleted %s\n", prog.c_str(), outstr);
       return 0;
@@ -44,7 +76,7 @@
       if( errno == ENOENT ) {
         return 0; // File did not exist - no error.
       } else {
-        perror("unlink");
+        perror("std::remove");
         return 1;
       }
     }
@@ -52,16 +84,12 @@
   return 0;
 }
 
-// inline bool hasNonAscii(const char *line, size_t len) {
-//   const unsigned char *uline = reinterpret_cast<const unsigned char*>(line);
-//   for(size_t i=0;i<len; i++) {
-//     if( uline[i] > 0x7F) {
-//       return true;
-//     }
-//   }
-//   return false;
-// }
-
+/**
+ * Skip across any known whitespace.
+ * @param p startpoint
+ * @param e limit
+ * @return first non-whitespace char
+ */
 inline const char *skipws(const char *p, const char *e) {
   for(;p<e;p++) {
     switch(*p) {
@@ -77,30 +105,11 @@
   return p;
 }
 
-// inline bool isCommentOrEmpty(const char* line, size_t len) {
-//   const char *p = line;
-//   const char *e = line+len;
-//   p = skipws(p,e);
-//   if(p==e) {
-//     return true; // whitespace only
-//   }
-//   p++;
-//   switch(*p) {
-//   case kHASH: return true; // #directive
-//   case kSLASH:
-//     p++;
-//     if(p==e) return false; // single slash
-//     switch(*p) {
-//     case kSLASH: // '/ /'
-//     case kSTAR: // '/ *'
-//       return true; // start of comment
-//     default: return false; // something else
-//     }
-//   default: return false; // something else
-//   }
-//   /*NOTREACHED*/
-// }
-
+/**
+ * Append a byte, hex encoded
+ * @param outstr sstring to append to
+ * @param byte the byte to append
+ */
 void appendByte(std::string &outstr,
                 uint8_t byte) {
     char tmp2[5];
@@ -109,6 +118,11 @@
 }
 
 /**
+ * Append the bytes from 'linestr' into outstr, with escaping
+ * @param outstr the output buffer
+ * @param linestr the input buffer
+ * @param pos in/out: the current char under consideration
+ * @param chars the number of chars to consider
  * @return true on failure
  */
 bool appendUtf8(std::string &outstr,
@@ -141,6 +155,7 @@
 }
 
 /**
+ * Fixup u8"x"
  * @param linestr string to mutate. Already escaped into \u format.
  * @param origpos beginning, points to 'u8"'
  * @param pos end, points to "
@@ -184,9 +199,11 @@
 }
 
 /**
- * fix the string at the position
- * false = no err
- * true = had err
+ * fix the u"x"/u'x'/u8"x" string at the position
+ * u8'x' is not supported, sorry.
+ * @param linestr the input string
+ * @param pos the position
+ * @return false = no err, true = had err
  */
 bool fixAt(std::string &linestr, size_t pos) {
   size_t origpos = pos;
@@ -292,8 +309,12 @@
 }
 
 /**
+ * Fixup an entire line
  * false = no err
  * true = had err
+ * @param no the line number (not used)
+ * @param linestr the string to fix
+ * @return true if any err, else false
  */
 bool fixLine(int /*no*/, std::string &linestr) {
   const char *line = linestr.c_str();
@@ -304,17 +325,6 @@
     return false; // Nothing to do. No u' or u" detected
   }
 
-  // lines such as u8"\u0308" are all ASCII.
-  // // Quick Check: all ascii?
-  // if(!hasNonAscii(line, len)) {
-  //   return false; // ASCII
-  // }
-
-  // // comment or empty line?
-  // if(isCommentOrEmpty(line, len)) {
-  //   return false; // Comment or just empty
-  // }
-
   // start from the end and find all u" cases
   size_t pos = len = linestr.size();
   while((pos>0) && (pos = linestr.rfind("u\"", pos)) != std::string::npos) {
@@ -345,6 +355,12 @@
   return false;
 }
 
+/**
+ * Convert a whole file
+ * @param infile
+ * @param outfile
+ * @return 1 on err, 0 otherwise
+ */
 int convert(const std::string &infile, const std::string &outfile) {
   fprintf(stderr, "escapesrc: %s -> %s\n", infile.c_str(), outfile.c_str());
 
@@ -386,6 +402,9 @@
   return 0;
 }
 
+/**
+ * Main function
+ */
 int main(int argc, const char *argv[]) {
   prog = argv[0];
 
@@ -399,6 +418,3 @@
 
   return convert(infile, outfile);
 }
-
-
-#include "utf_impl.cpp"
diff --git a/icu4c/source/tools/genbrk/genbrk.vcxproj b/icu4c/source/tools/genbrk/genbrk.vcxproj
index e7953e9..b8aa0ab 100644
--- a/icu4c/source/tools/genbrk/genbrk.vcxproj
+++ b/icu4c/source/tools/genbrk/genbrk.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{C2BE5000-7501-4E87-9724-B8D82494FAE6}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -93,7 +58,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -106,6 +71,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -114,6 +81,8 @@
     <Link>
       <OutputFile>.\x86\Release/genbrk.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/genbrk.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -133,7 +102,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -148,6 +117,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -156,6 +127,8 @@
     <Link>
       <OutputFile>.\x86\Debug/genbrk.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/genbrk.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -176,7 +149,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -189,6 +162,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -197,6 +172,8 @@
     <Link>
       <OutputFile>.\x64\Release/genbrk.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/genbrk.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -215,7 +192,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -230,6 +207,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -238,6 +217,8 @@
     <Link>
       <OutputFile>.\x64\Debug/genbrk.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/genbrk.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -247,17 +228,7 @@
   <ItemGroup>
     <ClCompile Include="genbrk.cpp" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/genccode/genccode.vcxproj b/icu4c/source/tools/genccode/genccode.vcxproj
index c835f32..e7dc0e5 100644
--- a/icu4c/source/tools/genccode/genccode.vcxproj
+++ b/icu4c/source/tools/genccode/genccode.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{FDD3C4F2-9805-44EB-9A77-BC1C1C95B547}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -93,7 +58,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -105,6 +70,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -113,6 +80,8 @@
     <Link>
       <OutputFile>.\x86\Release/genccode.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/genccode.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -132,7 +101,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -146,6 +115,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -154,6 +125,8 @@
     <Link>
       <OutputFile>.\x86\Debug/genccode.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/genccode.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -174,7 +147,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -186,6 +159,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -194,6 +169,8 @@
     <Link>
       <OutputFile>.\x64\Release/genccode.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/genccode.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -212,7 +189,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -226,6 +203,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -234,6 +213,8 @@
     <Link>
       <OutputFile>.\x64\Debug/genccode.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/genccode.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -243,17 +224,7 @@
   <ItemGroup>
     <ClCompile Include="genccode.c" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/gencfu/gencfu.vcxproj b/icu4c/source/tools/gencfu/gencfu.vcxproj
index 50ee280..fbae8f5 100644
--- a/icu4c/source/tools/gencfu/gencfu.vcxproj
+++ b/icu4c/source/tools/gencfu/gencfu.vcxproj
@@ -1,51 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{691EE0C0-DC57-4A48-8AEE-8ED75EB3A057}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
     <Keyword>Win32Proj</Keyword>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -90,7 +56,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -105,10 +71,14 @@
       <WarningLevel>Level3</WarningLevel>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <Link>
       <OutputFile>.\x86\Debug\gencfu.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Console</SubSystem>
     </Link>
@@ -120,7 +90,7 @@
     </CustomBuildStep>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <MinimalRebuild>false</MinimalRebuild>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -135,10 +105,15 @@
       <WarningLevel>Level3</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <Link>
       <OutputFile>.\x86\Release\gencfu.exe</OutputFile>
       <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>
@@ -156,7 +131,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -169,6 +144,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -177,6 +154,8 @@
     <Link>
       <OutputFile>.\x64\Release/gencfu.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/gencfu.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -194,7 +173,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -209,6 +188,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -217,6 +198,8 @@
     <Link>
       <OutputFile>.\x64\Debug/gencfu.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/gencfu.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -226,21 +209,7 @@
   <ItemGroup>
     <ClCompile Include="gencfu.cpp" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/gencmn/gencmn.vcxproj b/icu4c/source/tools/gencmn/gencmn.vcxproj
index 54dfbf8..87aeef3 100644
--- a/icu4c/source/tools/gencmn/gencmn.vcxproj
+++ b/icu4c/source/tools/gencmn/gencmn.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{A8D36F8D-09E6-4174-91C3-7BEAA9C3F04F}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -93,7 +58,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -106,6 +71,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -114,6 +81,8 @@
     <Link>
       <OutputFile>.\x86\Release/gencmn.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/gencmn.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -133,7 +102,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -148,6 +117,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -156,6 +127,8 @@
     <Link>
       <OutputFile>.\x86\Debug/gencmn.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/gencmn.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -176,7 +149,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -189,6 +162,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -197,6 +172,8 @@
     <Link>
       <OutputFile>.\x64\Release/gencmn.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/gencmn.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -215,7 +192,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -230,6 +207,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -238,6 +217,8 @@
     <Link>
       <OutputFile>.\x64\Debug/gencmn.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/gencmn.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -247,17 +228,7 @@
   <ItemGroup>
     <ClCompile Include="gencmn.c" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/gencnval/gencnval.vcxproj b/icu4c/source/tools/gencnval/gencnval.vcxproj
index d29c61f..d2becad 100644
--- a/icu4c/source/tools/gencnval/gencnval.vcxproj
+++ b/icu4c/source/tools/gencnval/gencnval.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{8B41752B-5A52-41E4-B7E0-07921C0CC6BF}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -93,7 +58,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -106,6 +71,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -114,6 +81,8 @@
     <Link>
       <OutputFile>.\x86\Release/gencnval.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/gencnval.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -133,7 +102,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -148,6 +117,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -156,6 +127,8 @@
     <Link>
       <OutputFile>.\x86\Debug/gencnval.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/gencnval.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -176,7 +149,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -189,6 +162,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -197,6 +172,8 @@
     <Link>
       <OutputFile>.\x64\Release/gencnval.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/gencnval.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -215,7 +192,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -230,6 +207,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -238,6 +217,8 @@
     <Link>
       <OutputFile>.\x64\Debug/gencnval.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/gencnval.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -247,17 +228,7 @@
   <ItemGroup>
     <ClCompile Include="gencnval.c" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/gendict/gendict.vcxproj b/icu4c/source/tools/gendict/gendict.vcxproj
index 7984a31..a419abb 100644
--- a/icu4c/source/tools/gendict/gendict.vcxproj
+++ b/icu4c/source/tools/gendict/gendict.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{9D4211F7-2C77-439C-82F0-30A4E43BA569}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -93,7 +58,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -106,6 +71,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -114,6 +81,8 @@
     <Link>
       <OutputFile>.\x86\Release/gendict.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/gendict.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -133,7 +102,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -148,6 +117,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -156,6 +127,8 @@
     <Link>
       <OutputFile>.\x86\Debug/gendict.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/gendict.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -176,7 +149,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -189,6 +162,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -197,6 +172,8 @@
     <Link>
       <OutputFile>.\x64\Release/gendict.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/gendict.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -215,7 +192,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -230,6 +207,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -238,6 +217,8 @@
     <Link>
       <OutputFile>.\x64\Debug/gendict.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/gendict.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -247,17 +228,7 @@
   <ItemGroup>
     <ClCompile Include="gendict.cpp" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/gennorm2/gennorm2.vcxproj b/icu4c/source/tools/gennorm2/gennorm2.vcxproj
index 9feb10e..ec408e2 100644
--- a/icu4c/source/tools/gennorm2/gennorm2.vcxproj
+++ b/icu4c/source/tools/gennorm2/gennorm2.vcxproj
@@ -1,51 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{C7891A65-80AB-4245-912E-5F1E17B0E6C4}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
     <RootNamespace>gennorm2</RootNamespace>
     <Keyword>Win32Proj</Keyword>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>Unicode</CharacterSet>
+  <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
     <WholeProgramOptimization>true</WholeProgramOptimization>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <CharacterSet>Unicode</CharacterSet>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -78,6 +47,14 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+    <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <CustomBuildStep>
       <Command>copy "$(TargetPath)" ..\..\..\bin
@@ -85,31 +62,22 @@
       <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Optimization>MaxSpeed</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release\gennorm2.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release\</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release\</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release\</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Release\gennorm2.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release\gennorm2.pdb</ProgramDatabaseFile>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Console</SubSystem>
@@ -127,38 +95,23 @@
       <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug\gennorm2.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug\</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug\</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug\</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Debug\gennorm2.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug\gennorm2.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>false</DataExecutionPrevention>
     </Link>
@@ -170,37 +123,25 @@
       <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Optimization>MaxSpeed</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release\gennorm2.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release\</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release\</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release\</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Release\gennorm2.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release\gennorm2.pdb</ProgramDatabaseFile>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Console</SubSystem>
       <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <TargetMachine>MachineX64</TargetMachine>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>false</DataExecutionPrevention>
     </Link>
@@ -212,38 +153,24 @@
       <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug\gennorm2.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug\</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug\</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug\</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Debug\gennorm2.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug\gennorm2.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
       <DataExecutionPrevention>false</DataExecutionPrevention>
     </Link>
@@ -259,17 +186,7 @@
     <ClInclude Include="n2builder.h" />
     <ClInclude Include="norms.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/genrb/derb.vcxproj b/icu4c/source/tools/genrb/derb.vcxproj
index bf8fb1b..d76c3d2 100644
--- a/icu4c/source/tools/genrb/derb.vcxproj
+++ b/icu4c/source/tools/genrb/derb.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{D3065ADB-8820-4CC7-9B6C-9510833961A3}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -97,7 +62,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\i18n;..\..\common;..\toolutil;..\..\io;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -110,6 +75,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -118,6 +85,8 @@
     <Link>
       <OutputFile>.\x86\Release_derb/derb.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release_derb/derb.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -141,7 +110,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\i18n;..\..\common;..\toolutil;..\..\io;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -155,6 +124,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -163,6 +134,8 @@
     <Link>
       <OutputFile>.\x86\Debug_derb/derb.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug_derb/derb.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -186,7 +159,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\i18n;..\..\common;..\toolutil;..\..\io;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -199,6 +172,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -207,6 +182,8 @@
     <Link>
       <OutputFile>.\x64\Release_derb/derb.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icuio.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release_derb/derb.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -228,7 +205,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\i18n;..\..\common;..\toolutil;..\..\io;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -242,6 +219,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -250,6 +229,8 @@
     <Link>
       <OutputFile>.\x64\Debug_derb/derb.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icuiod.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug_derb/derb.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -259,28 +240,7 @@
   <ItemGroup>
     <ClCompile Include="derb.cpp" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-    </ProjectReference>
-    <ProjectReference Include="..\..\io\io.vcxproj">
-      <Project>{c2b04507-2521-4801-bf0d-5fd79d6d518c}</Project>
-      <Private>true</Private>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-      <CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
-      <LinkLibraryDependencies>true</LinkLibraryDependencies>
-      <UseLibraryDependencyInputs>false</UseLibraryDependencyInputs>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/genrb/genrb.vcxproj b/icu4c/source/tools/genrb/genrb.vcxproj
index 0b2d62c..13c8aa8 100644
--- a/icu4c/source/tools/genrb/genrb.vcxproj
+++ b/icu4c/source/tools/genrb/genrb.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{97521D06-EC47-45D4-8BD0-9E16B3F93B2A}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,6 +47,12 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <CustomBuildStep>
       <Command>copy "$(TargetPath)" ..\..\..\bin
@@ -93,7 +64,6 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <DisableLanguageExtensions>true</DisableLanguageExtensions>
@@ -105,6 +75,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -113,6 +85,8 @@
     <Link>
       <OutputFile>.\x86\Release/genrb.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/genrb.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -132,7 +106,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -147,6 +120,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -155,6 +130,8 @@
     <Link>
       <OutputFile>.\x86\Debug/genrb.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/genrb.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -175,7 +152,6 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <DisableLanguageExtensions>true</DisableLanguageExtensions>
@@ -187,6 +163,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -195,6 +173,8 @@
     <Link>
       <OutputFile>.\x64\Release/genrb.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/genrb.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -213,7 +193,6 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -228,6 +207,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -236,6 +217,8 @@
     <Link>
       <OutputFile>.\x64\Debug/genrb.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/genrb.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -276,21 +259,7 @@
     <ClInclude Include="rle.h" />
     <ClInclude Include="ustr.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/gensprep/gensprep.vcxproj b/icu4c/source/tools/gensprep/gensprep.vcxproj
index 4e56344..3dde2db 100644
--- a/icu4c/source/tools/gensprep/gensprep.vcxproj
+++ b/icu4c/source/tools/gensprep/gensprep.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{631C23CE-6C1D-4875-88F0-85E0A42B36EA}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -93,7 +58,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -106,6 +71,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -114,6 +81,8 @@
     <Link>
       <OutputFile>.\x86\Release/gensprep.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/gensprep.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -133,7 +102,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -147,6 +116,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -155,6 +126,8 @@
     <Link>
       <OutputFile>.\x86\Debug/gensprep.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/gensprep.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -175,7 +148,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -188,6 +161,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -196,6 +171,8 @@
     <Link>
       <OutputFile>.\x64\Release/gensprep.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/gensprep.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -214,7 +191,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -228,6 +205,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -236,6 +215,8 @@
     <Link>
       <OutputFile>.\x64\Debug/gensprep.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/gensprep.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -249,17 +230,7 @@
   <ItemGroup>
     <ClInclude Include="gensprep.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/gentest/gentest.vcxproj b/icu4c/source/tools/gentest/gentest.vcxproj
index 078fc79..4104b48 100644
--- a/icu4c/source/tools/gentest/gentest.vcxproj
+++ b/icu4c/source/tools/gentest/gentest.vcxproj
@@ -1,52 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{77C78066-746F-4EA6-B3FE-B8C8A4A97891}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
     <RootNamespace>gentest</RootNamespace>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -89,7 +54,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -102,6 +67,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -110,6 +77,8 @@
     <Link>
       <OutputFile>.\x86\Release/gentest.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutest.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/gentest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -124,7 +93,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -139,6 +108,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -147,6 +118,8 @@
     <Link>
       <OutputFile>.\x86\Debug/gentest.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutestd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/gentest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -162,7 +135,7 @@
     </Midl>
     <ClCompile>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -175,6 +148,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -183,6 +158,8 @@
     <Link>
       <OutputFile>.\x64\Release/gentest.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutest.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/gentest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX64</TargetMachine>
@@ -196,7 +173,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -211,6 +188,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -219,6 +198,8 @@
     <Link>
       <OutputFile>.\x64\Debug/gentest.exe</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutestd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x64\Debug/gentest.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -232,21 +213,7 @@
   <ItemGroup>
     <ClInclude Include="gentest.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\ctestfw\ctestfw.vcxproj">
-      <Project>{eca6b435-b4fa-4f9f-bf95-f451d078fc47}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/icu-svnprops-check.py b/icu4c/source/tools/icu-svnprops-check.py
index 080b9fe..b0e86b3 100755
--- a/icu4c/source/tools/icu-svnprops-check.py
+++ b/icu4c/source/tools/icu-svnprops-check.py
@@ -75,6 +75,11 @@
             # unescape any ";;" in a property value, e.g. the mime-type from
             #    *.java = svn:eol-style=native;svn:mime-type=text/plain;;charset=utf-8
             prop_val = prop_val.replace(";;", ";");
+            # If the prop value "is quoted", remove the quotes.
+            # See svn:keywords for an example of a quoted prop value.
+            match = re.match('^"(.+)"$', prop_val)
+            if match:
+                prop_val = match.group(1)
             proplist.append((prop_name, prop_val))
 
         file_types.append((file_type, proplist))
diff --git a/icu4c/source/tools/icuinfo/icuinfo.vcxproj b/icu4c/source/tools/icuinfo/icuinfo.vcxproj
index 964ee94..ba33286 100644
--- a/icu4c/source/tools/icuinfo/icuinfo.vcxproj
+++ b/icu4c/source/tools/icuinfo/icuinfo.vcxproj
@@ -1,53 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{E7611F49-F088-4175-9446-6111444E72C8}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-    <RootNamespace>icuinfo</RootNamespace>
-    <Keyword>Win32Proj</Keyword>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -84,6 +47,14 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>
+      <WarningLevel>Level4</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <CustomBuildStep>
       <Command>copy "$(TargetPath)" ..\..\..\bin
@@ -91,27 +62,18 @@
       <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>x86\Release/icuinfo.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>x86\Release/</AssemblerListingLocation>
       <ObjectFileName>x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level4</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ResourceCompile>
     <Link>
       <OutputFile>$(OutDir)icuinfo.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>x86\Release/icuinfo.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -126,31 +88,19 @@
       <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>Debug/icuinfo.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>Debug/</AssemblerListingLocation>
       <ObjectFileName>Debug/</ObjectFileName>
       <ProgramDataBaseFileName>Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level4</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ResourceCompile>
     <Link>
       <OutputFile>$(OutDir)icuinfo.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>$(OutDir)icuinfo.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -164,34 +114,21 @@
 </Command>
       <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
-    <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-    </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>x64\Release/icuinfo.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>x64\Release/</AssemblerListingLocation>
       <ObjectFileName>x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level4</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ResourceCompile>
     <Link>
       <OutputFile>$(OutDir)icuinfo.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;icutu.lib;icutest.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>x64\Release/icuinfo.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -200,38 +137,22 @@
 </Command>
       <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
-    <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-    </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\common;..\..\i18n;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>Debug/icuinfo.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>Debug/</AssemblerListingLocation>
       <ObjectFileName>Debug/</ObjectFileName>
       <ProgramDataBaseFileName>Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level4</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ResourceCompile>
     <Link>
       <OutputFile>$(OutDir)icuinfo.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;icutud.lib;icutestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>$(OutDir)icuinfo.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -240,25 +161,7 @@
   <ItemGroup>
     <None Include="icuplugins_windows_sample.txt" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\ctestfw\ctestfw.vcxproj">
-      <Project>{eca6b435-b4fa-4f9f-bf95-f451d078fc47}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/icuinfo/testplug.vcxproj b/icu4c/source/tools/icuinfo/testplug.vcxproj
index 39cfcd2..058c495 100644
--- a/icu4c/source/tools/icuinfo/testplug.vcxproj
+++ b/icu4c/source/tools/icuinfo/testplug.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{659D0C08-D4ED-4BF3-B02B-2D8D4B5A7A7A}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -93,7 +58,7 @@
     <ClCompile>
       <WholeProgramOptimization>true</WholeProgramOptimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -106,6 +71,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -114,6 +81,8 @@
     <Link>
       <OutputFile>..\..\..\bin\testplug.dll</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\..\lib\testplug.pdb</ProgramDatabaseFile>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
@@ -134,7 +103,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -149,6 +118,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -157,6 +128,8 @@
     <Link>
       <OutputFile>..\..\..\bin\testplug.dll</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\..\..\..\lib\testplugd.pdb</ProgramDatabaseFile>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -176,7 +149,7 @@
     <ClCompile>
       <WholeProgramOptimization>true</WholeProgramOptimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -189,6 +162,8 @@
       <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -197,6 +172,8 @@
     <Link>
       <OutputFile>..\..\..\bin64\testplug.dll</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\..\lib64\testplug.pdb</ProgramDatabaseFile>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
@@ -215,7 +192,7 @@
     <ClCompile>
       <Optimization>Disabled</Optimization>
       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;..\ctestfw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WINVER=0x0601;_WIN32_WINNT=0x0601;WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;T_CTEST_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <BufferSecurityCheck>true</BufferSecurityCheck>
@@ -230,6 +207,8 @@
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -238,6 +217,8 @@
     <Link>
       <OutputFile>..\..\..\bin64\testplug.dll</OutputFile>
       <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\..\..\..\lib64\testplugd.pdb</ProgramDatabaseFile>
       <ImportLibrary>.\..\..\..\lib64\testplugd.lib</ImportLibrary>
@@ -247,17 +228,7 @@
   <ItemGroup>
     <ClCompile Include="testplug.c" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/icupkg/icupkg.vcxproj b/icu4c/source/tools/icupkg/icupkg.vcxproj
index 6e0e998..f75d40a 100644
--- a/icu4c/source/tools/icupkg/icupkg.vcxproj
+++ b/icu4c/source/tools/icupkg/icupkg.vcxproj
@@ -1,52 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{62D4B15D-7A90-4ECB-BA19-5E021D6A21BC}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
     <Keyword>Win32Proj</Keyword>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -83,6 +48,14 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>
+      <WarningLevel>Level4</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <CustomBuildStep>
       <Command>copy "$(TargetPath)" ..\..\..\bin
@@ -90,27 +63,18 @@
       <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>x86\Release/icupkg.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>x86\Release/</AssemblerListingLocation>
       <ObjectFileName>x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level4</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ResourceCompile>
     <Link>
       <OutputFile>$(OutDir)icupkg.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>x86\Release/icupkg.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -125,30 +89,19 @@
       <Outputs>..\..\..\bin\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>Debug/icupkg.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>Debug/</AssemblerListingLocation>
       <ObjectFileName>Debug/</ObjectFileName>
       <ProgramDataBaseFileName>Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level4</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ResourceCompile>
     <Link>
       <OutputFile>$(OutDir)icupkg.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>$(OutDir)icupkg.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -163,34 +116,21 @@
 </Command>
       <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
-    <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-    </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>x64\Release/icupkg.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>x64\Release/</AssemblerListingLocation>
       <ObjectFileName>x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level4</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ResourceCompile>
     <Link>
       <OutputFile>$(OutDir)icupkg.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>x64\Release/icupkg.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -199,54 +139,28 @@
 </Command>
       <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
-    <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
-    </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>Debug/icupkg.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>Debug/</AssemblerListingLocation>
       <ObjectFileName>Debug/</ObjectFileName>
       <ProgramDataBaseFileName>Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level4</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ResourceCompile>
     <Link>
       <OutputFile>$(OutDir)icupkg.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>$(OutDir)icupkg.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="icupkg.cpp" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/makeconv/makeconv.vcxproj b/icu4c/source/tools/makeconv/makeconv.vcxproj
index 4a95965..b5a1527 100644
--- a/icu4c/source/tools/makeconv/makeconv.vcxproj
+++ b/icu4c/source/tools/makeconv/makeconv.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{F5AD9738-1A3D-4906-B9C4-A7D9CE33DC2C}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,6 +47,14 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <CustomBuildStep>
       <Command>copy "$(TargetPath)" ..\..\..\bin
@@ -92,32 +65,19 @@
       <TypeLibraryName>.\x86\Debug/makeconv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/makeconv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Debug/makeconv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Debug/makeconv.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -135,27 +95,17 @@
       <TypeLibraryName>.\x86\Release/makeconv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/makeconv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Release/makeconv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/makeconv.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -170,39 +120,24 @@
       <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/makeconv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/makeconv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Debug/makeconv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Debug/makeconv.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -212,34 +147,22 @@
       <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/makeconv.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/makeconv.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Release/makeconv.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/makeconv.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -252,17 +175,7 @@
     <ClInclude Include="genmbcs.h" />
     <ClInclude Include="makeconv.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/pkgdata/pkgdata.vcxproj b/icu4c/source/tools/pkgdata/pkgdata.vcxproj
index 9f723c0..680cc2f 100644
--- a/icu4c/source/tools/pkgdata/pkgdata.vcxproj
+++ b/icu4c/source/tools/pkgdata/pkgdata.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{4C8454FE-81D3-4CA3-9927-29BA96F03DAC}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,6 +47,14 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\x64\Release\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>../../../include;../../common;../toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <CustomBuildStep>
       <Command>copy "$(TargetPath)" ..\..\..\bin
@@ -92,31 +65,22 @@
       <TypeLibraryName>.\x86\Debug/pkgdata.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>../../../include;../../common;../toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/pkgdata.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Culture>0x0411</Culture>
     </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Debug/pkgdata.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\x86\Debug/pkgdata.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
@@ -135,28 +99,21 @@
       <TypeLibraryName>.\x86\Release/pkgdata.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>../../../include;../../common;../toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/pkgdata.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Culture>0x0411</Culture>
     </ResourceCompile>
     <Link>
       <OutputFile>.\x86\Release/pkgdata.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x86\Release/pkgdata.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -171,39 +128,27 @@
       <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Debug/pkgdata.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>../../../include;../../common;../toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/pkgdata.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
       <BrowseInformation>true</BrowseInformation>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Culture>0x0411</Culture>
     </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Debug/pkgdata.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Debug/pkgdata.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -213,35 +158,27 @@
       <Outputs>..\..\..\bin64\$(TargetFileName);%(Outputs)</Outputs>
     </CustomBuildStep>
     <Midl>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\x64\Release/pkgdata.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <AdditionalIncludeDirectories>../../../include;../../common;../toolutil;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/pkgdata.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
       <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <Culture>0x0411</Culture>
     </ResourceCompile>
     <Link>
       <OutputFile>.\x64\Release/pkgdata.exe</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\x64\Release/pkgdata.pdb</ProgramDatabaseFile>
       <SubSystem>Console</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -251,29 +188,7 @@
   <ItemGroup>
     <ClInclude Include="pkgtypes.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\genccode\genccode.vcxproj">
-      <Project>{fdd3c4f2-9805-44eb-9a77-bc1c1c95b547}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\gencmn\gencmn.vcxproj">
-      <Project>{a8d36f8d-09e6-4174-91c3-7beaa9c3f04f}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\icupkg\icupkg.vcxproj">
-      <Project>{62d4b15d-7a90-4ecb-ba19-5e021d6a21bc}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\toolutil\toolutil.vcxproj">
-      <Project>{6b231032-3cb5-4eed-9210-810d666a23a0}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4c/source/tools/toolutil/toolutil.vcxproj b/icu4c/source/tools/toolutil/toolutil.vcxproj
index 7197635..4df76dd 100644
--- a/icu4c/source/tools/toolutil/toolutil.vcxproj
+++ b/icu4c/source/tools/toolutil/toolutil.vcxproj
@@ -1,51 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
+  <!-- The following import will include the 'default' configuration options for VS projects. -->
+  <Import Project="..\..\allinone\Build.Windows.ProjectConfiguration.props" />
+
   <PropertyGroup Label="Globals">
     <ProjectGuid>{6B231032-3CB5-4EED-9210-810D666A23A0}</ProjectGuid>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+  <PropertyGroup Label="Configuration">
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseOfMfc>false</UseOfMfc>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfMfc>false</UseOfMfc>
-    <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -82,42 +47,34 @@
     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\x64\Debug\</IntDir>
     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
   </PropertyGroup>
+  <!-- Options that are common to *all* project configurations -->
+  <ItemDefinitionGroup>
+    <ClCompile>
+       <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>U_TOOLUTIL_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+      <WarningLevel>Level3</WarningLevel>
+    </ClCompile>
+  </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\..\lib\icutu.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <WholeProgramOptimization>true</WholeProgramOptimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_TOOLUTIL_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Release/toolutil.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\..\bin\icutu60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\..\bin\icutu61.dll</OutputFile>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\..\lib\icutu.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
       <BaseAddress>0x4ac00000</BaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -128,40 +85,21 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
       <TypeLibraryName>.\..\..\..\lib\icutud.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_TOOLUTIL_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x86\Debug/toolutil.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x86\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x86\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x86\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\..\bin\icutu60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\..\bin\icutu61d.dll</OutputFile>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\..\..\..\lib\icutud.pdb</ProgramDatabaseFile>
       <BaseAddress>0x4ac00000</BaseAddress>
       <RandomizedBaseAddress>false</RandomizedBaseAddress>
@@ -172,86 +110,48 @@
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\..\lib64\icutu.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
       <WholeProgramOptimization>true</WholeProgramOptimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;NDEBUG;_CRT_SECURE_NO_DEPRECATE;U_TOOLUTIL_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Release/toolutil.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Release/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Release/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Release/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\..\bin64\icutu60.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\..\bin64\icutu61.dll</OutputFile>
+      <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\..\lib64\icutu.pdb</ProgramDatabaseFile>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
       <BaseAddress>0x4ac00000</BaseAddress>
       <ImportLibrary>..\..\..\lib64\icutu.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
       <TypeLibraryName>.\..\..\..\lib64\icutud.tlb</TypeLibraryName>
     </Midl>
     <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\..\include;..\..\common;..\..\i18n;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN64;WIN32;_DEBUG;_CRT_SECURE_NO_DEPRECATE;U_TOOLUTIL_IMPLEMENTATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <DisableLanguageExtensions>false</DisableLanguageExtensions>
-      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
       <PrecompiledHeaderOutputFile>.\x64\Debug/toolutil.pch</PrecompiledHeaderOutputFile>
       <AssemblerListingLocation>.\x64\Debug/</AssemblerListingLocation>
       <ObjectFileName>.\x64\Debug/</ObjectFileName>
       <ProgramDataBaseFileName>.\x64\Debug/</ProgramDataBaseFileName>
-      <WarningLevel>Level3</WarningLevel>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <CompileAs>Default</CompileAs>
-      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
     <Link>
-      <OutputFile>..\..\..\bin64\icutu60d.dll</OutputFile>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
+      <OutputFile>..\..\..\bin64\icutu61d.dll</OutputFile>
+      <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>..\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
       <ProgramDatabaseFile>.\..\..\..\lib64\icutud.pdb</ProgramDatabaseFile>
       <BaseAddress>0x4ac00000</BaseAddress>
       <ImportLibrary>..\..\..\lib64\icutud.lib</ImportLibrary>
-      <TargetMachine>MachineX64</TargetMachine>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -324,17 +224,7 @@
     <ClInclude Include="dbgutil.h" />
     <ClInclude Include="udbgutil.h" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\common\common.vcxproj">
-      <Project>{73c0a65b-d1f2-4de1-b3a6-15dad2c23f3d}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\i18n\i18n.vcxproj">
-      <Project>{0178b127-6269-407d-b112-93877bb62776}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/icu4j/APIChangeReport.html b/icu4j/APIChangeReport.html
index a9e65cb..e9c3fc1 100644
--- a/icu4j/APIChangeReport.html
+++ b/icu4j/APIChangeReport.html
@@ -2,298 +2,114 @@
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<!-- © 2017 and later: Unicode, Inc. and others. -->
+<!-- © 2018 and later: Unicode, Inc. and others. -->
 <!-- License & terms of use: http://www.unicode.org/copyright.html#License -->
-<title>ICU4J API Comparison: ICU4J 59.1 with ICU4J 60.1</title>
+<title>ICU4J API Comparison: ICU4J 60.1 with ICU4J 61.1</title>
 </head>
 <body>
-<h1>ICU4J API Comparison: ICU4J 59.1 with ICU4J 60.1</h1>
+<h1>ICU4J API Comparison: ICU4J 60.1 with ICU4J 61.1</h1>
 
 <hr/>
-<h2>Removed from ICU4J 59.1</h2>
-<p>(no API removed)</p>
-
-<hr/>
-<h2>Deprecated or Obsoleted in ICU4J 60.1</h2>
-
-<h3>Package com.ibm.icu.util</h3>
-<ul>
-Calendar
-<ul>
-<li><span style='color:gray'>(deprecated)</span> protected int <i>computeMillisInDay</i>()</li>
-<li><span style='color:gray'>(deprecated)</span> protected int <i>computeZoneOffset</i>(long, int)</li>
-</ul>
-</ul>
-
-
-<hr/>
-<h2>Changed in ICU4J 60.1 (old, new)</h2>
-<p>(no API changed)</p>
-
-<hr/>
-<h2>Promoted to stable in ICU4J 60.1</h2>
-
-<h3>Package com.ibm.icu.lang</h3>
-<ul>
-UProperty
-<ul>
-<li><span style='color:green'>(stable)</span> public static final int EMOJI</li>
-<li><span style='color:green'>(stable)</span> public static final int EMOJI_MODIFIER</li>
-<li><span style='color:green'>(stable)</span> public static final int EMOJI_MODIFIER_BASE</li>
-<li><span style='color:green'>(stable)</span> public static final int EMOJI_PRESENTATION</li>
-</ul>
-</ul>
+<h2>Removed from ICU4J 60.1</h2>
 
 <h3>Package com.ibm.icu.text</h3>
 <ul>
-<li><span style='color:green'>(stable)</span> public class <i>BidiTransform</i></li>
-<li><span style='color:green'>(stable)</span> public static enum <i>BidiTransform.Mirroring</i></li>
-<li><span style='color:green'>(stable)</span> public static enum <i>BidiTransform.Order</i></li>
-BidiTransform.Mirroring
+TimeUnitFormat
 <ul>
-<li><span style='color:green'>(stable)</span> public static final BidiTransform.Mirroring OFF</li>
-<li><span style='color:green'>(stable)</span> public static final BidiTransform.Mirroring ON</li>
+<li><span style='color:gray'>(deprecated)</span> public java.lang.StringBuffer <i>format</i>(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition)</li>
 </ul>
-BidiTransform.Order
+</ul>
+
+
+<hr/>
+<h2>Deprecated or Obsoleted in ICU4J 61.1</h2>
+<p>(no API obsoleted)</p>
+
+<hr/>
+<h2>Changed in ICU4J 61.1 (old, new)</h2>
+<p>(no API changed)</p>
+
+<hr/>
+<h2>Promoted to stable in ICU4J 61.1</h2>
+
+<h3>Package com.ibm.icu.text</h3>
 <ul>
-<li><span style='color:green'>(stable)</span> public static final BidiTransform.Order LOGICAL</li>
-<li><span style='color:green'>(stable)</span> public static final BidiTransform.Order VISUAL</li>
-</ul>
-DecimalFormatSymbols
-<ul>
-<li><span style='color:green'>(stable)</span> public java.lang.String <i>getDecimalSeparatorString</i>()</li>
-<li><span style='color:green'>(stable)</span> public java.lang.String[] <i>getDigitStrings</i>()</li>
-<li><span style='color:green'>(stable)</span> public java.lang.String <i>getGroupingSeparatorString</i>()</li>
-<li><span style='color:green'>(stable)</span> public java.lang.String <i>getMinusSignString</i>()</li>
-<li><span style='color:green'>(stable)</span> public java.lang.String <i>getMonetaryDecimalSeparatorString</i>()</li>
-<li><span style='color:green'>(stable)</span> public java.lang.String <i>getMonetaryGroupingSeparatorString</i>()</li>
-<li><span style='color:green'>(stable)</span> public java.lang.String <i>getPerMillString</i>()</li>
-<li><span style='color:green'>(stable)</span> public java.lang.String <i>getPercentString</i>()</li>
-<li><span style='color:green'>(stable)</span> public java.lang.String <i>getPlusSignString</i>()</li>
-<li><span style='color:green'>(stable)</span> public void <i>setDecimalSeparatorString</i>(java.lang.String)</li>
-<li><span style='color:green'>(stable)</span> public void <i>setDigitStrings</i>(java.lang.String[])</li>
-<li><span style='color:green'>(stable)</span> public void <i>setGroupingSeparatorString</i>(java.lang.String)</li>
-<li><span style='color:green'>(stable)</span> public void <i>setMinusSignString</i>(java.lang.String)</li>
-<li><span style='color:green'>(stable)</span> public void <i>setMonetaryDecimalSeparatorString</i>(java.lang.String)</li>
-<li><span style='color:green'>(stable)</span> public void <i>setMonetaryGroupingSeparatorString</i>(java.lang.String)</li>
-<li><span style='color:green'>(stable)</span> public void <i>setPerMillString</i>(java.lang.String)</li>
-<li><span style='color:green'>(stable)</span> public void <i>setPercentString</i>(java.lang.String)</li>
-<li><span style='color:green'>(stable)</span> public void <i>setPlusSignString</i>(java.lang.String)</li>
-</ul>
-DisplayContext
-<ul>
-<li><span style='color:green'>(stable)</span> public static final DisplayContext NO_SUBSTITUTE</li>
-<li><span style='color:green'>(stable)</span> public static final DisplayContext SUBSTITUTE</li>
-</ul>
-DisplayContext.Type
-<ul>
-<li><span style='color:green'>(stable)</span> public static final DisplayContext.Type SUBSTITUTE_HANDLING</li>
-</ul>
-MeasureFormat
-<ul>
-<li><span style='color:green'>(stable)</span> public java.lang.String <i>getUnitDisplayName</i>(MeasureUnit)</li>
-</ul>
-RuleBasedBreakIterator
-<ul>
-<li><span style='color:green'>(stable)</span> public int <i>getRuleStatus</i>()</li>
-<li><span style='color:green'>(stable)</span> public int <i>getRuleStatusVec</i>(int[])</li>
-</ul>
-SpoofChecker
-<ul>
-<li><span style='color:green'>(stable)</span> public static final int CONFUSABLE</li>
-<li><span style='color:green'>(stable)</span> public static final UnicodeSet INCLUSION</li>
-<li><span style='color:green'>(stable)</span> public static final int MIXED_NUMBERS</li>
-<li><span style='color:green'>(stable)</span> public static final UnicodeSet RECOMMENDED</li>
-<li><span style='color:green'>(stable)</span> public static final int RESTRICTION_LEVEL</li>
-<li><span style='color:green'>(stable)</span> public boolean <i>equals</i>(java.lang.Object)</li>
-<li><span style='color:green'>(stable)</span> public java.lang.String <i>getSkeleton</i>(java.lang.CharSequence)</li>
-<li><span style='color:green'>(stable)</span> public int <i>hashCode</i>()</li>
-</ul>
-SpoofChecker.Builder
-<ul>
-<li><span style='color:green'>(stable)</span> public SpoofChecker.Builder <i>setData</i>(java.io.Reader)</li>
-<li><span style='color:green'>(stable)</span> public SpoofChecker.Builder <i>setRestrictionLevel</i>(SpoofChecker.RestrictionLevel)</li>
-</ul>
-SpoofChecker.CheckResult
-<ul>
-<li><span style='color:green'>(stable)</span> public UnicodeSet numerics</li>
-<li><span style='color:green'>(stable)</span> public SpoofChecker.RestrictionLevel restrictionLevel</li>
-</ul>
+<li><span style='color:green'>(stable)</span> public abstract class <i>CaseMap</i></li>
+<li><span style='color:green'>(stable)</span> public static final class <i>CaseMap.Fold</i></li>
+<li><span style='color:green'>(stable)</span> public static final class <i>CaseMap.Lower</i></li>
+<li><span style='color:green'>(stable)</span> public static final class <i>CaseMap.Title</i></li>
+<li><span style='color:green'>(stable)</span> public static final class <i>CaseMap.Upper</i></li>
+<li><span style='color:green'>(stable)</span> public final class <i>Edits</i></li>
+<li><span style='color:green'>(stable)</span> public static final class <i>Edits.Iterator</i></li>
 </ul>
 
 <h3>Package com.ibm.icu.util</h3>
 <ul>
 MeasureUnit
 <ul>
-<li><span style='color:green'>(stable)</span> public static final MeasureUnit MILLIMOLE_PER_LITER</li>
-<li><span style='color:green'>(stable)</span> public static final MeasureUnit PART_PER_MILLION</li>
+<li><span style='color:green'>(stable)</span> public static final MeasureUnit POINT</li>
 </ul>
 </ul>
 
 
 <hr/>
-<h2>Added in ICU4J 60.1</h2>
-
-<h3>Package com.ibm.icu.lang</h3>
-<ul>
-UCharacter.JoiningGroup
-<ul>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_BHA</li>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_JA</li>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_LLA</li>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_LLLA</li>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_NGA</li>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_NNA</li>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_NNNA</li>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_NYA</li>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_RA</li>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_SSA</li>
-<li><span style='color:green'>(stable)</span> public static final int MALAYALAM_TTA</li>
-</ul>
-UCharacter.UnicodeBlock
-<ul>
-<li><span style='color:green'>(stable)</span> public static final UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F</li>
-<li><span style='color:green'>(stable)</span> public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F_ID</li>
-<li><span style='color:green'>(stable)</span> public static final UCharacter.UnicodeBlock KANA_EXTENDED_A</li>
-<li><span style='color:green'>(stable)</span> public static final int KANA_EXTENDED_A_ID</li>
-<li><span style='color:green'>(stable)</span> public static final UCharacter.UnicodeBlock MASARAM_GONDI</li>
-<li><span style='color:green'>(stable)</span> public static final int MASARAM_GONDI_ID</li>
-<li><span style='color:green'>(stable)</span> public static final UCharacter.UnicodeBlock NUSHU</li>
-<li><span style='color:green'>(stable)</span> public static final int NUSHU_ID</li>
-<li><span style='color:green'>(stable)</span> public static final UCharacter.UnicodeBlock SOYOMBO</li>
-<li><span style='color:green'>(stable)</span> public static final int SOYOMBO_ID</li>
-<li><span style='color:green'>(stable)</span> public static final UCharacter.UnicodeBlock SYRIAC_SUPPLEMENT</li>
-<li><span style='color:green'>(stable)</span> public static final int SYRIAC_SUPPLEMENT_ID</li>
-<li><span style='color:green'>(stable)</span> public static final UCharacter.UnicodeBlock ZANABAZAR_SQUARE</li>
-<li><span style='color:green'>(stable)</span> public static final int ZANABAZAR_SQUARE_ID</li>
-</ul>
-UProperty
-<ul>
-<li><span style='color:green'>(stable)</span> public static final int EMOJI_COMPONENT</li>
-<li><span style='color:green'>(stable)</span> public static final int PREPENDED_CONCATENATION_MARK</li>
-<li><span style='color:green'>(stable)</span> public static final int REGIONAL_INDICATOR</li>
-</ul>
-UScript
-<ul>
-<li><span style='color:green'>(stable)</span> public static final int MASARAM_GONDI</li>
-<li><span style='color:green'>(stable)</span> public static final int SOYOMBO</li>
-<li><span style='color:green'>(stable)</span> public static final int ZANABAZAR_SQUARE</li>
-</ul>
-</ul>
+<h2>Added in ICU4J 61.1</h2>
 
 <h3>Package com.ibm.icu.number</h3>
 <ul>
-<li><span style='color:orange'>(draft)</span> public class <i>CompactNotation</i></li>
-<li><span style='color:orange'>(draft)</span> public abstract class <i>CurrencyRounder</i></li>
-<li><span style='color:orange'>(draft)</span> public class <i>FormattedNumber</i></li>
-<li><span style='color:orange'>(draft)</span> public abstract class <i>FractionRounder</i></li>
-<li><span style='color:orange'>(draft)</span> public class <i>IntegerWidth</i></li>
-<li><span style='color:orange'>(draft)</span> public class <i>LocalizedNumberFormatter</i></li>
-<li><span style='color:orange'>(draft)</span> public class <i>Notation</i></li>
-<li><span style='color:orange'>(draft)</span> public final class <i>NumberFormatter</i></li>
-<li><span style='color:orange'>(draft)</span> public abstract class <i>NumberFormatterSettings</i></li>
-<li><span style='color:orange'>(draft)</span> public abstract class <i>Rounder</i></li>
-<li><span style='color:orange'>(draft)</span> public class <i>ScientificNotation</i></li>
-<li><span style='color:orange'>(draft)</span> public class <i>SimpleNotation</i></li>
-<li><span style='color:orange'>(draft)</span> public class <i>UnlocalizedNumberFormatter</i></li>
-<li><span style='color:orange'>(draft)</span> public static enum <i>NumberFormatter.DecimalSeparatorDisplay</i></li>
-<li><span style='color:orange'>(draft)</span> public static enum <i>NumberFormatter.SignDisplay</i></li>
-<li><span style='color:orange'>(draft)</span> public static enum <i>NumberFormatter.UnitWidth</i></li>
-NumberFormatter.DecimalSeparatorDisplay
+<li><span style='color:orange'>(draft)</span> public static enum <i>NumberFormatter.GroupingStrategy</i></li>
+NumberFormatter.GroupingStrategy
 <ul>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.DecimalSeparatorDisplay ALWAYS</li>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.DecimalSeparatorDisplay AUTO</li>
+<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.GroupingStrategy AUTO</li>
+<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.GroupingStrategy MIN2</li>
+<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.GroupingStrategy OFF</li>
+<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.GroupingStrategy ON_ALIGNED</li>
+<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.GroupingStrategy THOUSANDS</li>
 </ul>
 NumberFormatter.SignDisplay
 <ul>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.SignDisplay ACCOUNTING</li>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.SignDisplay ACCOUNTING_ALWAYS</li>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.SignDisplay ALWAYS</li>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.SignDisplay AUTO</li>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.SignDisplay NEVER</li>
+<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.SignDisplay ACCOUNTING_EXCEPT_ZERO</li>
+<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.SignDisplay EXCEPT_ZERO</li>
 </ul>
-NumberFormatter.UnitWidth
+NumberFormatterSettings
 <ul>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.UnitWidth FULL_NAME</li>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.UnitWidth HIDDEN</li>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.UnitWidth ISO_CODE</li>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.UnitWidth NARROW</li>
-<li><span style='color:orange'>(draft)</span> public static final r.NumberFormatter.UnitWidth SHORT</li>
+<li><span style='color:orange'>(draft)</span> public T extends r.NumberFormatterSettings&lt;?&gt; <i>grouping</i>(r.NumberFormatter.GroupingStrategy)</li>
+<li><span style='color:orange'>(draft)</span> public T extends r.NumberFormatterSettings&lt;?&gt; <i>perUnit</i>(MeasureUnit)</li>
 </ul>
 </ul>
 
 <h3>Package com.ibm.icu.text</h3>
 <ul>
-<li><span style='color:orange'>(draft)</span> public abstract class <i>FilteredBreakIteratorBuilder</i></li>
-BreakIterator
+<li><span style='color:orange'>(draft)</span> public static enum <i>DateTimePatternGenerator.DisplayWidth</i></li>
+CurrencyDisplayNames
 <ul>
-<li><span style='color:orange'>(draft)</span> public void <i>setText</i>(java.lang.CharSequence)</li>
+<li><span style='color:orange'>(draft)</span> public abstract java.lang.String <i>getNarrowSymbol</i>(java.lang.String)</li>
 </ul>
-CaseMap.Fold
+DateTimePatternGenerator
 <ul>
-<li><span style='color:orange'>(draft)</span> public java.lang.String <i>apply</i>(java.lang.CharSequence)</li>
+<li><span style='color:orange'>(draft)</span> public java.lang.String <i>getFieldDisplayName</i>(int, DateTimePatternGenerator.DisplayWidth)</li>
 </ul>
-CaseMap.Lower
+DateTimePatternGenerator.DisplayWidth
 <ul>
-<li><span style='color:orange'>(draft)</span> public java.lang.String <i>apply</i>(java.util.Locale, java.lang.CharSequence)</li>
+<li><span style='color:orange'>(draft)</span> public static final DateTimePatternGenerator.DisplayWidth ABBREVIATED</li>
+<li><span style='color:orange'>(draft)</span> public static final DateTimePatternGenerator.DisplayWidth NARROW</li>
+<li><span style='color:orange'>(draft)</span> public static final DateTimePatternGenerator.DisplayWidth WIDE</li>
 </ul>
-CaseMap.Title
+TimeUnitFormat
 <ul>
-<li><span style='color:orange'>(draft)</span> public CaseMap.Title <i>adjustToCased</i>()</li>
-<li><span style='color:orange'>(draft)</span> public java.lang.String <i>apply</i>(java.util.Locale, BreakIterator, java.lang.CharSequence)</li>
-<li><span style='color:orange'>(draft)</span> public CaseMap.Title <i>sentences</i>()</li>
-<li><span style='color:orange'>(draft)</span> public CaseMap.Title <i>wholeString</i>()</li>
-</ul>
-CaseMap.Upper
-<ul>
-<li><span style='color:orange'>(draft)</span> public java.lang.String <i>apply</i>(java.util.Locale, java.lang.CharSequence)</li>
-</ul>
-DecimalFormat
-<ul>
-<li><span style='color:orange'>(draft)</span> public r.LocalizedNumberFormatter <i>toNumberFormatter</i>()</li>
-</ul>
-DecimalFormatSymbols
-<ul>
-<li><span style='color:orange'>(draft)</span> public static DecimalFormatSymbols <i>forNumberingSystem</i>(ULocale, NumberingSystem)</li>
-<li><span style='color:orange'>(draft)</span> public static DecimalFormatSymbols <i>forNumberingSystem</i>(java.util.Locale, NumberingSystem)</li>
-</ul>
-Edits
-<ul>
-<li><span style='color:orange'>(draft)</span> public Edits <i>mergeAndAppend</i>(Edits, Edits)</li>
-<li><span style='color:orange'>(draft)</span> public int <i>numberOfChanges</i>()</li>
-</ul>
-Edits.Iterator
-<ul>
-<li><span style='color:orange'>(draft)</span> public int <i>destinationIndexFromSourceIndex</i>(int)</li>
-<li><span style='color:orange'>(draft)</span> public boolean <i>findDestinationIndex</i>(int)</li>
-<li><span style='color:orange'>(draft)</span> public int <i>sourceIndexFromDestinationIndex</i>(int)</li>
-</ul>
-NumberingSystem
-<ul>
-<li><span style='color:orange'>(draft)</span> public static final NumberingSystem LATIN</li>
+<li><span style='color:gray'>(deprecated)</span> public NumberFormat <i>getNumberFormat</i>()</li>
 </ul>
 </ul>
 
 <h3>Package com.ibm.icu.util</h3>
 <ul>
-<li><span style='color:orange'>(draft)</span> public class <i>NoUnit</i></li>
 Currency
 <ul>
-<li><span style='color:orange'>(draft)</span> public static Currency <i>fromJavaCurrency</i>(java.util.Currency)</li>
-<li><span style='color:orange'>(draft)</span> public java.util.Currency <i>toJavaCurrency</i>()</li>
-</ul>
-CurrencyAmount
-<ul>
-<li><span style='color:orange'>(draft)</span> public <i>CurrencyAmount</i>(double, java.util.Currency)</li>
-<li><span style='color:orange'>(draft)</span> public <i>CurrencyAmount</i>(java.lang.Number, java.util.Currency)</li>
-</ul>
-VersionInfo
-<ul>
-<li><span style='color:green'>(stable)</span> public static final VersionInfo UNICODE_10_0</li>
+<li><span style='color:orange'>(draft)</span> public static final int NARROW_SYMBOL_NAME</li>
 </ul>
 </ul>
 
 <hr/>
-<p><i><font size="-1">Contents generated by ReportAPI tool on Tue Oct 03 00:54:21 EDT 2017<br/>© 2017 and later: Unicode, Inc. and others. License & terms of use: <a href="http://www.unicode.org/copyright.html#License">http://www.unicode.org/copyright.html#License</a></font></i></p>
+<p><i><font size="-1">Contents generated by ReportAPI tool on Wed Feb 28 17:22:31 EST 2018<br/>© 2018 and later: Unicode, Inc. and others. License & terms of use: <a href="http://www.unicode.org/copyright.html#License">http://www.unicode.org/copyright.html#License</a></font></i></p>
 </body>
 </html>
diff --git a/icu4j/build.properties b/icu4j/build.properties
index 24f75ac..b7e2e43 100644
--- a/icu4j/build.properties
+++ b/icu4j/build.properties
@@ -4,9 +4,9 @@
 #* Copyright (C) 2009-2016, International Business Machines Corporation and    *
 #* others. All Rights Reserved.                                                *
 #*******************************************************************************
-api.report.version = 60
-api.report.prev.version = 59
-release.file.ver = 60_2
-api.doc.version = 60.2
-maven.pom.ver = 60.2
+api.report.version = 61
+api.report.prev.version = 60
+release.file.ver = 61_1
+api.doc.version = 61.1
+maven.pom.ver = 61.1
 
diff --git a/icu4j/build.xml b/icu4j/build.xml
index 7b07b2d..3c60877 100644
--- a/icu4j/build.xml
+++ b/icu4j/build.xml
@@ -102,10 +102,25 @@
         <matches string="${java.version}" pattern="9((-.|\.\d).*)?"/>
     </condition>
 
+    <condition property="is.java10">
+        <matches string="${java.version}" pattern="10((-.|\.\d).*)?"/>
+    </condition>
+
+    <condition property="is.java11">
+        <matches string="${java.version}" pattern="11((-.|\.\d).*)?"/>
+    </condition>
+
+    <condition property="is.java12">
+        <matches string="${java.version}" pattern="12((-.|\.\d).*)?"/>
+    </condition>
+
     <condition property="is.java8.plus">
         <or>
             <isset property="is.java8"/>
             <isset property="is.java9"/>
+            <isset property="is.java10"/>
+            <isset property="is.java11"/>
+            <isset property="is.java12"/>
         </or>
     </condition>
 
@@ -1735,7 +1750,7 @@
         </java>
     </target>
 
-    <target name="draftAPIs" depends="info, gatherapi" description="Run API collector tool and generate draft API report">
+    <target name="draftAPIs" depends="info, gatherapi" description="Run API collector tool and generate draft API report in html">
         <java classname="com.ibm.icu.dev.tool.docs.CollectAPI"
                 classpath="${icu4j.build-tools.jar}"
                 failonerror="true">
@@ -1747,6 +1762,19 @@
         </java>
     </target>
 
+    <target name="draftAPIsTSV" depends="info, gatherapi" description="Run API collector tool and generate draft API report in TSV">
+        <java classname="com.ibm.icu.dev.tool.docs.CollectAPI"
+                classpath="${icu4j.build-tools.jar}"
+                failonerror="true">
+            <arg value="-f"/>
+            <arg value="Draft"/>
+            <arg value="-o"/>
+            <arg value="${out.dir}/draftAPIs.tsv"/>
+            <arg value="-t"/>
+            <arg value="${out.dir}/icu4j${api.report.version}.api3.gz" />
+        </java>
+    </target>
+
     <target name="swatDeprecated" depends="build-tools" description="Convert @deprecated @draft tags to @provisional">
         <antcall target="_runSwatDeprecated">
             <param name="swat.deprecated.opt" value="-dep"/>
diff --git a/icu4j/eclipse-build/build.properties b/icu4j/eclipse-build/build.properties
index 8f91dea..bd6e644 100644
--- a/icu4j/eclipse-build/build.properties
+++ b/icu4j/eclipse-build/build.properties
@@ -4,6 +4,6 @@
 #* Copyright (C) 2010-2016, International Business Machines Corporation and    *
 #* others. All Rights Reserved.                                                *
 #*******************************************************************************
-icu4j.plugin.impl.version.string=60.2.0
+icu4j.plugin.impl.version.string=61.1.0
 copyright.eclipse=(C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html#License
-icu4j.data.version.number=60
+icu4j.data.version.number=61
diff --git a/icu4j/eclipse-build/misc/about_icu.html b/icu4j/eclipse-build/misc/about_icu.html
index bbd28d9..2af6e16 100644
--- a/icu4j/eclipse-build/misc/about_icu.html
+++ b/icu4j/eclipse-build/misc/about_icu.html
@@ -9,7 +9,7 @@
 <body lang="EN-US">
 <h2>About This Content</h2>
  
-<p>September 28, 2017</p>
+<p>February 20, 2018</p>
 <h3>License</h3>
 
 <p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
@@ -32,7 +32,7 @@
 for informational purposes only, and you should look to the Redistributor's license for 
 terms and conditions of use.</p>
 
-<p><strong>ICU4J 60.1.0 plug-in</strong></p>
+<p><strong>ICU4J 61.1.0 plug-in</strong></p>
 
 <p>The plug-in includes software (&quot;ICU4J&quot;) developed by Unicode Inc. and others.
 Your use of ICU4J is subject to the terms and conditions of the ICU license.  A copy of the
diff --git a/icu4j/eclipse-build/misc/about_icu_base.html b/icu4j/eclipse-build/misc/about_icu_base.html
index 077f193..9fe422c 100644
--- a/icu4j/eclipse-build/misc/about_icu_base.html
+++ b/icu4j/eclipse-build/misc/about_icu_base.html
@@ -9,7 +9,7 @@
 <body lang="EN-US">
 <h2>About This Content</h2>
  
-<p>September 28, 2017</p>
+<p>February 20, 2018</p>
 <h3>License</h3>
 
 <p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
@@ -32,7 +32,7 @@
 for informational purposes only, and you should look to the Redistributor's license for 
 terms and conditions of use.</p>
 
-<p><strong>ICU4J 60.1.0 base plug-in</strong></p>
+<p><strong>ICU4J 61.1.0 base plug-in</strong></p>
 
 <p>The plug-in includes software (&quot;ICU4J&quot;) developed by Unicode Inc. and others.
 Your use of ICU4J is subject to the terms and conditions of the ICU license.  A copy of the
diff --git a/icu4j/main/classes/charset/src/com/ibm/icu/charset/CharsetCallback.java b/icu4j/main/classes/charset/src/com/ibm/icu/charset/CharsetCallback.java
index 945379a..7d7ad47 100644
--- a/icu4j/main/classes/charset/src/com/ibm/icu/charset/CharsetCallback.java
+++ b/icu4j/main/classes/charset/src/com/ibm/icu/charset/CharsetCallback.java
@@ -89,41 +89,31 @@
      * To avoid dependency on other code, this list is hard coded here.
      * When an ignorable code point is found and is unmappable, the default callbacks
      * will ignore them.
-     * For a list of the default ignorable code points, use this link: http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[%3ADI%3A]&g=
+     * For a list of the default ignorable code points, use this link:
+     * https://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3ADI%3A%5D&abb=on&g=&i=
      *
-     * This list should be sync with the one in ucnv_err.c
-     *
+     * This list should be sync with the one in ucnv_err.cpp.
      */
     private static boolean IS_DEFAULT_IGNORABLE_CODE_POINT(int c) {
-        return ((c == 0x00AD) ||
-                (c == 0x034F) ||
-                (c == 0x061C) ||
-                (c == 0x115F) ||
-                (c == 0x1160) ||
-                (0x17B4 <= c && c <= 0x17B5) ||
-                (0x180B <= c && c <= 0x180E) ||
-                (0x200B <= c && c <= 0x200F) ||
-                (0x202A <= c && c <= 0x202E) ||
-                (c == 0x2060) ||
-                (0x2066 <= c && c <= 0x2069) ||
-                (0x2061 <= c && c <= 0x2064) ||
-                (0x206A <= c && c <= 0x206F) ||
-                (c == 0x3164) ||
-                (0x0FE00 <= c && c <= 0x0FE0F) ||
-                (c == 0x0FEFF) ||
-                (c == 0x0FFA0) ||
-                (0x01BCA0  <= c && c <= 0x01BCA3) ||
-                (0x01D173 <= c && c <= 0x01D17A) ||
-                (c == 0x0E0001) ||
-                (0x0E0020 <= c && c <= 0x0E007F) ||
-                (0x0E0100 <= c && c <= 0x0E01EF) ||
-                (c == 0x2065) ||
-                (0x0FFF0 <= c && c <= 0x0FFF8) ||
-                (c == 0x0E0000) ||
-                (0x0E0002 <= c && c <= 0x0E001F) ||
-                (0x0E0080 <= c && c <= 0x0E00FF) ||
-                (0x0E01F0 <= c && c <= 0x0E0FFF)
-                );
+        return
+            (c == 0x00AD) ||
+            (c == 0x034F) ||
+            (c == 0x061C) ||
+            (c == 0x115F) ||
+            (c == 0x1160) ||
+            (0x17B4 <= c && c <= 0x17B5) ||
+            (0x180B <= c && c <= 0x180E) ||
+            (0x200B <= c && c <= 0x200F) ||
+            (0x202A <= c && c <= 0x202E) ||
+            (0x2060 <= c && c <= 0x206F) ||
+            (c == 0x3164) ||
+            (0xFE00 <= c && c <= 0xFE0F) ||
+            (c == 0xFEFF) ||
+            (c == 0xFFA0) ||
+            (0xFFF0 <= c && c <= 0xFFF8) ||
+            (0x1BCA0 <= c && c <= 0x1BCA3) ||
+            (0x1D173 <= c && c <= 0x1D17A) ||
+            (0xE0000 <= c && c <= 0xE0FFF);
     }
     /**
      * Decoder Callback interface
diff --git a/icu4j/main/classes/collate/src/com/ibm/icu/text/AlphabeticIndex.java b/icu4j/main/classes/collate/src/com/ibm/icu/text/AlphabeticIndex.java
index 3ab4dd2..3dbe3c0 100644
--- a/icu4j/main/classes/collate/src/com/ibm/icu/text/AlphabeticIndex.java
+++ b/icu4j/main/classes/collate/src/com/ibm/icu/text/AlphabeticIndex.java
@@ -523,7 +523,6 @@
      */
     private void addIndexExemplars(ULocale locale) {
         UnicodeSet exemplars = LocaleData.getExemplarSet(locale, 0, LocaleData.ES_INDEX);
-        // Android-changed: check for empty exemplar sets (http://b/64953401).
         if (exemplars != null && !exemplars.isEmpty()) {
             initialLabels.addAll(exemplars);
             return;
@@ -535,7 +534,7 @@
 
         exemplars = exemplars.cloneAsThawed();
         // question: should we add auxiliary exemplars?
-        if (exemplars.containsSome('a', 'z') || exemplars.size() == 0) {
+        if (exemplars.containsSome('a', 'z') || exemplars.isEmpty()) {
             exemplars.addAll('a', 'z');
         }
         if (exemplars.containsSome(0xAC00, 0xD7A3)) {  // Hangul syllables
@@ -550,13 +549,9 @@
             // cut down to small list
             // make use of the fact that Ethiopic is allocated in 8's, where
             // the base is 0 mod 8.
-            UnicodeSet ethiopic = new UnicodeSet("[[:Block=Ethiopic:]&[:Script=Ethiopic:]]");
-            UnicodeSetIterator it = new UnicodeSetIterator(ethiopic);
-            while (it.next() && it.codepoint != UnicodeSetIterator.IS_STRING) {
-                if ((it.codepoint & 0x7) != 0) {
-                    exemplars.remove(it.codepoint);
-                }
-            }
+            UnicodeSet ethiopic = new UnicodeSet("[ሀለሐመሠረሰሸቀቈቐቘበቨተቸኀኈነኘአከኰኸዀወዐዘዠየደዸጀገጐጘጠጨጰጸፀፈፐፘ]");
+            ethiopic.retainAll(exemplars);
+            exemplars.remove('ሀ', 0x137F).addAll(ethiopic);
         }
 
         // Upper-case any that aren't already so.
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/CaseMapImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/CaseMapImpl.java
index f6ab77d..2b30c02 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/CaseMapImpl.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/CaseMapImpl.java
@@ -31,6 +31,21 @@
         }
 
         /**
+         * Constructor.
+         * @param src String to iterate over.
+         * @param cpStart Start index of the current code point.
+         * @param cpLimit Limit index of the current code point.
+         */
+        public StringContextIterator(CharSequence src, int cpStart, int cpLimit) {
+            s = src;
+            index = 0;
+            limit = src.length();
+            this.cpStart = cpStart;
+            this.cpLimit = cpLimit;
+            dir = 0;
+        }
+
+        /**
          * Set the iteration limit for nextCaseMapCP() to an index within the string.
          * If the limit parameter is negative or past the string, then the
          * string length is restored as the iteration limit.
@@ -77,6 +92,11 @@
             }
         }
 
+        public void setCPStartAndLimit(int s, int l) {
+            cpStart = s;
+            cpLimit = l;
+            dir = 0;
+        }
         /**
          * Returns the start of the code point that was last returned
          * by nextCaseMapCP().
@@ -400,13 +420,162 @@
         return result.toString();
     }
 
-    private static void internalToLower(int caseLocale, int options, StringContextIterator iter,
+    private static final Trie2_16 CASE_TRIE = UCaseProps.getTrie();
+
+    /**
+     * caseLocale >= 0: Lowercases [srcStart..srcLimit[ but takes context [0..srcLength[ into account.
+     * caseLocale < 0: Case-folds [srcStart..srcLimit[.
+     */
+    private static void internalToLower(int caseLocale, int options,
+            CharSequence src, int srcStart, int srcLimit, StringContextIterator iter,
             Appendable dest, Edits edits) throws IOException {
-        int c;
-        while ((c = iter.nextCaseMapCP()) >= 0) {
-            c = UCaseProps.INSTANCE.toFullLower(c, iter, dest, caseLocale);
-            appendResult(c, dest, iter.getCPLength(), options, edits);
+        byte[] latinToLower;
+        if (caseLocale == UCaseProps.LOC_ROOT ||
+                (caseLocale >= 0 ?
+                    !(caseLocale == UCaseProps.LOC_TURKISH || caseLocale == UCaseProps.LOC_LITHUANIAN) :
+                    (options & UCaseProps.FOLD_CASE_OPTIONS_MASK) == UCharacter.FOLD_CASE_DEFAULT)) {
+            latinToLower = UCaseProps.LatinCase.TO_LOWER_NORMAL;
+        } else {
+            latinToLower = UCaseProps.LatinCase.TO_LOWER_TR_LT;
         }
+        int prev = srcStart;
+        int srcIndex = srcStart;
+        outerLoop:
+        for (;;) {
+            // fast path for simple cases
+            char lead;
+            for (;;) {
+                if (srcIndex >= srcLimit) {
+                    break outerLoop;
+                }
+                lead = src.charAt(srcIndex);
+                int delta;
+                if (lead < UCaseProps.LatinCase.LONG_S) {
+                    byte d = latinToLower[lead];
+                    if (d == UCaseProps.LatinCase.EXC) { break; }
+                    ++srcIndex;
+                    if (d == 0) { continue; }
+                    delta = d;
+                } else if (lead >= 0xd800) {
+                    break;  // surrogate or higher
+                } else {
+                    int props = CASE_TRIE.getFromU16SingleLead(lead);
+                    if (UCaseProps.propsHasException(props)) { break; }
+                    ++srcIndex;
+                    if (!UCaseProps.isUpperOrTitleFromProps(props) ||
+                            (delta = UCaseProps.getDelta(props)) == 0) {
+                        continue;
+                    }
+                }
+                lead += delta;
+                appendUnchanged(src, prev, srcIndex - 1 - prev, dest, options, edits);
+                dest.append(lead);
+                if (edits != null) {
+                    edits.addReplace(1, 1);
+                }
+                prev = srcIndex;
+            }
+            // slow path
+            int cpStart = srcIndex++;
+            char trail;
+            int c;
+            if (Character.isHighSurrogate(lead) && srcIndex < srcLimit &&
+                    Character.isLowSurrogate(trail = src.charAt(srcIndex))) {
+                c = Character.toCodePoint(lead, trail);
+                ++srcIndex;
+            } else {
+                c = lead;
+            }
+            if (caseLocale >= 0) {
+                if (iter == null) {
+                    iter = new StringContextIterator(src, cpStart, srcIndex);
+                } else {
+                    iter.setCPStartAndLimit(cpStart, srcIndex);
+                }
+                c = UCaseProps.INSTANCE.toFullLower(c, iter, dest, caseLocale);
+            } else {
+                c = UCaseProps.INSTANCE.toFullFolding(c, dest, options);
+            }
+            if (c >= 0) {
+                appendUnchanged(src, prev, cpStart - prev, dest, options, edits);
+                appendResult(c, dest, srcIndex - cpStart, options, edits);
+                prev = srcIndex;
+            }
+        }
+        appendUnchanged(src, prev, srcIndex - prev, dest, options, edits);
+    }
+
+    private static void internalToUpper(int caseLocale, int options,
+            CharSequence src, Appendable dest, Edits edits) throws IOException {
+        StringContextIterator iter = null;
+        byte[] latinToUpper;
+        if (caseLocale == UCaseProps.LOC_TURKISH) {
+            latinToUpper = UCaseProps.LatinCase.TO_UPPER_TR;
+        } else {
+            latinToUpper = UCaseProps.LatinCase.TO_UPPER_NORMAL;
+        }
+        int prev = 0;
+        int srcIndex = 0;
+        int srcLength = src.length();
+        outerLoop:
+        for (;;) {
+            // fast path for simple cases
+            char lead;
+            for (;;) {
+                if (srcIndex >= srcLength) {
+                    break outerLoop;
+                }
+                lead = src.charAt(srcIndex);
+                int delta;
+                if (lead < UCaseProps.LatinCase.LONG_S) {
+                    byte d = latinToUpper[lead];
+                    if (d == UCaseProps.LatinCase.EXC) { break; }
+                    ++srcIndex;
+                    if (d == 0) { continue; }
+                    delta = d;
+                } else if (lead >= 0xd800) {
+                    break;  // surrogate or higher
+                } else {
+                    int props = CASE_TRIE.getFromU16SingleLead(lead);
+                    if (UCaseProps.propsHasException(props)) { break; }
+                    ++srcIndex;
+                    if (UCaseProps.getTypeFromProps(props) != UCaseProps.LOWER ||
+                            (delta = UCaseProps.getDelta(props)) == 0) {
+                        continue;
+                    }
+                }
+                lead += delta;
+                appendUnchanged(src, prev, srcIndex - 1 - prev, dest, options, edits);
+                dest.append(lead);
+                if (edits != null) {
+                    edits.addReplace(1, 1);
+                }
+                prev = srcIndex;
+            }
+            // slow path
+            int cpStart = srcIndex++;
+            char trail;
+            int c;
+            if (Character.isHighSurrogate(lead) && srcIndex < srcLength &&
+                    Character.isLowSurrogate(trail = src.charAt(srcIndex))) {
+                c = Character.toCodePoint(lead, trail);
+                ++srcIndex;
+            } else {
+                c = lead;
+            }
+            if (iter == null) {
+                iter = new StringContextIterator(src, cpStart, srcIndex);
+            } else {
+                iter.setCPStartAndLimit(cpStart, srcIndex);
+            }
+            c = UCaseProps.INSTANCE.toFullUpper(c, iter, dest, caseLocale);
+            if (c >= 0) {
+                appendUnchanged(src, prev, cpStart - prev, dest, options, edits);
+                appendResult(c, dest, srcIndex - cpStart, options, edits);
+                prev = srcIndex;
+            }
+        }
+        appendUnchanged(src, prev, srcIndex - prev, dest, options, edits);
     }
 
     public static String toLower(int caseLocale, int options, CharSequence src) {
@@ -432,8 +601,7 @@
             if (edits != null) {
                 edits.reset();
             }
-            StringContextIterator iter = new StringContextIterator(src);
-            internalToLower(caseLocale, options, iter, dest, edits);
+            internalToLower(caseLocale, options, src, 0, src.length(), null, dest, edits);
             return dest;
         } catch (IOException e) {
             throw new ICUUncheckedIOException(e);
@@ -466,12 +634,7 @@
             if (caseLocale == UCaseProps.LOC_GREEK) {
                 return GreekUpper.toUpper(options, src, dest, edits);
             }
-            StringContextIterator iter = new StringContextIterator(src);
-            int c;
-            while ((c = iter.nextCaseMapCP()) >= 0) {
-                c = UCaseProps.INSTANCE.toFullUpper(c, iter, dest, caseLocale);
-                appendResult(c, dest, iter.getCPLength(), options, edits);
-            }
+            internalToUpper(caseLocale, options, src, dest, edits);
             return dest;
         } catch (IOException e) {
             throw new ICUUncheckedIOException(e);
@@ -589,12 +752,13 @@
                         if(titleLimit<index) {
                             if((options&UCharacter.TITLECASE_NO_LOWERCASE)==0) {
                                 // Normal operation: Lowercase the rest of the word.
-                                internalToLower(caseLocale, options, iter, dest, edits);
+                                internalToLower(caseLocale, options,
+                                        src, titleLimit, index, iter, dest, edits);
                             } else {
                                 // Optionally just copy the rest of the word unchanged.
                                 appendUnchanged(src, titleLimit, index-titleLimit, dest, options, edits);
-                                iter.moveToLimit();
                             }
+                            iter.moveToLimit();
                         }
                     }
                 }
@@ -629,14 +793,7 @@
             if (edits != null) {
                 edits.reset();
             }
-            int length = src.length();
-            for (int i = 0; i < length;) {
-                int c = Character.codePointAt(src, i);
-                int cpLength = Character.charCount(c);
-                i += cpLength;
-                c = UCaseProps.INSTANCE.toFullFolding(c, dest, options);
-                appendResult(c, dest, cpLength, options, edits);
-            }
+            internalToLower(-1, options, src, 0, src.length(), null, dest, edits);
             return dest;
         } catch (IOException e) {
             throw new ICUUncheckedIOException(e);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/CurrencyData.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/CurrencyData.java
index b656a8b..df42725 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/CurrencyData.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/CurrencyData.java
@@ -29,7 +29,6 @@
         public abstract Map<String, String> getUnitPatterns();
         public abstract CurrencyFormatInfo getFormatInfo(String isoCode);
         public abstract CurrencySpacingInfo getSpacingInfo();
-        public abstract String getNarrowSymbol(String isoCode);
     }
 
     public static final class CurrencyFormatInfo {
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/LocaleDisplayNamesImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/LocaleDisplayNamesImpl.java
index 2b5076c..54d7293 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/LocaleDisplayNamesImpl.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/LocaleDisplayNamesImpl.java
@@ -91,8 +91,7 @@
             CaseMap.toTitle().wholeString().noLowercase();
 
     private static String toTitleWholeStringNoLowercase(ULocale locale, String s) {
-        return TO_TITLE_WHOLE_STRING_NO_LOWERCASE.apply(
-                locale.toLocale(), null, s, new StringBuilder(), null).toString();
+        return TO_TITLE_WHOLE_STRING_NO_LOWERCASE.apply(locale.toLocale(), null, s);
     }
 
     public static LocaleDisplayNames getInstance(ULocale locale, DialectHandling dialectHandling) {
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/StringSegment.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/StringSegment.java
new file mode 100644
index 0000000..3b4f9ce
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/StringSegment.java
@@ -0,0 +1,203 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl;
+
+import com.ibm.icu.lang.UCharacter;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * A mutable String wrapper with a variable offset and length and support for case folding.
+ * <p>
+ * The charAt, length, and subSequence methods all operate relative to the fixed offset into the String.
+ * <p>
+ * CAUTION: Since this class is mutable, it must not be used anywhere that an immutable object is
+ * required, like in a cache or as the key of a hash map.
+ *
+ * @author sffc
+ */
+public class StringSegment implements CharSequence {
+    private final String str;
+    private int start;
+    private int end;
+    private boolean foldCase;
+
+    public StringSegment(String str, boolean foldCase) {
+        this.str = str;
+        this.start = 0;
+        this.end = str.length();
+        this.foldCase = foldCase;
+    }
+
+    public int getOffset() {
+        return start;
+    }
+
+    public void setOffset(int start) {
+        assert start <= end;
+        this.start = start;
+    }
+
+    /**
+     * Equivalent to <code>setOffset(getOffset()+delta)</code>.
+     *
+     * <p>
+     * Number parsing note: This method is usually called by a Matcher to register that a char was
+     * consumed. If the char is strong (it usually is, except for things like whitespace), follow this
+     * with a call to ParsedNumber#setCharsConsumed(). For more information on strong chars, see that
+     * method.
+     */
+    public void adjustOffset(int delta) {
+        assert start + delta >= 0;
+        assert start + delta <= end;
+        start += delta;
+    }
+
+    /**
+     * Adjusts the offset by the width of the current lead code point, either 1 or 2 chars.
+     */
+    public void adjustOffsetByCodePoint() {
+        start += Character.charCount(getCodePoint());
+    }
+
+    public void setLength(int length) {
+        assert length >= 0;
+        assert start + length <= str.length();
+        end = start + length;
+    }
+
+    public void resetLength() {
+        end = str.length();
+    }
+
+    @Override
+    public int length() {
+        return end - start;
+    }
+
+    @Override
+    public char charAt(int index) {
+        return str.charAt(index + start);
+    }
+
+    @Override
+    public CharSequence subSequence(int start, int end) {
+        throw new AssertionError(); // Never used
+        // Possible implementation:
+        // return str.subSequence(start + this.start, end + this.start);
+    }
+
+    /**
+     * Returns the first code point in the string segment.
+     *
+     * <p>
+     * <strong>Important:</strong> Most of the time, you should use {@link #startsWith}, which handles
+     * case folding logic, instead of this method.
+     */
+    public int getCodePoint() {
+        assert start < end;
+        char lead = str.charAt(start);
+        char trail;
+        if (Character.isHighSurrogate(lead)
+                && start + 1 < end
+                && Character.isLowSurrogate(trail = str.charAt(start + 1))) {
+            return Character.toCodePoint(lead, trail);
+        }
+        return lead;
+    }
+
+    /**
+     * Returns true if the first code point of this StringSegment equals the given code point.
+     *
+     * <p>
+     * This method will perform case folding if case folding is enabled for the parser.
+     */
+    public boolean startsWith(int otherCp) {
+        return codePointsEqual(getCodePoint(), otherCp, foldCase);
+    }
+
+    /**
+     * Returns true if the first code point of this StringSegment is in the given UnicodeSet.
+     */
+    public boolean startsWith(UnicodeSet uniset) {
+        // TODO: Move UnicodeSet case-folding logic here.
+        // TODO: Handle string matches here instead of separately.
+        int cp = getCodePoint();
+        if (cp == -1) {
+            return false;
+        }
+        return uniset.contains(cp);
+    }
+
+    /**
+     * Returns the length of the prefix shared by this StringSegment and the given CharSequence. For
+     * example, if this string segment is "aab", and the char sequence is "aac", this method returns 2,
+     * since the first 2 characters are the same.
+     *
+     * <p>
+     * This method only returns offsets along code point boundaries.
+     *
+     * <p>
+     * This method will perform case folding if case folding was enabled in the constructor.
+     */
+    public int getCommonPrefixLength(CharSequence other) {
+        return getPrefixLengthInternal(other, foldCase);
+    }
+
+    /**
+     * Like {@link #getCommonPrefixLength}, but never performs case folding, even if case folding was
+     * enabled in the constructor.
+     */
+    public int getCaseSensitivePrefixLength(CharSequence other) {
+        return getPrefixLengthInternal(other, false);
+    }
+
+    private int getPrefixLengthInternal(CharSequence other, boolean foldCase) {
+        int offset = 0;
+        for (; offset < Math.min(length(), other.length());) {
+            int cp1 = Character.codePointAt(this, offset);
+            int cp2 = Character.codePointAt(other, offset);
+            if (!codePointsEqual(cp1, cp2, foldCase)) {
+                break;
+            }
+            offset += Character.charCount(cp1);
+        }
+        return offset;
+    }
+
+    private static final boolean codePointsEqual(int cp1, int cp2, boolean foldCase) {
+        if (cp1 == cp2) {
+            return true;
+        }
+        if (!foldCase) {
+            return false;
+        }
+        cp1 = UCharacter.foldCase(cp1, true);
+        cp2 = UCharacter.foldCase(cp2, true);
+        return cp1 == cp2;
+    }
+
+    /**
+     * Equals any CharSequence with the same chars as this segment.
+     *
+     * <p>
+     * This method does not perform case folding; if you want case-insensitive equality, use
+     * {@link #getCommonPrefixLength}.
+     */
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof CharSequence))
+            return false;
+        return Utility.charSequenceEquals(this, (CharSequence) other);
+    }
+
+    /** Returns a hash code equivalent to calling .toString().hashCode() */
+    @Override
+    public int hashCode() {
+        return Utility.charSequenceHashCode(this);
+    }
+
+    @Override
+    public String toString() {
+        return str.substring(0, start) + "[" + str.substring(start, end) + "]" + str.substring(end);
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/TextTrieMap.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/TextTrieMap.java
index c7b8d44..764d09a 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/TextTrieMap.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/TextTrieMap.java
@@ -14,7 +14,7 @@
 import java.util.ListIterator;
 
 import com.ibm.icu.lang.UCharacter;
-import com.ibm.icu.text.UTF16;
+import com.ibm.icu.text.UnicodeSet;
 
 /**
  * TextTrieMap is a trie implementation for supporting
@@ -25,6 +25,11 @@
     private Node _root = new Node();
     boolean _ignoreCase;
 
+    public static class Output {
+        public int matchLength;
+        public boolean partialMatch;
+    }
+
     /**
      * Constructs a TextTrieMap object.
      *
@@ -74,25 +79,29 @@
         return get(text, start, null);
     }
 
-    public Iterator<V> get(CharSequence text, int start, int[] matchLen) {
+    public Iterator<V> get(CharSequence text, int start, Output output) {
         LongestMatchHandler<V> handler = new LongestMatchHandler<V>();
-        find(text, start, handler);
-        if (matchLen != null && matchLen.length > 0) {
-            matchLen[0] = handler.getMatchLength();
+        find(text, start, handler, output);
+        if (output != null) {
+            output.matchLength = handler.getMatchLength();
         }
         return handler.getMatches();
     }
 
     public void find(CharSequence text, ResultHandler<V> handler) {
-        find(text, 0, handler);
+        find(text, 0, handler, null);
     }
 
     public void find(CharSequence text, int offset, ResultHandler<V> handler) {
-        CharIterator chitr = new CharIterator(text, offset, _ignoreCase);
-        find(_root, chitr, handler);
+        find(text, offset, handler, null);
     }
 
-    private synchronized void find(Node node, CharIterator chitr, ResultHandler<V> handler) {
+    private void find(CharSequence text, int offset, ResultHandler<V> handler, Output output) {
+        CharIterator chitr = new CharIterator(text, offset, _ignoreCase);
+        find(_root, chitr, handler, output);
+    }
+
+    private synchronized void find(Node node, CharIterator chitr, ResultHandler<V> handler, Output output) {
         Iterator<V> values = node.values();
         if (values != null) {
             if (!handler.handlePrefixMatch(chitr.processedLength(), values)) {
@@ -100,89 +109,14 @@
             }
         }
 
-        Node nextMatch = node.findMatch(chitr);
+        Node nextMatch = node.findMatch(chitr, output);
         if (nextMatch != null) {
-            find(nextMatch, chitr, handler);
+            find(nextMatch, chitr, handler, output);
         }
     }
 
-    /**
-     * Creates an object that consumes code points one at a time and returns intermediate prefix
-     * matches.  Returns null if no match exists.
-     *
-     * @return An instance of {@link ParseState}, or null if the starting code point is not a
-     * prefix for any entry in the trie.
-     */
-    public ParseState openParseState(int startingCp) {
-      // Check to see whether this is a valid starting character.  If not, return null.
-      if (_ignoreCase) {
-        startingCp = UCharacter.foldCase(startingCp, true);
-      }
-      int count = Character.charCount(startingCp);
-      char ch1 = (count == 1) ? (char) startingCp : UTF16.getLeadSurrogate(startingCp);
-      if (!_root.hasChildFor(ch1)) {
-        return null;
-      }
-
-      return new ParseState(_root);
-    }
-
-    /**
-     * ParseState is mutable, not thread-safe, and intended to be used internally by parsers for
-     * consuming values from this trie.
-     */
-    public class ParseState {
-      private Node node;
-      private int offset;
-      private Node.StepResult result;
-
-      ParseState(Node start) {
-        node = start;
-        offset = 0;
-        result = start.new StepResult();
-      }
-
-      /**
-       * Consumes a code point and walk to the next node in the trie.
-       *
-       * @param cp The code point to consume.
-       */
-      public void accept(int cp) {
-        assert node != null;
-        if (_ignoreCase) {
-          cp = UCharacter.foldCase(cp, true);
-        }
-        int count = Character.charCount(cp);
-        char ch1 = (count == 1) ? (char) cp : UTF16.getLeadSurrogate(cp);
-        node.takeStep(ch1, offset, result);
-        if (count == 2 && result.node != null) {
-          char ch2 = UTF16.getTrailSurrogate(cp);
-          result.node.takeStep(ch2, result.offset, result);
-        }
-        node = result.node;
-        offset = result.offset;
-      }
-
-      /**
-       * Gets the exact prefix matches for all code points that have been consumed so far.
-       *
-       * @return The matches.
-       */
-      public Iterator<V> getCurrentMatches() {
-        if (node != null && offset == node.charCount()) {
-          return node.values();
-        }
-        return null;
-      }
-
-      /**
-       * Checks whether any more code points can be consumed.
-       *
-       * @return true if no more code points can be consumed; false otherwise.
-       */
-      public boolean atEnd() {
-        return node == null || (node.charCount() == offset && node._children == null);
-      }
+    public void putLeadCodePoints(UnicodeSet output) {
+        _root.putLeadCodePoints(output);
     }
 
     public static class CharIterator implements Iterator<Character> {
@@ -318,17 +252,6 @@
           return _text == null ? 0 : _text.length;
         }
 
-        public boolean hasChildFor(char ch) {
-          for (int i=0; _children != null && i < _children.size(); i++) {
-            Node child = _children.get(i);
-            if (ch < child._text[0]) break;
-            if (ch == child._text[0]) {
-              return true;
-            }
-          }
-          return false;
-        }
-
         public Iterator<V> values() {
             if (_values == null) {
                 return null;
@@ -344,11 +267,14 @@
             add(toCharArray(buf), 0, value);
         }
 
-        public Node findMatch(CharIterator chitr) {
+        public Node findMatch(CharIterator chitr, Output output) {
             if (_children == null) {
                 return null;
             }
             if (!chitr.hasNext()) {
+                if (output != null) {
+                    output.partialMatch = true;
+                }
                 return null;
             }
             Node match = null;
@@ -358,7 +284,7 @@
                     break;
                 }
                 if (ch == child._text[0]) {
-                    if (child.matchFollowing(chitr)) {
+                    if (child.matchFollowing(chitr, output)) {
                         match = child;
                     }
                     break;
@@ -367,35 +293,25 @@
             return match;
         }
 
-        public class StepResult {
-          public Node node;
-          public int offset;
-        }
-        public void takeStep(char ch, int offset, StepResult result) {
-          assert offset <= charCount();
-          if (offset == charCount()) {
-            // Go to a child node
-            for (int i=0; _children != null && i < _children.size(); i++) {
-              Node child = _children.get(i);
-              if (ch < child._text[0]) break;
-              if (ch == child._text[0]) {
-                // Found a matching child node
-                result.node = child;
-                result.offset = 1;
+        public void putLeadCodePoints(UnicodeSet output) {
+            if (_children == null) {
                 return;
-              }
             }
-            // No matching children; fall through
-          } else if (_text[offset] == ch) {
-            // Return to this node; increase offset
-            result.node = this;
-            result.offset = offset + 1;
-            return;
-          }
-          // No matches
-          result.node = null;
-          result.offset = -1;
-          return;
+            for (Node child : _children) {
+                char c0 = child._text[0];
+                if (!UCharacter.isHighSurrogate(c0)) {
+                    output.add(c0);
+                } else if (child.charCount() >= 2) {
+                    output.add(Character.codePointAt(child._text, 0));
+                } else if (child._children != null) {
+                    // Construct all possible code points from grandchildren.
+                    for (Node grandchild : child._children) {
+                        char c1 = grandchild._text[0];
+                        int cp = Character.toCodePoint(c0, c1);
+                        output.add(cp);
+                    }
+                }
+            }
         }
 
         private void add(char[] text, int offset, V value) {
@@ -436,11 +352,14 @@
             litr.add(new Node(subArray(text, offset), addValue(null, value), null));
         }
 
-        private boolean matchFollowing(CharIterator chitr) {
+        private boolean matchFollowing(CharIterator chitr, Output output) {
             boolean matched = true;
             int idx = 1;
             while (idx < _text.length) {
                 if(!chitr.hasNext()) {
+                    if (output != null) {
+                        output.partialMatch = true;
+                    }
                     matched = false;
                     break;
                 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/TimeZoneAdapter.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/TimeZoneAdapter.java
index 7e0c18f..5f02417 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/TimeZoneAdapter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/TimeZoneAdapter.java
@@ -143,10 +143,14 @@
      */
     @Override
     public boolean equals(Object obj) {
-        if (obj instanceof TimeZoneAdapter) {
-            obj = ((TimeZoneAdapter) obj).zone;
+        if (this == obj) {
+            return true;
         }
-        return zone.equals(obj);
+        if (obj instanceof TimeZoneAdapter) {
+            TimeZone anotherZone = ((TimeZoneAdapter) obj).zone;
+            return zone.equals(anotherZone);
+        }
+        return false;
     }
 
     /**
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/UCaseProps.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/UCaseProps.java
index 0882229..56787a1 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/UCaseProps.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/UCaseProps.java
@@ -115,7 +115,7 @@
         return props>>EXC_SHIFT;
     }
 
-    private static final boolean propsHasException(int props) {
+    static final boolean propsHasException(int props) {
         return (props&EXCEPTION)!=0;
     }
 
@@ -187,7 +187,7 @@
     public final int tolower(int c) {
         int props=trie.get(c);
         if(!propsHasException(props)) {
-            if(getTypeFromProps(props)>=UPPER) {
+            if(isUpperOrTitleFromProps(props)) {
                 c+=getDelta(props);
             }
         } else {
@@ -592,6 +592,153 @@
     }
 
     /**
+     * Fast case mapping data for ASCII/Latin.
+     * Linear arrays of delta bytes: 0=no mapping; EXC=exception.
+     * Deltas must not cross the ASCII boundary, or else they cannot be easily used
+     * in simple UTF-8 code.
+     */
+    static final class LatinCase {
+        /** Case mapping/folding data for code points up to U+017F. */
+        static final char LIMIT = 0x180;
+        /** U+017F case-folds and uppercases crossing the ASCII boundary. */
+        static final char LONG_S = 0x17f;
+        /** Exception: Complex mapping, or too-large delta. */
+        static final byte EXC = -0x80;
+
+        /** Deltas for lowercasing for most locales, and default case folding. */
+        static final byte[] TO_LOWER_NORMAL = {
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+            32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+            32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, EXC,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            EXC, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
+
+            0, 1, 0, 1, 0, 1, 0, 1, 0, EXC, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, -121, 1, 0, 1, 0, 1, 0, EXC
+        };
+
+        /** Deltas for lowercasing for tr/az/lt, and Turkic case folding. */
+        static final byte[] TO_LOWER_TR_LT = {
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 32, 32, 32, 32, 32, 32, 32, 32, EXC, EXC, 32, 32, 32, 32, 32,
+            32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, EXC, EXC, 32, 32,
+            32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, EXC,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, EXC, 0, 1, 0, 1, 0, EXC, 0,
+            EXC, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1,
+
+            0, 1, 0, 1, 0, 1, 0, 1, 0, EXC, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+            1, 0, 1, 0, 1, 0, 1, 0, -121, 1, 0, 1, 0, 1, 0, EXC
+        };
+
+        /** Deltas for uppercasing for most locales. */
+        static final byte[] TO_UPPER_NORMAL = {
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+            -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EXC,
+            -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+            -32, -32, -32, -32, -32, -32, -32, 0, -32, -32, -32, -32, -32, -32, -32, 121,
+
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, EXC, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0,
+
+            -1, 0, -1, 0, -1, 0, -1, 0, -1, EXC, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, EXC
+        };
+
+        /** Deltas for uppercasing for tr/az. */
+        static final byte[] TO_UPPER_TR = {
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, -32, -32, -32, -32, -32, -32, -32, -32, EXC, -32, -32, -32, -32, -32, -32,
+            -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, EXC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, EXC,
+            -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+            -32, -32, -32, -32, -32, -32, -32, 0, -32, -32, -32, -32, -32, -32, -32, 121,
+
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, EXC, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0,
+
+            -1, 0, -1, 0, -1, 0, -1, 0, -1, EXC, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1,
+            0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, EXC
+        };
+    }
+
+    /**
      * For string case mappings, a single character (a code point) is mapped
      * either to itself (in which case in-place mapping functions do nothing),
      * or to another single code point, or to a string.
@@ -609,8 +756,8 @@
 
     //ivate static final int LOC_UNKNOWN=0;
     public static final int LOC_ROOT=1;
-    private static final int LOC_TURKISH=2;
-    private static final int LOC_LITHUANIAN=3;
+    static final int LOC_TURKISH=2;
+    static final int LOC_LITHUANIAN=3;
     static final int LOC_GREEK=4;
     public static final int LOC_DUTCH=5;
 
@@ -823,7 +970,7 @@
         result=c;
         props=trie.get(c);
         if(!propsHasException(props)) {
-            if(getTypeFromProps(props)>=UPPER) {
+            if(isUpperOrTitleFromProps(props)) {
                 result=c+getDelta(props);
             }
         } else {
@@ -1132,13 +1279,13 @@
      *
      * @internal
      */
-    private static final int FOLD_CASE_OPTIONS_MASK = 7;
+    static final int FOLD_CASE_OPTIONS_MASK = 7;
 
     /* return the simple case folding mapping for c */
     public final int fold(int c, int options) {
         int props=trie.get(c);
         if(!propsHasException(props)) {
-            if(getTypeFromProps(props)>=UPPER) {
+            if(isUpperOrTitleFromProps(props)) {
                 c+=getDelta(props);
             }
         } else {
@@ -1201,7 +1348,7 @@
         result=c;
         props=trie.get(c);
         if(!propsHasException(props)) {
-            if(getTypeFromProps(props)>=UPPER) {
+            if(isUpperOrTitleFromProps(props)) {
                 result=c+getDelta(props);
             }
         } else {
@@ -1361,6 +1508,10 @@
 
     // definitions for 16-bit case properties word ------------------------- ***
 
+    static Trie2_16 getTrie() {
+        return INSTANCE.trie;
+    }
+
     /* 2-bit constants for types of cased characters */
     public static final int TYPE_MASK=3;
     public static final int NONE=0;
@@ -1369,7 +1520,7 @@
     public static final int TITLE=3;
 
     /** @return NONE, LOWER, UPPER, TITLE */
-    private static final int getTypeFromProps(int props) {
+    static final int getTypeFromProps(int props) {
         return props&TYPE_MASK;
     }
 
@@ -1378,6 +1529,10 @@
         return props&7;
     }
 
+    static final boolean isUpperOrTitleFromProps(int props) {
+        return (props & 2) != 0;
+    }
+
     static final int IGNORABLE=4;
     private static final int SENSITIVE=     8;
     private static final int EXCEPTION=     0x10;
@@ -1394,7 +1549,7 @@
     //private static final int MAX_DELTA=     0xff;
     //private static final int MIN_DELTA=     (-MAX_DELTA-1);
 
-    private static final int getDelta(int props) {
+    static final int getDelta(int props) {
         return (short)props>>DELTA_SHIFT;
     }
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/Utility.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/Utility.java
index 0619563..170088e 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/Utility.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/Utility.java
@@ -1848,4 +1848,51 @@
     public static String toString(Object o) {
         return o == null ? "null" : o.toString();
     }
+
+    /**
+     * This implementation is equivalent to Java 8+ Math#addExact(int, int)
+     * @param x the first value
+     * @param y the second value
+     * @return the result
+     */
+    public static int addExact(int x, int y) {
+        int r = x + y;
+        // HD 2-12 Overflow iff both arguments have the opposite sign of the result
+        if (((x ^ r) & (y ^ r)) < 0) {
+            throw new ArithmeticException("integer overflow");
+        }
+        return r;
+    }
+
+    /**
+     * Returns whether the chars in the two CharSequences are equal.
+     */
+    public static boolean charSequenceEquals(CharSequence a, CharSequence b) {
+        if (a == b) {
+            return true;
+        }
+        if (a == null || b == null) {
+            return false;
+        }
+        if (a.length() != b.length()) {
+            return false;
+        }
+        for (int i = 0; i < a.length(); i++) {
+            if (a.charAt(i) != b.charAt(i))
+                return false;
+        }
+        return true;
+    }
+
+    /**
+     * Returns a hash code for a CharSequence that is equivalent to calling
+     * charSequence.toString().hashCode()
+     */
+    public static int charSequenceHashCode(CharSequence value) {
+        int hash = 0;
+        for (int i = 0; i < value.length(); i++) {
+            hash = hash * 31 + value.charAt(i);
+        }
+        return hash;
+    }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/AffixPatternProvider.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/AffixPatternProvider.java
index 0cf547e..e7519d5 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/AffixPatternProvider.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/AffixPatternProvider.java
@@ -3,24 +3,39 @@
 package com.ibm.icu.impl.number;
 
 public interface AffixPatternProvider {
-  public static final class Flags {
-    public static final int PLURAL_MASK = 0xff;
-    public static final int PREFIX = 0x100;
-    public static final int NEGATIVE_SUBPATTERN = 0x200;
-    public static final int PADDING = 0x400;
-  }
+    public static final class Flags {
+        public static final int PLURAL_MASK = 0xff;
+        public static final int PREFIX = 0x100;
+        public static final int NEGATIVE_SUBPATTERN = 0x200;
+        public static final int PADDING = 0x400;
+    }
 
-  public char charAt(int flags, int i);
+    // Convenience compound flags
+    public static final int FLAG_POS_PREFIX = Flags.PREFIX;
+    public static final int FLAG_POS_SUFFIX = 0;
+    public static final int FLAG_NEG_PREFIX = Flags.PREFIX | Flags.NEGATIVE_SUBPATTERN;
+    public static final int FLAG_NEG_SUFFIX = Flags.NEGATIVE_SUBPATTERN;
 
-  public int length(int flags);
+    public char charAt(int flags, int i);
 
-  public boolean hasCurrencySign();
+    public int length(int flags);
 
-  public boolean positiveHasPlusSign();
+    public String getString(int flags);
 
-  public boolean hasNegativeSubpattern();
+    public boolean hasCurrencySign();
 
-  public boolean negativeHasMinusSign();
+    public boolean positiveHasPlusSign();
 
-  public boolean containsSymbolType(int type);
+    public boolean hasNegativeSubpattern();
+
+    public boolean negativeHasMinusSign();
+
+    public boolean containsSymbolType(int type);
+
+    /**
+     * True if the pattern has a number placeholder like "0" or "#,##0.00"; false if the pattern does not
+     * have one. This is used in cases like compact notation, where the pattern replaces the entire
+     * number instead of rendering the number.
+     */
+    public boolean hasBody();
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/AffixUtils.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/AffixUtils.java
index bf32451..746cbd0 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/AffixUtils.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/AffixUtils.java
@@ -3,614 +3,703 @@
 package com.ibm.icu.impl.number;
 
 import com.ibm.icu.text.NumberFormat;
+import com.ibm.icu.text.UnicodeSet;
 
 /**
  * Performs manipulations on affix patterns: the prefix and suffix strings associated with a decimal
  * format pattern. For example:
  *
  * <table>
- * <tr><th>Affix Pattern</th><th>Example Unescaped (Formatted) String</th></tr>
- * <tr><td>abc</td><td>abc</td></tr>
- * <tr><td>ab-</td><td>ab−</td></tr>
- * <tr><td>ab'-'</td><td>ab-</td></tr>
- * <tr><td>ab''</td><td>ab'</td></tr>
+ * <tr>
+ * <th>Affix Pattern</th>
+ * <th>Example Unescaped (Formatted) String</th>
+ * </tr>
+ * <tr>
+ * <td>abc</td>
+ * <td>abc</td>
+ * </tr>
+ * <tr>
+ * <td>ab-</td>
+ * <td>ab−</td>
+ * </tr>
+ * <tr>
+ * <td>ab'-'</td>
+ * <td>ab-</td>
+ * </tr>
+ * <tr>
+ * <td>ab''</td>
+ * <td>ab'</td>
+ * </tr>
  * </table>
  *
- * To manually iterate over tokens in a literal string, use the following pattern, which is designed
- * to be efficient.
+ * To manually iterate over tokens in a literal string, use the following pattern, which is designed to
+ * be efficient.
  *
  * <pre>
  * long tag = 0L;
  * while (AffixPatternUtils.hasNext(tag, patternString)) {
- *   tag = AffixPatternUtils.nextToken(tag, patternString);
- *   int typeOrCp = AffixPatternUtils.getTypeOrCp(tag);
- *   switch (typeOrCp) {
+ *     tag = AffixPatternUtils.nextToken(tag, patternString);
+ *     int typeOrCp = AffixPatternUtils.getTypeOrCp(tag);
+ *     switch (typeOrCp) {
  *     case AffixPatternUtils.TYPE_MINUS_SIGN:
- *       // Current token is a minus sign.
- *       break;
+ *         // Current token is a minus sign.
+ *         break;
  *     case AffixPatternUtils.TYPE_PLUS_SIGN:
- *       // Current token is a plus sign.
- *       break;
+ *         // Current token is a plus sign.
+ *         break;
  *     case AffixPatternUtils.TYPE_PERCENT:
- *       // Current token is a percent sign.
- *       break;
+ *         // Current token is a percent sign.
+ *         break;
  *     // ... other types ...
  *     default:
- *       // Current token is an arbitrary code point.
- *       // The variable typeOrCp is the code point.
- *       break;
- *   }
+ *         // Current token is an arbitrary code point.
+ *         // The variable typeOrCp is the code point.
+ *         break;
+ *     }
  * }
  * </pre>
  */
 public class AffixUtils {
 
-  private static final int STATE_BASE = 0;
-  private static final int STATE_FIRST_QUOTE = 1;
-  private static final int STATE_INSIDE_QUOTE = 2;
-  private static final int STATE_AFTER_QUOTE = 3;
-  private static final int STATE_FIRST_CURR = 4;
-  private static final int STATE_SECOND_CURR = 5;
-  private static final int STATE_THIRD_CURR = 6;
-  private static final int STATE_FOURTH_CURR = 7;
-  private static final int STATE_FIFTH_CURR = 8;
-  private static final int STATE_OVERFLOW_CURR = 9;
+    private static final int STATE_BASE = 0;
+    private static final int STATE_FIRST_QUOTE = 1;
+    private static final int STATE_INSIDE_QUOTE = 2;
+    private static final int STATE_AFTER_QUOTE = 3;
+    private static final int STATE_FIRST_CURR = 4;
+    private static final int STATE_SECOND_CURR = 5;
+    private static final int STATE_THIRD_CURR = 6;
+    private static final int STATE_FOURTH_CURR = 7;
+    private static final int STATE_FIFTH_CURR = 8;
+    private static final int STATE_OVERFLOW_CURR = 9;
 
-  /** Represents a literal character; the value is stored in the code point field. */
-  private static final int TYPE_CODEPOINT = 0;
+    /** Represents a literal character; the value is stored in the code point field. */
+    private static final int TYPE_CODEPOINT = 0;
 
-  /** Represents a minus sign symbol '-'. */
-  public static final int TYPE_MINUS_SIGN = -1;
+    /** Represents a minus sign symbol '-'. */
+    public static final int TYPE_MINUS_SIGN = -1;
 
-  /** Represents a plus sign symbol '+'. */
-  public static final int TYPE_PLUS_SIGN = -2;
+    /** Represents a plus sign symbol '+'. */
+    public static final int TYPE_PLUS_SIGN = -2;
 
-  /** Represents a percent sign symbol '%'. */
-  public static final int TYPE_PERCENT = -3;
+    /** Represents a percent sign symbol '%'. */
+    public static final int TYPE_PERCENT = -3;
 
-  /** Represents a permille sign symbol '‰'. */
-  public static final int TYPE_PERMILLE = -4;
+    /** Represents a permille sign symbol '‰'. */
+    public static final int TYPE_PERMILLE = -4;
 
-  /** Represents a single currency symbol '¤'. */
-  public static final int TYPE_CURRENCY_SINGLE = -5;
+    /** Represents a single currency symbol '¤'. */
+    public static final int TYPE_CURRENCY_SINGLE = -5;
 
-  /** Represents a double currency symbol '¤¤'. */
-  public static final int TYPE_CURRENCY_DOUBLE = -6;
+    /** Represents a double currency symbol '¤¤'. */
+    public static final int TYPE_CURRENCY_DOUBLE = -6;
 
-  /** Represents a triple currency symbol '¤¤¤'. */
-  public static final int TYPE_CURRENCY_TRIPLE = -7;
+    /** Represents a triple currency symbol '¤¤¤'. */
+    public static final int TYPE_CURRENCY_TRIPLE = -7;
 
-  /** Represents a quadruple currency symbol '¤¤¤¤'. */
-  public static final int TYPE_CURRENCY_QUAD = -8;
+    /** Represents a quadruple currency symbol '¤¤¤¤'. */
+    public static final int TYPE_CURRENCY_QUAD = -8;
 
-  /** Represents a quintuple currency symbol '¤¤¤¤¤'. */
-  public static final int TYPE_CURRENCY_QUINT = -9;
+    /** Represents a quintuple currency symbol '¤¤¤¤¤'. */
+    public static final int TYPE_CURRENCY_QUINT = -9;
 
-  /** Represents a sequence of six or more currency symbols. */
-  public static final int TYPE_CURRENCY_OVERFLOW = -15;
+    /** Represents a sequence of six or more currency symbols. */
+    public static final int TYPE_CURRENCY_OVERFLOW = -15;
 
-  public static interface SymbolProvider {
-    public CharSequence getSymbol(int type);
-  }
+    public static interface SymbolProvider {
+        public CharSequence getSymbol(int type);
+    }
 
-  /**
-   * Estimates the number of code points present in an unescaped version of the affix pattern string
-   * (one that would be returned by {@link #unescape}), assuming that all interpolated symbols
-   * consume one code point and that currencies consume as many code points as their symbol width.
-   * Used for computing padding width.
-   *
-   * @param patternString The original string whose width will be estimated.
-   * @return The length of the unescaped string.
-   */
-  public static int estimateLength(CharSequence patternString) {
-    if (patternString == null) return 0;
-    int state = STATE_BASE;
-    int offset = 0;
-    int length = 0;
-    for (; offset < patternString.length(); ) {
-      int cp = Character.codePointAt(patternString, offset);
+    public static interface TokenConsumer {
+        public void consumeToken(int typeOrCp);
+    }
 
-      switch (state) {
-        case STATE_BASE:
-          if (cp == '\'') {
-            // First quote
-            state = STATE_FIRST_QUOTE;
-          } else {
-            // Unquoted symbol
-            length++;
-          }
-          break;
+    /**
+     * Estimates the number of code points present in an unescaped version of the affix pattern string
+     * (one that would be returned by {@link #unescape}), assuming that all interpolated symbols consume
+     * one code point and that currencies consume as many code points as their symbol width. Used for
+     * computing padding width.
+     *
+     * @param patternString
+     *            The original string whose width will be estimated.
+     * @return The length of the unescaped string.
+     */
+    public static int estimateLength(CharSequence patternString) {
+        if (patternString == null)
+            return 0;
+        int state = STATE_BASE;
+        int offset = 0;
+        int length = 0;
+        for (; offset < patternString.length();) {
+            int cp = Character.codePointAt(patternString, offset);
+
+            switch (state) {
+            case STATE_BASE:
+                if (cp == '\'') {
+                    // First quote
+                    state = STATE_FIRST_QUOTE;
+                } else {
+                    // Unquoted symbol
+                    length++;
+                }
+                break;
+            case STATE_FIRST_QUOTE:
+                if (cp == '\'') {
+                    // Repeated quote
+                    length++;
+                    state = STATE_BASE;
+                } else {
+                    // Quoted code point
+                    length++;
+                    state = STATE_INSIDE_QUOTE;
+                }
+                break;
+            case STATE_INSIDE_QUOTE:
+                if (cp == '\'') {
+                    // End of quoted sequence
+                    state = STATE_AFTER_QUOTE;
+                } else {
+                    // Quoted code point
+                    length++;
+                }
+                break;
+            case STATE_AFTER_QUOTE:
+                if (cp == '\'') {
+                    // Double quote inside of quoted sequence
+                    length++;
+                    state = STATE_INSIDE_QUOTE;
+                } else {
+                    // Unquoted symbol
+                    length++;
+                }
+                break;
+            default:
+                throw new AssertionError();
+            }
+
+            offset += Character.charCount(cp);
+        }
+
+        switch (state) {
         case STATE_FIRST_QUOTE:
-          if (cp == '\'') {
-            // Repeated quote
-            length++;
-            state = STATE_BASE;
-          } else {
-            // Quoted code point
-            length++;
-            state = STATE_INSIDE_QUOTE;
-          }
-          break;
         case STATE_INSIDE_QUOTE:
-          if (cp == '\'') {
-            // End of quoted sequence
-            state = STATE_AFTER_QUOTE;
-          } else {
-            // Quoted code point
-            length++;
-          }
-          break;
-        case STATE_AFTER_QUOTE:
-          if (cp == '\'') {
-            // Double quote inside of quoted sequence
-            length++;
-            state = STATE_INSIDE_QUOTE;
-          } else {
-            // Unquoted symbol
-            length++;
-          }
-          break;
+            throw new IllegalArgumentException("Unterminated quote: \"" + patternString + "\"");
         default:
-          throw new AssertionError();
-      }
+            break;
+        }
 
-      offset += Character.charCount(cp);
+        return length;
     }
 
-    switch (state) {
-      case STATE_FIRST_QUOTE:
-      case STATE_INSIDE_QUOTE:
-        throw new IllegalArgumentException("Unterminated quote: \"" + patternString + "\"");
-      default:
-        break;
-    }
+    /**
+     * Takes a string and escapes (quotes) characters that have special meaning in the affix pattern
+     * syntax. This function does not reverse-lookup symbols.
+     *
+     * <p>
+     * Example input: "-$x"; example output: "'-'$x"
+     *
+     * @param input
+     *            The string to be escaped.
+     * @param output
+     *            The string builder to which to append the escaped string.
+     * @return The number of chars (UTF-16 code units) appended to the output.
+     */
+    public static int escape(CharSequence input, StringBuilder output) {
+        if (input == null)
+            return 0;
+        int state = STATE_BASE;
+        int offset = 0;
+        int startLength = output.length();
+        for (; offset < input.length();) {
+            int cp = Character.codePointAt(input, offset);
 
-    return length;
-  }
+            switch (cp) {
+            case '\'':
+                output.append("''");
+                break;
 
-  /**
-   * Takes a string and escapes (quotes) characters that have special meaning in the affix pattern
-   * syntax. This function does not reverse-lookup symbols.
-   *
-   * <p>Example input: "-$x"; example output: "'-'$x"
-   *
-   * @param input The string to be escaped.
-   * @param output The string builder to which to append the escaped string.
-   * @return The number of chars (UTF-16 code units) appended to the output.
-   */
-  public static int escape(CharSequence input, StringBuilder output) {
-    if (input == null) return 0;
-    int state = STATE_BASE;
-    int offset = 0;
-    int startLength = output.length();
-    for (; offset < input.length(); ) {
-      int cp = Character.codePointAt(input, offset);
+            case '-':
+            case '+':
+            case '%':
+            case '‰':
+            case '¤':
+                if (state == STATE_BASE) {
+                    output.append('\'');
+                    output.appendCodePoint(cp);
+                    state = STATE_INSIDE_QUOTE;
+                } else {
+                    output.appendCodePoint(cp);
+                }
+                break;
 
-      switch (cp) {
-        case '\'':
-          output.append("''");
-          break;
+            default:
+                if (state == STATE_INSIDE_QUOTE) {
+                    output.append('\'');
+                    output.appendCodePoint(cp);
+                    state = STATE_BASE;
+                } else {
+                    output.appendCodePoint(cp);
+                }
+                break;
+            }
+            offset += Character.charCount(cp);
+        }
 
-        case '-':
-        case '+':
-        case '%':
-        case '‰':
-        case '¤':
-          if (state == STATE_BASE) {
+        if (state == STATE_INSIDE_QUOTE) {
             output.append('\'');
-            output.appendCodePoint(cp);
-            state = STATE_INSIDE_QUOTE;
-          } else {
-            output.appendCodePoint(cp);
-          }
-          break;
+        }
 
+        return output.length() - startLength;
+    }
+
+    /** Version of {@link #escape} that returns a String, or null if input is null. */
+    public static String escape(CharSequence input) {
+        if (input == null)
+            return null;
+        StringBuilder sb = new StringBuilder();
+        escape(input, sb);
+        return sb.toString();
+    }
+
+    public static final NumberFormat.Field getFieldForType(int type) {
+        switch (type) {
+        case TYPE_MINUS_SIGN:
+            return NumberFormat.Field.SIGN;
+        case TYPE_PLUS_SIGN:
+            return NumberFormat.Field.SIGN;
+        case TYPE_PERCENT:
+            return NumberFormat.Field.PERCENT;
+        case TYPE_PERMILLE:
+            return NumberFormat.Field.PERMILLE;
+        case TYPE_CURRENCY_SINGLE:
+            return NumberFormat.Field.CURRENCY;
+        case TYPE_CURRENCY_DOUBLE:
+            return NumberFormat.Field.CURRENCY;
+        case TYPE_CURRENCY_TRIPLE:
+            return NumberFormat.Field.CURRENCY;
+        case TYPE_CURRENCY_QUAD:
+            return NumberFormat.Field.CURRENCY;
+        case TYPE_CURRENCY_QUINT:
+            return NumberFormat.Field.CURRENCY;
+        case TYPE_CURRENCY_OVERFLOW:
+            return NumberFormat.Field.CURRENCY;
         default:
-          if (state == STATE_INSIDE_QUOTE) {
-            output.append('\'');
-            output.appendCodePoint(cp);
-            state = STATE_BASE;
-          } else {
-            output.appendCodePoint(cp);
-          }
-          break;
-      }
-      offset += Character.charCount(cp);
+            throw new AssertionError();
+        }
     }
 
-    if (state == STATE_INSIDE_QUOTE) {
-      output.append('\'');
+    /**
+     * Executes the unescape state machine. Replaces the unquoted characters "-", "+", "%", "‰", and "¤"
+     * with the corresponding symbols provided by the {@link SymbolProvider}, and inserts the result into
+     * the NumberStringBuilder at the requested location.
+     *
+     * <p>
+     * Example input: "'-'¤x"; example output: "-$x"
+     *
+     * @param affixPattern
+     *            The original string to be unescaped.
+     * @param output
+     *            The NumberStringBuilder to mutate with the result.
+     * @param position
+     *            The index into the NumberStringBuilder to insert the the string.
+     * @param provider
+     *            An object to generate locale symbols.
+     * @return The length of the string added to affixPattern.
+     */
+    public static int unescape(
+            CharSequence affixPattern,
+            NumberStringBuilder output,
+            int position,
+            SymbolProvider provider) {
+        assert affixPattern != null;
+        int length = 0;
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            int typeOrCp = getTypeOrCp(tag);
+            if (typeOrCp == TYPE_CURRENCY_OVERFLOW) {
+                // Don't go to the provider for this special case
+                length += output.insertCodePoint(position + length, 0xFFFD, NumberFormat.Field.CURRENCY);
+            } else if (typeOrCp < 0) {
+                length += output.insert(position + length,
+                        provider.getSymbol(typeOrCp),
+                        getFieldForType(typeOrCp));
+            } else {
+                length += output.insertCodePoint(position + length, typeOrCp, null);
+            }
+        }
+        return length;
     }
 
-    return output.length() - startLength;
-  }
-
-  /** Version of {@link #escape} that returns a String, or null if input is null. */
-  public static String escape(CharSequence input) {
-    if (input == null) return null;
-    StringBuilder sb = new StringBuilder();
-    escape(input, sb);
-    return sb.toString();
-  }
-
-  public static final NumberFormat.Field getFieldForType(int type) {
-    switch (type) {
-      case TYPE_MINUS_SIGN:
-        return NumberFormat.Field.SIGN;
-      case TYPE_PLUS_SIGN:
-        return NumberFormat.Field.SIGN;
-      case TYPE_PERCENT:
-        return NumberFormat.Field.PERCENT;
-      case TYPE_PERMILLE:
-        return NumberFormat.Field.PERMILLE;
-      case TYPE_CURRENCY_SINGLE:
-        return NumberFormat.Field.CURRENCY;
-      case TYPE_CURRENCY_DOUBLE:
-        return NumberFormat.Field.CURRENCY;
-      case TYPE_CURRENCY_TRIPLE:
-        return NumberFormat.Field.CURRENCY;
-      case TYPE_CURRENCY_QUAD:
-        return NumberFormat.Field.CURRENCY;
-      case TYPE_CURRENCY_QUINT:
-        return NumberFormat.Field.CURRENCY;
-      case TYPE_CURRENCY_OVERFLOW:
-        return NumberFormat.Field.CURRENCY;
-      default:
-        throw new AssertionError();
+    /**
+     * Sames as {@link #unescape}, but only calculates the length or code point count. More efficient
+     * than {@link #unescape} if you only need the length but not the string itself.
+     *
+     * @param affixPattern
+     *            The original string to be unescaped.
+     * @param lengthOrCount
+     *            true to count length (UTF-16 code units); false to count code points
+     * @param provider
+     *            An object to generate locale symbols.
+     * @return The number of code points in the unescaped string.
+     */
+    public static int unescapedCount(
+            CharSequence affixPattern,
+            boolean lengthOrCount,
+            SymbolProvider provider) {
+        int length = 0;
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            int typeOrCp = getTypeOrCp(tag);
+            if (typeOrCp == TYPE_CURRENCY_OVERFLOW) {
+                // U+FFFD is one char
+                length += 1;
+            } else if (typeOrCp < 0) {
+                CharSequence symbol = provider.getSymbol(typeOrCp);
+                length += lengthOrCount ? symbol.length()
+                        : Character.codePointCount(symbol, 0, symbol.length());
+            } else {
+                length += lengthOrCount ? Character.charCount(typeOrCp) : 1;
+            }
+        }
+        return length;
     }
-  }
 
-  /**
-   * Executes the unescape state machine. Replaces the unquoted characters "-", "+", "%", "‰", and
-   * "¤" with the corresponding symbols provided by the {@link SymbolProvider}, and inserts the
-   * result into the NumberStringBuilder at the requested location.
-   *
-   * <p>Example input: "'-'¤x"; example output: "-$x"
-   *
-   * @param affixPattern The original string to be unescaped.
-   * @param output The NumberStringBuilder to mutate with the result.
-   * @param position The index into the NumberStringBuilder to insert the the string.
-   * @param provider An object to generate locale symbols.
-   * @return The length of the string added to affixPattern.
-   */
-  public static int unescape(
-      CharSequence affixPattern,
-      NumberStringBuilder output,
-      int position,
-      SymbolProvider provider) {
-    assert affixPattern != null;
-    int length = 0;
-    long tag = 0L;
-    while (hasNext(tag, affixPattern)) {
-      tag = nextToken(tag, affixPattern);
-      int typeOrCp = getTypeOrCp(tag);
-      if (typeOrCp == TYPE_CURRENCY_OVERFLOW) {
-        // Don't go to the provider for this special case
-        length += output.insertCodePoint(position + length, 0xFFFD, NumberFormat.Field.CURRENCY);
-      } else if (typeOrCp < 0) {
-        length += output.insert(position + length, provider.getSymbol(typeOrCp), getFieldForType(typeOrCp));
-      } else {
-        length += output.insertCodePoint(position + length, typeOrCp, null);
-      }
-    }
-    return length;
-  }
-
-  /**
-   * Sames as {@link #unescape}, but only calculates the code point count.  More efficient than {@link #unescape}
-   * if you only need the length but not the string itself.
-   *
-   * @param affixPattern The original string to be unescaped.
-   * @param provider An object to generate locale symbols.
-   * @return The number of code points in the unescaped string.
-   */
-  public static int unescapedCodePointCount(CharSequence affixPattern, SymbolProvider provider) {
-    int length = 0;
-    long tag = 0L;
-    while (hasNext(tag, affixPattern)) {
-      tag = nextToken(tag, affixPattern);
-      int typeOrCp = getTypeOrCp(tag);
-      if (typeOrCp == TYPE_CURRENCY_OVERFLOW) {
-        length += 1;
-      } else if (typeOrCp < 0) {
-        CharSequence symbol = provider.getSymbol(typeOrCp);
-        length += Character.codePointCount(symbol, 0, symbol.length());
-      } else {
-        length += 1;
-      }
-    }
-    return length;
-  }
-
-  /**
-   * Checks whether the given affix pattern contains at least one token of the given type, which is
-   * one of the constants "TYPE_" in {@link AffixUtils}.
-   *
-   * @param affixPattern The affix pattern to check.
-   * @param type The token type.
-   * @return true if the affix pattern contains the given token type; false otherwise.
-   */
-  public static boolean containsType(CharSequence affixPattern, int type) {
-    if (affixPattern == null || affixPattern.length() == 0) {
+    /**
+     * Checks whether the given affix pattern contains at least one token of the given type, which is one
+     * of the constants "TYPE_" in {@link AffixUtils}.
+     *
+     * @param affixPattern
+     *            The affix pattern to check.
+     * @param type
+     *            The token type.
+     * @return true if the affix pattern contains the given token type; false otherwise.
+     */
+    public static boolean containsType(CharSequence affixPattern, int type) {
+        if (affixPattern == null || affixPattern.length() == 0) {
+            return false;
+        }
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            if (getTypeOrCp(tag) == type) {
+                return true;
+            }
+        }
         return false;
     }
-    long tag = 0L;
-    while (hasNext(tag, affixPattern)) {
-      tag = nextToken(tag, affixPattern);
-      if (getTypeOrCp(tag) == type) {
-        return true;
-      }
-    }
-    return false;
-  }
 
-  /**
-   * Checks whether the specified affix pattern has any unquoted currency symbols ("¤").
-   *
-   * @param affixPattern The string to check for currency symbols.
-   * @return true if the literal has at least one unquoted currency symbol; false otherwise.
-   */
-  public static boolean hasCurrencySymbols(CharSequence affixPattern) {
-    if (affixPattern == null || affixPattern.length() == 0) return false;
-    long tag = 0L;
-    while (hasNext(tag, affixPattern)) {
-      tag = nextToken(tag, affixPattern);
-      int typeOrCp = getTypeOrCp(tag);
-      if (typeOrCp < 0 && getFieldForType(typeOrCp) == NumberFormat.Field.CURRENCY) {
-        return true;
-      }
+    /**
+     * Checks whether the specified affix pattern has any unquoted currency symbols ("¤").
+     *
+     * @param affixPattern
+     *            The string to check for currency symbols.
+     * @return true if the literal has at least one unquoted currency symbol; false otherwise.
+     */
+    public static boolean hasCurrencySymbols(CharSequence affixPattern) {
+        if (affixPattern == null || affixPattern.length() == 0)
+            return false;
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            int typeOrCp = getTypeOrCp(tag);
+            if (typeOrCp < 0 && getFieldForType(typeOrCp) == NumberFormat.Field.CURRENCY) {
+                return true;
+            }
+        }
+        return false;
     }
-    return false;
-  }
 
-  /**
-   * Replaces all occurrences of tokens with the given type with the given replacement char.
-   *
-   * @param affixPattern The source affix pattern (does not get modified).
-   * @param type The token type.
-   * @param replacementChar The char to substitute in place of chars of the given token type.
-   * @return A string containing the new affix pattern.
-   */
-  public static String replaceType(CharSequence affixPattern, int type, char replacementChar) {
-    if (affixPattern == null || affixPattern.length() == 0) return "";
-    char[] chars = affixPattern.toString().toCharArray();
-    long tag = 0L;
-    while (hasNext(tag, affixPattern)) {
-      tag = nextToken(tag, affixPattern);
-      if (getTypeOrCp(tag) == type) {
+    /**
+     * Replaces all occurrences of tokens with the given type with the given replacement char.
+     *
+     * @param affixPattern
+     *            The source affix pattern (does not get modified).
+     * @param type
+     *            The token type.
+     * @param replacementChar
+     *            The char to substitute in place of chars of the given token type.
+     * @return A string containing the new affix pattern.
+     */
+    public static String replaceType(CharSequence affixPattern, int type, char replacementChar) {
+        if (affixPattern == null || affixPattern.length() == 0)
+            return "";
+        char[] chars = affixPattern.toString().toCharArray();
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            if (getTypeOrCp(tag) == type) {
+                int offset = getOffset(tag);
+                chars[offset - 1] = replacementChar;
+            }
+        }
+        return new String(chars);
+    }
+
+    /**
+     * Returns whether the given affix pattern contains only symbols and ignorables as defined by the
+     * given ignorables set.
+     */
+    public static boolean containsOnlySymbolsAndIgnorables(
+            CharSequence affixPattern,
+            UnicodeSet ignorables) {
+        if (affixPattern == null) {
+            return true;
+        }
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            int typeOrCp = getTypeOrCp(tag);
+            if (typeOrCp >= 0 && !ignorables.contains(typeOrCp)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Iterates over the affix pattern, calling the TokenConsumer for each token.
+     */
+    public static void iterateWithConsumer(CharSequence affixPattern, TokenConsumer consumer) {
+        assert affixPattern != null;
+        long tag = 0L;
+        while (hasNext(tag, affixPattern)) {
+            tag = nextToken(tag, affixPattern);
+            int typeOrCp = getTypeOrCp(tag);
+            consumer.consumeToken(typeOrCp);
+        }
+    }
+
+    /**
+     * Returns the next token from the affix pattern.
+     *
+     * @param tag
+     *            A bitmask used for keeping track of state from token to token. The initial value should
+     *            be 0L.
+     * @param patternString
+     *            The affix pattern.
+     * @return The bitmask tag to pass to the next call of this method to retrieve the following token
+     *         (never negative), or -1 if there were no more tokens in the affix pattern.
+     * @see #hasNext
+     */
+    private static long nextToken(long tag, CharSequence patternString) {
         int offset = getOffset(tag);
-        chars[offset - 1] = replacementChar;
-      }
-    }
-    return new String(chars);
-  }
+        int state = getState(tag);
+        for (; offset < patternString.length();) {
+            int cp = Character.codePointAt(patternString, offset);
+            int count = Character.charCount(cp);
 
-  /**
-   * Returns the next token from the affix pattern.
-   *
-   * @param tag A bitmask used for keeping track of state from token to token. The initial value
-   *     should be 0L.
-   * @param patternString The affix pattern.
-   * @return The bitmask tag to pass to the next call of this method to retrieve the following token
-   *     (never negative), or -1 if there were no more tokens in the affix pattern.
-   * @see #hasNext
-   */
-  public static long nextToken(long tag, CharSequence patternString) {
-    int offset = getOffset(tag);
-    int state = getState(tag);
-    for (; offset < patternString.length(); ) {
-      int cp = Character.codePointAt(patternString, offset);
-      int count = Character.charCount(cp);
-
-      switch (state) {
-        case STATE_BASE:
-          switch (cp) {
-            case '\'':
-              state = STATE_FIRST_QUOTE;
-              offset += count;
-              // continue to the next code point
-              break;
-            case '-':
-              return makeTag(offset + count, TYPE_MINUS_SIGN, STATE_BASE, 0);
-            case '+':
-              return makeTag(offset + count, TYPE_PLUS_SIGN, STATE_BASE, 0);
-            case '%':
-              return makeTag(offset + count, TYPE_PERCENT, STATE_BASE, 0);
-            case '‰':
-              return makeTag(offset + count, TYPE_PERMILLE, STATE_BASE, 0);
-            case '¤':
-              state = STATE_FIRST_CURR;
-              offset += count;
-              // continue to the next code point
-              break;
+            switch (state) {
+            case STATE_BASE:
+                switch (cp) {
+                case '\'':
+                    state = STATE_FIRST_QUOTE;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                case '-':
+                    return makeTag(offset + count, TYPE_MINUS_SIGN, STATE_BASE, 0);
+                case '+':
+                    return makeTag(offset + count, TYPE_PLUS_SIGN, STATE_BASE, 0);
+                case '%':
+                    return makeTag(offset + count, TYPE_PERCENT, STATE_BASE, 0);
+                case '‰':
+                    return makeTag(offset + count, TYPE_PERMILLE, STATE_BASE, 0);
+                case '¤':
+                    state = STATE_FIRST_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                default:
+                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
+                }
+                break;
+            case STATE_FIRST_QUOTE:
+                if (cp == '\'') {
+                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
+                } else {
+                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
+                }
+            case STATE_INSIDE_QUOTE:
+                if (cp == '\'') {
+                    state = STATE_AFTER_QUOTE;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
+                }
+            case STATE_AFTER_QUOTE:
+                if (cp == '\'') {
+                    return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
+                } else {
+                    state = STATE_BASE;
+                    // re-evaluate this code point
+                    break;
+                }
+            case STATE_FIRST_CURR:
+                if (cp == '¤') {
+                    state = STATE_SECOND_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
+                }
+            case STATE_SECOND_CURR:
+                if (cp == '¤') {
+                    state = STATE_THIRD_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
+                }
+            case STATE_THIRD_CURR:
+                if (cp == '¤') {
+                    state = STATE_FOURTH_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
+                }
+            case STATE_FOURTH_CURR:
+                if (cp == '¤') {
+                    state = STATE_FIFTH_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
+                }
+            case STATE_FIFTH_CURR:
+                if (cp == '¤') {
+                    state = STATE_OVERFLOW_CURR;
+                    offset += count;
+                    // continue to the next code point
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
+                }
+            case STATE_OVERFLOW_CURR:
+                if (cp == '¤') {
+                    offset += count;
+                    // continue to the next code point and loop back to this state
+                    break;
+                } else {
+                    return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
+                }
             default:
-              return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
-          }
-          break;
+                throw new AssertionError();
+            }
+        }
+        // End of string
+        switch (state) {
+        case STATE_BASE:
+            // No more tokens in string.
+            return -1L;
         case STATE_FIRST_QUOTE:
-          if (cp == '\'') {
-            return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp);
-          } else {
-            return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
-          }
         case STATE_INSIDE_QUOTE:
-          if (cp == '\'') {
-            state = STATE_AFTER_QUOTE;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
-            return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
-          }
+            // For consistent behavior with the JDK and ICU 58, throw an exception here.
+            throw new IllegalArgumentException(
+                    "Unterminated quote in pattern affix: \"" + patternString + "\"");
         case STATE_AFTER_QUOTE:
-          if (cp == '\'') {
-            return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp);
-          } else {
-            state = STATE_BASE;
-            // re-evaluate this code point
-            break;
-          }
+            // No more tokens in string.
+            return -1L;
         case STATE_FIRST_CURR:
-          if (cp == '¤') {
-            state = STATE_SECOND_CURR;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
-          }
         case STATE_SECOND_CURR:
-          if (cp == '¤') {
-            state = STATE_THIRD_CURR;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
-          }
         case STATE_THIRD_CURR:
-          if (cp == '¤') {
-            state = STATE_FOURTH_CURR;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
-          }
         case STATE_FOURTH_CURR:
-          if (cp == '¤') {
-            state = STATE_FIFTH_CURR;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
-          }
         case STATE_FIFTH_CURR:
-          if (cp == '¤') {
-            state = STATE_OVERFLOW_CURR;
-            offset += count;
-            // continue to the next code point
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
-          }
         case STATE_OVERFLOW_CURR:
-          if (cp == '¤') {
-            offset += count;
-            // continue to the next code point and loop back to this state
-            break;
-          } else {
             return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
-          }
         default:
-          throw new AssertionError();
-      }
+            throw new AssertionError();
+        }
     }
-    // End of string
-    switch (state) {
-      case STATE_BASE:
-        // No more tokens in string.
-        return -1L;
-      case STATE_FIRST_QUOTE:
-      case STATE_INSIDE_QUOTE:
-        // For consistent behavior with the JDK and ICU 58, throw an exception here.
-        throw new IllegalArgumentException(
-            "Unterminated quote in pattern affix: \"" + patternString + "\"");
-      case STATE_AFTER_QUOTE:
-        // No more tokens in string.
-        return -1L;
-      case STATE_FIRST_CURR:
-        return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0);
-      case STATE_SECOND_CURR:
-        return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0);
-      case STATE_THIRD_CURR:
-        return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0);
-      case STATE_FOURTH_CURR:
-        return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0);
-      case STATE_FIFTH_CURR:
-        return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0);
-      case STATE_OVERFLOW_CURR:
-        return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0);
-      default:
-        throw new AssertionError();
+
+    /**
+     * Returns whether the affix pattern string has any more tokens to be retrieved from a call to
+     * {@link #nextToken}.
+     *
+     * @param tag
+     *            The bitmask tag of the previous token, as returned by {@link #nextToken}.
+     * @param string
+     *            The affix pattern.
+     * @return true if there are more tokens to consume; false otherwise.
+     */
+    private static boolean hasNext(long tag, CharSequence string) {
+        assert tag >= 0;
+        int state = getState(tag);
+        int offset = getOffset(tag);
+        // Special case: the last character in string is an end quote.
+        if (state == STATE_INSIDE_QUOTE
+                && offset == string.length() - 1
+                && string.charAt(offset) == '\'') {
+            return false;
+        } else if (state != STATE_BASE) {
+            return true;
+        } else {
+            return offset < string.length();
+        }
     }
-  }
 
-  /**
-   * Returns whether the affix pattern string has any more tokens to be retrieved from a call to
-   * {@link #nextToken}.
-   *
-   * @param tag The bitmask tag of the previous token, as returned by {@link #nextToken}.
-   * @param string The affix pattern.
-   * @return true if there are more tokens to consume; false otherwise.
-   */
-  public static boolean hasNext(long tag, CharSequence string) {
-    assert tag >= 0;
-    int state = getState(tag);
-    int offset = getOffset(tag);
-    // Special case: the last character in string is an end quote.
-    if (state == STATE_INSIDE_QUOTE
-        && offset == string.length() - 1
-        && string.charAt(offset) == '\'') {
-      return false;
-    } else if (state != STATE_BASE) {
-      return true;
-    } else {
-      return offset < string.length();
+    /**
+     * This function helps determine the identity of the token consumed by {@link #nextToken}. Converts
+     * from a bitmask tag, based on a call to {@link #nextToken}, to its corresponding symbol type or
+     * code point.
+     *
+     * @param tag
+     *            The bitmask tag of the current token, as returned by {@link #nextToken}.
+     * @return If less than zero, a symbol type corresponding to one of the <code>TYPE_</code> constants,
+     *         such as {@link #TYPE_MINUS_SIGN}. If greater than or equal to zero, a literal code point.
+     */
+    private static int getTypeOrCp(long tag) {
+        assert tag >= 0;
+        int type = getType(tag);
+        return (type == TYPE_CODEPOINT) ? getCodePoint(tag) : -type;
     }
-  }
 
-  /**
-   * This function helps determine the identity of the token consumed by {@link #nextToken}.
-   * Converts from a bitmask tag, based on a call to {@link #nextToken}, to its corresponding symbol
-   * type or code point.
-   *
-   * @param tag The bitmask tag of the current token, as returned by {@link #nextToken}.
-   * @return If less than zero, a symbol type corresponding to one of the <code>TYPE_</code>
-   *     constants, such as {@link #TYPE_MINUS_SIGN}. If greater than or equal to zero, a literal
-   *     code point.
-   */
-  public static int getTypeOrCp(long tag) {
-    assert tag >= 0;
-    int type = getType(tag);
-    return (type == TYPE_CODEPOINT) ? getCodePoint(tag) : -type;
-  }
+    /**
+     * Encodes the given values into a 64-bit tag.
+     *
+     * <ul>
+     * <li>Bits 0-31 => offset (int32)
+     * <li>Bits 32-35 => type (uint4)
+     * <li>Bits 36-39 => state (uint4)
+     * <li>Bits 40-60 => code point (uint21)
+     * <li>Bits 61-63 => unused
+     * </ul>
+     */
+    private static long makeTag(int offset, int type, int state, int cp) {
+        long tag = 0L;
+        tag |= offset;
+        tag |= (-(long) type) << 32;
+        tag |= ((long) state) << 36;
+        tag |= ((long) cp) << 40;
+        assert tag >= 0;
+        return tag;
+    }
 
-  /**
-   * Encodes the given values into a 64-bit tag.
-   *
-   * <ul>
-   *   <li>Bits 0-31 => offset (int32)
-   *   <li>Bits 32-35 => type (uint4)
-   *   <li>Bits 36-39 => state (uint4)
-   *   <li>Bits 40-60 => code point (uint21)
-   *   <li>Bits 61-63 => unused
-   * </ul>
-   */
-  private static long makeTag(int offset, int type, int state, int cp) {
-    long tag = 0L;
-    tag |= offset;
-    tag |= (-(long) type) << 32;
-    tag |= ((long) state) << 36;
-    tag |= ((long) cp) << 40;
-    assert tag >= 0;
-    return tag;
-  }
+    private static int getOffset(long tag) {
+        return (int) (tag & 0xffffffff);
+    }
 
-  static int getOffset(long tag) {
-    return (int) (tag & 0xffffffff);
-  }
+    private static int getType(long tag) {
+        return (int) ((tag >>> 32) & 0xf);
+    }
 
-  static int getType(long tag) {
-    return (int) ((tag >>> 32) & 0xf);
-  }
+    private static int getState(long tag) {
+        return (int) ((tag >>> 36) & 0xf);
+    }
 
-  static int getState(long tag) {
-    return (int) ((tag >>> 36) & 0xf);
-  }
-
-  static int getCodePoint(long tag) {
-    return (int) (tag >>> 40);
-  }
+    private static int getCodePoint(long tag) {
+        return (int) (tag >>> 40);
+    }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java
index ed524b3..8b66e18 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java
@@ -39,10 +39,15 @@
         isEmpty = true;
     }
 
-    public void populate(ULocale locale, String nsName, CompactStyle compactStyle, CompactType compactType) {
+    public void populate(
+            ULocale locale,
+            String nsName,
+            CompactStyle compactStyle,
+            CompactType compactType) {
         assert isEmpty;
         CompactDataSink sink = new CompactDataSink(this);
-        ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle.getBundleInstance(ICUData.ICU_BASE_NAME, locale);
+        ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle
+                .getBundleInstance(ICUData.ICU_BASE_NAME, locale);
 
         boolean nsIsLatn = nsName.equals("latn");
         boolean compactIsShort = compactStyle == CompactStyle.SHORT;
@@ -71,7 +76,11 @@
     }
 
     /** Produces a string like "NumberElements/latn/patternsShort/decimalFormat". */
-    private static void getResourceBundleKey(String nsName, CompactStyle compactStyle, CompactType compactType, StringBuilder sb) {
+    private static void getResourceBundleKey(
+            String nsName,
+            CompactStyle compactStyle,
+            CompactType compactType,
+            StringBuilder sb) {
         sb.setLength(0);
         sb.append("NumberElements/");
         sb.append(nsName);
@@ -82,7 +91,8 @@
     /** Java-only method used by CLDR tooling. */
     public void populate(Map<String, Map<String, String>> powersToPluralsToPatterns) {
         assert isEmpty;
-        for (Map.Entry<String, Map<String, String>> magnitudeEntry : powersToPluralsToPatterns.entrySet()) {
+        for (Map.Entry<String, Map<String, String>> magnitudeEntry : powersToPluralsToPatterns
+                .entrySet()) {
             byte magnitude = (byte) (magnitudeEntry.getKey().length() - 1);
             for (Map.Entry<String, String> pluralEntry : magnitudeEntry.getValue().entrySet()) {
                 StandardPlural plural = StandardPlural.fromString(pluralEntry.getKey().toString());
@@ -155,7 +165,7 @@
             for (int i3 = 0; powersOfTenTable.getKeyAndValue(i3, key, value); ++i3) {
 
                 // Assumes that the keys are always of the form "10000" where the magnitude is the
-                // length of the key minus one.  We expect magnitudes to be less than MAX_DIGITS.
+                // length of the key minus one. We expect magnitudes to be less than MAX_DIGITS.
                 byte magnitude = (byte) (key.length() - 1);
                 byte multiplier = data.multipliers[magnitude];
                 assert magnitude < COMPACT_MAX_DIGITS;
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ConstantAffixModifier.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ConstantAffixModifier.java
index 53f7909..4ebb3d0 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ConstantAffixModifier.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ConstantAffixModifier.java
@@ -21,7 +21,8 @@
      * Constructs an instance with the given strings.
      *
      * <p>
-     * The arguments need to be Strings, not CharSequences, because Strings are immutable but CharSequences are not.
+     * The arguments need to be Strings, not CharSequences, because Strings are immutable but
+     * CharSequences are not.
      *
      * @param prefix
      *            The prefix string.
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ConstantMultiFieldModifier.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ConstantMultiFieldModifier.java
index c6c38e0..cdd129c 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ConstantMultiFieldModifier.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ConstantMultiFieldModifier.java
@@ -5,8 +5,9 @@
 import com.ibm.icu.text.NumberFormat.Field;
 
 /**
- * An implementation of {@link Modifier} that allows for multiple types of fields in the same modifier. Constructed
- * based on the contents of two {@link NumberStringBuilder} instances (one for the prefix, one for the suffix).
+ * An implementation of {@link Modifier} that allows for multiple types of fields in the same modifier.
+ * Constructed based on the contents of two {@link NumberStringBuilder} instances (one for the prefix,
+ * one for the suffix).
  */
 public class ConstantMultiFieldModifier implements Modifier {
 
@@ -16,21 +17,29 @@
     protected final char[] suffixChars;
     protected final Field[] prefixFields;
     protected final Field[] suffixFields;
+    private final boolean overwrite;
     private final boolean strong;
 
-    public ConstantMultiFieldModifier(NumberStringBuilder prefix, NumberStringBuilder suffix, boolean strong) {
+    public ConstantMultiFieldModifier(
+            NumberStringBuilder prefix,
+            NumberStringBuilder suffix,
+            boolean overwrite,
+            boolean strong) {
         prefixChars = prefix.toCharArray();
         suffixChars = suffix.toCharArray();
         prefixFields = prefix.toFieldArray();
         suffixFields = suffix.toFieldArray();
+        this.overwrite = overwrite;
         this.strong = strong;
     }
 
     @Override
     public int apply(NumberStringBuilder output, int leftIndex, int rightIndex) {
-        // Insert the suffix first since inserting the prefix will change the rightIndex
-        int length = output.insert(rightIndex, suffixChars, suffixFields);
-        length += output.insert(leftIndex, prefixChars, prefixFields);
+        int length = output.insert(leftIndex, prefixChars, prefixFields);
+        if (overwrite) {
+            length += output.splice(leftIndex + length, rightIndex + length, "", 0, 0, null);
+        }
+        length += output.insert(rightIndex + length, suffixChars, suffixFields);
         return length;
     }
 
@@ -55,7 +64,8 @@
         NumberStringBuilder temp = new NumberStringBuilder();
         apply(temp, 0, 0);
         int prefixLength = getPrefixLength();
-        return String.format("<ConstantMultiFieldModifier prefix:'%s' suffix:'%s'>", temp.subSequence(0, prefixLength),
+        return String.format("<ConstantMultiFieldModifier prefix:'%s' suffix:'%s'>",
+                temp.subSequence(0, prefixLength),
                 temp.subSequence(prefixLength, temp.length()));
     }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencyPluralInfoAffixProvider.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencyPluralInfoAffixProvider.java
new file mode 100644
index 0000000..2540899
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencyPluralInfoAffixProvider.java
@@ -0,0 +1,67 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number;
+
+import com.ibm.icu.impl.StandardPlural;
+import com.ibm.icu.impl.number.PatternStringParser.ParsedPatternInfo;
+import com.ibm.icu.text.CurrencyPluralInfo;
+
+public class CurrencyPluralInfoAffixProvider implements AffixPatternProvider {
+    private final AffixPatternProvider[] affixesByPlural;
+
+    public CurrencyPluralInfoAffixProvider(CurrencyPluralInfo cpi) {
+        affixesByPlural = new ParsedPatternInfo[StandardPlural.COUNT];
+        for (StandardPlural plural : StandardPlural.VALUES) {
+            affixesByPlural[plural.ordinal()] = PatternStringParser
+                    .parseToPatternInfo(cpi.getCurrencyPluralPattern(plural.getKeyword()));
+        }
+    }
+
+    @Override
+    public char charAt(int flags, int i) {
+        int pluralOrdinal = (flags & Flags.PLURAL_MASK);
+        return affixesByPlural[pluralOrdinal].charAt(flags, i);
+    }
+
+    @Override
+    public int length(int flags) {
+        int pluralOrdinal = (flags & Flags.PLURAL_MASK);
+        return affixesByPlural[pluralOrdinal].length(flags);
+    }
+
+    @Override
+    public String getString(int flags) {
+        int pluralOrdinal = (flags & Flags.PLURAL_MASK);
+        return affixesByPlural[pluralOrdinal].getString(flags);
+    }
+
+    @Override
+    public boolean positiveHasPlusSign() {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].positiveHasPlusSign();
+    }
+
+    @Override
+    public boolean hasNegativeSubpattern() {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].hasNegativeSubpattern();
+    }
+
+    @Override
+    public boolean negativeHasMinusSign() {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].negativeHasMinusSign();
+    }
+
+    @Override
+    public boolean hasCurrencySign() {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].hasCurrencySign();
+    }
+
+    @Override
+    public boolean containsSymbolType(int type) {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].containsSymbolType(type);
+    }
+
+    @Override
+    public boolean hasBody() {
+        return affixesByPlural[StandardPlural.OTHER.ordinal()].hasBody();
+    }
+}
\ No newline at end of file
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencySpacingEnabledModifier.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencySpacingEnabledModifier.java
index 5aff0f3..2cf8758 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencySpacingEnabledModifier.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencySpacingEnabledModifier.java
@@ -27,9 +27,13 @@
     private final String beforeSuffixInsert;
 
     /** Safe code path */
-    public CurrencySpacingEnabledModifier(NumberStringBuilder prefix, NumberStringBuilder suffix, boolean strong,
+    public CurrencySpacingEnabledModifier(
+            NumberStringBuilder prefix,
+            NumberStringBuilder suffix,
+            boolean overwrite,
+            boolean strong,
             DecimalFormatSymbols symbols) {
-        super(prefix, suffix, strong);
+        super(prefix, suffix, overwrite, strong);
 
         // Check for currency spacing. Do not build the UnicodeSets unless there is
         // a currency code point at a boundary.
@@ -70,12 +74,14 @@
     public int apply(NumberStringBuilder output, int leftIndex, int rightIndex) {
         // Currency spacing logic
         int length = 0;
-        if (rightIndex - leftIndex > 0 && afterPrefixUnicodeSet != null
+        if (rightIndex - leftIndex > 0
+                && afterPrefixUnicodeSet != null
                 && afterPrefixUnicodeSet.contains(output.codePointAt(leftIndex))) {
             // TODO: Should we use the CURRENCY field here?
             length += output.insert(leftIndex, afterPrefixInsert, null);
         }
-        if (rightIndex - leftIndex > 0 && beforeSuffixUnicodeSet != null
+        if (rightIndex - leftIndex > 0
+                && beforeSuffixUnicodeSet != null
                 && beforeSuffixUnicodeSet.contains(output.codePointBefore(rightIndex))) {
             // TODO: Should we use the CURRENCY field here?
             length += output.insert(rightIndex + length, beforeSuffixInsert, null);
@@ -87,8 +93,13 @@
     }
 
     /** Unsafe code path */
-    public static int applyCurrencySpacing(NumberStringBuilder output, int prefixStart, int prefixLen, int suffixStart,
-            int suffixLen, DecimalFormatSymbols symbols) {
+    public static int applyCurrencySpacing(
+            NumberStringBuilder output,
+            int prefixStart,
+            int prefixLen,
+            int suffixStart,
+            int suffixLen,
+            DecimalFormatSymbols symbols) {
         int length = 0;
         boolean hasPrefix = (prefixLen > 0);
         boolean hasSuffix = (suffixLen > 0);
@@ -103,12 +114,16 @@
     }
 
     /** Unsafe code path */
-    private static int applyCurrencySpacingAffix(NumberStringBuilder output, int index, byte affix,
+    private static int applyCurrencySpacingAffix(
+            NumberStringBuilder output,
+            int index,
+            byte affix,
             DecimalFormatSymbols symbols) {
         // NOTE: For prefix, output.fieldAt(index-1) gets the last field type in the prefix.
         // This works even if the last code point in the prefix is 2 code units because the
         // field value gets populated to both indices in the field array.
-        NumberFormat.Field affixField = (affix == PREFIX) ? output.fieldAt(index - 1) : output.fieldAt(index);
+        NumberFormat.Field affixField = (affix == PREFIX) ? output.fieldAt(index - 1)
+                : output.fieldAt(index);
         if (affixField != NumberFormat.Field.CURRENCY) {
             return 0;
         }
@@ -135,8 +150,10 @@
 
     private static UnicodeSet getUnicodeSet(DecimalFormatSymbols symbols, short position, byte affix) {
         String pattern = symbols
-                .getPatternForCurrencySpacing(position == IN_CURRENCY ? DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH
-                        : DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH, affix == SUFFIX);
+                .getPatternForCurrencySpacing(
+                        position == IN_CURRENCY ? DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH
+                                : DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH,
+                        affix == SUFFIX);
         if (pattern.equals("[:digit:]")) {
             return UNISET_DIGIT;
         } else if (pattern.equals("[:^S:]")) {
@@ -147,6 +164,7 @@
     }
 
     private static String getInsertString(DecimalFormatSymbols symbols, byte affix) {
-        return symbols.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_INSERT, affix == SUFFIX);
+        return symbols.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_INSERT,
+                affix == SUFFIX);
     }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CustomSymbolCurrency.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CustomSymbolCurrency.java
index e854909..b794aeb 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CustomSymbolCurrency.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CustomSymbolCurrency.java
@@ -7,70 +7,69 @@
 import com.ibm.icu.util.ULocale;
 
 public class CustomSymbolCurrency extends Currency {
-  private static final long serialVersionUID = 2497493016770137670L;
-  // TODO: Serialization methods?
+    private static final long serialVersionUID = 2497493016770137670L;
+    // TODO: Serialization methods?
 
-  private String symbol1;
-  private String symbol2;
+    private String symbol1;
+    private String symbol2;
 
-  public static Currency resolve(Currency currency, ULocale locale, DecimalFormatSymbols symbols) {
-    if (currency == null) {
-      currency = symbols.getCurrency();
+    public static Currency resolve(Currency currency, ULocale locale, DecimalFormatSymbols symbols) {
+        if (currency == null) {
+            currency = symbols.getCurrency();
+        }
+        String currency1Sym = symbols.getCurrencySymbol();
+        String currency2Sym = symbols.getInternationalCurrencySymbol();
+        if (currency == null) {
+            return new CustomSymbolCurrency("XXX", currency1Sym, currency2Sym);
+        }
+        if (!currency.equals(symbols.getCurrency())) {
+            return currency;
+        }
+        String currency1 = currency.getName(symbols.getULocale(), Currency.SYMBOL_NAME, null);
+        String currency2 = currency.getCurrencyCode();
+        if (!currency1.equals(currency1Sym) || !currency2.equals(currency2Sym)) {
+            return new CustomSymbolCurrency(currency2, currency1Sym, currency2Sym);
+        }
+        return currency;
     }
-    String currency1Sym = symbols.getCurrencySymbol();
-    String currency2Sym = symbols.getInternationalCurrencySymbol();
-    if (currency == null) {
-      return new CustomSymbolCurrency("XXX", currency1Sym, currency2Sym);
+
+    public CustomSymbolCurrency(String isoCode, String currency1Sym, String currency2Sym) {
+        super(isoCode);
+        this.symbol1 = currency1Sym;
+        this.symbol2 = currency2Sym;
     }
-    if (!currency.equals(symbols.getCurrency())) {
-      return currency;
+
+    @Override
+    public String getName(ULocale locale, int nameStyle, boolean[] isChoiceFormat) {
+        if (nameStyle == SYMBOL_NAME) {
+            return symbol1;
+        }
+        return super.getName(locale, nameStyle, isChoiceFormat);
     }
-    String currency1 = currency.getName(symbols.getULocale(), Currency.SYMBOL_NAME, null);
-    String currency2 = currency.getCurrencyCode();
-    if (!currency1.equals(currency1Sym) || !currency2.equals(currency2Sym)) {
-      return new CustomSymbolCurrency(currency2, currency1Sym, currency2Sym);
+
+    @Override
+    public String getName(ULocale locale, int nameStyle, String pluralCount, boolean[] isChoiceFormat) {
+        if (nameStyle == PLURAL_LONG_NAME && subType.equals("XXX")) {
+            // Plural in absence of a currency should return the symbol
+            return symbol1;
+        }
+        return super.getName(locale, nameStyle, pluralCount, isChoiceFormat);
     }
-    return currency;
-  }
 
-  public CustomSymbolCurrency(String isoCode, String currency1Sym, String currency2Sym) {
-    super(isoCode);
-    this.symbol1 = currency1Sym;
-    this.symbol2 = currency2Sym;
-  }
-
-  @Override
-  public String getName(ULocale locale, int nameStyle, boolean[] isChoiceFormat) {
-    if (nameStyle == SYMBOL_NAME) {
-      return symbol1;
+    @Override
+    public String getCurrencyCode() {
+        return symbol2;
     }
-    return super.getName(locale, nameStyle, isChoiceFormat);
-  }
 
-  @Override
-  public String getName(
-      ULocale locale, int nameStyle, String pluralCount, boolean[] isChoiceFormat) {
-    if (nameStyle == PLURAL_LONG_NAME && subType.equals("XXX")) {
-      // Plural in absence of a currency should return the symbol
-      return symbol1;
+    @Override
+    public int hashCode() {
+        return super.hashCode() ^ symbol1.hashCode() ^ symbol2.hashCode();
     }
-    return super.getName(locale, nameStyle, pluralCount, isChoiceFormat);
-  }
 
-  @Override
-  public String getCurrencyCode() {
-    return symbol2;
-  }
-
-  @Override
-  public int hashCode() {
-    return super.hashCode() ^ symbol1.hashCode() ^ symbol2.hashCode();
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    return super.equals(other)
-            && ((CustomSymbolCurrency)other).symbol1.equals(symbol1)
-            && ((CustomSymbolCurrency)other).symbol2.equals(symbol2);
-  }
+    @Override
+    public boolean equals(Object other) {
+        return super.equals(other)
+                && ((CustomSymbolCurrency) other).symbol1.equals(symbol1)
+                && ((CustomSymbolCurrency) other).symbol2.equals(symbol2);
+    }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalFormatProperties.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalFormatProperties.java
index 26859ab..94ddef3 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalFormatProperties.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalFormatProperties.java
@@ -16,8 +16,7 @@
 import java.util.Map;
 
 import com.ibm.icu.impl.number.Padder.PadPosition;
-import com.ibm.icu.impl.number.Parse.GroupingMode;
-import com.ibm.icu.impl.number.Parse.ParseMode;
+import com.ibm.icu.impl.number.parse.NumberParserImpl.ParseMode;
 import com.ibm.icu.text.CompactDecimalFormat.CompactStyle;
 import com.ibm.icu.text.CurrencyPluralInfo;
 import com.ibm.icu.text.PluralRules;
@@ -73,7 +72,6 @@
     private transient PadPosition padPosition;
     private transient String padString;
     private transient boolean parseCaseSensitive;
-    private transient GroupingMode parseGroupingMode;
     private transient boolean parseIntegerOnly;
     private transient ParseMode parseMode;
     private transient boolean parseNoExponent;
@@ -105,8 +103,8 @@
      * Sets all properties to their defaults (unset).
      *
      * <p>
-     * All integers default to -1 EXCEPT FOR MAGNITUDE MULTIPLIER which has a default of 0 (since negative numbers are
-     * important).
+     * All integers default to -1 EXCEPT FOR MAGNITUDE MULTIPLIER which has a default of 0 (since
+     * negative numbers are important).
      *
      * <p>
      * All booleans default to false.
@@ -145,7 +143,6 @@
         padPosition = null;
         padString = null;
         parseCaseSensitive = false;
-        parseGroupingMode = null;
         parseIntegerOnly = false;
         parseMode = null;
         parseNoExponent = false;
@@ -191,7 +188,6 @@
         padPosition = other.padPosition;
         padString = other.padString;
         parseCaseSensitive = other.parseCaseSensitive;
-        parseGroupingMode = other.parseGroupingMode;
         parseIntegerOnly = other.parseIntegerOnly;
         parseMode = other.parseMode;
         parseNoExponent = other.parseNoExponent;
@@ -238,7 +234,6 @@
         eq = eq && _equalsHelper(padPosition, other.padPosition);
         eq = eq && _equalsHelper(padString, other.padString);
         eq = eq && _equalsHelper(parseCaseSensitive, other.parseCaseSensitive);
-        eq = eq && _equalsHelper(parseGroupingMode, other.parseGroupingMode);
         eq = eq && _equalsHelper(parseIntegerOnly, other.parseIntegerOnly);
         eq = eq && _equalsHelper(parseMode, other.parseMode);
         eq = eq && _equalsHelper(parseNoExponent, other.parseNoExponent);
@@ -301,7 +296,6 @@
         hashCode ^= _hashCodeHelper(padPosition);
         hashCode ^= _hashCodeHelper(padString);
         hashCode ^= _hashCodeHelper(parseCaseSensitive);
-        hashCode ^= _hashCodeHelper(parseGroupingMode);
         hashCode ^= _hashCodeHelper(parseIntegerOnly);
         hashCode ^= _hashCodeHelper(parseMode);
         hashCode ^= _hashCodeHelper(parseNoExponent);
@@ -484,10 +478,6 @@
         return parseCaseSensitive;
     }
 
-    public GroupingMode getParseGroupingMode() {
-        return parseGroupingMode;
-    }
-
     public boolean getParseIntegerOnly() {
         return parseIntegerOnly;
     }
@@ -550,7 +540,8 @@
         readObjectImpl(ois);
     }
 
-    /* package-private */ void readObjectImpl(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+    /* package-private */ void readObjectImpl(ObjectInputStream ois)
+            throws IOException, ClassNotFoundException {
         ois.defaultReadObject();
 
         // Initialize to empty
@@ -596,8 +587,8 @@
     }
 
     /**
-     * Specifies custom data to be used instead of CLDR data when constructing a CompactDecimalFormat. The argument
-     * should be a map with the following structure:
+     * Specifies custom data to be used instead of CLDR data when constructing a CompactDecimalFormat.
+     * The argument should be a map with the following structure:
      *
      * <pre>
      * {
@@ -619,15 +610,17 @@
      *            A map with the above structure.
      * @return The property bag, for chaining.
      */
-    public DecimalFormatProperties setCompactCustomData(Map<String, Map<String, String>> compactCustomData) {
+    public DecimalFormatProperties setCompactCustomData(
+            Map<String, Map<String, String>> compactCustomData) {
         // TODO: compactCustomData is not immutable.
         this.compactCustomData = compactCustomData;
         return this;
     }
 
     /**
-     * Use compact decimal formatting with the specified {@link CompactStyle}. CompactStyle.SHORT produces output like
-     * "10K" in locale <em>en-US</em>, whereas CompactStyle.LONG produces output like "10 thousand" in that locale.
+     * Use compact decimal formatting with the specified {@link CompactStyle}. CompactStyle.SHORT
+     * produces output like "10K" in locale <em>en-US</em>, whereas CompactStyle.LONG produces output
+     * like "10 thousand" in that locale.
      *
      * @param compactStyle
      *            The style of prefixes/suffixes to append.
@@ -668,11 +661,12 @@
     }
 
     /**
-     * Use the specified {@link CurrencyUsage} instance, which provides default rounding rules for the currency in two
-     * styles, CurrencyUsage.CASH and CurrencyUsage.STANDARD.
+     * Use the specified {@link CurrencyUsage} instance, which provides default rounding rules for the
+     * currency in two styles, CurrencyUsage.CASH and CurrencyUsage.STANDARD.
      *
      * <p>
-     * The CurrencyUsage specified here will not be used unless there is a currency placeholder in the pattern.
+     * The CurrencyUsage specified here will not be used unless there is a currency placeholder in the
+     * pattern.
      *
      * @param currencyUsage
      *            The currency usage. Defaults to CurrencyUsage.STANDARD.
@@ -684,9 +678,10 @@
     }
 
     /**
-     * PARSING: Whether to require that the presence of decimal point matches the pattern. If a decimal point is not
-     * present, but the pattern contained a decimal point, parse will not succeed: null will be returned from
-     * <code>parse()</code>, and an error index will be set in the {@link ParsePosition}.
+     * PARSING: Whether to require that the presence of decimal point matches the pattern. If a decimal
+     * point is not present, but the pattern contained a decimal point, parse will not succeed: null will
+     * be returned from <code>parse()</code>, and an error index will be set in the
+     * {@link ParsePosition}.
      *
      * @param decimalPatternMatchRequired
      *            true to set an error if decimal is not present
@@ -698,8 +693,9 @@
     }
 
     /**
-     * Sets whether to always show the decimal point, even if the number doesn't require one. For example, if always
-     * show decimal is true, the number 123 would be formatted as "123." in locale <em>en-US</em>.
+     * Sets whether to always show the decimal point, even if the number doesn't require one. For
+     * example, if always show decimal is true, the number 123 would be formatted as "123." in locale
+     * <em>en-US</em>.
      *
      * @param alwaysShowDecimal
      *            Whether to show the decimal point when it is optional.
@@ -711,8 +707,9 @@
     }
 
     /**
-     * Sets whether to show the plus sign in the exponent part of numbers with a zero or positive exponent. For example,
-     * the number "1200" with the pattern "0.0E0" would be formatted as "1.2E+3" instead of "1.2E3" in <em>en-US</em>.
+     * Sets whether to show the plus sign in the exponent part of numbers with a zero or positive
+     * exponent. For example, the number "1200" with the pattern "0.0E0" would be formatted as "1.2E+3"
+     * instead of "1.2E3" in <em>en-US</em>.
      *
      * @param exponentSignAlwaysShown
      *            Whether to show the plus sign in positive exponents.
@@ -724,13 +721,13 @@
     }
 
     /**
-     * Sets the minimum width of the string output by the formatting pipeline. For example, if padding is enabled and
-     * paddingWidth is set to 6, formatting the number "3.14159" with the pattern "0.00" will result in "··3.14" if '·'
-     * is your padding string.
+     * Sets the minimum width of the string output by the formatting pipeline. For example, if padding is
+     * enabled and paddingWidth is set to 6, formatting the number "3.14159" with the pattern "0.00" will
+     * result in "··3.14" if '·' is your padding string.
      *
      * <p>
-     * If the number is longer than your padding width, the number will display as if no padding width had been
-     * specified, which may result in strings longer than the padding width.
+     * If the number is longer than your padding width, the number will display as if no padding width
+     * had been specified, which may result in strings longer than the padding width.
      *
      * <p>
      * Width is counted in UTF-16 code units.
@@ -747,9 +744,9 @@
     }
 
     /**
-     * Sets the number of digits between grouping separators. For example, the <em>en-US</em> locale uses a grouping
-     * size of 3, so the number 1234567 would be formatted as "1,234,567". For locales whose grouping sizes vary with
-     * magnitude, see {@link #setSecondaryGroupingSize(int)}.
+     * Sets the number of digits between grouping separators. For example, the <em>en-US</em> locale uses
+     * a grouping size of 3, so the number 1234567 would be formatted as "1,234,567". For locales whose
+     * grouping sizes vary with magnitude, see {@link #setSecondaryGroupingSize(int)}.
      *
      * @param groupingSize
      *            The primary grouping size.
@@ -761,8 +758,8 @@
     }
 
     /**
-     * Multiply all numbers by this power of ten before formatting. Negative multipliers reduce the magnitude and make
-     * numbers smaller (closer to zero).
+     * Multiply all numbers by this power of ten before formatting. Negative multipliers reduce the
+     * magnitude and make numbers smaller (closer to zero).
      *
      * @param magnitudeMultiplier
      *            The number of powers of ten to scale.
@@ -775,8 +772,8 @@
     }
 
     /**
-     * Sets the {@link MathContext} to be used during math and rounding operations. A MathContext encapsulates a
-     * RoundingMode and the number of significant digits in the output.
+     * Sets the {@link MathContext} to be used during math and rounding operations. A MathContext
+     * encapsulates a RoundingMode and the number of significant digits in the output.
      *
      * @param mathContext
      *            The math context to use when rounding is required.
@@ -790,11 +787,12 @@
     }
 
     /**
-     * Sets the maximum number of digits to display after the decimal point. If the number has fewer than this number of
-     * digits, the number will be rounded off using the rounding mode specified by
-     * {@link #setRoundingMode(RoundingMode)}. The pattern "#00.0#", for example, corresponds to 2 maximum fraction
-     * digits, and the number 456.789 would be formatted as "456.79" in locale <em>en-US</em> with the default rounding
-     * mode. Note that the number 456.999 would be formatted as "457.0" given the same configurations.
+     * Sets the maximum number of digits to display after the decimal point. If the number has fewer than
+     * this number of digits, the number will be rounded off using the rounding mode specified by
+     * {@link #setRoundingMode(RoundingMode)}. The pattern "#00.0#", for example, corresponds to 2
+     * maximum fraction digits, and the number 456.789 would be formatted as "456.79" in locale
+     * <em>en-US</em> with the default rounding mode. Note that the number 456.999 would be formatted as
+     * "457.0" given the same configurations.
      *
      * @param maximumFractionDigits
      *            The maximum number of fraction digits to output.
@@ -806,10 +804,11 @@
     }
 
     /**
-     * Sets the maximum number of digits to display before the decimal point. If the number has more than this number of
-     * digits, the extra digits will be truncated. For example, if maximum integer digits is 2, and you attempt to
-     * format the number 1970, you will get "70" in locale <em>en-US</em>. It is not possible to specify the maximum
-     * integer digits using a pattern string, except in the special case of a scientific format pattern.
+     * Sets the maximum number of digits to display before the decimal point. If the number has more than
+     * this number of digits, the extra digits will be truncated. For example, if maximum integer digits
+     * is 2, and you attempt to format the number 1970, you will get "70" in locale <em>en-US</em>. It is
+     * not possible to specify the maximum integer digits using a pattern string, except in the special
+     * case of a scientific format pattern.
      *
      * @param maximumIntegerDigits
      *            The maximum number of integer digits to output.
@@ -821,20 +820,21 @@
     }
 
     /**
-     * Sets the maximum number of significant digits to display. The number of significant digits is equal to the number
-     * of digits counted from the leftmost nonzero digit through the rightmost nonzero digit; for example, the number
-     * "2010" has 3 significant digits. If the number has more significant digits than specified here, the extra
-     * significant digits will be rounded off using the rounding mode specified by
-     * {@link #setRoundingMode(RoundingMode)}. For example, if maximum significant digits is 3, the number 1234.56 will
-     * be formatted as "1230" in locale <em>en-US</em> with the default rounding mode.
+     * Sets the maximum number of significant digits to display. The number of significant digits is
+     * equal to the number of digits counted from the leftmost nonzero digit through the rightmost
+     * nonzero digit; for example, the number "2010" has 3 significant digits. If the number has more
+     * significant digits than specified here, the extra significant digits will be rounded off using the
+     * rounding mode specified by {@link #setRoundingMode(RoundingMode)}. For example, if maximum
+     * significant digits is 3, the number 1234.56 will be formatted as "1230" in locale <em>en-US</em>
+     * with the default rounding mode.
      *
      * <p>
-     * If both maximum significant digits and maximum integer/fraction digits are set at the same time, the behavior is
-     * undefined.
+     * If both maximum significant digits and maximum integer/fraction digits are set at the same time,
+     * the behavior is undefined.
      *
      * <p>
-     * The number of significant digits can be specified in a pattern string using the '@' character. For example, the
-     * pattern "@@#" corresponds to a minimum of 2 and a maximum of 3 significant digits.
+     * The number of significant digits can be specified in a pattern string using the '@' character. For
+     * example, the pattern "@@#" corresponds to a minimum of 2 and a maximum of 3 significant digits.
      *
      * @param maximumSignificantDigits
      *            The maximum number of significant digits to display.
@@ -846,8 +846,9 @@
     }
 
     /**
-     * Sets the minimum number of digits to display in the exponent. For example, the number "1200" with the pattern
-     * "0.0E00", which has 2 exponent digits, would be formatted as "1.2E03" in <em>en-US</em>.
+     * Sets the minimum number of digits to display in the exponent. For example, the number "1200" with
+     * the pattern "0.0E00", which has 2 exponent digits, would be formatted as "1.2E03" in
+     * <em>en-US</em>.
      *
      * @param minimumExponentDigits
      *            The minimum number of digits to display in the exponent field.
@@ -859,9 +860,10 @@
     }
 
     /**
-     * Sets the minimum number of digits to display after the decimal point. If the number has fewer than this number of
-     * digits, the number will be padded with zeros. The pattern "#00.0#", for example, corresponds to 1 minimum
-     * fraction digit, and the number 456 would be formatted as "456.0" in locale <em>en-US</em>.
+     * Sets the minimum number of digits to display after the decimal point. If the number has fewer than
+     * this number of digits, the number will be padded with zeros. The pattern "#00.0#", for example,
+     * corresponds to 1 minimum fraction digit, and the number 456 would be formatted as "456.0" in
+     * locale <em>en-US</em>.
      *
      * @param minimumFractionDigits
      *            The minimum number of fraction digits to output.
@@ -873,10 +875,10 @@
     }
 
     /**
-     * Sets the minimum number of digits required to be beyond the first grouping separator in order to enable grouping.
-     * For example, if the minimum grouping digits is 2, then 1234 would be formatted as "1234" but 12345 would be
-     * formatted as "12,345" in <em>en-US</em>. Note that 1234567 would still be formatted as "1,234,567", not
-     * "1234,567".
+     * Sets the minimum number of digits required to be beyond the first grouping separator in order to
+     * enable grouping. For example, if the minimum grouping digits is 2, then 1234 would be formatted as
+     * "1234" but 12345 would be formatted as "12,345" in <em>en-US</em>. Note that 1234567 would still
+     * be formatted as "1,234,567", not "1234,567".
      *
      * @param minimumGroupingDigits
      *            How many digits must appear before a grouping separator before enabling grouping.
@@ -888,9 +890,10 @@
     }
 
     /**
-     * Sets the minimum number of digits to display before the decimal point. If the number has fewer than this number
-     * of digits, the number will be padded with zeros. The pattern "#00.0#", for example, corresponds to 2 minimum
-     * integer digits, and the number 5.3 would be formatted as "05.3" in locale <em>en-US</em>.
+     * Sets the minimum number of digits to display before the decimal point. If the number has fewer
+     * than this number of digits, the number will be padded with zeros. The pattern "#00.0#", for
+     * example, corresponds to 2 minimum integer digits, and the number 5.3 would be formatted as "05.3"
+     * in locale <em>en-US</em>.
      *
      * @param minimumIntegerDigits
      *            The minimum number of integer digits to output.
@@ -902,20 +905,22 @@
     }
 
     /**
-     * Sets the minimum number of significant digits to display. If, after rounding to the number of significant digits
-     * specified by {@link #setMaximumSignificantDigits}, the number of remaining significant digits is less than the
-     * minimum, the number will be padded with zeros. For example, if minimum significant digits is 3, the number 5.8
-     * will be formatted as "5.80" in locale <em>en-US</em>. Note that minimum significant digits is relevant only when
-     * numbers have digits after the decimal point.
+     * Sets the minimum number of significant digits to display. If, after rounding to the number of
+     * significant digits specified by {@link #setMaximumSignificantDigits}, the number of remaining
+     * significant digits is less than the minimum, the number will be padded with zeros. For example, if
+     * minimum significant digits is 3, the number 5.8 will be formatted as "5.80" in locale
+     * <em>en-US</em>. Note that minimum significant digits is relevant only when numbers have digits
+     * after the decimal point.
      *
      * <p>
-     * If both minimum significant digits and minimum integer/fraction digits are set at the same time, both values will
-     * be respected, and the one that results in the greater number of padding zeros will be used. For example,
-     * formatting the number 73 with 3 minimum significant digits and 2 minimum fraction digits will produce "73.00".
+     * If both minimum significant digits and minimum integer/fraction digits are set at the same time,
+     * both values will be respected, and the one that results in the greater number of padding zeros
+     * will be used. For example, formatting the number 73 with 3 minimum significant digits and 2
+     * minimum fraction digits will produce "73.00".
      *
      * <p>
-     * The number of significant digits can be specified in a pattern string using the '@' character. For example, the
-     * pattern "@@#" corresponds to a minimum of 2 and a maximum of 3 significant digits.
+     * The number of significant digits can be specified in a pattern string using the '@' character. For
+     * example, the pattern "@@#" corresponds to a minimum of 2 and a maximum of 3 significant digits.
      *
      * @param minimumSignificantDigits
      *            The minimum number of significant digits to display.
@@ -940,9 +945,10 @@
     }
 
     /**
-     * Sets the prefix to prepend to negative numbers. The prefix will be interpreted literally. For example, if you set
-     * a negative prefix of <code>n</code>, then the number -123 will be formatted as "n123" in the locale
-     * <em>en-US</em>. Note that if the negative prefix is left unset, the locale's minus sign is used.
+     * Sets the prefix to prepend to negative numbers. The prefix will be interpreted literally. For
+     * example, if you set a negative prefix of <code>n</code>, then the number -123 will be formatted as
+     * "n123" in the locale <em>en-US</em>. Note that if the negative prefix is left unset, the locale's
+     * minus sign is used.
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
@@ -958,14 +964,15 @@
     }
 
     /**
-     * Sets the prefix to prepend to negative numbers. Locale-specific symbols will be substituted into the string
-     * according to Unicode Technical Standard #35 (LDML).
+     * Sets the prefix to prepend to negative numbers. Locale-specific symbols will be substituted into
+     * the string according to Unicode Technical Standard #35 (LDML).
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
      *
      * @param negativePrefixPattern
-     *            The CharSequence to prepend to negative numbers after locale symbol substitutions take place.
+     *            The CharSequence to prepend to negative numbers after locale symbol substitutions take
+     *            place.
      * @return The property bag, for chaining.
      * @see #setNegativePrefix
      */
@@ -975,10 +982,11 @@
     }
 
     /**
-     * Sets the suffix to append to negative numbers. The suffix will be interpreted literally. For example, if you set
-     * a suffix prefix of <code>n</code>, then the number -123 will be formatted as "-123n" in the locale
-     * <em>en-US</em>. Note that the minus sign is prepended by default unless otherwise specified in either the pattern
-     * string or in one of the {@link #setNegativePrefix} methods.
+     * Sets the suffix to append to negative numbers. The suffix will be interpreted literally. For
+     * example, if you set a suffix prefix of <code>n</code>, then the number -123 will be formatted as
+     * "-123n" in the locale <em>en-US</em>. Note that the minus sign is prepended by default unless
+     * otherwise specified in either the pattern string or in one of the {@link #setNegativePrefix}
+     * methods.
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
@@ -994,14 +1002,15 @@
     }
 
     /**
-     * Sets the suffix to append to negative numbers. Locale-specific symbols will be substituted into the string
-     * according to Unicode Technical Standard #35 (LDML).
+     * Sets the suffix to append to negative numbers. Locale-specific symbols will be substituted into
+     * the string according to Unicode Technical Standard #35 (LDML).
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
      *
      * @param negativeSuffixPattern
-     *            The CharSequence to append to negative numbers after locale symbol substitutions take place.
+     *            The CharSequence to append to negative numbers after locale symbol substitutions take
+     *            place.
      * @return The property bag, for chaining.
      * @see #setNegativeSuffix
      */
@@ -1011,8 +1020,8 @@
     }
 
     /**
-     * Sets the location where the padding string is to be inserted to maintain the padding width: one of BEFORE_PREFIX,
-     * AFTER_PREFIX, BEFORE_SUFFIX, or AFTER_SUFFIX.
+     * Sets the location where the padding string is to be inserted to maintain the padding width: one of
+     * BEFORE_PREFIX, AFTER_PREFIX, BEFORE_SUFFIX, or AFTER_SUFFIX.
      *
      * <p>
      * Must be used in conjunction with {@link #setFormatWidth}.
@@ -1028,7 +1037,8 @@
     }
 
     /**
-     * Sets the string used for padding. The string should contain a single character or grapheme cluster.
+     * Sets the string used for padding. The string should contain a single character or grapheme
+     * cluster.
      *
      * <p>
      * Must be used in conjunction with {@link #setFormatWidth}.
@@ -1044,12 +1054,14 @@
     }
 
     /**
-     * Whether to require cases to match when parsing strings; default is true. Case sensitivity applies to prefixes,
-     * suffixes, the exponent separator, the symbol "NaN", and the infinity symbol. Grouping separators, decimal
-     * separators, and padding are always case-sensitive. Currencies are always case-insensitive.
+     * Whether to require cases to match when parsing strings; default is true. Case sensitivity applies
+     * to prefixes, suffixes, the exponent separator, the symbol "NaN", and the infinity symbol. Grouping
+     * separators, decimal separators, and padding are always case-sensitive. Currencies are always
+     * case-insensitive.
      *
      * <p>
-     * This setting is ignored in fast mode. In fast mode, strings are always compared in a case-sensitive way.
+     * This setting is ignored in fast mode. In fast mode, strings are always compared in a
+     * case-sensitive way.
      *
      * @param parseCaseSensitive
      *            true to be case-sensitive when parsing; false to allow any case.
@@ -1061,35 +1073,8 @@
     }
 
     /**
-     * Sets the strategy used during parsing when a code point needs to be interpreted as either a decimal separator or
-     * a grouping separator.
-     *
-     * <p>
-     * The comma, period, space, and apostrophe have different meanings in different locales. For example, in
-     * <em>en-US</em> and most American locales, the period is used as a decimal separator, but in <em>es-PY</em> and
-     * most European locales, it is used as a grouping separator.
-     *
-     * <p>
-     * Suppose you are in <em>fr-FR</em> the parser encounters the string "1.234". In <em>fr-FR</em>, the grouping is a
-     * space and the decimal is a comma. The <em>grouping mode</em> is a mechanism to let you specify whether to accept
-     * the string as 1234 (GroupingMode.DEFAULT) or whether to reject it since the separators don't match
-     * (GroupingMode.RESTRICTED).
-     *
-     * <p>
-     * When resolving grouping separators, it is the <em>equivalence class</em> of separators that is considered. For
-     * example, a period is seen as equal to a fixed set of other period-like characters.
-     *
-     * @param parseGroupingMode
-     *            The {@link GroupingMode} to use; either DEFAULT or RESTRICTED.
-     * @return The property bag, for chaining.
-     */
-    public DecimalFormatProperties setParseGroupingMode(GroupingMode parseGroupingMode) {
-        this.parseGroupingMode = parseGroupingMode;
-        return this;
-    }
-
-    /**
-     * Whether to ignore the fractional part of numbers. For example, parses "123.4" to "123" instead of "123.4".
+     * Whether to ignore the fractional part of numbers. For example, parses "123.4" to "123" instead of
+     * "123.4".
      *
      * @param parseIntegerOnly
      *            true to parse integers only; false to parse integers with their fraction parts
@@ -1101,8 +1086,8 @@
     }
 
     /**
-     * Controls certain rules for how strict this parser is when reading strings. See {@link ParseMode#LENIENT} and
-     * {@link ParseMode#STRICT}.
+     * Controls certain rules for how strict this parser is when reading strings. See
+     * {@link ParseMode#LENIENT} and {@link ParseMode#STRICT}.
      *
      * @param parseMode
      *            Either {@link ParseMode#LENIENT} or {@link ParseMode#STRICT}.
@@ -1114,7 +1099,8 @@
     }
 
     /**
-     * Whether to ignore the exponential part of numbers. For example, parses "123E4" to "123" instead of "1230000".
+     * Whether to ignore the exponential part of numbers. For example, parses "123E4" to "123" instead of
+     * "1230000".
      *
      * @param parseNoExponent
      *            true to ignore exponents; false to parse them.
@@ -1126,11 +1112,12 @@
     }
 
     /**
-     * Whether to always return a BigDecimal from {@link Parse#parse} and all other parse methods. By default, a Long or
-     * a BigInteger are returned when possible.
+     * Whether to always return a BigDecimal from parse methods. By default, a Long or a BigInteger are
+     * returned when possible.
      *
      * @param parseToBigDecimal
-     *            true to always return a BigDecimal; false to return a Long or a BigInteger when possible.
+     *            true to always return a BigDecimal; false to return a Long or a BigInteger when
+     *            possible.
      * @return The property bag, for chaining.
      */
     public DecimalFormatProperties setParseToBigDecimal(boolean parseToBigDecimal) {
@@ -1151,9 +1138,9 @@
     }
 
     /**
-     * Sets the prefix to prepend to positive numbers. The prefix will be interpreted literally. For example, if you set
-     * a positive prefix of <code>p</code>, then the number 123 will be formatted as "p123" in the locale
-     * <em>en-US</em>.
+     * Sets the prefix to prepend to positive numbers. The prefix will be interpreted literally. For
+     * example, if you set a positive prefix of <code>p</code>, then the number 123 will be formatted as
+     * "p123" in the locale <em>en-US</em>.
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
@@ -1169,14 +1156,15 @@
     }
 
     /**
-     * Sets the prefix to prepend to positive numbers. Locale-specific symbols will be substituted into the string
-     * according to Unicode Technical Standard #35 (LDML).
+     * Sets the prefix to prepend to positive numbers. Locale-specific symbols will be substituted into
+     * the string according to Unicode Technical Standard #35 (LDML).
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
      *
      * @param positivePrefixPattern
-     *            The CharSequence to prepend to positive numbers after locale symbol substitutions take place.
+     *            The CharSequence to prepend to positive numbers after locale symbol substitutions take
+     *            place.
      * @return The property bag, for chaining.
      * @see #setPositivePrefix
      */
@@ -1186,9 +1174,9 @@
     }
 
     /**
-     * Sets the suffix to append to positive numbers. The suffix will be interpreted literally. For example, if you set
-     * a positive suffix of <code>p</code>, then the number 123 will be formatted as "123p" in the locale
-     * <em>en-US</em>.
+     * Sets the suffix to append to positive numbers. The suffix will be interpreted literally. For
+     * example, if you set a positive suffix of <code>p</code>, then the number 123 will be formatted as
+     * "123p" in the locale <em>en-US</em>.
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
@@ -1204,14 +1192,15 @@
     }
 
     /**
-     * Sets the suffix to append to positive numbers. Locale-specific symbols will be substituted into the string
-     * according to Unicode Technical Standard #35 (LDML).
+     * Sets the suffix to append to positive numbers. Locale-specific symbols will be substituted into
+     * the string according to Unicode Technical Standard #35 (LDML).
      *
      * <p>
      * For more information on prefixes and suffixes, see {@link MutablePatternModifier}.
      *
      * @param positiveSuffixPattern
-     *            The CharSequence to append to positive numbers after locale symbol substitutions take place.
+     *            The CharSequence to append to positive numbers after locale symbol substitutions take
+     *            place.
      * @return The property bag, for chaining.
      * @see #setPositiveSuffix
      */
@@ -1221,15 +1210,16 @@
     }
 
     /**
-     * Sets the increment to which to round numbers. For example, with a rounding interval of 0.05, the number 11.17
-     * would be formatted as "11.15" in locale <em>en-US</em> with the default rounding mode.
+     * Sets the increment to which to round numbers. For example, with a rounding interval of 0.05, the
+     * number 11.17 would be formatted as "11.15" in locale <em>en-US</em> with the default rounding
+     * mode.
      *
      * <p>
      * You can use either a rounding increment or significant digits, but not both at the same time.
      *
      * <p>
-     * The rounding increment can be specified in a pattern string. For example, the pattern "#,##0.05" corresponds to a
-     * rounding interval of 0.05 with 1 minimum integer digit and a grouping size of 3.
+     * The rounding increment can be specified in a pattern string. For example, the pattern "#,##0.05"
+     * corresponds to a rounding interval of 0.05 with 1 minimum integer digit and a grouping size of 3.
      *
      * @param roundingIncrement
      *            The interval to which to round.
@@ -1241,9 +1231,9 @@
     }
 
     /**
-     * Sets the rounding mode, which determines under which conditions extra decimal places are rounded either up or
-     * down. See {@link RoundingMode} for details on the choices of rounding mode. The default if not set explicitly is
-     * {@link RoundingMode#HALF_EVEN}.
+     * Sets the rounding mode, which determines under which conditions extra decimal places are rounded
+     * either up or down. See {@link RoundingMode} for details on the choices of rounding mode. The
+     * default if not set explicitly is {@link RoundingMode#HALF_EVEN}.
      *
      * <p>
      * This setting is ignored if {@link #setMathContext} is used.
@@ -1260,13 +1250,13 @@
     }
 
     /**
-     * Sets the number of digits between grouping separators higher than the least-significant grouping separator. For
-     * example, the locale <em>hi</em> uses a primary grouping size of 3 and a secondary grouping size of 2, so the
-     * number 1234567 would be formatted as "12,34,567".
+     * Sets the number of digits between grouping separators higher than the least-significant grouping
+     * separator. For example, the locale <em>hi</em> uses a primary grouping size of 3 and a secondary
+     * grouping size of 2, so the number 1234567 would be formatted as "12,34,567".
      *
      * <p>
-     * The two levels of grouping separators can be specified in the pattern string. For example, the <em>hi</em>
-     * locale's default decimal format pattern is "#,##,##0.###".
+     * The two levels of grouping separators can be specified in the pattern string. For example, the
+     * <em>hi</em> locale's default decimal format pattern is "#,##,##0.###".
      *
      * @param secondaryGroupingSize
      *            The secondary grouping size.
@@ -1281,14 +1271,16 @@
      * Sets whether to always display of a plus sign on positive numbers.
      *
      * <p>
-     * If the location of the negative sign is specified by the decimal format pattern (or by the negative prefix/suffix
-     * pattern methods), a plus sign is substituted into that location, in accordance with Unicode Technical Standard
-     * #35 (LDML) section 3.2.1. Otherwise, the plus sign is prepended to the number. For example, if the decimal format
-     * pattern <code>#;#-</code> is used, then formatting 123 would result in "123+" in the locale <em>en-US</em>.
+     * If the location of the negative sign is specified by the decimal format pattern (or by the
+     * negative prefix/suffix pattern methods), a plus sign is substituted into that location, in
+     * accordance with Unicode Technical Standard #35 (LDML) section 3.2.1. Otherwise, the plus sign is
+     * prepended to the number. For example, if the decimal format pattern <code>#;#-</code> is used,
+     * then formatting 123 would result in "123+" in the locale <em>en-US</em>.
      *
      * <p>
-     * This method should be used <em>instead of</em> setting the positive prefix/suffix. The behavior is undefined if
-     * alwaysShowPlusSign is set but the positive prefix/suffix already contains a plus sign.
+     * This method should be used <em>instead of</em> setting the positive prefix/suffix. The behavior is
+     * undefined if alwaysShowPlusSign is set but the positive prefix/suffix already contains a plus
+     * sign.
      *
      * @param signAlwaysShown
      *            Whether positive numbers should display a plus sign.
@@ -1309,8 +1301,8 @@
     }
 
     /**
-     * Appends a string containing properties that differ from the default, but without being surrounded by
-     * &lt;Properties&gt;.
+     * Appends a string containing properties that differ from the default, but without being surrounded
+     * by &lt;Properties&gt;.
      */
     public void toStringBare(StringBuilder result) {
         Field[] fields = DecimalFormatProperties.class.getDeclaredFields();
@@ -1337,8 +1329,8 @@
     }
 
     /**
-     * Custom serialization: save fields along with their name, so that fields can be easily added in the future in any
-     * order. Only save fields that differ from their default value.
+     * Custom serialization: save fields along with their name, so that fields can be easily added in the
+     * future in any order. Only save fields that differ from their default value.
      */
     private void writeObject(ObjectOutputStream oos) throws IOException {
         writeObjectImpl(oos);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity.java
index 368dcfb..1a5d6f7 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity.java
@@ -14,167 +14,186 @@
  * An interface representing a number to be processed by the decimal formatting pipeline. Includes
  * methods for rounding, plural rules, and decimal digit extraction.
  *
- * <p>By design, this is NOT IMMUTABLE and NOT THREAD SAFE. It is intended to be an intermediate
- * object holding state during a pass through the decimal formatting pipeline.
+ * <p>
+ * By design, this is NOT IMMUTABLE and NOT THREAD SAFE. It is intended to be an intermediate object
+ * holding state during a pass through the decimal formatting pipeline.
  *
- * <p>Implementations of this interface are free to use any internal storage mechanism.
+ * <p>
+ * Implementations of this interface are free to use any internal storage mechanism.
  *
- * <p>TODO: Should I change this to an abstract class so that logic for min/max digits doesn't need
- * to be copied to every implementation?
+ * <p>
+ * TODO: Should I change this to an abstract class so that logic for min/max digits doesn't need to be
+ * copied to every implementation?
  */
 public interface DecimalQuantity extends PluralRules.IFixedDecimal {
-  /**
-   * Sets the minimum and maximum integer digits that this {@link DecimalQuantity} should generate.
-   * This method does not perform rounding.
-   *
-   * @param minInt The minimum number of integer digits.
-   * @param maxInt The maximum number of integer digits.
-   */
-  public void setIntegerLength(int minInt, int maxInt);
+    /**
+     * Sets the minimum and maximum integer digits that this {@link DecimalQuantity} should generate.
+     * This method does not perform rounding.
+     *
+     * @param minInt
+     *            The minimum number of integer digits.
+     * @param maxInt
+     *            The maximum number of integer digits.
+     */
+    public void setIntegerLength(int minInt, int maxInt);
 
-  /**
-   * Sets the minimum and maximum fraction digits that this {@link DecimalQuantity} should generate.
-   * This method does not perform rounding.
-   *
-   * @param minFrac The minimum number of fraction digits.
-   * @param maxFrac The maximum number of fraction digits.
-   */
-  public void setFractionLength(int minFrac, int maxFrac);
+    /**
+     * Sets the minimum and maximum fraction digits that this {@link DecimalQuantity} should generate.
+     * This method does not perform rounding.
+     *
+     * @param minFrac
+     *            The minimum number of fraction digits.
+     * @param maxFrac
+     *            The maximum number of fraction digits.
+     */
+    public void setFractionLength(int minFrac, int maxFrac);
 
-  /**
-   * Rounds the number to a specified interval, such as 0.05.
-   *
-   * <p>If rounding to a power of ten, use the more efficient {@link #roundToMagnitude} instead.
-   *
-   * @param roundingInterval The increment to which to round.
-   * @param mathContext The {@link MathContext} to use if rounding is necessary. Undefined behavior
-   *     if null.
-   */
-  public void roundToIncrement(BigDecimal roundingInterval, MathContext mathContext);
+    /**
+     * Rounds the number to a specified interval, such as 0.05.
+     *
+     * <p>
+     * If rounding to a power of ten, use the more efficient {@link #roundToMagnitude} instead.
+     *
+     * @param roundingInterval
+     *            The increment to which to round.
+     * @param mathContext
+     *            The {@link MathContext} to use if rounding is necessary. Undefined behavior if null.
+     */
+    public void roundToIncrement(BigDecimal roundingInterval, MathContext mathContext);
 
-  /**
-   * Rounds the number to a specified magnitude (power of ten).
-   *
-   * @param roundingMagnitude The power of ten to which to round. For example, a value of -2 will
-   *     round to 2 decimal places.
-   * @param mathContext The {@link MathContext} to use if rounding is necessary. Undefined behavior
-   *     if null.
-   */
-  public void roundToMagnitude(int roundingMagnitude, MathContext mathContext);
+    /**
+     * Rounds the number to a specified magnitude (power of ten).
+     *
+     * @param roundingMagnitude
+     *            The power of ten to which to round. For example, a value of -2 will round to 2 decimal
+     *            places.
+     * @param mathContext
+     *            The {@link MathContext} to use if rounding is necessary. Undefined behavior if null.
+     */
+    public void roundToMagnitude(int roundingMagnitude, MathContext mathContext);
 
-  /**
-   * Rounds the number to an infinite number of decimal points. This has no effect except for
-   * forcing the double in {@link DecimalQuantity_AbstractBCD} to adopt its exact representation.
-   */
-  public void roundToInfinity();
+    /**
+     * Rounds the number to an infinite number of decimal points. This has no effect except for forcing
+     * the double in {@link DecimalQuantity_AbstractBCD} to adopt its exact representation.
+     */
+    public void roundToInfinity();
 
-  /**
-   * Multiply the internal value.
-   *
-   * @param multiplicand The value by which to multiply.
-   */
-  public void multiplyBy(BigDecimal multiplicand);
+    /**
+     * Multiply the internal value.
+     *
+     * @param multiplicand
+     *            The value by which to multiply.
+     */
+    public void multiplyBy(BigDecimal multiplicand);
 
-  /**
-   * Scales the number by a power of ten. For example, if the value is currently "1234.56", calling
-   * this method with delta=-3 will change the value to "1.23456".
-   *
-   * @param delta The number of magnitudes of ten to change by.
-   */
-  public void adjustMagnitude(int delta);
+    /**
+     * Scales the number by a power of ten. For example, if the value is currently "1234.56", calling
+     * this method with delta=-3 will change the value to "1.23456".
+     *
+     * @param delta
+     *            The number of magnitudes of ten to change by.
+     */
+    public void adjustMagnitude(int delta);
 
-  /**
-   * @return The power of ten corresponding to the most significant nonzero digit.
-   * @throws ArithmeticException If the value represented is zero.
-   */
-  public int getMagnitude() throws ArithmeticException;
+    /**
+     * @return The power of ten corresponding to the most significant nonzero digit.
+     * @throws ArithmeticException
+     *             If the value represented is zero.
+     */
+    public int getMagnitude() throws ArithmeticException;
 
-  /** @return Whether the value represented by this {@link DecimalQuantity} is zero. */
-  public boolean isZero();
+    /** @return Whether the value represented by this {@link DecimalQuantity} is zero. */
+    public boolean isZero();
 
-  /** @return Whether the value represented by this {@link DecimalQuantity} is less than zero. */
-  public boolean isNegative();
+    /** @return Whether the value represented by this {@link DecimalQuantity} is less than zero. */
+    public boolean isNegative();
 
-  /** @return Whether the value represented by this {@link DecimalQuantity} is infinite. */
-  @Override
-  public boolean isInfinite();
+    /** @return -1 if the value is negative; 1 if positive; or 0 if zero. */
+    public int signum();
 
-  /** @return Whether the value represented by this {@link DecimalQuantity} is not a number. */
-  @Override
-  public boolean isNaN();
+    /** @return Whether the value represented by this {@link DecimalQuantity} is infinite. */
+    @Override
+    public boolean isInfinite();
 
-  /** @return The value contained in this {@link DecimalQuantity} approximated as a double. */
-  public double toDouble();
+    /** @return Whether the value represented by this {@link DecimalQuantity} is not a number. */
+    @Override
+    public boolean isNaN();
 
-  public BigDecimal toBigDecimal();
+    /** @return The value contained in this {@link DecimalQuantity} approximated as a double. */
+    public double toDouble();
 
-  public void setToBigDecimal(BigDecimal input);
+    public BigDecimal toBigDecimal();
 
-  public int maxRepresentableDigits();
+    public void setToBigDecimal(BigDecimal input);
 
-  // TODO: Should this method be removed, since DecimalQuantity implements IFixedDecimal now?
-  /**
-   * Computes the plural form for this number based on the specified set of rules.
-   *
-   * @param rules A {@link PluralRules} object representing the set of rules.
-   * @return The {@link StandardPlural} according to the PluralRules. If the plural form is not in
-   *     the set of standard plurals, {@link StandardPlural#OTHER} is returned instead.
-   */
-  public StandardPlural getStandardPlural(PluralRules rules);
+    public int maxRepresentableDigits();
 
-  /**
-   * Gets the digit at the specified magnitude. For example, if the represented number is 12.3,
-   * getDigit(-1) returns 3, since 3 is the digit corresponding to 10^-1.
-   *
-   * @param magnitude The magnitude of the digit.
-   * @return The digit at the specified magnitude.
-   */
-  public byte getDigit(int magnitude);
+    // TODO: Should this method be removed, since DecimalQuantity implements IFixedDecimal now?
+    /**
+     * Computes the plural form for this number based on the specified set of rules.
+     *
+     * @param rules
+     *            A {@link PluralRules} object representing the set of rules.
+     * @return The {@link StandardPlural} according to the PluralRules. If the plural form is not in the
+     *         set of standard plurals, {@link StandardPlural#OTHER} is returned instead.
+     */
+    public StandardPlural getStandardPlural(PluralRules rules);
 
-  /**
-   * Gets the largest power of ten that needs to be displayed. The value returned by this function
-   * will be bounded between minInt and maxInt.
-   *
-   * @return The highest-magnitude digit to be displayed.
-   */
-  public int getUpperDisplayMagnitude();
+    /**
+     * Gets the digit at the specified magnitude. For example, if the represented number is 12.3,
+     * getDigit(-1) returns 3, since 3 is the digit corresponding to 10^-1.
+     *
+     * @param magnitude
+     *            The magnitude of the digit.
+     * @return The digit at the specified magnitude.
+     */
+    public byte getDigit(int magnitude);
 
-  /**
-   * Gets the smallest power of ten that needs to be displayed. The value returned by this function
-   * will be bounded between -minFrac and -maxFrac.
-   *
-   * @return The lowest-magnitude digit to be displayed.
-   */
-  public int getLowerDisplayMagnitude();
+    /**
+     * Gets the largest power of ten that needs to be displayed. The value returned by this function will
+     * be bounded between minInt and maxInt.
+     *
+     * @return The highest-magnitude digit to be displayed.
+     */
+    public int getUpperDisplayMagnitude();
 
-  /**
-   * Returns the string in "plain" format (no exponential notation) using ASCII digits.
-   */
-  public String toPlainString();
+    /**
+     * Gets the smallest power of ten that needs to be displayed. The value returned by this function
+     * will be bounded between -minFrac and -maxFrac.
+     *
+     * @return The lowest-magnitude digit to be displayed.
+     */
+    public int getLowerDisplayMagnitude();
 
-  /**
-   * Like clone, but without the restrictions of the Cloneable interface clone.
-   *
-   * @return A copy of this instance which can be mutated without affecting this instance.
-   */
-  public DecimalQuantity createCopy();
+    /**
+     * Returns the string in "plain" format (no exponential notation) using ASCII digits.
+     */
+    public String toPlainString();
 
-  /**
-   * Sets this instance to be equal to another instance.
-   *
-   * @param other The instance to copy from.
-   */
-  public void copyFrom(DecimalQuantity other);
+    /**
+     * Like clone, but without the restrictions of the Cloneable interface clone.
+     *
+     * @return A copy of this instance which can be mutated without affecting this instance.
+     */
+    public DecimalQuantity createCopy();
 
-  /** This method is for internal testing only. */
-  public long getPositionFingerprint();
+    /**
+     * Sets this instance to be equal to another instance.
+     *
+     * @param other
+     *            The instance to copy from.
+     */
+    public void copyFrom(DecimalQuantity other);
 
-  /**
-   * If the given {@link FieldPosition} is a {@link UFieldPosition}, populates it with the fraction
-   * length and fraction long value. If the argument is not a {@link UFieldPosition}, nothing
-   * happens.
-   *
-   * @param fp The {@link UFieldPosition} to populate.
-   */
-  public void populateUFieldPosition(FieldPosition fp);
+    /** This method is for internal testing only. */
+    public long getPositionFingerprint();
+
+    /**
+     * If the given {@link FieldPosition} is a {@link UFieldPosition}, populates it with the fraction
+     * length and fraction long value. If the argument is not a {@link UFieldPosition}, nothing happens.
+     *
+     * @param fp
+     *            The {@link UFieldPosition} to populate.
+     */
+    public void populateUFieldPosition(FieldPosition fp);
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity_AbstractBCD.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity_AbstractBCD.java
index b442cf1..2e1b416 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity_AbstractBCD.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity_AbstractBCD.java
@@ -8,6 +8,7 @@
 import java.text.FieldPosition;
 
 import com.ibm.icu.impl.StandardPlural;
+import com.ibm.icu.impl.Utility;
 import com.ibm.icu.text.PluralRules;
 import com.ibm.icu.text.PluralRules.Operand;
 import com.ibm.icu.text.UFieldPosition;
@@ -19,911 +20,1003 @@
  */
 public abstract class DecimalQuantity_AbstractBCD implements DecimalQuantity {
 
-  /**
-   * The power of ten corresponding to the least significant digit in the BCD. For example, if this
-   * object represents the number "3.14", the BCD will be "0x314" and the scale will be -2.
-   *
-   * <p>Note that in {@link java.math.BigDecimal}, the scale is defined differently: the number of
-   * digits after the decimal place, which is the negative of our definition of scale.
-   */
-  protected int scale;
+    /**
+     * The power of ten corresponding to the least significant digit in the BCD. For example, if this
+     * object represents the number "3.14", the BCD will be "0x314" and the scale will be -2.
+     *
+     * <p>
+     * Note that in {@link java.math.BigDecimal}, the scale is defined differently: the number of digits
+     * after the decimal place, which is the negative of our definition of scale.
+     */
+    protected int scale;
 
-  /**
-   * The number of digits in the BCD. For example, "1007" has BCD "0x1007" and precision 4. The
-   * maximum precision is 16 since a long can hold only 16 digits.
-   *
-   * <p>This value must be re-calculated whenever the value in bcd changes by using {@link
-   * #computePrecisionAndCompact()}.
-   */
-  protected int precision;
+    /**
+     * The number of digits in the BCD. For example, "1007" has BCD "0x1007" and precision 4. A long
+     * cannot represent precisions greater than 16.
+     *
+     * <p>
+     * This value must be re-calculated whenever the value in bcd changes by using
+     * {@link #computePrecisionAndCompact()}.
+     */
+    protected int precision;
 
-  /**
-   * A bitmask of properties relating to the number represented by this object.
-   *
-   * @see #NEGATIVE_FLAG
-   * @see #INFINITY_FLAG
-   * @see #NAN_FLAG
-   */
-  protected byte flags;
+    /**
+     * A bitmask of properties relating to the number represented by this object.
+     *
+     * @see #NEGATIVE_FLAG
+     * @see #INFINITY_FLAG
+     * @see #NAN_FLAG
+     */
+    protected byte flags;
 
-  protected static final int NEGATIVE_FLAG = 1;
-  protected static final int INFINITY_FLAG = 2;
-  protected static final int NAN_FLAG = 4;
+    protected static final int NEGATIVE_FLAG = 1;
+    protected static final int INFINITY_FLAG = 2;
+    protected static final int NAN_FLAG = 4;
 
-  // The following three fields relate to the double-to-ascii fast path algorithm.
-  // When a double is given to DecimalQuantityBCD, it is converted to using a fast algorithm. The
-  // fast algorithm guarantees correctness to only the first ~12 digits of the double. The process
-  // of rounding the number ensures that the converted digits are correct, falling back to a slow-
-  // path algorithm if required.  Therefore, if a DecimalQuantity is constructed from a double, it
-  // is *required* that roundToMagnitude(), roundToIncrement(), or roundToInfinity() is called. If
-  // you don't round, assertions will fail in certain other methods if you try calling them.
+    // The following three fields relate to the double-to-ascii fast path algorithm.
+    // When a double is given to DecimalQuantityBCD, it is converted to using a fast algorithm. The
+    // fast algorithm guarantees correctness to only the first ~12 digits of the double. The process
+    // of rounding the number ensures that the converted digits are correct, falling back to a slow-
+    // path algorithm if required. Therefore, if a DecimalQuantity is constructed from a double, it
+    // is *required* that roundToMagnitude(), roundToIncrement(), or roundToInfinity() is called. If
+    // you don't round, assertions will fail in certain other methods if you try calling them.
 
-  /**
-   * The original number provided by the user and which is represented in BCD. Used when we need to
-   * re-compute the BCD for an exact double representation.
-   */
-  protected double origDouble;
+    /**
+     * The original number provided by the user and which is represented in BCD. Used when we need to
+     * re-compute the BCD for an exact double representation.
+     */
+    protected double origDouble;
 
-  /**
-   * The change in magnitude relative to the original double. Used when we need to re-compute the
-   * BCD for an exact double representation.
-   */
-  protected int origDelta;
+    /**
+     * The change in magnitude relative to the original double. Used when we need to re-compute the BCD
+     * for an exact double representation.
+     */
+    protected int origDelta;
 
-  /**
-   * Whether the value in the BCD comes from the double fast path without having been rounded to
-   * ensure correctness
-   */
-  protected boolean isApproximate;
+    /**
+     * Whether the value in the BCD comes from the double fast path without having been rounded to ensure
+     * correctness
+     */
+    protected boolean isApproximate;
 
-  // Four positions: left optional '(', left required '[', right required ']', right optional ')'.
-  // These four positions determine which digits are displayed in the output string.  They do NOT
-  // affect rounding.  These positions are internal-only and can be specified only by the public
-  // endpoints like setFractionLength, setIntegerLength, and setSignificantDigits, among others.
-  //
-  //   * Digits between lReqPos and rReqPos are in the "required zone" and are always displayed.
-  //   * Digits between lOptPos and rOptPos but outside the required zone are in the "optional zone"
-  //     and are displayed unless they are trailing off the left or right edge of the number and
-  //     have a numerical value of zero.  In order to be "trailing", the digits need to be beyond
-  //     the decimal point in their respective directions.
-  //   * Digits outside of the "optional zone" are never displayed.
-  //
-  // See the table below for illustrative examples.
-  //
-  // +---------+---------+---------+---------+------------+------------------------+--------------+
-  // | lOptPos | lReqPos | rReqPos | rOptPos |   number   |        positions       | en-US string |
-  // +---------+---------+---------+---------+------------+------------------------+--------------+
-  // |    5    |    2    |   -1    |   -5    |   1234.567 |     ( 12[34.5]67  )    |   1,234.567  |
-  // |    3    |    2    |   -1    |   -5    |   1234.567 |      1(2[34.5]67  )    |     234.567  |
-  // |    3    |    2    |   -1    |   -2    |   1234.567 |      1(2[34.5]6)7      |     234.56   |
-  // |    6    |    4    |    2    |   -5    | 123456789. |  123(45[67]89.     )   | 456,789.     |
-  // |    6    |    4    |    2    |    1    | 123456789. |     123(45[67]8)9.     | 456,780.     |
-  // |   -1    |   -1    |   -3    |   -4    | 0.123456   |     0.1([23]4)56       |        .0234 |
-  // |    6    |    4    |   -2    |   -2    |     12.3   |     (  [  12.3 ])      |    0012.30   |
-  // +---------+---------+---------+---------+------------+------------------------+--------------+
-  //
-  protected int lOptPos = Integer.MAX_VALUE;
-  protected int lReqPos = 0;
-  protected int rReqPos = 0;
-  protected int rOptPos = Integer.MIN_VALUE;
+    // Four positions: left optional '(', left required '[', right required ']', right optional ')'.
+    // These four positions determine which digits are displayed in the output string. They do NOT
+    // affect rounding. These positions are internal-only and can be specified only by the public
+    // endpoints like setFractionLength, setIntegerLength, and setSignificantDigits, among others.
+    //
+    // * Digits between lReqPos and rReqPos are in the "required zone" and are always displayed.
+    // * Digits between lOptPos and rOptPos but outside the required zone are in the "optional zone"
+    // and are displayed unless they are trailing off the left or right edge of the number and
+    // have a numerical value of zero. In order to be "trailing", the digits need to be beyond
+    // the decimal point in their respective directions.
+    // * Digits outside of the "optional zone" are never displayed.
+    //
+    // See the table below for illustrative examples.
+    //
+    // +---------+---------+---------+---------+------------+------------------------+--------------+
+    // | lOptPos | lReqPos | rReqPos | rOptPos |   number   |        positions       | en-US string |
+    // +---------+---------+---------+---------+------------+------------------------+--------------+
+    // |    5    |    2    |   -1    |   -5    |   1234.567 |     ( 12[34.5]67  )    |   1,234.567  |
+    // |    3    |    2    |   -1    |   -5    |   1234.567 |      1(2[34.5]67  )    |     234.567  |
+    // |    3    |    2    |   -1    |   -2    |   1234.567 |      1(2[34.5]6)7      |     234.56   |
+    // |    6    |    4    |    2    |   -5    | 123456789. |  123(45[67]89.     )   | 456,789.     |
+    // |    6    |    4    |    2    |    1    | 123456789. |     123(45[67]8)9.     | 456,780.     |
+    // |   -1    |   -1    |   -3    |   -4    | 0.123456   |     0.1([23]4)56       |        .0234 |
+    // |    6    |    4    |   -2    |   -2    |     12.3   |     (  [  12.3 ])      |    0012.30   |
+    // +---------+---------+---------+---------+------------+------------------------+--------------+
+    //
+    protected int lOptPos = Integer.MAX_VALUE;
+    protected int lReqPos = 0;
+    protected int rReqPos = 0;
+    protected int rOptPos = Integer.MIN_VALUE;
 
-  @Override
-  public void copyFrom(DecimalQuantity _other) {
-    copyBcdFrom(_other);
-    DecimalQuantity_AbstractBCD other = (DecimalQuantity_AbstractBCD) _other;
-    lOptPos = other.lOptPos;
-    lReqPos = other.lReqPos;
-    rReqPos = other.rReqPos;
-    rOptPos = other.rOptPos;
-    scale = other.scale;
-    precision = other.precision;
-    flags = other.flags;
-    origDouble = other.origDouble;
-    origDelta = other.origDelta;
-    isApproximate = other.isApproximate;
-  }
-
-  public DecimalQuantity_AbstractBCD clear() {
-    lOptPos = Integer.MAX_VALUE;
-    lReqPos = 0;
-    rReqPos = 0;
-    rOptPos = Integer.MIN_VALUE;
-    flags = 0;
-    setBcdToZero(); // sets scale, precision, hasDouble, origDouble, origDelta, and BCD data
-    return this;
-  }
-
-  @Override
-  public void setIntegerLength(int minInt, int maxInt) {
-    // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class.
-    assert minInt >= 0;
-    assert maxInt >= minInt;
-
-    // Save values into internal state
-    // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
-    lOptPos = maxInt;
-    lReqPos = minInt;
-  }
-
-  @Override
-  public void setFractionLength(int minFrac, int maxFrac) {
-    // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class.
-    assert minFrac >= 0;
-    assert maxFrac >= minFrac;
-
-    // Save values into internal state
-    // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
-    rReqPos = -minFrac;
-    rOptPos = -maxFrac;
-  }
-
-  @Override
-  public long getPositionFingerprint() {
-    long fingerprint = 0;
-    fingerprint ^= lOptPos;
-    fingerprint ^= (lReqPos << 16);
-    fingerprint ^= ((long) rReqPos << 32);
-    fingerprint ^= ((long) rOptPos << 48);
-    return fingerprint;
-  }
-
-  @Override
-  public void roundToIncrement(BigDecimal roundingIncrement, MathContext mathContext) {
-    // TODO: Avoid converting back and forth to BigDecimal.
-    BigDecimal temp = toBigDecimal();
-    temp =
-        temp.divide(roundingIncrement, 0, mathContext.getRoundingMode())
-            .multiply(roundingIncrement)
-            .round(mathContext);
-    if (temp.signum() == 0) {
-      setBcdToZero(); // keeps negative flag for -0.0
-    } else {
-      setToBigDecimal(temp);
-    }
-  }
-
-  @Override
-  public void multiplyBy(BigDecimal multiplicand) {
-    if (isInfinite() || isZero() || isNaN()) {
-      return;
-    }
-    BigDecimal temp = toBigDecimal();
-    temp = temp.multiply(multiplicand);
-    setToBigDecimal(temp);
-  }
-
-  @Override
-  public int getMagnitude() throws ArithmeticException {
-    if (precision == 0) {
-      throw new ArithmeticException("Magnitude is not well-defined for zero");
-    } else {
-      return scale + precision - 1;
-    }
-  }
-
-  @Override
-  public void adjustMagnitude(int delta) {
-    if (precision != 0) {
-      scale += delta;
-      origDelta += delta;
-    }
-  }
-
-  @Override
-  public StandardPlural getStandardPlural(PluralRules rules) {
-    if (rules == null) {
-      // Fail gracefully if the user didn't provide a PluralRules
-      return StandardPlural.OTHER;
-    } else {
-      @SuppressWarnings("deprecation")
-      String ruleString = rules.select(this);
-      return StandardPlural.orOtherFromString(ruleString);
-    }
-  }
-
-  @Override
-  public double getPluralOperand(Operand operand) {
-    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
-    // See the comment at the top of this file explaining the "isApproximate" field.
-    assert !isApproximate;
-
-    switch (operand) {
-      case i:
-        return toLong();
-      case f:
-        return toFractionLong(true);
-      case t:
-        return toFractionLong(false);
-      case v:
-        return fractionCount();
-      case w:
-        return fractionCountWithoutTrailingZeros();
-      default:
-        return Math.abs(toDouble());
-    }
-  }
-
-  @Override
-  public void populateUFieldPosition(FieldPosition fp) {
-    if (fp instanceof UFieldPosition) {
-      ((UFieldPosition) fp)
-          .setFractionDigits((int) getPluralOperand(Operand.v), (long) getPluralOperand(Operand.f));
-    }
-  }
-
-  @Override
-  public int getUpperDisplayMagnitude() {
-    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
-    // See the comment at the top of this file explaining the "isApproximate" field.
-    assert !isApproximate;
-
-    int magnitude = scale + precision;
-    int result = (lReqPos > magnitude) ? lReqPos : (lOptPos < magnitude) ? lOptPos : magnitude;
-    return result - 1;
-  }
-
-  @Override
-  public int getLowerDisplayMagnitude() {
-    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
-    // See the comment at the top of this file explaining the "isApproximate" field.
-    assert !isApproximate;
-
-    int magnitude = scale;
-    int result = (rReqPos < magnitude) ? rReqPos : (rOptPos > magnitude) ? rOptPos : magnitude;
-    return result;
-  }
-
-  @Override
-  public byte getDigit(int magnitude) {
-    // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
-    // See the comment at the top of this file explaining the "isApproximate" field.
-    assert !isApproximate;
-
-    return getDigitPos(magnitude - scale);
-  }
-
-  private int fractionCount() {
-    return -getLowerDisplayMagnitude();
-  }
-
-  private int fractionCountWithoutTrailingZeros() {
-    return Math.max(-scale, 0);
-  }
-
-  @Override
-  public boolean isNegative() {
-    return (flags & NEGATIVE_FLAG) != 0;
-  }
-
-  @Override
-  public boolean isInfinite() {
-    return (flags & INFINITY_FLAG) != 0;
-  }
-
-  @Override
-  public boolean isNaN() {
-    return (flags & NAN_FLAG) != 0;
-  }
-
-  @Override
-  public boolean isZero() {
-    return precision == 0;
-  }
-
-  public void setToInt(int n) {
-    setBcdToZero();
-    flags = 0;
-    if (n < 0) {
-      flags |= NEGATIVE_FLAG;
-      n = -n;
-    }
-    if (n != 0) {
-      _setToInt(n);
-      compact();
-    }
-  }
-
-  private void _setToInt(int n) {
-    if (n == Integer.MIN_VALUE) {
-      readLongToBcd(-(long) n);
-    } else {
-      readIntToBcd(n);
-    }
-  }
-
-  public void setToLong(long n) {
-    setBcdToZero();
-    flags = 0;
-    if (n < 0) {
-      flags |= NEGATIVE_FLAG;
-      n = -n;
-    }
-    if (n != 0) {
-      _setToLong(n);
-      compact();
-    }
-  }
-
-  private void _setToLong(long n) {
-    if (n == Long.MIN_VALUE) {
-      readBigIntegerToBcd(BigInteger.valueOf(n).negate());
-    } else if (n <= Integer.MAX_VALUE) {
-      readIntToBcd((int) n);
-    } else {
-      readLongToBcd(n);
-    }
-  }
-
-  public void setToBigInteger(BigInteger n) {
-    setBcdToZero();
-    flags = 0;
-    if (n.signum() == -1) {
-      flags |= NEGATIVE_FLAG;
-      n = n.negate();
-    }
-    if (n.signum() != 0) {
-      _setToBigInteger(n);
-      compact();
-    }
-  }
-
-  private void _setToBigInteger(BigInteger n) {
-    if (n.bitLength() < 32) {
-      readIntToBcd(n.intValue());
-    } else if (n.bitLength() < 64) {
-      readLongToBcd(n.longValue());
-    } else {
-      readBigIntegerToBcd(n);
-    }
-  }
-
-  /**
-   * Sets the internal BCD state to represent the value in the given double.
-   *
-   * @param n The value to consume.
-   */
-  public void setToDouble(double n) {
-    setBcdToZero();
-    flags = 0;
-    // Double.compare() handles +0.0 vs -0.0
-    if (Double.compare(n, 0.0) < 0) {
-      flags |= NEGATIVE_FLAG;
-      n = -n;
-    }
-    if (Double.isNaN(n)) {
-      flags |= NAN_FLAG;
-    } else if (Double.isInfinite(n)) {
-      flags |= INFINITY_FLAG;
-    } else if (n != 0) {
-      _setToDoubleFast(n);
-      compact();
-    }
-  }
-
-  private static final double[] DOUBLE_MULTIPLIERS = {
-    1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16,
-    1e17, 1e18, 1e19, 1e20, 1e21
-  };
-
-  /**
-   * Uses double multiplication and division to get the number into integer space before converting
-   * to digits. Since double arithmetic is inexact, the resulting digits may not be accurate.
-   */
-  private void _setToDoubleFast(double n) {
-    isApproximate = true;
-    origDouble = n;
-    origDelta = 0;
-
-    // NOTE: Unlike ICU4C, doubles are always IEEE 754 doubles.
-    long ieeeBits = Double.doubleToLongBits(n);
-    int exponent = (int) ((ieeeBits & 0x7ff0000000000000L) >> 52) - 0x3ff;
-
-    // Not all integers can be represented exactly for exponent > 52
-    if (exponent <= 52 && (long) n == n) {
-      _setToLong((long) n);
-      return;
+    @Override
+    public void copyFrom(DecimalQuantity _other) {
+        copyBcdFrom(_other);
+        DecimalQuantity_AbstractBCD other = (DecimalQuantity_AbstractBCD) _other;
+        lOptPos = other.lOptPos;
+        lReqPos = other.lReqPos;
+        rReqPos = other.rReqPos;
+        rOptPos = other.rOptPos;
+        scale = other.scale;
+        precision = other.precision;
+        flags = other.flags;
+        origDouble = other.origDouble;
+        origDelta = other.origDelta;
+        isApproximate = other.isApproximate;
     }
 
-    // 3.3219... is log2(10)
-    int fracLength = (int) ((52 - exponent) / 3.32192809489);
-    if (fracLength >= 0) {
-      int i = fracLength;
-      // 1e22 is the largest exact double.
-      for (; i >= 22; i -= 22) n *= 1e22;
-      n *= DOUBLE_MULTIPLIERS[i];
-    } else {
-      int i = fracLength;
-      // 1e22 is the largest exact double.
-      for (; i <= -22; i += 22) n /= 1e22;
-      n /= DOUBLE_MULTIPLIERS[-i];
-    }
-    long result = Math.round(n);
-    if (result != 0) {
-      _setToLong(result);
-      scale -= fracLength;
-    }
-  }
-
-  /**
-   * Uses Double.toString() to obtain an exact accurate representation of the double, overwriting it
-   * into the BCD. This method can be called at any point after {@link #_setToDoubleFast} while
-   * {@link #isApproximate} is still true.
-   */
-  private void convertToAccurateDouble() {
-    double n = origDouble;
-    assert n != 0;
-    int delta = origDelta;
-    setBcdToZero();
-
-    // Call the slow oracle function (Double.toString in Java, sprintf in C++).
-    String dstr = Double.toString(n);
-
-    if (dstr.indexOf('E') != -1) {
-      // Case 1: Exponential notation.
-      assert dstr.indexOf('.') == 1;
-      int expPos = dstr.indexOf('E');
-      _setToLong(Long.parseLong(dstr.charAt(0) + dstr.substring(2, expPos)));
-      scale += Integer.parseInt(dstr.substring(expPos + 1)) - (expPos - 1) + 1;
-    } else if (dstr.charAt(0) == '0') {
-      // Case 2: Fraction-only number.
-      assert dstr.indexOf('.') == 1;
-      _setToLong(Long.parseLong(dstr.substring(2)));
-      scale += 2 - dstr.length();
-    } else if (dstr.charAt(dstr.length() - 1) == '0') {
-      // Case 3: Integer-only number.
-      // Note: this path should not normally happen, because integer-only numbers are captured
-      // before the approximate double logic is performed.
-      assert dstr.indexOf('.') == dstr.length() - 2;
-      assert dstr.length() - 2 <= 18;
-      _setToLong(Long.parseLong(dstr.substring(0, dstr.length() - 2)));
-      // no need to adjust scale
-    } else {
-      // Case 4: Number with both a fraction and an integer.
-      int decimalPos = dstr.indexOf('.');
-      _setToLong(Long.parseLong(dstr.substring(0, decimalPos) + dstr.substring(decimalPos + 1)));
-      scale += decimalPos - dstr.length() + 1;
+    public DecimalQuantity_AbstractBCD clear() {
+        lOptPos = Integer.MAX_VALUE;
+        lReqPos = 0;
+        rReqPos = 0;
+        rOptPos = Integer.MIN_VALUE;
+        flags = 0;
+        setBcdToZero(); // sets scale, precision, hasDouble, origDouble, origDelta, and BCD data
+        return this;
     }
 
-    scale += delta;
-    compact();
-    explicitExactDouble = true;
-  }
+    @Override
+    public void setIntegerLength(int minInt, int maxInt) {
+        // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class.
+        assert minInt >= 0;
+        assert maxInt >= minInt;
 
-  /**
-   * Whether this {@link DecimalQuantity_DualStorageBCD} has been explicitly converted to an exact double. true if
-   * backed by a double that was explicitly converted via convertToAccurateDouble; false otherwise.
-   * Used for testing.
-   *
-   * @internal
-   * @deprecated This API is ICU internal only.
-   */
-  @Deprecated public boolean explicitExactDouble = false;
-
-  /**
-   * Sets the internal BCD state to represent the value in the given BigDecimal.
-   *
-   * @param n The value to consume.
-   */
-  @Override
-  public void setToBigDecimal(BigDecimal n) {
-    setBcdToZero();
-    flags = 0;
-    if (n.signum() == -1) {
-      flags |= NEGATIVE_FLAG;
-      n = n.negate();
-    }
-    if (n.signum() != 0) {
-      _setToBigDecimal(n);
-      compact();
-    }
-  }
-
-  private void _setToBigDecimal(BigDecimal n) {
-    int fracLength = n.scale();
-    n = n.scaleByPowerOfTen(fracLength);
-    BigInteger bi = n.toBigInteger();
-    _setToBigInteger(bi);
-    scale -= fracLength;
-  }
-
-  /**
-   * Returns a long approximating the internal BCD. A long can only represent the integral part of
-   * the number.
-   *
-   * @return A double representation of the internal BCD.
-   */
-  protected long toLong() {
-    long result = 0L;
-    for (int magnitude = scale + precision - 1; magnitude >= 0; magnitude--) {
-      result = result * 10 + getDigitPos(magnitude - scale);
-    }
-    return result;
-  }
-
-  /**
-   * This returns a long representing the fraction digits of the number, as required by PluralRules.
-   * For example, if we represent the number "1.20" (including optional and required digits), then
-   * this function returns "20" if includeTrailingZeros is true or "2" if false.
-   */
-  protected long toFractionLong(boolean includeTrailingZeros) {
-    long result = 0L;
-    int magnitude = -1;
-    for (;
-        (magnitude >= scale || (includeTrailingZeros && magnitude >= rReqPos))
-            && magnitude >= rOptPos;
-        magnitude--) {
-      result = result * 10 + getDigitPos(magnitude - scale);
-    }
-    return result;
-  }
-
-  /**
-   * Returns a double approximating the internal BCD. The double may not retain all of the
-   * information encoded in the BCD if the BCD represents a number out of range of a double.
-   *
-   * @return A double representation of the internal BCD.
-   */
-  @Override
-  public double toDouble() {
-    if (isApproximate) {
-      return toDoubleFromOriginal();
+        // Save values into internal state
+        // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
+        lOptPos = maxInt;
+        lReqPos = minInt;
     }
 
-    if (isNaN()) {
-      return Double.NaN;
-    } else if (isInfinite()) {
-      return isNegative() ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
+    @Override
+    public void setFractionLength(int minFrac, int maxFrac) {
+        // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class.
+        assert minFrac >= 0;
+        assert maxFrac >= minFrac;
+
+        // Save values into internal state
+        // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE
+        rReqPos = -minFrac;
+        rOptPos = -maxFrac;
     }
 
-    long tempLong = 0L;
-    int lostDigits = precision - Math.min(precision, 17);
-    for (int shift = precision - 1; shift >= lostDigits; shift--) {
-      tempLong = tempLong * 10 + getDigitPos(shift);
-    }
-    double result = tempLong;
-    int _scale = scale + lostDigits;
-    if (_scale >= 0) {
-      // 1e22 is the largest exact double.
-      int i = _scale;
-      for (; i >= 22; i -= 22) result *= 1e22;
-      result *= DOUBLE_MULTIPLIERS[i];
-    } else {
-      // 1e22 is the largest exact double.
-      int i = _scale;
-      for (; i <= -22; i += 22) result /= 1e22;
-      result /= DOUBLE_MULTIPLIERS[-i];
-    }
-    if (isNegative()) result = -result;
-    return result;
-  }
-
-  @Override
-  public BigDecimal toBigDecimal() {
-    if (isApproximate) {
-      // Converting to a BigDecimal requires Double.toString().
-      convertToAccurateDouble();
-    }
-    return bcdToBigDecimal();
-  }
-
-  protected double toDoubleFromOriginal() {
-    double result = origDouble;
-    int delta = origDelta;
-    if (delta >= 0) {
-      // 1e22 is the largest exact double.
-      for (; delta >= 22; delta -= 22) result *= 1e22;
-      result *= DOUBLE_MULTIPLIERS[delta];
-    } else {
-      // 1e22 is the largest exact double.
-      for (; delta <= -22; delta += 22) result /= 1e22;
-      result /= DOUBLE_MULTIPLIERS[-delta];
-    }
-    if (isNegative()) result *= -1;
-    return result;
-  }
-
-  private static int safeSubtract(int a, int b) {
-    int diff = a - b;
-    if (b < 0 && diff < a) return Integer.MAX_VALUE;
-    if (b > 0 && diff > a) return Integer.MIN_VALUE;
-    return diff;
-  }
-
-  private static final int SECTION_LOWER_EDGE = -1;
-  private static final int SECTION_UPPER_EDGE = -2;
-
-  @Override
-  public void roundToMagnitude(int magnitude, MathContext mathContext) {
-    // The position in the BCD at which rounding will be performed; digits to the right of position
-    // will be rounded away.
-    // TODO: Andy: There was a test failure because of integer overflow here. Should I do
-    // "safe subtraction" everywhere in the code?  What's the nicest way to do it?
-    int position = safeSubtract(magnitude, scale);
-
-    // Enforce the number of digits required by the MathContext.
-    int _mcPrecision = mathContext.getPrecision();
-    if (magnitude == Integer.MAX_VALUE
-        || (_mcPrecision > 0 && precision - position > _mcPrecision)) {
-      position = precision - _mcPrecision;
+    @Override
+    public long getPositionFingerprint() {
+        long fingerprint = 0;
+        fingerprint ^= lOptPos;
+        fingerprint ^= (lReqPos << 16);
+        fingerprint ^= ((long) rReqPos << 32);
+        fingerprint ^= ((long) rOptPos << 48);
+        return fingerprint;
     }
 
-    if (position <= 0 && !isApproximate) {
-      // All digits are to the left of the rounding magnitude.
-    } else if (precision == 0) {
-      // No rounding for zero.
-    } else {
-      // Perform rounding logic.
-      // "leading" = most significant digit to the right of rounding
-      // "trailing" = least significant digit to the left of rounding
-      byte leadingDigit = getDigitPos(safeSubtract(position, 1));
-      byte trailingDigit = getDigitPos(position);
-
-      // Compute which section of the number we are in.
-      // EDGE means we are at the bottom or top edge, like 1.000 or 1.999 (used by doubles)
-      // LOWER means we are between the bottom edge and the midpoint, like 1.391
-      // MIDPOINT means we are exactly in the middle, like 1.500
-      // UPPER means we are between the midpoint and the top edge, like 1.916
-      int section = RoundingUtils.SECTION_MIDPOINT;
-      if (!isApproximate) {
-        if (leadingDigit < 5) {
-          section = RoundingUtils.SECTION_LOWER;
-        } else if (leadingDigit > 5) {
-          section = RoundingUtils.SECTION_UPPER;
+    @Override
+    public void roundToIncrement(BigDecimal roundingIncrement, MathContext mathContext) {
+        // TODO: Avoid converting back and forth to BigDecimal.
+        BigDecimal temp = toBigDecimal();
+        temp = temp.divide(roundingIncrement, 0, mathContext.getRoundingMode())
+                .multiply(roundingIncrement).round(mathContext);
+        if (temp.signum() == 0) {
+            setBcdToZero(); // keeps negative flag for -0.0
         } else {
-          for (int p = safeSubtract(position, 2); p >= 0; p--) {
-            if (getDigitPos(p) != 0) {
-              section = RoundingUtils.SECTION_UPPER;
-              break;
-            }
-          }
+            setToBigDecimal(temp);
         }
-      } else {
-        int p = safeSubtract(position, 2);
-        int minP = Math.max(0, precision - 14);
-        if (leadingDigit == 0) {
-          section = SECTION_LOWER_EDGE;
-          for (; p >= minP; p--) {
-            if (getDigitPos(p) != 0) {
-              section = RoundingUtils.SECTION_LOWER;
-              break;
-            }
-          }
-        } else if (leadingDigit == 4) {
-          for (; p >= minP; p--) {
-            if (getDigitPos(p) != 9) {
-              section = RoundingUtils.SECTION_LOWER;
-              break;
-            }
-          }
-        } else if (leadingDigit == 5) {
-          for (; p >= minP; p--) {
-            if (getDigitPos(p) != 0) {
-              section = RoundingUtils.SECTION_UPPER;
-              break;
-            }
-          }
-        } else if (leadingDigit == 9) {
-          section = SECTION_UPPER_EDGE;
-          for (; p >= minP; p--) {
-            if (getDigitPos(p) != 9) {
-              section = RoundingUtils.SECTION_UPPER;
-              break;
-            }
-          }
-        } else if (leadingDigit < 5) {
-          section = RoundingUtils.SECTION_LOWER;
+    }
+
+    @Override
+    public void multiplyBy(BigDecimal multiplicand) {
+        if (isInfinite() || isZero() || isNaN()) {
+            return;
+        }
+        BigDecimal temp = toBigDecimal();
+        temp = temp.multiply(multiplicand);
+        setToBigDecimal(temp);
+    }
+
+    @Override
+    public int getMagnitude() throws ArithmeticException {
+        if (precision == 0) {
+            throw new ArithmeticException("Magnitude is not well-defined for zero");
         } else {
-          section = RoundingUtils.SECTION_UPPER;
+            return scale + precision - 1;
         }
+    }
 
-        boolean roundsAtMidpoint =
-            RoundingUtils.roundsAtMidpoint(mathContext.getRoundingMode().ordinal());
-        if (safeSubtract(position, 1) < precision - 14
-            || (roundsAtMidpoint && section == RoundingUtils.SECTION_MIDPOINT)
-            || (!roundsAtMidpoint && section < 0 /* i.e. at upper or lower edge */)) {
-          // Oops! This means that we have to get the exact representation of the double, because
-          // the zone of uncertainty is along the rounding boundary.
-          convertToAccurateDouble();
-          roundToMagnitude(magnitude, mathContext); // start over
-          return;
+    @Override
+    public void adjustMagnitude(int delta) {
+        if (precision != 0) {
+            scale = Utility.addExact(scale, delta);
+            origDelta = Utility.addExact(origDelta, delta);
         }
+    }
 
-        // Turn off the approximate double flag, since the value is now confirmed to be exact.
-        isApproximate = false;
-        origDouble = 0.0;
+    @Override
+    public StandardPlural getStandardPlural(PluralRules rules) {
+        if (rules == null) {
+            // Fail gracefully if the user didn't provide a PluralRules
+            return StandardPlural.OTHER;
+        } else {
+            @SuppressWarnings("deprecation")
+            String ruleString = rules.select(this);
+            return StandardPlural.orOtherFromString(ruleString);
+        }
+    }
+
+    @Override
+    public double getPluralOperand(Operand operand) {
+        // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
+        // See the comment at the top of this file explaining the "isApproximate" field.
+        assert !isApproximate;
+
+        switch (operand) {
+        case i:
+            return toLong();
+        case f:
+            return toFractionLong(true);
+        case t:
+            return toFractionLong(false);
+        case v:
+            return fractionCount();
+        case w:
+            return fractionCountWithoutTrailingZeros();
+        default:
+            return Math.abs(toDouble());
+        }
+    }
+
+    @Override
+    public void populateUFieldPosition(FieldPosition fp) {
+        if (fp instanceof UFieldPosition) {
+            ((UFieldPosition) fp).setFractionDigits((int) getPluralOperand(Operand.v),
+                    (long) getPluralOperand(Operand.f));
+        }
+    }
+
+    @Override
+    public int getUpperDisplayMagnitude() {
+        // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
+        // See the comment at the top of this file explaining the "isApproximate" field.
+        assert !isApproximate;
+
+        int magnitude = scale + precision;
+        int result = (lReqPos > magnitude) ? lReqPos : (lOptPos < magnitude) ? lOptPos : magnitude;
+        return result - 1;
+    }
+
+    @Override
+    public int getLowerDisplayMagnitude() {
+        // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
+        // See the comment at the top of this file explaining the "isApproximate" field.
+        assert !isApproximate;
+
+        int magnitude = scale;
+        int result = (rReqPos < magnitude) ? rReqPos : (rOptPos > magnitude) ? rOptPos : magnitude;
+        return result;
+    }
+
+    @Override
+    public byte getDigit(int magnitude) {
+        // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
+        // See the comment at the top of this file explaining the "isApproximate" field.
+        assert !isApproximate;
+
+        return getDigitPos(magnitude - scale);
+    }
+
+    private int fractionCount() {
+        return -getLowerDisplayMagnitude();
+    }
+
+    private int fractionCountWithoutTrailingZeros() {
+        return Math.max(-scale, 0);
+    }
+
+    @Override
+    public boolean isNegative() {
+        return (flags & NEGATIVE_FLAG) != 0;
+    }
+
+    @Override
+    public int signum() {
+        return isNegative() ? -1 : isZero() ? 0 : 1;
+    }
+
+    @Override
+    public boolean isInfinite() {
+        return (flags & INFINITY_FLAG) != 0;
+    }
+
+    @Override
+    public boolean isNaN() {
+        return (flags & NAN_FLAG) != 0;
+    }
+
+    @Override
+    public boolean isZero() {
+        return precision == 0;
+    }
+
+    public void setToInt(int n) {
+        setBcdToZero();
+        flags = 0;
+        if (n < 0) {
+            flags |= NEGATIVE_FLAG;
+            n = -n;
+        }
+        if (n != 0) {
+            _setToInt(n);
+            compact();
+        }
+    }
+
+    private void _setToInt(int n) {
+        if (n == Integer.MIN_VALUE) {
+            readLongToBcd(-(long) n);
+        } else {
+            readIntToBcd(n);
+        }
+    }
+
+    public void setToLong(long n) {
+        setBcdToZero();
+        flags = 0;
+        if (n < 0) {
+            flags |= NEGATIVE_FLAG;
+            n = -n;
+        }
+        if (n != 0) {
+            _setToLong(n);
+            compact();
+        }
+    }
+
+    private void _setToLong(long n) {
+        if (n == Long.MIN_VALUE) {
+            readBigIntegerToBcd(BigInteger.valueOf(n).negate());
+        } else if (n <= Integer.MAX_VALUE) {
+            readIntToBcd((int) n);
+        } else {
+            readLongToBcd(n);
+        }
+    }
+
+    public void setToBigInteger(BigInteger n) {
+        setBcdToZero();
+        flags = 0;
+        if (n.signum() == -1) {
+            flags |= NEGATIVE_FLAG;
+            n = n.negate();
+        }
+        if (n.signum() != 0) {
+            _setToBigInteger(n);
+            compact();
+        }
+    }
+
+    private void _setToBigInteger(BigInteger n) {
+        if (n.bitLength() < 32) {
+            readIntToBcd(n.intValue());
+        } else if (n.bitLength() < 64) {
+            readLongToBcd(n.longValue());
+        } else {
+            readBigIntegerToBcd(n);
+        }
+    }
+
+    /**
+     * Sets the internal BCD state to represent the value in the given double.
+     *
+     * @param n
+     *            The value to consume.
+     */
+    public void setToDouble(double n) {
+        setBcdToZero();
+        flags = 0;
+        // Double.compare() handles +0.0 vs -0.0
+        if (Double.compare(n, 0.0) < 0) {
+            flags |= NEGATIVE_FLAG;
+            n = -n;
+        }
+        if (Double.isNaN(n)) {
+            flags |= NAN_FLAG;
+        } else if (Double.isInfinite(n)) {
+            flags |= INFINITY_FLAG;
+        } else if (n != 0) {
+            _setToDoubleFast(n);
+            compact();
+        }
+    }
+
+    private static final double[] DOUBLE_MULTIPLIERS = {
+            1e0,
+            1e1,
+            1e2,
+            1e3,
+            1e4,
+            1e5,
+            1e6,
+            1e7,
+            1e8,
+            1e9,
+            1e10,
+            1e11,
+            1e12,
+            1e13,
+            1e14,
+            1e15,
+            1e16,
+            1e17,
+            1e18,
+            1e19,
+            1e20,
+            1e21 };
+
+    /**
+     * Uses double multiplication and division to get the number into integer space before converting to
+     * digits. Since double arithmetic is inexact, the resulting digits may not be accurate.
+     */
+    private void _setToDoubleFast(double n) {
+        isApproximate = true;
+        origDouble = n;
         origDelta = 0;
 
-        if (position <= 0) {
-          // All digits are to the left of the rounding magnitude.
-          return;
+        // NOTE: Unlike ICU4C, doubles are always IEEE 754 doubles.
+        long ieeeBits = Double.doubleToLongBits(n);
+        int exponent = (int) ((ieeeBits & 0x7ff0000000000000L) >> 52) - 0x3ff;
+
+        // Not all integers can be represented exactly for exponent > 52
+        if (exponent <= 52 && (long) n == n) {
+            _setToLong((long) n);
+            return;
         }
 
-        // Good to continue rounding.
-        if (section == SECTION_LOWER_EDGE) section = RoundingUtils.SECTION_LOWER;
-        if (section == SECTION_UPPER_EDGE) section = RoundingUtils.SECTION_UPPER;
-      }
+        // 3.3219... is log2(10)
+        int fracLength = (int) ((52 - exponent) / 3.32192809489);
+        if (fracLength >= 0) {
+            int i = fracLength;
+            // 1e22 is the largest exact double.
+            for (; i >= 22; i -= 22)
+                n *= 1e22;
+            n *= DOUBLE_MULTIPLIERS[i];
+        } else {
+            int i = fracLength;
+            // 1e22 is the largest exact double.
+            for (; i <= -22; i += 22)
+                n /= 1e22;
+            n /= DOUBLE_MULTIPLIERS[-i];
+        }
+        long result = Math.round(n);
+        if (result != 0) {
+            _setToLong(result);
+            scale -= fracLength;
+        }
+    }
 
-      boolean roundDown =
-          RoundingUtils.getRoundingDirection(
-              (trailingDigit % 2) == 0,
-              isNegative(),
-              section,
-              mathContext.getRoundingMode().ordinal(),
-              this);
-
-      // Perform truncation
-      if (position >= precision) {
+    /**
+     * Uses Double.toString() to obtain an exact accurate representation of the double, overwriting it
+     * into the BCD. This method can be called at any point after {@link #_setToDoubleFast} while
+     * {@link #isApproximate} is still true.
+     */
+    private void convertToAccurateDouble() {
+        double n = origDouble;
+        assert n != 0;
+        int delta = origDelta;
         setBcdToZero();
-        scale = magnitude;
-      } else {
-        shiftRight(position);
-      }
 
-      // Bubble the result to the higher digits
-      if (!roundDown) {
-        if (trailingDigit == 9) {
-          int bubblePos = 0;
-          // Note: in the long implementation, the most digits BCD can have at this point is 15,
-          // so bubblePos <= 15 and getDigitPos(bubblePos) is safe.
-          for (; getDigitPos(bubblePos) == 9; bubblePos++) {}
-          shiftRight(bubblePos); // shift off the trailing 9s
+        // Call the slow oracle function (Double.toString in Java, sprintf in C++).
+        String dstr = Double.toString(n);
+
+        if (dstr.indexOf('E') != -1) {
+            // Case 1: Exponential notation.
+            assert dstr.indexOf('.') == 1;
+            int expPos = dstr.indexOf('E');
+            _setToLong(Long.parseLong(dstr.charAt(0) + dstr.substring(2, expPos)));
+            scale += Integer.parseInt(dstr.substring(expPos + 1)) - (expPos - 1) + 1;
+        } else if (dstr.charAt(0) == '0') {
+            // Case 2: Fraction-only number.
+            assert dstr.indexOf('.') == 1;
+            _setToLong(Long.parseLong(dstr.substring(2)));
+            scale += 2 - dstr.length();
+        } else if (dstr.charAt(dstr.length() - 1) == '0') {
+            // Case 3: Integer-only number.
+            // Note: this path should not normally happen, because integer-only numbers are captured
+            // before the approximate double logic is performed.
+            assert dstr.indexOf('.') == dstr.length() - 2;
+            assert dstr.length() - 2 <= 18;
+            _setToLong(Long.parseLong(dstr.substring(0, dstr.length() - 2)));
+            // no need to adjust scale
+        } else {
+            // Case 4: Number with both a fraction and an integer.
+            int decimalPos = dstr.indexOf('.');
+            _setToLong(Long.parseLong(dstr.substring(0, decimalPos) + dstr.substring(decimalPos + 1)));
+            scale += decimalPos - dstr.length() + 1;
         }
-        byte digit0 = getDigitPos(0);
-        assert digit0 != 9;
-        setDigitPos(0, (byte) (digit0 + 1));
-        precision += 1; // in case an extra digit got added
-      }
 
-      compact();
-    }
-  }
-
-  @Override
-  public void roundToInfinity() {
-    if (isApproximate) {
-      convertToAccurateDouble();
-    }
-  }
-
-  /**
-   * Appends a digit, optionally with one or more leading zeros, to the end of the value represented
-   * by this DecimalQuantity.
-   *
-   * <p>The primary use of this method is to construct numbers during a parsing loop. It allows
-   * parsing to take advantage of the digit list infrastructure primarily designed for formatting.
-   *
-   * @param value The digit to append.
-   * @param leadingZeros The number of zeros to append before the digit. For example, if the value
-   *     in this instance starts as 12.3, and you append a 4 with 1 leading zero, the value becomes
-   *     12.304.
-   * @param appendAsInteger If true, increase the magnitude of existing digits to make room for the
-   *     new digit. If false, append to the end like a fraction digit. If true, there must not be
-   *     any fraction digits already in the number.
-   * @internal
-   * @deprecated This API is ICU internal only.
-   */
-  @Deprecated
-  public void appendDigit(byte value, int leadingZeros, boolean appendAsInteger) {
-    assert leadingZeros >= 0;
-
-    // Zero requires special handling to maintain the invariant that the least-significant digit
-    // in the BCD is nonzero.
-    if (value == 0) {
-      if (appendAsInteger && precision != 0) {
-        scale += leadingZeros + 1;
-      }
-      return;
+        scale += delta;
+        compact();
+        explicitExactDouble = true;
     }
 
-    // Deal with trailing zeros
-    if (scale > 0) {
-      leadingZeros += scale;
-      if (appendAsInteger) {
-        scale = 0;
-      }
+    /**
+     * Whether this {@link DecimalQuantity_DualStorageBCD} has been explicitly converted to an exact
+     * double. true if backed by a double that was explicitly converted via convertToAccurateDouble;
+     * false otherwise. Used for testing.
+     *
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public boolean explicitExactDouble = false;
+
+    /**
+     * Sets the internal BCD state to represent the value in the given BigDecimal.
+     *
+     * @param n
+     *            The value to consume.
+     */
+    @Override
+    public void setToBigDecimal(BigDecimal n) {
+        setBcdToZero();
+        flags = 0;
+        if (n.signum() == -1) {
+            flags |= NEGATIVE_FLAG;
+            n = n.negate();
+        }
+        if (n.signum() != 0) {
+            _setToBigDecimal(n);
+            compact();
+        }
     }
 
-    // Append digit
-    shiftLeft(leadingZeros + 1);
-    setDigitPos(0, value);
-
-    // Fix scale if in integer mode
-    if (appendAsInteger) {
-      scale += leadingZeros + 1;
+    private void _setToBigDecimal(BigDecimal n) {
+        int fracLength = n.scale();
+        n = n.scaleByPowerOfTen(fracLength);
+        BigInteger bi = n.toBigInteger();
+        _setToBigInteger(bi);
+        scale -= fracLength;
     }
-  }
 
-  @Override
-  public String toPlainString() {
-      // NOTE: This logic is duplicated between here and DecimalQuantity_SimpleStorage.
-      StringBuilder sb = new StringBuilder();
-      if (isNegative()) {
-          sb.append('-');
-      }
-      for (int m = getUpperDisplayMagnitude(); m >= getLowerDisplayMagnitude(); m--) {
-        sb.append(getDigit(m));
-        if (m == 0) sb.append('.');
-      }
-      return sb.toString();
-  }
+    /**
+     * Returns a long approximating the internal BCD. A long can only represent the integral part of the
+     * number.
+     *
+     * @return A double representation of the internal BCD.
+     */
+    public long toLong() {
+        long result = 0L;
+        for (int magnitude = scale + precision - 1; magnitude >= 0; magnitude--) {
+            result = result * 10 + getDigitPos(magnitude - scale);
+        }
+        return result;
+    }
 
-  /**
-   * Returns a single digit from the BCD list. No internal state is changed by calling this method.
-   *
-   * @param position The position of the digit to pop, counted in BCD units from the least
-   *     significant digit. If outside the range supported by the implementation, zero is returned.
-   * @return The digit at the specified location.
-   */
-  protected abstract byte getDigitPos(int position);
+    /**
+     * This returns a long representing the fraction digits of the number, as required by PluralRules.
+     * For example, if we represent the number "1.20" (including optional and required digits), then this
+     * function returns "20" if includeTrailingZeros is true or "2" if false.
+     */
+    public long toFractionLong(boolean includeTrailingZeros) {
+        long result = 0L;
+        int magnitude = -1;
+        for (; (magnitude >= scale || (includeTrailingZeros && magnitude >= rReqPos))
+                && magnitude >= rOptPos; magnitude--) {
+            result = result * 10 + getDigitPos(magnitude - scale);
+        }
+        return result;
+    }
 
-  /**
-   * Sets the digit in the BCD list. This method only sets the digit; it is the caller's
-   * responsibility to call {@link #compact} after setting the digit.
-   *
-   * @param position The position of the digit to pop, counted in BCD units from the least
-   *     significant digit. If outside the range supported by the implementation, an AssertionError
-   *     is thrown.
-   * @param value The digit to set at the specified location.
-   */
-  protected abstract void setDigitPos(int position, byte value);
+    static final byte[] INT64_BCD = { 9, 2, 2, 3, 3, 7, 2, 0, 3, 6, 8, 5, 4, 7, 7, 5, 8, 0, 7 };
 
-  /**
-   * Adds zeros to the end of the BCD list. This will result in an invalid BCD representation; it is
-   * the caller's responsibility to do further manipulation and then call {@link #compact}.
-   *
-   * @param numDigits The number of zeros to add.
-   */
-  protected abstract void shiftLeft(int numDigits);
+    /**
+     * Returns whether or not a Long can fully represent the value stored in this DecimalQuantity.
+     * Assumes that the DecimalQuantity is positive.
+     */
+    public boolean fitsInLong() {
+        if (isZero()) {
+            return true;
+        }
+        if (scale < 0) {
+            return false;
+        }
+        int magnitude = getMagnitude();
+        if (magnitude < 18) {
+            return true;
+        }
+        if (magnitude > 18) {
+            return false;
+        }
+        // Hard case: the magnitude is 10^18.
+        // The largest int64 is: 9,223,372,036,854,775,807
+        for (int p = 0; p < precision; p++) {
+            byte digit = getDigit(18 - p);
+            if (digit < INT64_BCD[p]) {
+                return true;
+            } else if (digit > INT64_BCD[p]) {
+                return false;
+            }
+        }
+        // Exactly equal to max long.
+        return true;
+    }
 
-  protected abstract void shiftRight(int numDigits);
+    /**
+     * Returns a double approximating the internal BCD. The double may not retain all of the information
+     * encoded in the BCD if the BCD represents a number out of range of a double.
+     *
+     * @return A double representation of the internal BCD.
+     */
+    @Override
+    public double toDouble() {
+        if (isApproximate) {
+            return toDoubleFromOriginal();
+        }
 
-  /**
-   * Sets the internal representation to zero. Clears any values stored in scale, precision,
-   * hasDouble, origDouble, origDelta, and BCD data.
-   */
-  protected abstract void setBcdToZero();
+        if (isNaN()) {
+            return Double.NaN;
+        } else if (isInfinite()) {
+            return isNegative() ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
+        }
 
-  /**
-   * Sets the internal BCD state to represent the value in the given int. The int is guaranteed to
-   * be either positive. The internal state is guaranteed to be empty when this method is called.
-   *
-   * @param n The value to consume.
-   */
-  protected abstract void readIntToBcd(int input);
+        long tempLong = 0L;
+        int lostDigits = precision - Math.min(precision, 17);
+        for (int shift = precision - 1; shift >= lostDigits; shift--) {
+            tempLong = tempLong * 10 + getDigitPos(shift);
+        }
+        double result = tempLong;
+        int _scale = scale + lostDigits;
+        if (_scale >= 0) {
+            // 1e22 is the largest exact double.
+            int i = _scale;
+            for (; i >= 22; i -= 22)
+                result *= 1e22;
+            result *= DOUBLE_MULTIPLIERS[i];
+        } else {
+            // 1e22 is the largest exact double.
+            int i = _scale;
+            for (; i <= -22; i += 22)
+                result /= 1e22;
+            result /= DOUBLE_MULTIPLIERS[-i];
+        }
+        if (isNegative())
+            result = -result;
+        return result;
+    }
 
-  /**
-   * Sets the internal BCD state to represent the value in the given long. The long is guaranteed to
-   * be either positive. The internal state is guaranteed to be empty when this method is called.
-   *
-   * @param n The value to consume.
-   */
-  protected abstract void readLongToBcd(long input);
+    @Override
+    public BigDecimal toBigDecimal() {
+        if (isApproximate) {
+            // Converting to a BigDecimal requires Double.toString().
+            convertToAccurateDouble();
+        }
+        return bcdToBigDecimal();
+    }
 
-  /**
-   * Sets the internal BCD state to represent the value in the given BigInteger. The BigInteger is
-   * guaranteed to be positive, and it is guaranteed to be larger than Long.MAX_VALUE. The internal
-   * state is guaranteed to be empty when this method is called.
-   *
-   * @param n The value to consume.
-   */
-  protected abstract void readBigIntegerToBcd(BigInteger input);
+    protected double toDoubleFromOriginal() {
+        double result = origDouble;
+        int delta = origDelta;
+        if (delta >= 0) {
+            // 1e22 is the largest exact double.
+            for (; delta >= 22; delta -= 22)
+                result *= 1e22;
+            result *= DOUBLE_MULTIPLIERS[delta];
+        } else {
+            // 1e22 is the largest exact double.
+            for (; delta <= -22; delta += 22)
+                result /= 1e22;
+            result /= DOUBLE_MULTIPLIERS[-delta];
+        }
+        if (isNegative())
+            result *= -1;
+        return result;
+    }
 
-  /**
-   * Returns a BigDecimal encoding the internal BCD value.
-   *
-   * @return A BigDecimal representation of the internal BCD.
-   */
-  protected abstract BigDecimal bcdToBigDecimal();
+    private static int safeSubtract(int a, int b) {
+        int diff = a - b;
+        if (b < 0 && diff < a)
+            return Integer.MAX_VALUE;
+        if (b > 0 && diff > a)
+            return Integer.MIN_VALUE;
+        return diff;
+    }
 
-  protected abstract void copyBcdFrom(DecimalQuantity _other);
+    private static final int SECTION_LOWER_EDGE = -1;
+    private static final int SECTION_UPPER_EDGE = -2;
 
-  /**
-   * Removes trailing zeros from the BCD (adjusting the scale as required) and then computes the
-   * precision. The precision is the number of digits in the number up through the greatest nonzero
-   * digit.
-   *
-   * <p>This method must always be called when bcd changes in order for assumptions to be correct in
-   * methods like {@link #fractionCount()}.
-   */
-  protected abstract void compact();
+    @Override
+    public void roundToMagnitude(int magnitude, MathContext mathContext) {
+        // The position in the BCD at which rounding will be performed; digits to the right of position
+        // will be rounded away.
+        // TODO: Andy: There was a test failure because of integer overflow here. Should I do
+        // "safe subtraction" everywhere in the code? What's the nicest way to do it?
+        int position = safeSubtract(magnitude, scale);
+
+        // Enforce the number of digits required by the MathContext.
+        int _mcPrecision = mathContext.getPrecision();
+        if (magnitude == Integer.MAX_VALUE
+                || (_mcPrecision > 0 && precision - position > _mcPrecision)) {
+            position = precision - _mcPrecision;
+        }
+
+        if (position <= 0 && !isApproximate) {
+            // All digits are to the left of the rounding magnitude.
+        } else if (precision == 0) {
+            // No rounding for zero.
+        } else {
+            // Perform rounding logic.
+            // "leading" = most significant digit to the right of rounding
+            // "trailing" = least significant digit to the left of rounding
+            byte leadingDigit = getDigitPos(safeSubtract(position, 1));
+            byte trailingDigit = getDigitPos(position);
+
+            // Compute which section of the number we are in.
+            // EDGE means we are at the bottom or top edge, like 1.000 or 1.999 (used by doubles)
+            // LOWER means we are between the bottom edge and the midpoint, like 1.391
+            // MIDPOINT means we are exactly in the middle, like 1.500
+            // UPPER means we are between the midpoint and the top edge, like 1.916
+            int section = RoundingUtils.SECTION_MIDPOINT;
+            if (!isApproximate) {
+                if (leadingDigit < 5) {
+                    section = RoundingUtils.SECTION_LOWER;
+                } else if (leadingDigit > 5) {
+                    section = RoundingUtils.SECTION_UPPER;
+                } else {
+                    for (int p = safeSubtract(position, 2); p >= 0; p--) {
+                        if (getDigitPos(p) != 0) {
+                            section = RoundingUtils.SECTION_UPPER;
+                            break;
+                        }
+                    }
+                }
+            } else {
+                int p = safeSubtract(position, 2);
+                int minP = Math.max(0, precision - 14);
+                if (leadingDigit == 0) {
+                    section = SECTION_LOWER_EDGE;
+                    for (; p >= minP; p--) {
+                        if (getDigitPos(p) != 0) {
+                            section = RoundingUtils.SECTION_LOWER;
+                            break;
+                        }
+                    }
+                } else if (leadingDigit == 4) {
+                    for (; p >= minP; p--) {
+                        if (getDigitPos(p) != 9) {
+                            section = RoundingUtils.SECTION_LOWER;
+                            break;
+                        }
+                    }
+                } else if (leadingDigit == 5) {
+                    for (; p >= minP; p--) {
+                        if (getDigitPos(p) != 0) {
+                            section = RoundingUtils.SECTION_UPPER;
+                            break;
+                        }
+                    }
+                } else if (leadingDigit == 9) {
+                    section = SECTION_UPPER_EDGE;
+                    for (; p >= minP; p--) {
+                        if (getDigitPos(p) != 9) {
+                            section = RoundingUtils.SECTION_UPPER;
+                            break;
+                        }
+                    }
+                } else if (leadingDigit < 5) {
+                    section = RoundingUtils.SECTION_LOWER;
+                } else {
+                    section = RoundingUtils.SECTION_UPPER;
+                }
+
+                boolean roundsAtMidpoint = RoundingUtils
+                        .roundsAtMidpoint(mathContext.getRoundingMode().ordinal());
+                if (safeSubtract(position, 1) < precision - 14
+                        || (roundsAtMidpoint && section == RoundingUtils.SECTION_MIDPOINT)
+                        || (!roundsAtMidpoint && section < 0 /* i.e. at upper or lower edge */)) {
+                    // Oops! This means that we have to get the exact representation of the double,
+                    // because
+                    // the zone of uncertainty is along the rounding boundary.
+                    convertToAccurateDouble();
+                    roundToMagnitude(magnitude, mathContext); // start over
+                    return;
+                }
+
+                // Turn off the approximate double flag, since the value is now confirmed to be exact.
+                isApproximate = false;
+                origDouble = 0.0;
+                origDelta = 0;
+
+                if (position <= 0) {
+                    // All digits are to the left of the rounding magnitude.
+                    return;
+                }
+
+                // Good to continue rounding.
+                if (section == SECTION_LOWER_EDGE)
+                    section = RoundingUtils.SECTION_LOWER;
+                if (section == SECTION_UPPER_EDGE)
+                    section = RoundingUtils.SECTION_UPPER;
+            }
+
+            boolean roundDown = RoundingUtils.getRoundingDirection((trailingDigit % 2) == 0,
+                    isNegative(),
+                    section,
+                    mathContext.getRoundingMode().ordinal(),
+                    this);
+
+            // Perform truncation
+            if (position >= precision) {
+                setBcdToZero();
+                scale = magnitude;
+            } else {
+                shiftRight(position);
+            }
+
+            // Bubble the result to the higher digits
+            if (!roundDown) {
+                if (trailingDigit == 9) {
+                    int bubblePos = 0;
+                    // Note: in the long implementation, the most digits BCD can have at this point is
+                    // 15,
+                    // so bubblePos <= 15 and getDigitPos(bubblePos) is safe.
+                    for (; getDigitPos(bubblePos) == 9; bubblePos++) {
+                    }
+                    shiftRight(bubblePos); // shift off the trailing 9s
+                }
+                byte digit0 = getDigitPos(0);
+                assert digit0 != 9;
+                setDigitPos(0, (byte) (digit0 + 1));
+                precision += 1; // in case an extra digit got added
+            }
+
+            compact();
+        }
+    }
+
+    @Override
+    public void roundToInfinity() {
+        if (isApproximate) {
+            convertToAccurateDouble();
+        }
+    }
+
+    /**
+     * Appends a digit, optionally with one or more leading zeros, to the end of the value represented by
+     * this DecimalQuantity.
+     *
+     * <p>
+     * The primary use of this method is to construct numbers during a parsing loop. It allows parsing to
+     * take advantage of the digit list infrastructure primarily designed for formatting.
+     *
+     * @param value
+     *            The digit to append.
+     * @param leadingZeros
+     *            The number of zeros to append before the digit. For example, if the value in this
+     *            instance starts as 12.3, and you append a 4 with 1 leading zero, the value becomes
+     *            12.304.
+     * @param appendAsInteger
+     *            If true, increase the magnitude of existing digits to make room for the new digit. If
+     *            false, append to the end like a fraction digit. If true, there must not be any fraction
+     *            digits already in the number.
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public void appendDigit(byte value, int leadingZeros, boolean appendAsInteger) {
+        assert leadingZeros >= 0;
+
+        // Zero requires special handling to maintain the invariant that the least-significant digit
+        // in the BCD is nonzero.
+        if (value == 0) {
+            if (appendAsInteger && precision != 0) {
+                scale += leadingZeros + 1;
+            }
+            return;
+        }
+
+        // Deal with trailing zeros
+        if (scale > 0) {
+            leadingZeros += scale;
+            if (appendAsInteger) {
+                scale = 0;
+            }
+        }
+
+        // Append digit
+        shiftLeft(leadingZeros + 1);
+        setDigitPos(0, value);
+
+        // Fix scale if in integer mode
+        if (appendAsInteger) {
+            scale += leadingZeros + 1;
+        }
+    }
+
+    @Override
+    public String toPlainString() {
+        // NOTE: This logic is duplicated between here and DecimalQuantity_SimpleStorage.
+        StringBuilder sb = new StringBuilder();
+        if (isNegative()) {
+            sb.append('-');
+        }
+        for (int m = getUpperDisplayMagnitude(); m >= getLowerDisplayMagnitude(); m--) {
+            sb.append(getDigit(m));
+            if (m == 0)
+                sb.append('.');
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Returns a single digit from the BCD list. No internal state is changed by calling this method.
+     *
+     * @param position
+     *            The position of the digit to pop, counted in BCD units from the least significant
+     *            digit. If outside the range supported by the implementation, zero is returned.
+     * @return The digit at the specified location.
+     */
+    protected abstract byte getDigitPos(int position);
+
+    /**
+     * Sets the digit in the BCD list. This method only sets the digit; it is the caller's responsibility
+     * to call {@link #compact} after setting the digit.
+     *
+     * @param position
+     *            The position of the digit to pop, counted in BCD units from the least significant
+     *            digit. If outside the range supported by the implementation, an AssertionError is
+     *            thrown.
+     * @param value
+     *            The digit to set at the specified location.
+     */
+    protected abstract void setDigitPos(int position, byte value);
+
+    /**
+     * Adds zeros to the end of the BCD list. This will result in an invalid BCD representation; it is
+     * the caller's responsibility to do further manipulation and then call {@link #compact}.
+     *
+     * @param numDigits
+     *            The number of zeros to add.
+     */
+    protected abstract void shiftLeft(int numDigits);
+
+    /**
+     * Removes digits from the end of the BCD list. This may result in an invalid BCD representation; it
+     * is the caller's responsibility to follow-up with a call to {@link #compact}.
+     *
+     * @param numDigits
+     *            The number of zeros to add.
+     */
+    protected abstract void shiftRight(int numDigits);
+
+    /**
+     * Sets the internal representation to zero. Clears any values stored in scale, precision, hasDouble,
+     * origDouble, origDelta, and BCD data.
+     */
+    protected abstract void setBcdToZero();
+
+    /**
+     * Sets the internal BCD state to represent the value in the given int. The int is guaranteed to be
+     * either positive. The internal state is guaranteed to be empty when this method is called.
+     *
+     * @param n
+     *            The value to consume.
+     */
+    protected abstract void readIntToBcd(int input);
+
+    /**
+     * Sets the internal BCD state to represent the value in the given long. The long is guaranteed to be
+     * either positive. The internal state is guaranteed to be empty when this method is called.
+     *
+     * @param n
+     *            The value to consume.
+     */
+    protected abstract void readLongToBcd(long input);
+
+    /**
+     * Sets the internal BCD state to represent the value in the given BigInteger. The BigInteger is
+     * guaranteed to be positive, and it is guaranteed to be larger than Long.MAX_VALUE. The internal
+     * state is guaranteed to be empty when this method is called.
+     *
+     * @param n
+     *            The value to consume.
+     */
+    protected abstract void readBigIntegerToBcd(BigInteger input);
+
+    /**
+     * Returns a BigDecimal encoding the internal BCD value.
+     *
+     * @return A BigDecimal representation of the internal BCD.
+     */
+    protected abstract BigDecimal bcdToBigDecimal();
+
+    protected abstract void copyBcdFrom(DecimalQuantity _other);
+
+    /**
+     * Removes trailing zeros from the BCD (adjusting the scale as required) and then computes the
+     * precision. The precision is the number of digits in the number up through the greatest nonzero
+     * digit.
+     *
+     * <p>
+     * This method must always be called when bcd changes in order for assumptions to be correct in
+     * methods like {@link #fractionCount()}.
+     */
+    protected abstract void compact();
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity_DualStorageBCD.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity_DualStorageBCD.java
index 2ea374b..55e4e18 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity_DualStorageBCD.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/DecimalQuantity_DualStorageBCD.java
@@ -6,412 +6,435 @@
 import java.math.BigInteger;
 
 /**
- * A DecimalQuantity with internal storage as a 64-bit BCD, with fallback to a byte array
- * for numbers that don't fit into the standard BCD.
+ * A DecimalQuantity with internal storage as a 64-bit BCD, with fallback to a byte array for numbers
+ * that don't fit into the standard BCD.
  */
 public final class DecimalQuantity_DualStorageBCD extends DecimalQuantity_AbstractBCD {
 
-  /**
-   * The BCD of the 16 digits of the number represented by this object. Every 4 bits of the long map
-   * to one digit. For example, the number "12345" in BCD is "0x12345".
-   *
-   * <p>Whenever bcd changes internally, {@link #compact()} must be called, except in special cases
-   * like setting the digit to zero.
-   */
-  private byte[] bcdBytes;
+    /**
+     * The BCD of the 16 digits of the number represented by this object. Every 4 bits of the long map to
+     * one digit. For example, the number "12345" in BCD is "0x12345".
+     *
+     * <p>
+     * Whenever bcd changes internally, {@link #compact()} must be called, except in special cases like
+     * setting the digit to zero.
+     */
+    private byte[] bcdBytes;
 
-  private long bcdLong = 0L;
+    private long bcdLong = 0L;
 
-  private boolean usingBytes = false;
+    private boolean usingBytes = false;
 
-  @Override
-  public int maxRepresentableDigits() {
-    return Integer.MAX_VALUE;
-  }
-
-  public DecimalQuantity_DualStorageBCD() {
-    setBcdToZero();
-    flags = 0;
-  }
-
-  public DecimalQuantity_DualStorageBCD(long input) {
-    setToLong(input);
-  }
-
-  public DecimalQuantity_DualStorageBCD(int input) {
-    setToInt(input);
-  }
-
-  public DecimalQuantity_DualStorageBCD(double input) {
-    setToDouble(input);
-  }
-
-  public DecimalQuantity_DualStorageBCD(BigInteger input) {
-    setToBigInteger(input);
-  }
-
-  public DecimalQuantity_DualStorageBCD(BigDecimal input) {
-    setToBigDecimal(input);
-  }
-
-  public DecimalQuantity_DualStorageBCD(DecimalQuantity_DualStorageBCD other) {
-    copyFrom(other);
-  }
-
-  public DecimalQuantity_DualStorageBCD(Number number) {
-    if (number instanceof Long) {
-      setToLong(number.longValue());
-    } else if (number instanceof Integer) {
-      setToInt(number.intValue());
-    } else if (number instanceof Double) {
-      setToDouble(number.doubleValue());
-    } else if (number instanceof BigInteger) {
-      setToBigInteger((BigInteger) number);
-    } else if (number instanceof BigDecimal) {
-      setToBigDecimal((BigDecimal) number);
-    } else if (number instanceof com.ibm.icu.math.BigDecimal) {
-      setToBigDecimal(((com.ibm.icu.math.BigDecimal) number).toBigDecimal());
-    } else {
-      throw new IllegalArgumentException(
-          "Number is of an unsupported type: " + number.getClass().getName());
+    @Override
+    public int maxRepresentableDigits() {
+        return Integer.MAX_VALUE;
     }
-  }
 
-  @Override
-  public DecimalQuantity createCopy() {
-    return new DecimalQuantity_DualStorageBCD(this);
-  }
-
-  @Override
-  protected byte getDigitPos(int position) {
-    if (usingBytes) {
-      if (position < 0 || position > precision) return 0;
-      return bcdBytes[position];
-    } else {
-      if (position < 0 || position >= 16) return 0;
-      return (byte) ((bcdLong >>> (position * 4)) & 0xf);
-    }
-  }
-
-  @Override
-  protected void setDigitPos(int position, byte value) {
-    assert position >= 0;
-    if (usingBytes) {
-      ensureCapacity(position + 1);
-      bcdBytes[position] = value;
-    } else if (position >= 16) {
-      switchStorage();
-      ensureCapacity(position + 1);
-      bcdBytes[position] = value;
-    } else {
-      int shift = position * 4;
-      bcdLong = bcdLong & ~(0xfL << shift) | ((long) value << shift);
-    }
-  }
-
-  @Override
-  protected void shiftLeft(int numDigits) {
-    if (!usingBytes && precision + numDigits > 16) {
-      switchStorage();
-    }
-    if (usingBytes) {
-      ensureCapacity(precision + numDigits);
-      int i = precision + numDigits - 1;
-      for (; i >= numDigits; i--) {
-        bcdBytes[i] = bcdBytes[i - numDigits];
-      }
-      for (; i >= 0; i--) {
-        bcdBytes[i] = 0;
-      }
-    } else {
-      bcdLong <<= (numDigits * 4);
-    }
-    scale -= numDigits;
-    precision += numDigits;
-  }
-
-  @Override
-  protected void shiftRight(int numDigits) {
-    if (usingBytes) {
-      int i = 0;
-      for (; i < precision - numDigits; i++) {
-        bcdBytes[i] = bcdBytes[i + numDigits];
-      }
-      for (; i < precision; i++) {
-        bcdBytes[i] = 0;
-      }
-    } else {
-      bcdLong >>>= (numDigits * 4);
-    }
-    scale += numDigits;
-    precision -= numDigits;
-  }
-
-  @Override
-  protected void setBcdToZero() {
-    if (usingBytes) {
-        bcdBytes = null;
-        usingBytes = false;
-    }
-    bcdLong = 0L;
-    scale = 0;
-    precision = 0;
-    isApproximate = false;
-    origDouble = 0;
-    origDelta = 0;
-  }
-
-  @Override
-  protected void readIntToBcd(int n) {
-    assert n != 0;
-    // ints always fit inside the long implementation.
-    long result = 0L;
-    int i = 16;
-    for (; n != 0; n /= 10, i--) {
-      result = (result >>> 4) + (((long) n % 10) << 60);
-    }
-    assert !usingBytes;
-    bcdLong = result >>> (i * 4);
-    scale = 0;
-    precision = 16 - i;
-  }
-
-  @Override
-  protected void readLongToBcd(long n) {
-    assert n != 0;
-    if (n >= 10000000000000000L) {
-      ensureCapacity();
-      int i = 0;
-      for (; n != 0L; n /= 10L, i++) {
-        bcdBytes[i] = (byte) (n % 10);
-      }
-      assert usingBytes;
-      scale = 0;
-      precision = i;
-    } else {
-      long result = 0L;
-      int i = 16;
-      for (; n != 0L; n /= 10L, i--) {
-        result = (result >>> 4) + ((n % 10) << 60);
-      }
-      assert i >= 0;
-      assert !usingBytes;
-      bcdLong = result >>> (i * 4);
-      scale = 0;
-      precision = 16 - i;
-    }
-  }
-
-  @Override
-  protected void readBigIntegerToBcd(BigInteger n) {
-    assert n.signum() != 0;
-    ensureCapacity(); // allocate initial byte array
-    int i = 0;
-    for (; n.signum() != 0; i++) {
-      BigInteger[] temp = n.divideAndRemainder(BigInteger.TEN);
-      ensureCapacity(i + 1);
-      bcdBytes[i] = temp[1].byteValue();
-      n = temp[0];
-    }
-    scale = 0;
-    precision = i;
-  }
-
-  @Override
-  protected BigDecimal bcdToBigDecimal() {
-    if (usingBytes) {
-      // Converting to a string here is faster than doing BigInteger/BigDecimal arithmetic.
-      BigDecimal result = new BigDecimal(toNumberString());
-      if (isNegative()) {
-          result = result.negate();
-      }
-      return result;
-    } else {
-      long tempLong = 0L;
-      for (int shift = (precision - 1); shift >= 0; shift--) {
-        tempLong = tempLong * 10 + getDigitPos(shift);
-      }
-      BigDecimal result = BigDecimal.valueOf(tempLong);
-      result = result.scaleByPowerOfTen(scale);
-      if (isNegative()) result = result.negate();
-      return result;
-    }
-  }
-
-  @Override
-  protected void compact() {
-    if (usingBytes) {
-      int delta = 0;
-      for (; delta < precision && bcdBytes[delta] == 0; delta++) ;
-      if (delta == precision) {
-        // Number is zero
+    public DecimalQuantity_DualStorageBCD() {
         setBcdToZero();
-        return;
-      } else {
-        // Remove trailing zeros
-        shiftRight(delta);
-      }
+        flags = 0;
+    }
 
-      // Compute precision
-      int leading = precision - 1;
-      for (; leading >= 0 && bcdBytes[leading] == 0; leading--) ;
-      precision = leading + 1;
+    public DecimalQuantity_DualStorageBCD(long input) {
+        setToLong(input);
+    }
 
-      // Switch storage mechanism if possible
-      if (precision <= 16) {
-        switchStorage();
-      }
+    public DecimalQuantity_DualStorageBCD(int input) {
+        setToInt(input);
+    }
 
-    } else {
-      if (bcdLong == 0L) {
-        // Number is zero
+    public DecimalQuantity_DualStorageBCD(double input) {
+        setToDouble(input);
+    }
+
+    public DecimalQuantity_DualStorageBCD(BigInteger input) {
+        setToBigInteger(input);
+    }
+
+    public DecimalQuantity_DualStorageBCD(BigDecimal input) {
+        setToBigDecimal(input);
+    }
+
+    public DecimalQuantity_DualStorageBCD(DecimalQuantity_DualStorageBCD other) {
+        copyFrom(other);
+    }
+
+    public DecimalQuantity_DualStorageBCD(Number number) {
+        if (number instanceof Long) {
+            setToLong(number.longValue());
+        } else if (number instanceof Integer) {
+            setToInt(number.intValue());
+        } else if (number instanceof Float) {
+            setToDouble(number.doubleValue());
+        } else if (number instanceof Double) {
+            setToDouble(number.doubleValue());
+        } else if (number instanceof BigInteger) {
+            setToBigInteger((BigInteger) number);
+        } else if (number instanceof BigDecimal) {
+            setToBigDecimal((BigDecimal) number);
+        } else if (number instanceof com.ibm.icu.math.BigDecimal) {
+            setToBigDecimal(((com.ibm.icu.math.BigDecimal) number).toBigDecimal());
+        } else {
+            throw new IllegalArgumentException(
+                    "Number is of an unsupported type: " + number.getClass().getName());
+        }
+    }
+
+    @Override
+    public DecimalQuantity createCopy() {
+        return new DecimalQuantity_DualStorageBCD(this);
+    }
+
+    @Override
+    protected byte getDigitPos(int position) {
+        if (usingBytes) {
+            if (position < 0 || position > precision)
+                return 0;
+            return bcdBytes[position];
+        } else {
+            if (position < 0 || position >= 16)
+                return 0;
+            return (byte) ((bcdLong >>> (position * 4)) & 0xf);
+        }
+    }
+
+    @Override
+    protected void setDigitPos(int position, byte value) {
+        assert position >= 0;
+        if (usingBytes) {
+            ensureCapacity(position + 1);
+            bcdBytes[position] = value;
+        } else if (position >= 16) {
+            switchStorage();
+            ensureCapacity(position + 1);
+            bcdBytes[position] = value;
+        } else {
+            int shift = position * 4;
+            bcdLong = bcdLong & ~(0xfL << shift) | ((long) value << shift);
+        }
+    }
+
+    @Override
+    protected void shiftLeft(int numDigits) {
+        if (!usingBytes && precision + numDigits > 16) {
+            switchStorage();
+        }
+        if (usingBytes) {
+            ensureCapacity(precision + numDigits);
+            int i = precision + numDigits - 1;
+            for (; i >= numDigits; i--) {
+                bcdBytes[i] = bcdBytes[i - numDigits];
+            }
+            for (; i >= 0; i--) {
+                bcdBytes[i] = 0;
+            }
+        } else {
+            bcdLong <<= (numDigits * 4);
+        }
+        scale -= numDigits;
+        precision += numDigits;
+    }
+
+    @Override
+    protected void shiftRight(int numDigits) {
+        if (usingBytes) {
+            int i = 0;
+            for (; i < precision - numDigits; i++) {
+                bcdBytes[i] = bcdBytes[i + numDigits];
+            }
+            for (; i < precision; i++) {
+                bcdBytes[i] = 0;
+            }
+        } else {
+            bcdLong >>>= (numDigits * 4);
+        }
+        scale += numDigits;
+        precision -= numDigits;
+    }
+
+    @Override
+    protected void setBcdToZero() {
+        if (usingBytes) {
+            bcdBytes = null;
+            usingBytes = false;
+        }
+        bcdLong = 0L;
+        scale = 0;
+        precision = 0;
+        isApproximate = false;
+        origDouble = 0;
+        origDelta = 0;
+    }
+
+    @Override
+    protected void readIntToBcd(int n) {
+        assert n != 0;
+        // ints always fit inside the long implementation.
+        long result = 0L;
+        int i = 16;
+        for (; n != 0; n /= 10, i--) {
+            result = (result >>> 4) + (((long) n % 10) << 60);
+        }
+        assert !usingBytes;
+        bcdLong = result >>> (i * 4);
+        scale = 0;
+        precision = 16 - i;
+    }
+
+    @Override
+    protected void readLongToBcd(long n) {
+        assert n != 0;
+        if (n >= 10000000000000000L) {
+            ensureCapacity();
+            int i = 0;
+            for (; n != 0L; n /= 10L, i++) {
+                bcdBytes[i] = (byte) (n % 10);
+            }
+            assert usingBytes;
+            scale = 0;
+            precision = i;
+        } else {
+            long result = 0L;
+            int i = 16;
+            for (; n != 0L; n /= 10L, i--) {
+                result = (result >>> 4) + ((n % 10) << 60);
+            }
+            assert i >= 0;
+            assert !usingBytes;
+            bcdLong = result >>> (i * 4);
+            scale = 0;
+            precision = 16 - i;
+        }
+    }
+
+    @Override
+    protected void readBigIntegerToBcd(BigInteger n) {
+        assert n.signum() != 0;
+        ensureCapacity(); // allocate initial byte array
+        int i = 0;
+        for (; n.signum() != 0; i++) {
+            BigInteger[] temp = n.divideAndRemainder(BigInteger.TEN);
+            ensureCapacity(i + 1);
+            bcdBytes[i] = temp[1].byteValue();
+            n = temp[0];
+        }
+        scale = 0;
+        precision = i;
+    }
+
+    @Override
+    protected BigDecimal bcdToBigDecimal() {
+        if (usingBytes) {
+            // Converting to a string here is faster than doing BigInteger/BigDecimal arithmetic.
+            BigDecimal result = new BigDecimal(toNumberString());
+            if (isNegative()) {
+                result = result.negate();
+            }
+            return result;
+        } else {
+            long tempLong = 0L;
+            for (int shift = (precision - 1); shift >= 0; shift--) {
+                tempLong = tempLong * 10 + getDigitPos(shift);
+            }
+            BigDecimal result = BigDecimal.valueOf(tempLong);
+            result = result.scaleByPowerOfTen(scale);
+            if (isNegative())
+                result = result.negate();
+            return result;
+        }
+    }
+
+    @Override
+    protected void compact() {
+        if (usingBytes) {
+            int delta = 0;
+            for (; delta < precision && bcdBytes[delta] == 0; delta++)
+                ;
+            if (delta == precision) {
+                // Number is zero
+                setBcdToZero();
+                return;
+            } else {
+                // Remove trailing zeros
+                shiftRight(delta);
+            }
+
+            // Compute precision
+            int leading = precision - 1;
+            for (; leading >= 0 && bcdBytes[leading] == 0; leading--)
+                ;
+            precision = leading + 1;
+
+            // Switch storage mechanism if possible
+            if (precision <= 16) {
+                switchStorage();
+            }
+
+        } else {
+            if (bcdLong == 0L) {
+                // Number is zero
+                setBcdToZero();
+                return;
+            }
+
+            // Compact the number (remove trailing zeros)
+            int delta = Long.numberOfTrailingZeros(bcdLong) / 4;
+            bcdLong >>>= delta * 4;
+            scale += delta;
+
+            // Compute precision
+            precision = 16 - (Long.numberOfLeadingZeros(bcdLong) / 4);
+        }
+    }
+
+    /** Ensure that a byte array of at least 40 digits is allocated. */
+    private void ensureCapacity() {
+        ensureCapacity(40);
+    }
+
+    private void ensureCapacity(int capacity) {
+        if (capacity == 0)
+            return;
+        int oldCapacity = usingBytes ? bcdBytes.length : 0;
+        if (!usingBytes) {
+            bcdBytes = new byte[capacity];
+        } else if (oldCapacity < capacity) {
+            byte[] bcd1 = new byte[capacity * 2];
+            System.arraycopy(bcdBytes, 0, bcd1, 0, oldCapacity);
+            bcdBytes = bcd1;
+        }
+        usingBytes = true;
+    }
+
+    /** Switches the internal storage mechanism between the 64-bit long and the byte array. */
+    private void switchStorage() {
+        if (usingBytes) {
+            // Change from bytes to long
+            bcdLong = 0L;
+            for (int i = precision - 1; i >= 0; i--) {
+                bcdLong <<= 4;
+                bcdLong |= bcdBytes[i];
+            }
+            bcdBytes = null;
+            usingBytes = false;
+        } else {
+            // Change from long to bytes
+            ensureCapacity();
+            for (int i = 0; i < precision; i++) {
+                bcdBytes[i] = (byte) (bcdLong & 0xf);
+                bcdLong >>>= 4;
+            }
+            assert usingBytes;
+        }
+    }
+
+    @Override
+    protected void copyBcdFrom(DecimalQuantity _other) {
+        DecimalQuantity_DualStorageBCD other = (DecimalQuantity_DualStorageBCD) _other;
         setBcdToZero();
-        return;
-      }
-
-      // Compact the number (remove trailing zeros)
-      int delta = Long.numberOfTrailingZeros(bcdLong) / 4;
-      bcdLong >>>= delta * 4;
-      scale += delta;
-
-      // Compute precision
-      precision = 16 - (Long.numberOfLeadingZeros(bcdLong) / 4);
-    }
-  }
-
-  /** Ensure that a byte array of at least 40 digits is allocated. */
-  private void ensureCapacity() {
-    ensureCapacity(40);
-  }
-
-  private void ensureCapacity(int capacity) {
-    if (capacity == 0) return;
-    int oldCapacity = usingBytes ? bcdBytes.length : 0;
-    if (!usingBytes) {
-      bcdBytes = new byte[capacity];
-    } else if (oldCapacity < capacity) {
-      byte[] bcd1 = new byte[capacity * 2];
-      System.arraycopy(bcdBytes, 0, bcd1, 0, oldCapacity);
-      bcdBytes = bcd1;
-    }
-    usingBytes = true;
-  }
-
-  /** Switches the internal storage mechanism between the 64-bit long and the byte array. */
-  private void switchStorage() {
-    if (usingBytes) {
-      // Change from bytes to long
-      bcdLong = 0L;
-      for (int i = precision - 1; i >= 0; i--) {
-        bcdLong <<= 4;
-        bcdLong |= bcdBytes[i];
-      }
-      bcdBytes = null;
-      usingBytes = false;
-    } else {
-      // Change from long to bytes
-      ensureCapacity();
-      for (int i = 0; i < precision; i++) {
-        bcdBytes[i] = (byte) (bcdLong & 0xf);
-        bcdLong >>>= 4;
-      }
-      assert usingBytes;
-    }
-  }
-
-  @Override
-  protected void copyBcdFrom(DecimalQuantity _other) {
-    DecimalQuantity_DualStorageBCD other = (DecimalQuantity_DualStorageBCD) _other;
-    setBcdToZero();
-    if (other.usingBytes) {
-      ensureCapacity(other.precision);
-      System.arraycopy(other.bcdBytes, 0, bcdBytes, 0, other.precision);
-    } else {
-      bcdLong = other.bcdLong;
-    }
-  }
-
-  /**
-   * Checks whether the bytes stored in this instance are all valid. For internal unit testing only.
-   *
-   * @return An error message if this instance is invalid, or null if this instance is healthy.
-   * @internal
-   * @deprecated This API is for ICU internal use only.
-   */
-  @Deprecated
-  public String checkHealth() {
-    if (usingBytes) {
-      if (bcdLong != 0) return "Value in bcdLong but we are in byte mode";
-      if (precision == 0) return "Zero precision but we are in byte mode";
-      if (precision > bcdBytes.length) return "Precision exceeds length of byte array";
-      if (getDigitPos(precision - 1) == 0) return "Most significant digit is zero in byte mode";
-      if (getDigitPos(0) == 0) return "Least significant digit is zero in long mode";
-      for (int i = 0; i < precision; i++) {
-        if (getDigitPos(i) >= 10) return "Digit exceeding 10 in byte array";
-        if (getDigitPos(i) < 0) return "Digit below 0 in byte array";
-      }
-      for (int i = precision; i < bcdBytes.length; i++) {
-        if (getDigitPos(i) != 0) return "Nonzero digits outside of range in byte array";
-      }
-    } else {
-      if (bcdBytes != null) {
-        for (int i = 0; i < bcdBytes.length; i++) {
-          if (bcdBytes[i] != 0) return "Nonzero digits in byte array but we are in long mode";
+        if (other.usingBytes) {
+            ensureCapacity(other.precision);
+            System.arraycopy(other.bcdBytes, 0, bcdBytes, 0, other.precision);
+        } else {
+            bcdLong = other.bcdLong;
         }
-      }
-      if (precision == 0 && bcdLong != 0) return "Value in bcdLong even though precision is zero";
-      if (precision > 16) return "Precision exceeds length of long";
-      if (precision != 0 && getDigitPos(precision - 1) == 0)
-        return "Most significant digit is zero in long mode";
-      if (precision != 0 && getDigitPos(0) == 0)
-        return "Least significant digit is zero in long mode";
-      for (int i = 0; i < precision; i++) {
-        if (getDigitPos(i) >= 10) return "Digit exceeding 10 in long";
-        if (getDigitPos(i) < 0) return "Digit below 0 in long (?!)";
-      }
-      for (int i = precision; i < 16; i++) {
-        if (getDigitPos(i) != 0) return "Nonzero digits outside of range in long";
-      }
     }
 
-    return null;
-  }
-
-  /**
-   * Checks whether this {@link DecimalQuantity_DualStorageBCD} is using its internal byte array storage mechanism.
-   *
-   * @return true if an internal byte array is being used; false if a long is being used.
-   * @internal
-   * @deprecated This API is ICU internal only.
-   */
-  @Deprecated
-  public boolean isUsingBytes() {
-    return usingBytes;
-  }
-
-  @Override
-  public String toString() {
-    return String.format(
-        "<DecimalQuantity %s:%d:%d:%s %s %s>",
-        (lOptPos > 1000 ? "999" : String.valueOf(lOptPos)),
-        lReqPos,
-        rReqPos,
-        (rOptPos < -1000 ? "-999" : String.valueOf(rOptPos)),
-        (usingBytes ? "bytes" : "long"),
-        toNumberString());
-  }
-
-  public String toNumberString() {
-      StringBuilder sb = new StringBuilder();
-      if (usingBytes) {
-        for (int i = precision - 1; i >= 0; i--) {
-          sb.append(bcdBytes[i]);
+    /**
+     * Checks whether the bytes stored in this instance are all valid. For internal unit testing only.
+     *
+     * @return An error message if this instance is invalid, or null if this instance is healthy.
+     * @internal
+     * @deprecated This API is for ICU internal use only.
+     */
+    @Deprecated
+    public String checkHealth() {
+        if (usingBytes) {
+            if (bcdLong != 0)
+                return "Value in bcdLong but we are in byte mode";
+            if (precision == 0)
+                return "Zero precision but we are in byte mode";
+            if (precision > bcdBytes.length)
+                return "Precision exceeds length of byte array";
+            if (getDigitPos(precision - 1) == 0)
+                return "Most significant digit is zero in byte mode";
+            if (getDigitPos(0) == 0)
+                return "Least significant digit is zero in long mode";
+            for (int i = 0; i < precision; i++) {
+                if (getDigitPos(i) >= 10)
+                    return "Digit exceeding 10 in byte array";
+                if (getDigitPos(i) < 0)
+                    return "Digit below 0 in byte array";
+            }
+            for (int i = precision; i < bcdBytes.length; i++) {
+                if (getDigitPos(i) != 0)
+                    return "Nonzero digits outside of range in byte array";
+            }
+        } else {
+            if (bcdBytes != null) {
+                for (int i = 0; i < bcdBytes.length; i++) {
+                    if (bcdBytes[i] != 0)
+                        return "Nonzero digits in byte array but we are in long mode";
+                }
+            }
+            if (precision == 0 && bcdLong != 0)
+                return "Value in bcdLong even though precision is zero";
+            if (precision > 16)
+                return "Precision exceeds length of long";
+            if (precision != 0 && getDigitPos(precision - 1) == 0)
+                return "Most significant digit is zero in long mode";
+            if (precision != 0 && getDigitPos(0) == 0)
+                return "Least significant digit is zero in long mode";
+            for (int i = 0; i < precision; i++) {
+                if (getDigitPos(i) >= 10)
+                    return "Digit exceeding 10 in long";
+                if (getDigitPos(i) < 0)
+                    return "Digit below 0 in long (?!)";
+            }
+            for (int i = precision; i < 16; i++) {
+                if (getDigitPos(i) != 0)
+                    return "Nonzero digits outside of range in long";
+            }
         }
-      } else {
-        sb.append(Long.toHexString(bcdLong));
-      }
-      sb.append("E");
-      sb.append(scale);
-      return sb.toString();
-  }
+
+        return null;
+    }
+
+    /**
+     * Checks whether this {@link DecimalQuantity_DualStorageBCD} is using its internal byte array
+     * storage mechanism.
+     *
+     * @return true if an internal byte array is being used; false if a long is being used.
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public boolean isUsingBytes() {
+        return usingBytes;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("<DecimalQuantity %s:%d:%d:%s %s %s>",
+                (lOptPos > 1000 ? "999" : String.valueOf(lOptPos)),
+                lReqPos,
+                rReqPos,
+                (rOptPos < -1000 ? "-999" : String.valueOf(rOptPos)),
+                (usingBytes ? "bytes" : "long"),
+                toNumberString());
+    }
+
+    public String toNumberString() {
+        StringBuilder sb = new StringBuilder();
+        if (usingBytes) {
+            for (int i = precision - 1; i >= 0; i--) {
+                sb.append(bcdBytes[i]);
+            }
+        } else {
+            sb.append(Long.toHexString(bcdLong));
+        }
+        sb.append("E");
+        sb.append(scale);
+        return sb.toString();
+    }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Grouper.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Grouper.java
new file mode 100644
index 0000000..6e18907
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Grouper.java
@@ -0,0 +1,164 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number;
+
+import com.ibm.icu.impl.ICUData;
+import com.ibm.icu.impl.ICUResourceBundle;
+import com.ibm.icu.impl.number.PatternStringParser.ParsedPatternInfo;
+import com.ibm.icu.number.NumberFormatter.GroupingStrategy;
+import com.ibm.icu.util.ULocale;
+import com.ibm.icu.util.UResourceBundle;
+
+/**
+ * A full options object for grouping sizes.
+ */
+public class Grouper {
+
+    private static final Grouper GROUPER_NEVER = new Grouper((short) -1, (short) -1, (short) -2);
+    private static final Grouper GROUPER_MIN2 = new Grouper((short) -2, (short) -2, (short) -3);
+    private static final Grouper GROUPER_AUTO = new Grouper((short) -2, (short) -2, (short) -2);
+    private static final Grouper GROUPER_ON_ALIGNED = new Grouper((short) -4, (short) -4, (short) 1);
+
+    private static final Grouper GROUPER_WESTERN = new Grouper((short) 3, (short) 3, (short) 1);
+    private static final Grouper GROUPER_INDIC = new Grouper((short) 3, (short) 2, (short) 1);
+    private static final Grouper GROUPER_WESTERN_MIN2 = new Grouper((short) 3, (short) 3, (short) 2);
+    private static final Grouper GROUPER_INDIC_MIN2 = new Grouper((short) 3, (short) 2, (short) 2);
+
+    /**
+     * Convert from the GroupingStrategy enum to a Grouper object.
+     */
+    public static Grouper forStrategy(GroupingStrategy grouping) {
+        switch (grouping) {
+        case OFF:
+            return GROUPER_NEVER;
+        case MIN2:
+            return GROUPER_MIN2;
+        case AUTO:
+            return GROUPER_AUTO;
+        case ON_ALIGNED:
+            return GROUPER_ON_ALIGNED;
+        case THOUSANDS:
+            return GROUPER_WESTERN;
+        default:
+            throw new AssertionError();
+        }
+    }
+
+    /**
+     * Resolve the values in Properties to a Grouper object.
+     */
+    public static Grouper forProperties(DecimalFormatProperties properties) {
+        short grouping1 = (short) properties.getGroupingSize();
+        short grouping2 = (short) properties.getSecondaryGroupingSize();
+        short minGrouping = (short) properties.getMinimumGroupingDigits();
+        grouping1 = grouping1 > 0 ? grouping1 : grouping2 > 0 ? grouping2 : grouping1;
+        grouping2 = grouping2 > 0 ? grouping2 : grouping1;
+        return getInstance(grouping1, grouping2, minGrouping);
+    }
+
+    public static Grouper getInstance(short grouping1, short grouping2, short minGrouping) {
+        if (grouping1 == -1) {
+            return GROUPER_NEVER;
+        } else if (grouping1 == 3 && grouping2 == 3 && minGrouping == 1) {
+            return GROUPER_WESTERN;
+        } else if (grouping1 == 3 && grouping2 == 2 && minGrouping == 1) {
+            return GROUPER_INDIC;
+        } else if (grouping1 == 3 && grouping2 == 3 && minGrouping == 2) {
+            return GROUPER_WESTERN_MIN2;
+        } else if (grouping1 == 3 && grouping2 == 2 && minGrouping == 2) {
+            return GROUPER_INDIC_MIN2;
+        } else {
+            return new Grouper(grouping1, grouping2, minGrouping);
+        }
+    }
+
+    private static short getMinGroupingForLocale(ULocale locale) {
+        // TODO: Cache this?
+        ICUResourceBundle resource = (ICUResourceBundle) UResourceBundle
+                .getBundleInstance(ICUData.ICU_BASE_NAME, locale);
+        String result = resource.getStringWithFallback("NumberElements/minimumGroupingDigits");
+        return Short.valueOf(result);
+    }
+
+    /**
+     * The primary grouping size, with the following special values:
+     * <ul>
+     * <li>-1 = no grouping
+     * <li>-2 = needs locale data
+     * <li>-4 = fall back to Western grouping if not in locale
+     * </ul>
+     */
+    private final short grouping1;
+
+    /**
+     * The secondary grouping size, with the following special values:
+     * <ul>
+     * <li>-1 = no grouping
+     * <li>-2 = needs locale data
+     * <li>-4 = fall back to Western grouping if not in locale
+     * </ul>
+     */
+    private final short grouping2;
+
+    /**
+     * The minimum gropuing size, with the following special values:
+     * <ul>
+     * <li>-2 = needs locale data
+     * <li>-3 = no less than 2
+     * </ul>
+     */
+    private final short minGrouping;
+
+    private Grouper(short grouping1, short grouping2, short minGrouping) {
+        this.grouping1 = grouping1;
+        this.grouping2 = grouping2;
+        this.minGrouping = minGrouping;
+    }
+
+    public Grouper withLocaleData(ULocale locale, ParsedPatternInfo patternInfo) {
+        if (this.grouping1 != -2 && this.grouping1 != -4) {
+            return this;
+        }
+
+        short grouping1 = (short) (patternInfo.positive.groupingSizes & 0xffff);
+        short grouping2 = (short) ((patternInfo.positive.groupingSizes >>> 16) & 0xffff);
+        short grouping3 = (short) ((patternInfo.positive.groupingSizes >>> 32) & 0xffff);
+        if (grouping2 == -1) {
+            grouping1 = this.grouping1 == -4 ? (short) 3 : (short) -1;
+        }
+        if (grouping3 == -1) {
+            grouping2 = grouping1;
+        }
+
+        short minGrouping;
+        if (this.minGrouping == -2) {
+            minGrouping = getMinGroupingForLocale(locale);
+        } else if (this.minGrouping == -3) {
+            minGrouping = (short) Math.max(2, getMinGroupingForLocale(locale));
+        } else {
+            minGrouping = this.minGrouping;
+        }
+
+        return getInstance(grouping1, grouping2, minGrouping);
+    }
+
+    public boolean groupAtPosition(int position, DecimalQuantity value) {
+        assert grouping1 != -2 && grouping1 != -4;
+        if (grouping1 == -1 || grouping1 == 0) {
+            // Either -1 or 0 means "no grouping"
+            return false;
+        }
+        position -= grouping1;
+        return position >= 0
+                && (position % grouping2) == 0
+                && value.getUpperDisplayMagnitude() - grouping1 + 1 >= minGrouping;
+    }
+
+    public short getPrimary() {
+        return grouping1;
+    }
+
+    public short getSecondary() {
+        return grouping2;
+    }
+}
\ No newline at end of file
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/LongNameHandler.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/LongNameHandler.java
index 2ed9f4d..63a11f4 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/LongNameHandler.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/LongNameHandler.java
@@ -4,6 +4,7 @@
 
 import java.util.EnumMap;
 import java.util.Map;
+import java.util.MissingResourceException;
 
 import com.ibm.icu.impl.CurrencyData;
 import com.ibm.icu.impl.ICUData;
@@ -22,40 +23,70 @@
 
 public class LongNameHandler implements MicroPropsGenerator {
 
+    private static final int DNAM_INDEX = StandardPlural.COUNT;
+    private static final int PER_INDEX = StandardPlural.COUNT + 1;
+    private static final int ARRAY_LENGTH = StandardPlural.COUNT + 2;
+
+    private static int getIndex(String pluralKeyword) {
+        // pluralKeyword can also be "dnam" or "per"
+        if (pluralKeyword.equals("dnam")) {
+            return DNAM_INDEX;
+        } else if (pluralKeyword.equals("per")) {
+            return PER_INDEX;
+        } else {
+            return StandardPlural.fromString(pluralKeyword).ordinal();
+        }
+    }
+
+    private static String getWithPlural(String[] strings, StandardPlural plural) {
+        String result = strings[plural.ordinal()];
+        if (result == null) {
+            result = strings[StandardPlural.OTHER.ordinal()];
+        }
+        if (result == null) {
+            // There should always be data in the "other" plural variant.
+            throw new ICUException("Could not find data in 'other' plural variant");
+        }
+        return result;
+    }
+
     //////////////////////////
     /// BEGIN DATA LOADING ///
     //////////////////////////
 
     private static final class PluralTableSink extends UResource.Sink {
 
-        Map<StandardPlural, String> output;
+        String[] outArray;
 
-        public PluralTableSink(Map<StandardPlural, String> output) {
-            this.output = output;
+        public PluralTableSink(String[] outArray) {
+            this.outArray = outArray;
         }
 
         @Override
         public void put(UResource.Key key, UResource.Value value, boolean noFallback) {
             UResource.Table pluralsTable = value.getTable();
             for (int i = 0; pluralsTable.getKeyAndValue(i, key, value); ++i) {
-                if (key.contentEquals("dnam") || key.contentEquals("per")) {
-                    continue;
-                }
-                StandardPlural plural = StandardPlural.fromString(key);
-                if (output.containsKey(plural)) {
+                int index = getIndex(key.toString());
+                if (outArray[index] != null) {
                     continue;
                 }
                 String formatString = value.getString();
-                output.put(plural, formatString);
+                outArray[index] = formatString;
             }
         }
     }
 
-    private static void getMeasureData(ULocale locale, MeasureUnit unit, UnitWidth width,
-            Map<StandardPlural, String> output) {
-        PluralTableSink sink = new PluralTableSink(output);
+    // NOTE: outArray MUST have at least ARRAY_LENGTH entries. No bounds checking is performed.
+
+    private static void getMeasureData(
+            ULocale locale,
+            MeasureUnit unit,
+            UnitWidth width,
+            String[] outArray) {
+        PluralTableSink sink = new PluralTableSink(outArray);
         ICUResourceBundle resource;
-        resource = (ICUResourceBundle) UResourceBundle.getBundleInstance(ICUData.ICU_UNIT_BASE_NAME, locale);
+        resource = (ICUResourceBundle) UResourceBundle.getBundleInstance(ICUData.ICU_UNIT_BASE_NAME,
+                locale);
         StringBuilder key = new StringBuilder();
         key.append("units");
         if (width == UnitWidth.NARROW) {
@@ -67,24 +98,49 @@
         key.append(unit.getType());
         key.append("/");
         key.append(unit.getSubtype());
-        resource.getAllItemsWithFallback(key.toString(), sink);
+        try {
+            resource.getAllItemsWithFallback(key.toString(), sink);
+        } catch (MissingResourceException e) {
+            throw new IllegalArgumentException("No data for unit " + unit + ", width " + width, e);
+        }
     }
 
-    private static void getCurrencyLongNameData(ULocale locale, Currency currency, Map<StandardPlural, String> output) {
+    private static void getCurrencyLongNameData(ULocale locale, Currency currency, String[] outArray) {
         // In ICU4J, this method gets a CurrencyData from CurrencyData.provider.
         // TODO(ICU4J): Implement this without going through CurrencyData, like in ICU4C?
         Map<String, String> data = CurrencyData.provider.getInstance(locale, true).getUnitPatterns();
         for (Map.Entry<String, String> e : data.entrySet()) {
             String pluralKeyword = e.getKey();
-            StandardPlural plural = StandardPlural.fromString(e.getKey());
+            int index = getIndex(pluralKeyword);
             String longName = currency.getName(locale, Currency.PLURAL_LONG_NAME, pluralKeyword, null);
             String simpleFormat = e.getValue();
             // Example pattern from data: "{0} {1}"
             // Example output after find-and-replace: "{0} US dollars"
             simpleFormat = simpleFormat.replace("{1}", longName);
-            // String compiled = SimpleFormatterImpl.compileToStringMinMaxArguments(simpleFormat, sb, 1, 1);
+            // String compiled = SimpleFormatterImpl.compileToStringMinMaxArguments(simpleFormat, sb, 1,
+            // 1);
             // SimpleModifier mod = new SimpleModifier(compiled, Field.CURRENCY, false);
-            output.put(plural, simpleFormat);
+            outArray[index] = simpleFormat;
+        }
+    }
+
+    private static String getPerUnitFormat(ULocale locale, UnitWidth width) {
+        ICUResourceBundle resource;
+        resource = (ICUResourceBundle) UResourceBundle.getBundleInstance(ICUData.ICU_UNIT_BASE_NAME,
+                locale);
+        StringBuilder key = new StringBuilder();
+        key.append("units");
+        if (width == UnitWidth.NARROW) {
+            key.append("Narrow");
+        } else if (width == UnitWidth.SHORT) {
+            key.append("Short");
+        }
+        key.append("/compound/per");
+        try {
+            return resource.getStringWithFallback(key.toString());
+        } catch (MissingResourceException e) {
+            throw new IllegalArgumentException(
+                    "Could not find x-per-y format for " + locale + ", width " + width);
         }
     }
 
@@ -96,16 +152,27 @@
     private final PluralRules rules;
     private final MicroPropsGenerator parent;
 
-    private LongNameHandler(Map<StandardPlural, SimpleModifier> modifiers, PluralRules rules,
+    private LongNameHandler(
+            Map<StandardPlural, SimpleModifier> modifiers,
+            PluralRules rules,
             MicroPropsGenerator parent) {
         this.modifiers = modifiers;
         this.rules = rules;
         this.parent = parent;
     }
 
-    public static LongNameHandler forCurrencyLongNames(ULocale locale, Currency currency, PluralRules rules,
+    public static String getUnitDisplayName(ULocale locale, MeasureUnit unit, UnitWidth width) {
+        String[] measureData = new String[ARRAY_LENGTH];
+        getMeasureData(locale, unit, width, measureData);
+        return measureData[DNAM_INDEX];
+    }
+
+    public static LongNameHandler forCurrencyLongNames(
+            ULocale locale,
+            Currency currency,
+            PluralRules rules,
             MicroPropsGenerator parent) {
-        Map<StandardPlural, String> simpleFormats = new EnumMap<StandardPlural, String>(StandardPlural.class);
+        String[] simpleFormats = new String[ARRAY_LENGTH];
         getCurrencyLongNameData(locale, currency, simpleFormats);
         // TODO(ICU4J): Reduce the number of object creations here?
         Map<StandardPlural, SimpleModifier> modifiers = new EnumMap<StandardPlural, SimpleModifier>(
@@ -114,9 +181,25 @@
         return new LongNameHandler(modifiers, rules, parent);
     }
 
-    public static LongNameHandler forMeasureUnit(ULocale locale, MeasureUnit unit, UnitWidth width, PluralRules rules,
+    public static LongNameHandler forMeasureUnit(
+            ULocale locale,
+            MeasureUnit unit,
+            MeasureUnit perUnit,
+            UnitWidth width,
+            PluralRules rules,
             MicroPropsGenerator parent) {
-        Map<StandardPlural, String> simpleFormats = new EnumMap<StandardPlural, String>(StandardPlural.class);
+        if (perUnit != null) {
+            // Compound unit: first try to simplify (e.g., meters per second is its own unit).
+            MeasureUnit simplified = MeasureUnit.resolveUnitPerUnit(unit, perUnit);
+            if (simplified != null) {
+                unit = simplified;
+            } else {
+                // No simplified form is available.
+                return forCompoundUnit(locale, unit, perUnit, width, rules, parent);
+            }
+        }
+
+        String[] simpleFormats = new String[ARRAY_LENGTH];
         getMeasureData(locale, unit, width, simpleFormats);
         // TODO: What field to use for units?
         // TODO(ICU4J): Reduce the number of object creations here?
@@ -126,20 +209,66 @@
         return new LongNameHandler(modifiers, rules, parent);
     }
 
-    private static void simpleFormatsToModifiers(Map<StandardPlural, String> simpleFormats, NumberFormat.Field field,
+    private static LongNameHandler forCompoundUnit(
+            ULocale locale,
+            MeasureUnit unit,
+            MeasureUnit perUnit,
+            UnitWidth width,
+            PluralRules rules,
+            MicroPropsGenerator parent) {
+        String[] primaryData = new String[ARRAY_LENGTH];
+        getMeasureData(locale, unit, width, primaryData);
+        String[] secondaryData = new String[ARRAY_LENGTH];
+        getMeasureData(locale, perUnit, width, secondaryData);
+        String perUnitFormat;
+        if (secondaryData[PER_INDEX] != null) {
+            perUnitFormat = secondaryData[PER_INDEX];
+        } else {
+            String rawPerUnitFormat = getPerUnitFormat(locale, width);
+            // rawPerUnitFormat is something like "{0}/{1}"; we need to substitute in the secondary unit.
+            // TODO: Lots of thrashing. Improve?
+            StringBuilder sb = new StringBuilder();
+            String compiled = SimpleFormatterImpl
+                    .compileToStringMinMaxArguments(rawPerUnitFormat, sb, 2, 2);
+            String secondaryFormat = getWithPlural(secondaryData, StandardPlural.ONE);
+            String secondaryCompiled = SimpleFormatterImpl
+                    .compileToStringMinMaxArguments(secondaryFormat, sb, 1, 1);
+            String secondaryString = SimpleFormatterImpl.getTextWithNoArguments(secondaryCompiled)
+                    .trim();
+            perUnitFormat = SimpleFormatterImpl.formatCompiledPattern(compiled, "{0}", secondaryString);
+        }
+        // TODO: What field to use for units?
+        Map<StandardPlural, SimpleModifier> modifiers = new EnumMap<StandardPlural, SimpleModifier>(
+                StandardPlural.class);
+        multiSimpleFormatsToModifiers(primaryData, perUnitFormat, null, modifiers);
+        return new LongNameHandler(modifiers, rules, parent);
+    }
+
+    private static void simpleFormatsToModifiers(
+            String[] simpleFormats,
+            NumberFormat.Field field,
             Map<StandardPlural, SimpleModifier> output) {
         StringBuilder sb = new StringBuilder();
         for (StandardPlural plural : StandardPlural.VALUES) {
-            String simpleFormat = simpleFormats.get(plural);
-            if (simpleFormat == null) {
-                simpleFormat = simpleFormats.get(StandardPlural.OTHER);
-            }
-            if (simpleFormat == null) {
-                // There should always be data in the "other" plural variant.
-                throw new ICUException("Could not find data in 'other' plural variant with field " + field);
-            }
-            String compiled = SimpleFormatterImpl.compileToStringMinMaxArguments(simpleFormat, sb, 1, 1);
-            output.put(plural, new SimpleModifier(compiled, null, false));
+            String simpleFormat = getWithPlural(simpleFormats, plural);
+            String compiled = SimpleFormatterImpl.compileToStringMinMaxArguments(simpleFormat, sb, 0, 1);
+            output.put(plural, new SimpleModifier(compiled, field, false));
+        }
+    }
+
+    private static void multiSimpleFormatsToModifiers(
+            String[] leadFormats,
+            String trailFormat,
+            NumberFormat.Field field,
+            Map<StandardPlural, SimpleModifier> output) {
+        StringBuilder sb = new StringBuilder();
+        String trailCompiled = SimpleFormatterImpl.compileToStringMinMaxArguments(trailFormat, sb, 1, 1);
+        for (StandardPlural plural : StandardPlural.VALUES) {
+            String leadFormat = getWithPlural(leadFormats, plural);
+            String compoundFormat = SimpleFormatterImpl.formatCompiledPattern(trailCompiled, leadFormat);
+            String compoundCompiled = SimpleFormatterImpl
+                    .compileToStringMinMaxArguments(compoundFormat, sb, 0, 1);
+            output.put(plural, new SimpleModifier(compoundCompiled, field, false));
         }
     }
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MacroProps.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MacroProps.java
index 711b4e2..fa0f764 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MacroProps.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MacroProps.java
@@ -3,7 +3,6 @@
 package com.ibm.icu.impl.number;
 
 import com.ibm.icu.impl.Utility;
-import com.ibm.icu.number.Grouper;
 import com.ibm.icu.number.IntegerWidth;
 import com.ibm.icu.number.Notation;
 import com.ibm.icu.number.NumberFormatter.DecimalSeparatorDisplay;
@@ -15,92 +14,114 @@
 import com.ibm.icu.util.ULocale;
 
 public class MacroProps implements Cloneable {
-  public Notation notation;
-  public MeasureUnit unit;
-  public Rounder rounder;
-  public Grouper grouper;
-  public Padder padder;
-  public IntegerWidth integerWidth;
-  public Object symbols;
-  public UnitWidth unitWidth;
-  public SignDisplay sign;
-  public DecimalSeparatorDisplay decimal;
-  public AffixPatternProvider affixProvider; // not in API; for JDK compatibility mode only
-  public MultiplierImpl multiplier; // not in API; for JDK compatibility mode only
-  public PluralRules rules; // not in API; could be made public in the future
-  public Long threshold; // not in API; controls internal self-regulation threshold
-  public ULocale loc;
+    public Notation notation;
+    public MeasureUnit unit;
+    public MeasureUnit perUnit;
+    public Rounder rounder;
+    public Object grouping;
+    public Padder padder;
+    public IntegerWidth integerWidth;
+    public Object symbols;
+    public UnitWidth unitWidth;
+    public SignDisplay sign;
+    public DecimalSeparatorDisplay decimal;
+    public AffixPatternProvider affixProvider; // not in API; for JDK compatibility mode only
+    public MultiplierImpl multiplier; // not in API; for JDK compatibility mode only
+    public PluralRules rules; // not in API; could be made public in the future
+    public Long threshold; // not in API; controls internal self-regulation threshold
+    public ULocale loc;
 
-  /**
-   * Copies values from fallback into this instance if they are null in this instance.
-   *
-   * @param fallback The instance to copy from; not modified by this operation.
-   */
-  public void fallback(MacroProps fallback) {
-    if (notation == null) notation = fallback.notation;
-    if (unit == null) unit = fallback.unit;
-    if (rounder == null) rounder = fallback.rounder;
-    if (grouper == null) grouper = fallback.grouper;
-    if (padder == null) padder = fallback.padder;
-    if (integerWidth == null) integerWidth = fallback.integerWidth;
-    if (symbols == null) symbols = fallback.symbols;
-    if (unitWidth == null) unitWidth = fallback.unitWidth;
-    if (sign == null) sign = fallback.sign;
-    if (decimal == null) decimal = fallback.decimal;
-    if (affixProvider == null) affixProvider = fallback.affixProvider;
-    if (multiplier == null) multiplier = fallback.multiplier;
-    if (rules == null) rules = fallback.rules;
-    if (loc == null) loc = fallback.loc;
-  }
-
-  @Override
-  public int hashCode() {
-    return Utility.hash(
-        notation,
-        unit,
-        rounder,
-        grouper,
-        padder,
-        integerWidth,
-        symbols,
-        unitWidth,
-        sign,
-        decimal,
-        affixProvider,
-        multiplier,
-        rules,
-        loc);
-  }
-
-  @Override
-  public boolean equals(Object _other) {
-    if (_other == null) return false;
-    if (this == _other) return true;
-    if (!(_other instanceof MacroProps)) return false;
-    MacroProps other = (MacroProps) _other;
-    return Utility.equals(notation, other.notation)
-        && Utility.equals(unit, other.unit)
-        && Utility.equals(rounder, other.rounder)
-        && Utility.equals(grouper, other.grouper)
-        && Utility.equals(padder, other.padder)
-        && Utility.equals(integerWidth, other.integerWidth)
-        && Utility.equals(symbols, other.symbols)
-        && Utility.equals(unitWidth, other.unitWidth)
-        && Utility.equals(sign, other.sign)
-        && Utility.equals(decimal, other.decimal)
-        && Utility.equals(affixProvider, other.affixProvider)
-        && Utility.equals(multiplier, other.multiplier)
-        && Utility.equals(rules, other.rules)
-        && Utility.equals(loc, other.loc);
-  }
-
-  @Override
-  public Object clone() {
-    // TODO: Remove this method?
-    try {
-      return super.clone();
-    } catch (CloneNotSupportedException e) {
-      throw new AssertionError(e);
+    /**
+     * Copies values from fallback into this instance if they are null in this instance.
+     *
+     * @param fallback
+     *            The instance to copy from; not modified by this operation.
+     */
+    public void fallback(MacroProps fallback) {
+        if (notation == null)
+            notation = fallback.notation;
+        if (unit == null)
+            unit = fallback.unit;
+        if (perUnit == null)
+            perUnit = fallback.perUnit;
+        if (rounder == null)
+            rounder = fallback.rounder;
+        if (grouping == null)
+            grouping = fallback.grouping;
+        if (padder == null)
+            padder = fallback.padder;
+        if (integerWidth == null)
+            integerWidth = fallback.integerWidth;
+        if (symbols == null)
+            symbols = fallback.symbols;
+        if (unitWidth == null)
+            unitWidth = fallback.unitWidth;
+        if (sign == null)
+            sign = fallback.sign;
+        if (decimal == null)
+            decimal = fallback.decimal;
+        if (affixProvider == null)
+            affixProvider = fallback.affixProvider;
+        if (multiplier == null)
+            multiplier = fallback.multiplier;
+        if (rules == null)
+            rules = fallback.rules;
+        if (loc == null)
+            loc = fallback.loc;
     }
-  }
+
+    @Override
+    public int hashCode() {
+        return Utility.hash(notation,
+                unit,
+                perUnit,
+                rounder,
+                grouping,
+                padder,
+                integerWidth,
+                symbols,
+                unitWidth,
+                sign,
+                decimal,
+                affixProvider,
+                multiplier,
+                rules,
+                loc);
+    }
+
+    @Override
+    public boolean equals(Object _other) {
+        if (_other == null)
+            return false;
+        if (this == _other)
+            return true;
+        if (!(_other instanceof MacroProps))
+            return false;
+        MacroProps other = (MacroProps) _other;
+        return Utility.equals(notation, other.notation)
+                && Utility.equals(unit, other.unit)
+                && Utility.equals(perUnit, other.perUnit)
+                && Utility.equals(rounder, other.rounder)
+                && Utility.equals(grouping, other.grouping)
+                && Utility.equals(padder, other.padder)
+                && Utility.equals(integerWidth, other.integerWidth)
+                && Utility.equals(symbols, other.symbols)
+                && Utility.equals(unitWidth, other.unitWidth)
+                && Utility.equals(sign, other.sign)
+                && Utility.equals(decimal, other.decimal)
+                && Utility.equals(affixProvider, other.affixProvider)
+                && Utility.equals(multiplier, other.multiplier)
+                && Utility.equals(rules, other.rules)
+                && Utility.equals(loc, other.loc);
+    }
+
+    @Override
+    public Object clone() {
+        // TODO: Remove this method?
+        try {
+            return super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new AssertionError(e);
+        }
+    }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MicroProps.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MicroProps.java
index 6d5a33a..d5e3ba4 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MicroProps.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MicroProps.java
@@ -2,7 +2,6 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 package com.ibm.icu.impl.number;
 
-import com.ibm.icu.number.Grouper;
 import com.ibm.icu.number.IntegerWidth;
 import com.ibm.icu.number.NumberFormatter.DecimalSeparatorDisplay;
 import com.ibm.icu.number.NumberFormatter.SignDisplay;
@@ -31,8 +30,8 @@
 
     /**
      * @param immutable
-     *            Whether this MicroProps should behave as an immutable after construction with respect to the quantity
-     *            chain.
+     *            Whether this MicroProps should behave as an immutable after construction with respect
+     *            to the quantity chain.
      */
     public MicroProps(boolean immutable) {
         this.immutable = immutable;
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MicroPropsGenerator.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MicroPropsGenerator.java
index c633ce7..12ce18d 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MicroPropsGenerator.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MicroPropsGenerator.java
@@ -3,19 +3,21 @@
 package com.ibm.icu.impl.number;
 
 /**
- * This interface is used when all number formatting settings, including the locale, are known, except for the quantity
- * itself. The {@link #processQuantity} method performs the final step in the number processing pipeline: it uses the
- * quantity to generate a finalized {@link MicroProps}, which can be used to render the number to output.
+ * This interface is used when all number formatting settings, including the locale, are known, except
+ * for the quantity itself. The {@link #processQuantity} method performs the final step in the number
+ * processing pipeline: it uses the quantity to generate a finalized {@link MicroProps}, which can be
+ * used to render the number to output.
  *
  * <p>
- * In other words, this interface is used for the parts of number processing that are <em>quantity-dependent</em>.
+ * In other words, this interface is used for the parts of number processing that are
+ * <em>quantity-dependent</em>.
  *
  * <p>
- * In order to allow for multiple different objects to all mutate the same MicroProps, a "chain" of MicroPropsGenerators
- * are linked together, and each one is responsible for manipulating a certain quantity-dependent part of the
- * MicroProps. At the top of the linked list is a base instance of {@link MicroProps} with properties that are not
- * quantity-dependent. Each element in the linked list calls {@link #processQuantity} on its "parent", then does its
- * work, and then returns the result.
+ * In order to allow for multiple different objects to all mutate the same MicroProps, a "chain" of
+ * MicroPropsGenerators are linked together, and each one is responsible for manipulating a certain
+ * quantity-dependent part of the MicroProps. At the top of the linked list is a base instance of
+ * {@link MicroProps} with properties that are not quantity-dependent. Each element in the linked list
+ * calls {@link #processQuantity} on its "parent", then does its work, and then returns the result.
  *
  * <p>
  * A class implementing MicroPropsGenerator looks something like this:
@@ -42,7 +44,8 @@
  */
 public interface MicroPropsGenerator {
     /**
-     * Considers the given {@link DecimalQuantity}, optionally mutates it, and returns a {@link MicroProps}.
+     * Considers the given {@link DecimalQuantity}, optionally mutates it, and returns a
+     * {@link MicroProps}.
      *
      * @param quantity
      *            The quantity for consideration and optional mutation.
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Modifier.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Modifier.java
index b37e4d7..a7ab9b9 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Modifier.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Modifier.java
@@ -3,12 +3,12 @@
 package com.ibm.icu.impl.number;
 
 /**
- * A Modifier is an object that can be passed through the formatting pipeline until it is finally applied to the string
- * builder. A Modifier usually contains a prefix and a suffix that are applied, but it could contain something else,
- * like a {@link com.ibm.icu.text.SimpleFormatter} pattern.
+ * A Modifier is an object that can be passed through the formatting pipeline until it is finally applied
+ * to the string builder. A Modifier usually contains a prefix and a suffix that are applied, but it
+ * could contain something else, like a {@link com.ibm.icu.text.SimpleFormatter} pattern.
  *
- * A Modifier is usually immutable, except in cases such as {@link MutablePatternModifier}, which are mutable for performance
- * reasons.
+ * A Modifier is usually immutable, except in cases such as {@link MutablePatternModifier}, which are
+ * mutable for performance reasons.
  */
 public interface Modifier {
 
@@ -18,17 +18,18 @@
      * @param output
      *            The string builder to which to apply this modifier.
      * @param leftIndex
-     *            The left index of the string within the builder. Equal to 0 when only one number is being formatted.
+     *            The left index of the string within the builder. Equal to 0 when only one number is
+     *            being formatted.
      * @param rightIndex
-     *            The right index of the string within the string builder. Equal to length when only one number is being
-     *            formatted.
+     *            The right index of the string within the string builder. Equal to length when only one
+     *            number is being formatted.
      * @return The number of characters (UTF-16 code units) that were added to the string builder.
      */
     public int apply(NumberStringBuilder output, int leftIndex, int rightIndex);
 
     /**
-     * Gets the length of the prefix. This information can be used in combination with {@link #apply} to extract the
-     * prefix and suffix strings.
+     * Gets the length of the prefix. This information can be used in combination with {@link #apply} to
+     * extract the prefix and suffix strings.
      *
      * @return The number of characters (UTF-16 code units) in the prefix.
      */
@@ -40,9 +41,9 @@
     public int getCodePointCount();
 
     /**
-     * Whether this modifier is strong. If a modifier is strong, it should always be applied immediately and not allowed
-     * to bubble up. With regard to padding, strong modifiers are considered to be on the inside of the prefix and
-     * suffix.
+     * Whether this modifier is strong. If a modifier is strong, it should always be applied immediately
+     * and not allowed to bubble up. With regard to padding, strong modifiers are considered to be on the
+     * inside of the prefix and suffix.
      *
      * @return Whether the modifier is strong.
      */
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierImpl.java
index 0533ebf..dd495d1 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierImpl.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierImpl.java
@@ -5,39 +5,39 @@
 import java.math.BigDecimal;
 
 public class MultiplierImpl implements MicroPropsGenerator {
-  final int magnitudeMultiplier;
-  final BigDecimal bigDecimalMultiplier;
-  final MicroPropsGenerator parent;
+    final int magnitudeMultiplier;
+    final BigDecimal bigDecimalMultiplier;
+    final MicroPropsGenerator parent;
 
-  public MultiplierImpl(int magnitudeMultiplier) {
-    this.magnitudeMultiplier = magnitudeMultiplier;
-    this.bigDecimalMultiplier = null;
-    parent = null;
-  }
-
-  public MultiplierImpl(BigDecimal bigDecimalMultiplier) {
-    this.magnitudeMultiplier = 0;
-    this.bigDecimalMultiplier = bigDecimalMultiplier;
-    parent = null;
-  }
-
-  private MultiplierImpl(MultiplierImpl base, MicroPropsGenerator parent) {
-    this.magnitudeMultiplier = base.magnitudeMultiplier;
-    this.bigDecimalMultiplier = base.bigDecimalMultiplier;
-    this.parent = parent;
-  }
-
-  public MicroPropsGenerator copyAndChain(MicroPropsGenerator parent) {
-    return new MultiplierImpl(this, parent);
-  }
-
-  @Override
-  public MicroProps processQuantity(DecimalQuantity quantity) {
-    MicroProps micros = parent.processQuantity(quantity);
-    quantity.adjustMagnitude(magnitudeMultiplier);
-    if (bigDecimalMultiplier != null) {
-      quantity.multiplyBy(bigDecimalMultiplier);
+    public MultiplierImpl(int magnitudeMultiplier) {
+        this.magnitudeMultiplier = magnitudeMultiplier;
+        this.bigDecimalMultiplier = null;
+        parent = null;
     }
-    return micros;
-  }
+
+    public MultiplierImpl(BigDecimal bigDecimalMultiplier) {
+        this.magnitudeMultiplier = 0;
+        this.bigDecimalMultiplier = bigDecimalMultiplier;
+        parent = null;
+    }
+
+    private MultiplierImpl(MultiplierImpl base, MicroPropsGenerator parent) {
+        this.magnitudeMultiplier = base.magnitudeMultiplier;
+        this.bigDecimalMultiplier = base.bigDecimalMultiplier;
+        this.parent = parent;
+    }
+
+    public MicroPropsGenerator copyAndChain(MicroPropsGenerator parent) {
+        return new MultiplierImpl(this, parent);
+    }
+
+    @Override
+    public MicroProps processQuantity(DecimalQuantity quantity) {
+        MicroProps micros = parent.processQuantity(quantity);
+        quantity.adjustMagnitude(magnitudeMultiplier);
+        if (bigDecimalMultiplier != null) {
+            quantity.multiplyBy(bigDecimalMultiplier);
+        }
+        return micros;
+    }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierProducer.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierProducer.java
index ea42246..708481d 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierProducer.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierProducer.java
@@ -6,5 +6,14 @@
  * An interface used by compact notation and scientific notation to choose a multiplier while rounding.
  */
 public interface MultiplierProducer {
+    /**
+     * Maps a magnitude to a multiplier in powers of ten. For example, in compact notation in English, a
+     * magnitude of 5 (e.g., 100,000) should return a multiplier of -3, since the number is displayed in
+     * thousands.
+     *
+     * @param magnitude
+     *            The power of ten of the input number.
+     * @return The shift in powers of ten.
+     */
     int getMultiplier(int magnitude);
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MutablePatternModifier.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MutablePatternModifier.java
index df1fa90..609259a 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MutablePatternModifier.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MutablePatternModifier.java
@@ -11,25 +11,26 @@
 import com.ibm.icu.util.Currency;
 
 /**
- * This class is a {@link Modifier} that wraps a decimal format pattern. It applies the pattern's affixes in
- * {@link Modifier#apply}.
+ * This class is a {@link Modifier} that wraps a decimal format pattern. It applies the pattern's affixes
+ * in {@link Modifier#apply}.
  *
  * <p>
- * In addition to being a Modifier, this class contains the business logic for substituting the correct locale symbols
- * into the affixes of the decimal format pattern.
+ * In addition to being a Modifier, this class contains the business logic for substituting the correct
+ * locale symbols into the affixes of the decimal format pattern.
  *
  * <p>
- * In order to use this class, create a new instance and call the following four setters: {@link #setPatternInfo},
- * {@link #setPatternAttributes}, {@link #setSymbols}, and {@link #setNumberProperties}. After calling these four
- * setters, the instance will be ready for use as a Modifier.
+ * In order to use this class, create a new instance and call the following four setters:
+ * {@link #setPatternInfo}, {@link #setPatternAttributes}, {@link #setSymbols}, and
+ * {@link #setNumberProperties}. After calling these four setters, the instance will be ready for use as
+ * a Modifier.
  *
  * <p>
- * This is a MUTABLE, NON-THREAD-SAFE class designed for performance. Do NOT save references to this or attempt to use
- * it from multiple threads! Instead, you can obtain a safe, immutable decimal format pattern modifier by calling
- * {@link MutablePatternModifier#createImmutable}, in effect treating this instance as a builder for the immutable
- * variant.
+ * This is a MUTABLE, NON-THREAD-SAFE class designed for performance. Do NOT save references to this or
+ * attempt to use it from multiple threads! Instead, you can obtain a safe, immutable decimal format
+ * pattern modifier by calling {@link MutablePatternModifier#createImmutable}, in effect treating this
+ * instance as a builder for the immutable variant.
  */
-public class MutablePatternModifier implements Modifier, SymbolProvider, CharSequence, MicroPropsGenerator {
+public class MutablePatternModifier implements Modifier, SymbolProvider, MicroPropsGenerator {
 
     // Modifier details
     final boolean isStrong;
@@ -46,24 +47,20 @@
     PluralRules rules;
 
     // Number details
-    boolean isNegative;
+    int signum;
     StandardPlural plural;
 
     // QuantityChain details
     MicroPropsGenerator parent;
 
-    // Transient CharSequence fields
-    boolean inCharSequenceMode;
-    int flags;
-    int length;
-    boolean prependSign;
-    boolean plusReplacesMinusSign;
+    // Transient fields for rendering
+    StringBuilder currentAffix;
 
     /**
      * @param isStrong
      *            Whether the modifier should be considered strong. For more information, see
-     *            {@link Modifier#isStrong()}. Most of the time, decimal format pattern modifiers should be considered
-     *            as non-strong.
+     *            {@link Modifier#isStrong()}. Most of the time, decimal format pattern modifiers should
+     *            be considered as non-strong.
      */
     public MutablePatternModifier(boolean isStrong) {
         this.isStrong = isStrong;
@@ -71,8 +68,8 @@
 
     /**
      * Sets a reference to the parsed decimal format pattern, usually obtained from
-     * {@link PatternStringParser#parseToPatternInfo(String)}, but any implementation of {@link AffixPatternProvider} is
-     * accepted.
+     * {@link PatternStringParser#parseToPatternInfo(String)}, but any implementation of
+     * {@link AffixPatternProvider} is accepted.
      */
     public void setPatternInfo(AffixPatternProvider patternInfo) {
         this.patternInfo = patternInfo;
@@ -101,10 +98,14 @@
      * @param unitWidth
      *            The width used to render currencies.
      * @param rules
-     *            Required if the triple currency sign, "¤¤¤", appears in the pattern, which can be determined from the
-     *            convenience method {@link #needsPlurals()}.
+     *            Required if the triple currency sign, "¤¤¤", appears in the pattern, which can be
+     *            determined from the convenience method {@link #needsPlurals()}.
      */
-    public void setSymbols(DecimalFormatSymbols symbols, Currency currency, UnitWidth unitWidth, PluralRules rules) {
+    public void setSymbols(
+            DecimalFormatSymbols symbols,
+            Currency currency,
+            UnitWidth unitWidth,
+            PluralRules rules) {
         assert (rules != null) == needsPlurals();
         this.symbols = symbols;
         this.currency = currency;
@@ -115,30 +116,31 @@
     /**
      * Sets attributes of the current number being processed.
      *
-     * @param isNegative
-     *            Whether the number is negative.
+     * @param signum
+     *            -1 if negative; +1 if positive; or 0 if zero.
      * @param plural
-     *            The plural form of the number, required only if the pattern contains the triple currency sign, "¤¤¤"
-     *            (and as indicated by {@link #needsPlurals()}).
+     *            The plural form of the number, required only if the pattern contains the triple
+     *            currency sign, "¤¤¤" (and as indicated by {@link #needsPlurals()}).
      */
-    public void setNumberProperties(boolean isNegative, StandardPlural plural) {
+    public void setNumberProperties(int signum, StandardPlural plural) {
         assert (plural != null) == needsPlurals();
-        this.isNegative = isNegative;
+        this.signum = signum;
         this.plural = plural;
     }
 
     /**
-     * Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order to localize.
-     * This is currently true only if there is a currency long name placeholder in the pattern ("¤¤¤").
+     * Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order
+     * to localize. This is currently true only if there is a currency long name placeholder in the
+     * pattern ("¤¤¤").
      */
     public boolean needsPlurals() {
         return patternInfo.containsSymbolType(AffixUtils.TYPE_CURRENCY_TRIPLE);
     }
 
     /**
-     * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable
-     * and can be saved for future use. The number properties in the current instance are mutated; all other properties
-     * are left untouched.
+     * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which
+     * is immutable and can be saved for future use. The number properties in the current instance are
+     * mutated; all other properties are left untouched.
      *
      * <p>
      * The resulting modifier cannot be used in a QuantityChain.
@@ -150,9 +152,9 @@
     }
 
     /**
-     * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable
-     * and can be saved for future use. The number properties in the current instance are mutated; all other properties
-     * are left untouched.
+     * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which
+     * is immutable and can be saved for future use. The number properties in the current instance are
+     * mutated; all other properties are left untouched.
      *
      * @param parent
      *            The QuantityChain to which to chain this immutable.
@@ -165,42 +167,48 @@
             // Slower path when we require the plural keyword.
             ParameterizedModifier pm = new ParameterizedModifier();
             for (StandardPlural plural : StandardPlural.VALUES) {
-                setNumberProperties(false, plural);
-                pm.setModifier(false, plural, createConstantModifier(a, b));
-                setNumberProperties(true, plural);
-                pm.setModifier(true, plural, createConstantModifier(a, b));
+                setNumberProperties(1, plural);
+                pm.setModifier(1, plural, createConstantModifier(a, b));
+                setNumberProperties(0, plural);
+                pm.setModifier(0, plural, createConstantModifier(a, b));
+                setNumberProperties(-1, plural);
+                pm.setModifier(-1, plural, createConstantModifier(a, b));
             }
             pm.freeze();
             return new ImmutablePatternModifier(pm, rules, parent);
         } else {
             // Faster path when plural keyword is not needed.
-            setNumberProperties(false, null);
+            setNumberProperties(1, null);
             Modifier positive = createConstantModifier(a, b);
-            setNumberProperties(true, null);
+            setNumberProperties(0, null);
+            Modifier zero = createConstantModifier(a, b);
+            setNumberProperties(-1, null);
             Modifier negative = createConstantModifier(a, b);
-            ParameterizedModifier pm = new ParameterizedModifier(positive, negative);
+            ParameterizedModifier pm = new ParameterizedModifier(positive, zero, negative);
             return new ImmutablePatternModifier(pm, null, parent);
         }
     }
 
     /**
-     * Uses the current properties to create a single {@link ConstantMultiFieldModifier} with currency spacing support
-     * if required.
+     * Uses the current properties to create a single {@link ConstantMultiFieldModifier} with currency
+     * spacing support if required.
      *
      * @param a
-     *            A working NumberStringBuilder object; passed from the outside to prevent the need to create many new
-     *            instances if this method is called in a loop.
+     *            A working NumberStringBuilder object; passed from the outside to prevent the need to
+     *            create many new instances if this method is called in a loop.
      * @param b
      *            Another working NumberStringBuilder object.
      * @return The constant modifier object.
      */
-    private ConstantMultiFieldModifier createConstantModifier(NumberStringBuilder a, NumberStringBuilder b) {
+    private ConstantMultiFieldModifier createConstantModifier(
+            NumberStringBuilder a,
+            NumberStringBuilder b) {
         insertPrefix(a.clear(), 0);
         insertSuffix(b.clear(), 0);
         if (patternInfo.hasCurrencySign()) {
-            return new CurrencySpacingEnabledModifier(a, b, isStrong, symbols);
+            return new CurrencySpacingEnabledModifier(a, b, !patternInfo.hasBody(), isStrong, symbols);
         } else {
-            return new ConstantMultiFieldModifier(a, b, isStrong);
+            return new ConstantMultiFieldModifier(a, b, !patternInfo.hasBody(), isStrong);
         }
     }
 
@@ -209,7 +217,10 @@
         final PluralRules rules;
         final MicroPropsGenerator parent;
 
-        ImmutablePatternModifier(ParameterizedModifier pm, PluralRules rules, MicroPropsGenerator parent) {
+        ImmutablePatternModifier(
+                ParameterizedModifier pm,
+                PluralRules rules,
+                MicroPropsGenerator parent) {
             this.pm = pm;
             this.rules = rules;
             this.parent = parent;
@@ -224,13 +235,13 @@
 
         public void applyToMicros(MicroProps micros, DecimalQuantity quantity) {
             if (rules == null) {
-                micros.modMiddle = pm.getModifier(quantity.isNegative());
+                micros.modMiddle = pm.getModifier(quantity.signum());
             } else {
                 // TODO: Fix this. Avoid the copy.
                 DecimalQuantity copy = quantity.createCopy();
                 copy.roundToInfinity();
                 StandardPlural plural = copy.getStandardPlural(rules);
-                micros.modMiddle = pm.getModifier(quantity.isNegative(), plural);
+                micros.modMiddle = pm.getModifier(quantity.signum(), plural);
             }
         }
     }
@@ -248,9 +259,9 @@
             // TODO: Fix this. Avoid the copy.
             DecimalQuantity copy = fq.createCopy();
             micros.rounding.apply(copy);
-            setNumberProperties(fq.isNegative(), copy.getStandardPlural(rules));
+            setNumberProperties(fq.signum(), copy.getStandardPlural(rules));
         } else {
-            setNumberProperties(fq.isNegative(), null);
+            setNumberProperties(fq.signum(), null);
         }
         micros.modMiddle = this;
         return micros;
@@ -260,29 +271,35 @@
     public int apply(NumberStringBuilder output, int leftIndex, int rightIndex) {
         int prefixLen = insertPrefix(output, leftIndex);
         int suffixLen = insertSuffix(output, rightIndex + prefixLen);
-        CurrencySpacingEnabledModifier.applyCurrencySpacing(output, leftIndex, prefixLen, rightIndex + prefixLen,
-                suffixLen, symbols);
-        return prefixLen + suffixLen;
+        // If the pattern had no decimal stem body (like #,##0.00), overwrite the value.
+        int overwriteLen = 0;
+        if (!patternInfo.hasBody()) {
+            overwriteLen = output.splice(leftIndex + prefixLen, rightIndex + prefixLen, "", 0, 0, null);
+        }
+        CurrencySpacingEnabledModifier.applyCurrencySpacing(output,
+                leftIndex,
+                prefixLen,
+                rightIndex + prefixLen + overwriteLen,
+                suffixLen,
+                symbols);
+        return prefixLen + overwriteLen + suffixLen;
     }
 
     @Override
     public int getPrefixLength() {
-        // Enter and exit CharSequence Mode to get the length.
-        enterCharSequenceMode(true);
-        int result = AffixUtils.unescapedCodePointCount(this, this);  // prefix length
-        exitCharSequenceMode();
+        // Render the affix to get the length
+        prepareAffix(true);
+        int result = AffixUtils.unescapedCount(currentAffix, true, this); // prefix length
         return result;
     }
 
     @Override
     public int getCodePointCount() {
-        // Enter and exit CharSequence Mode to get the length.
-        enterCharSequenceMode(true);
-        int result = AffixUtils.unescapedCodePointCount(this, this);  // prefix length
-        exitCharSequenceMode();
-        enterCharSequenceMode(false);
-        result += AffixUtils.unescapedCodePointCount(this, this);  // suffix length
-        exitCharSequenceMode();
+        // Render the affixes to get the length
+        prepareAffix(true);
+        int result = AffixUtils.unescapedCount(currentAffix, false, this); // prefix length
+        prepareAffix(false);
+        result += AffixUtils.unescapedCount(currentAffix, false, this); // suffix length
         return result;
     }
 
@@ -292,20 +309,38 @@
     }
 
     private int insertPrefix(NumberStringBuilder sb, int position) {
-        enterCharSequenceMode(true);
-        int length = AffixUtils.unescape(this, sb, position, this);
-        exitCharSequenceMode();
+        prepareAffix(true);
+        int length = AffixUtils.unescape(currentAffix, sb, position, this);
         return length;
     }
 
     private int insertSuffix(NumberStringBuilder sb, int position) {
-        enterCharSequenceMode(false);
-        int length = AffixUtils.unescape(this, sb, position, this);
-        exitCharSequenceMode();
+        prepareAffix(false);
+        int length = AffixUtils.unescape(currentAffix, sb, position, this);
         return length;
     }
 
     /**
+     * Pre-processes the prefix or suffix into the currentAffix field, creating and mutating that field
+     * if necessary. Calls down to {@link PatternStringUtils#affixPatternProviderToStringBuilder}.
+     *
+     * @param isPrefix
+     *            true to prepare the prefix; false to prepare the suffix.
+     */
+    private void prepareAffix(boolean isPrefix) {
+        if (currentAffix == null) {
+            currentAffix = new StringBuilder();
+        }
+        PatternStringUtils.patternInfoToStringBuilder(patternInfo,
+                isPrefix,
+                signum,
+                signDisplay,
+                plural,
+                perMilleReplacesPercent,
+                currentAffix);
+    }
+
+    /**
      * Returns the string that substitutes a given symbol type in a pattern.
      */
     @Override
@@ -325,10 +360,10 @@
                 return currency.getCurrencyCode();
             } else if (unitWidth == UnitWidth.HIDDEN) {
                 return "";
-            } else if (unitWidth == UnitWidth.NARROW) {
-                return currency.getName(symbols.getULocale(), Currency.NARROW_SYMBOL_NAME, null);
             } else {
-                return currency.getName(symbols.getULocale(), Currency.SYMBOL_NAME, null);
+                int selector = unitWidth == UnitWidth.NARROW ? Currency.NARROW_SYMBOL_NAME
+                        : Currency.SYMBOL_NAME;
+                return currency.getName(symbols.getULocale(), selector, null);
             }
         case AffixUtils.TYPE_CURRENCY_DOUBLE:
             return currency.getCurrencyCode();
@@ -337,7 +372,8 @@
             // Plural currencies set via the API are formatted in LongNameHandler.
             // This code path is used by DecimalFormat via CurrencyPluralInfo.
             assert plural != null;
-            return currency.getName(symbols.getULocale(), Currency.PLURAL_LONG_NAME, plural.getKeyword(), null);
+            return currency
+                    .getName(symbols.getULocale(), Currency.PLURAL_LONG_NAME, plural.getKeyword(), null);
         case AffixUtils.TYPE_CURRENCY_QUAD:
             return "\uFFFD";
         case AffixUtils.TYPE_CURRENCY_QUINT:
@@ -346,81 +382,4 @@
             throw new AssertionError();
         }
     }
-
-    /** This method contains the heart of the logic for rendering LDML affix strings. */
-    private void enterCharSequenceMode(boolean isPrefix) {
-        assert !inCharSequenceMode;
-        inCharSequenceMode = true;
-
-        // Should the output render '+' where '-' would normally appear in the pattern?
-        plusReplacesMinusSign = !isNegative
-                && (signDisplay == SignDisplay.ALWAYS || signDisplay == SignDisplay.ACCOUNTING_ALWAYS)
-                && patternInfo.positiveHasPlusSign() == false;
-
-        // Should we use the affix from the negative subpattern? (If not, we will use the positive subpattern.)
-        boolean useNegativeAffixPattern = patternInfo.hasNegativeSubpattern()
-                && (isNegative || (patternInfo.negativeHasMinusSign() && plusReplacesMinusSign));
-
-        // Resolve the flags for the affix pattern.
-        flags = 0;
-        if (useNegativeAffixPattern) {
-            flags |= AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN;
-        }
-        if (isPrefix) {
-            flags |= AffixPatternProvider.Flags.PREFIX;
-        }
-        if (plural != null) {
-            assert plural.ordinal() == (AffixPatternProvider.Flags.PLURAL_MASK & plural.ordinal());
-            flags |= plural.ordinal();
-        }
-
-        // Should we prepend a sign to the pattern?
-        if (!isPrefix || useNegativeAffixPattern) {
-            prependSign = false;
-        } else if (isNegative) {
-            prependSign = signDisplay != SignDisplay.NEVER;
-        } else {
-            prependSign = plusReplacesMinusSign;
-        }
-
-        // Finally, compute the length of the affix pattern.
-        length = patternInfo.length(flags) + (prependSign ? 1 : 0);
-    }
-
-    private void exitCharSequenceMode() {
-        assert inCharSequenceMode;
-        inCharSequenceMode = false;
-    }
-
-    @Override
-    public int length() {
-        assert inCharSequenceMode;
-        return length;
-    }
-
-    @Override
-    public char charAt(int index) {
-        assert inCharSequenceMode;
-        char candidate;
-        if (prependSign && index == 0) {
-            candidate = '-';
-        } else if (prependSign) {
-            candidate = patternInfo.charAt(flags, index - 1);
-        } else {
-            candidate = patternInfo.charAt(flags, index);
-        }
-        if (plusReplacesMinusSign && candidate == '-') {
-            return '+';
-        }
-        if (perMilleReplacesPercent && candidate == '%') {
-            return '‰';
-        }
-        return candidate;
-    }
-
-    @Override
-    public CharSequence subSequence(int start, int end) {
-        // Never called by AffixUtils
-        throw new AssertionError();
-    }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/NumberStringBuilder.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/NumberStringBuilder.java
index f103b5e..f95603f 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/NumberStringBuilder.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/NumberStringBuilder.java
@@ -13,8 +13,8 @@
 import com.ibm.icu.text.NumberFormat.Field;
 
 /**
- * A StringBuilder optimized for number formatting. It implements the following key features beyond a normal JDK
- * StringBuilder:
+ * A StringBuilder optimized for number formatting. It implements the following key features beyond a
+ * normal JDK StringBuilder:
  *
  * <ol>
  * <li>Efficient prepend as well as append.
@@ -156,8 +156,8 @@
     }
 
     /**
-     * Inserts the specified CharSequence at the specified index in the string, reading from the CharSequence from start
-     * (inclusive) to end (exclusive).
+     * Inserts the specified CharSequence at the specified index in the string, reading from the
+     * CharSequence from start (inclusive) to end (exclusive).
      *
      * @return The number of chars added, which is the length of CharSequence.
      */
@@ -172,8 +172,41 @@
     }
 
     /**
-     * Appends the chars in the specified char array to the end of the string, and associates them with the fields in
-     * the specified field array, which must have the same length as chars.
+     * Replaces the chars between startThis and endThis with the chars between startOther and endOther of
+     * the given CharSequence. Calling this method with startThis == endThis is equivalent to calling
+     * insert.
+     *
+     * @return The number of chars added, which may be negative if the removed segment is longer than the
+     *         length of the CharSequence segment that was inserted.
+     */
+    public int splice(
+            int startThis,
+            int endThis,
+            CharSequence sequence,
+            int startOther,
+            int endOther,
+            Field field) {
+        int thisLength = endThis - startThis;
+        int otherLength = endOther - startOther;
+        int count = otherLength - thisLength;
+        int position;
+        if (count > 0) {
+            // Overall, chars need to be added.
+            position = prepareForInsert(startThis, count);
+        } else {
+            // Overall, chars need to be removed or kept the same.
+            position = remove(startThis, -count);
+        }
+        for (int i = 0; i < otherLength; i++) {
+            chars[position + i] = sequence.charAt(startOther + i);
+            fields[position + i] = field;
+        }
+        return count;
+    }
+
+    /**
+     * Appends the chars in the specified char array to the end of the string, and associates them with
+     * the fields in the specified field array, which must have the same length as chars.
      *
      * @return The number of chars added, which is the length of the char array.
      */
@@ -182,8 +215,8 @@
     }
 
     /**
-     * Inserts the chars in the specified char array at the specified index in the string, and associates them with the
-     * fields in the specified field array, which must have the same length as chars.
+     * Inserts the chars in the specified char array at the specified index in the string, and associates
+     * them with the fields in the specified field array, which must have the same length as chars.
      *
      * @return The number of chars added, which is the length of the char array.
      */
@@ -257,7 +290,8 @@
     }
 
     private int prepareForInsertHelper(int index, int count) {
-        // Java note: Keeping this code out of prepareForInsert() increases the speed of append operations.
+        // Java note: Keeping this code out of prepareForInsert() increases the speed of append
+        // operations.
         int oldCapacity = getCapacity();
         int oldZero = zero;
         char[] oldChars = chars;
@@ -272,9 +306,17 @@
             // First copy the prefix and then the suffix, leaving room for the new chars that the
             // caller wants to insert.
             System.arraycopy(oldChars, oldZero, newChars, newZero, index);
-            System.arraycopy(oldChars, oldZero + index, newChars, newZero + index + count, length - index);
+            System.arraycopy(oldChars,
+                    oldZero + index,
+                    newChars,
+                    newZero + index + count,
+                    length - index);
             System.arraycopy(oldFields, oldZero, newFields, newZero, index);
-            System.arraycopy(oldFields, oldZero + index, newFields, newZero + index + count, length - index);
+            System.arraycopy(oldFields,
+                    oldZero + index,
+                    newFields,
+                    newZero + index + count,
+                    length - index);
 
             chars = newChars;
             fields = newFields;
@@ -286,9 +328,17 @@
             // First copy the entire string to the location of the prefix, and then move the suffix
             // to make room for the new chars that the caller wants to insert.
             System.arraycopy(oldChars, oldZero, oldChars, newZero, length);
-            System.arraycopy(oldChars, newZero + index, oldChars, newZero + index + count, length - index);
+            System.arraycopy(oldChars,
+                    newZero + index,
+                    oldChars,
+                    newZero + index + count,
+                    length - index);
             System.arraycopy(oldFields, oldZero, oldFields, newZero, length);
-            System.arraycopy(oldFields, newZero + index, oldFields, newZero + index + count, length - index);
+            System.arraycopy(oldFields,
+                    newZero + index,
+                    oldFields,
+                    newZero + index + count,
+                    length - index);
 
             zero = newZero;
             length += count;
@@ -296,6 +346,18 @@
         return zero + index;
     }
 
+    /**
+     * Removes the "count" chars starting at "index". Returns the position at which the chars were
+     * removed.
+     */
+    private int remove(int index, int count) {
+        int position = index + zero;
+        System.arraycopy(chars, position + count, chars, position, length - index - count);
+        System.arraycopy(fields, position + count, fields, position, length - index - count);
+        length -= count;
+        return position;
+    }
+
     private int getCapacity() {
         return chars.length;
     }
@@ -342,8 +404,8 @@
      * Returns a string that includes field information, for debugging purposes.
      *
      * <p>
-     * For example, if the string is "-12.345", the debug string will be something like "&lt;NumberStringBuilder
-     * [-123.45] [-iii.ff]&gt;"
+     * For example, if the string is "-12.345", the debug string will be something like
+     * "&lt;NumberStringBuilder [-123.45] [-iii.ff]&gt;"
      *
      * @return A string for debugging purposes.
      */
@@ -374,7 +436,8 @@
     }
 
     /**
-     * @return Whether the contents and field values of this string builder are equal to the given chars and fields.
+     * @return Whether the contents and field values of this string builder are equal to the given chars
+     *         and fields.
      * @see #toCharArray
      * @see #toFieldArray
      */
@@ -455,7 +518,8 @@
             Field _field = (i < zero + length) ? fields[i] : null;
             if (seenStart && field != _field) {
                 // Special case: GROUPING_SEPARATOR counts as an INTEGER.
-                if (field == NumberFormat.Field.INTEGER && _field == NumberFormat.Field.GROUPING_SEPARATOR) {
+                if (field == NumberFormat.Field.INTEGER
+                        && _field == NumberFormat.Field.GROUPING_SEPARATOR) {
                     continue;
                 }
                 fp.setEndIndex(i - zero + offset);
@@ -482,9 +546,13 @@
         int currentStart = -1;
         for (int i = 0; i < length; i++) {
             Field field = fields[i + zero];
-            if (current == NumberFormat.Field.INTEGER && field == NumberFormat.Field.GROUPING_SEPARATOR) {
+            if (current == NumberFormat.Field.INTEGER
+                    && field == NumberFormat.Field.GROUPING_SEPARATOR) {
                 // Special case: GROUPING_SEPARATOR counts as an INTEGER.
-                as.addAttribute(NumberFormat.Field.GROUPING_SEPARATOR, NumberFormat.Field.GROUPING_SEPARATOR, i, i + 1);
+                as.addAttribute(NumberFormat.Field.GROUPING_SEPARATOR,
+                        NumberFormat.Field.GROUPING_SEPARATOR,
+                        i,
+                        i + 1);
             } else if (current != field) {
                 if (current != null) {
                     as.addAttribute(current, current, currentStart, i);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Padder.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Padder.java
index c1be703..efb4cec 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Padder.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Padder.java
@@ -6,40 +6,37 @@
     public static final String FALLBACK_PADDING_STRING = "\u0020"; // i.e. a space
 
     public enum PadPosition {
-      BEFORE_PREFIX,
-      AFTER_PREFIX,
-      BEFORE_SUFFIX,
-      AFTER_SUFFIX;
+        BEFORE_PREFIX, AFTER_PREFIX, BEFORE_SUFFIX, AFTER_SUFFIX;
 
-      public static PadPosition fromOld(int old) {
-        switch (old) {
-          case com.ibm.icu.text.DecimalFormat.PAD_BEFORE_PREFIX:
-            return PadPosition.BEFORE_PREFIX;
-          case com.ibm.icu.text.DecimalFormat.PAD_AFTER_PREFIX:
-            return PadPosition.AFTER_PREFIX;
-          case com.ibm.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX:
-            return PadPosition.BEFORE_SUFFIX;
-          case com.ibm.icu.text.DecimalFormat.PAD_AFTER_SUFFIX:
-            return PadPosition.AFTER_SUFFIX;
-          default:
-            throw new IllegalArgumentException("Don't know how to map " + old);
+        public static PadPosition fromOld(int old) {
+            switch (old) {
+            case com.ibm.icu.text.DecimalFormat.PAD_BEFORE_PREFIX:
+                return PadPosition.BEFORE_PREFIX;
+            case com.ibm.icu.text.DecimalFormat.PAD_AFTER_PREFIX:
+                return PadPosition.AFTER_PREFIX;
+            case com.ibm.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX:
+                return PadPosition.BEFORE_SUFFIX;
+            case com.ibm.icu.text.DecimalFormat.PAD_AFTER_SUFFIX:
+                return PadPosition.AFTER_SUFFIX;
+            default:
+                throw new IllegalArgumentException("Don't know how to map " + old);
+            }
         }
-      }
 
-      public int toOld() {
-        switch (this) {
-          case BEFORE_PREFIX:
-            return com.ibm.icu.text.DecimalFormat.PAD_BEFORE_PREFIX;
-          case AFTER_PREFIX:
-            return com.ibm.icu.text.DecimalFormat.PAD_AFTER_PREFIX;
-          case BEFORE_SUFFIX:
-            return com.ibm.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX;
-          case AFTER_SUFFIX:
-            return com.ibm.icu.text.DecimalFormat.PAD_AFTER_SUFFIX;
-          default:
-            return -1; // silence compiler errors
+        public int toOld() {
+            switch (this) {
+            case BEFORE_PREFIX:
+                return com.ibm.icu.text.DecimalFormat.PAD_BEFORE_PREFIX;
+            case AFTER_PREFIX:
+                return com.ibm.icu.text.DecimalFormat.PAD_AFTER_PREFIX;
+            case BEFORE_SUFFIX:
+                return com.ibm.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX;
+            case AFTER_SUFFIX:
+                return com.ibm.icu.text.DecimalFormat.PAD_AFTER_SUFFIX;
+            default:
+                return -1; // silence compiler errors
+            }
         }
-      }
     }
 
     /* like package-private */ public static final Padder NONE = new Padder(null, -1, null);
@@ -73,10 +70,16 @@
         return targetWidth > 0;
     }
 
-    public int padAndApply(Modifier mod1, Modifier mod2, NumberStringBuilder string, int leftIndex, int rightIndex) {
+    public int padAndApply(
+            Modifier mod1,
+            Modifier mod2,
+            NumberStringBuilder string,
+            int leftIndex,
+            int rightIndex) {
         int modLength = mod1.getCodePointCount() + mod2.getCodePointCount();
         int requiredPadding = targetWidth - modLength - string.codePointCount();
-        assert leftIndex == 0 && rightIndex == string.length(); // fix the previous line to remove this assertion
+        assert leftIndex == 0 && rightIndex == string.length(); // fix the previous line to remove this
+                                                                // assertion
 
         int length = 0;
         if (requiredPadding <= 0) {
@@ -102,7 +105,10 @@
         return length;
     }
 
-    private static int addPaddingHelper(String paddingString, int requiredPadding, NumberStringBuilder string,
+    private static int addPaddingHelper(
+            String paddingString,
+            int requiredPadding,
+            NumberStringBuilder string,
             int index) {
         for (int i = 0; i < requiredPadding; i++) {
             // TODO: If appending to the end, this will cause actual insertion operations. Improve.
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ParameterizedModifier.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ParameterizedModifier.java
index 5a7191a..a553be4 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ParameterizedModifier.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/ParameterizedModifier.java
@@ -5,11 +5,12 @@
 import com.ibm.icu.impl.StandardPlural;
 
 /**
- * A ParameterizedModifier by itself is NOT a Modifier. Rather, it wraps a data structure containing two or more
- * Modifiers and returns the modifier appropriate for the current situation.
+ * A ParameterizedModifier by itself is NOT a Modifier. Rather, it wraps a data structure containing two
+ * or more Modifiers and returns the modifier appropriate for the current situation.
  */
 public class ParameterizedModifier {
     private final Modifier positive;
+    private final Modifier zero;
     private final Modifier negative;
     final Modifier[] mods;
     boolean frozen;
@@ -20,49 +21,51 @@
      * <p>
      * If this constructor is used, a plural form CANNOT be passed to {@link #getModifier}.
      */
-    public ParameterizedModifier(Modifier positive, Modifier negative) {
+    public ParameterizedModifier(Modifier positive, Modifier zero, Modifier negative) {
         this.positive = positive;
+        this.zero = zero;
         this.negative = negative;
         this.mods = null;
         this.frozen = true;
     }
 
     /**
-     * This constructor prepares the ParameterizedModifier to be populated with a positive and negative Modifier for
-     * multiple plural forms.
+     * This constructor prepares the ParameterizedModifier to be populated with a positive and negative
+     * Modifier for multiple plural forms.
      *
      * <p>
      * If this constructor is used, a plural form MUST be passed to {@link #getModifier}.
      */
     public ParameterizedModifier() {
         this.positive = null;
+        this.zero = null;
         this.negative = null;
-        this.mods = new Modifier[2 * StandardPlural.COUNT];
+        this.mods = new Modifier[3 * StandardPlural.COUNT];
         this.frozen = false;
     }
 
-    public void setModifier(boolean isNegative, StandardPlural plural, Modifier mod) {
+    public void setModifier(int signum, StandardPlural plural, Modifier mod) {
         assert !frozen;
-        mods[getModIndex(isNegative, plural)] = mod;
+        mods[getModIndex(signum, plural)] = mod;
     }
 
     public void freeze() {
         frozen = true;
     }
 
-    public Modifier getModifier(boolean isNegative) {
+    public Modifier getModifier(int signum) {
         assert frozen;
         assert mods == null;
-        return isNegative ? negative : positive;
+        return signum == 0 ? zero : signum < 0 ? negative : positive;
     }
 
-    public Modifier getModifier(boolean isNegative, StandardPlural plural) {
+    public Modifier getModifier(int signum, StandardPlural plural) {
         assert frozen;
         assert positive == null;
-        return mods[getModIndex(isNegative, plural)];
+        return mods[getModIndex(signum, plural)];
     }
 
-    private static int getModIndex(boolean isNegative, StandardPlural plural) {
-        return plural.ordinal() * 2 + (isNegative ? 1 : 0);
+    private static int getModIndex(int signum, StandardPlural plural) {
+        return plural.ordinal() * 3 + (signum + 1);
     }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Parse.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Parse.java
deleted file mode 100644
index efb0e50..0000000
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Parse.java
+++ /dev/null
@@ -1,2385 +0,0 @@
-// © 2017 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html#License
-package com.ibm.icu.impl.number;
-
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.text.ParseException;
-import java.text.ParsePosition;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import com.ibm.icu.impl.StandardPlural;
-import com.ibm.icu.impl.TextTrieMap;
-import com.ibm.icu.lang.UCharacter;
-import com.ibm.icu.text.CurrencyPluralInfo;
-import com.ibm.icu.text.DecimalFormatSymbols;
-import com.ibm.icu.text.NumberFormat;
-import com.ibm.icu.text.UnicodeSet;
-import com.ibm.icu.util.Currency;
-import com.ibm.icu.util.Currency.CurrencyStringInfo;
-import com.ibm.icu.util.CurrencyAmount;
-import com.ibm.icu.util.ULocale;
-
-/**
- * A parser designed to convert an arbitrary human-generated string to its best representation as a
- * number: a long, a BigInteger, or a BigDecimal.
- *
- * <p>The parser may traverse multiple parse paths in the same strings if there is ambiguity. For
- * example, the string "12,345.67" has two main interpretations: it could be "12.345" in a locale
- * that uses '.' as the grouping separator, or it could be "12345.67" in a locale that uses ',' as
- * the grouping separator. Since the second option has a longer parse path (consumes more of the
- * input string), the parser will accept the second option.
- */
-public class Parse {
-
-  /** Controls the set of rules for parsing a string. */
-  public static enum ParseMode {
-    /**
-     * Lenient mode should be used if you want to accept malformed user input. It will use
-     * heuristics to attempt to parse through typographical errors in the string.
-     */
-    LENIENT,
-
-    /**
-     * Strict mode should be used if you want to require that the input is well-formed. More
-     * specifically, it differs from lenient mode in the following ways:
-     *
-     * <ul>
-     *   <li>Grouping widths must match the grouping settings. For example, "12,3,45" will fail if
-     *       the grouping width is 3, as in the pattern "#,##0".
-     *   <li>The string must contain a complete prefix and suffix. For example, if the pattern is
-     *       "{#};(#)", then "{123}" or "(123)" would match, but "{123", "123}", and "123" would all
-     *       fail. (The latter strings would be accepted in lenient mode.)
-     *   <li>Whitespace may not appear at arbitrary places in the string. In lenient mode,
-     *       whitespace is allowed to occur arbitrarily before and after prefixes and exponent
-     *       separators.
-     *   <li>Leading grouping separators are not allowed, as in ",123".
-     *   <li>Minus and plus signs can only appear if specified in the pattern. In lenient mode, a
-     *       plus or minus sign can always precede a number.
-     *   <li>The set of characters that can be interpreted as a decimal or grouping separator is
-     *       smaller.
-     *   <li><strong>If currency parsing is enabled,</strong> currencies must only appear where
-     *       specified in either the current pattern string or in a valid pattern string for the
-     *       current locale. For example, if the pattern is "¤0.00", then "$1.23" would match, but
-     *       "1.23$" would fail to match.
-     * </ul>
-     */
-    STRICT,
-
-    /**
-     * Fast mode should be used in applications that don't require prefixes and suffixes to match.
-     *
-     * <p>In addition to ignoring prefixes and suffixes, fast mode performs the following
-     * optimizations:
-     *
-     * <ul>
-     *   <li>Ignores digit strings from {@link DecimalFormatSymbols} and only uses the code point's
-     *       Unicode digit property. If you are not using custom digit strings, this should not
-     *       cause a change in behavior.
-     *   <li>Instead of traversing multiple possible parse paths, a "greedy" parsing strategy is
-     *       used, which might mean that fast mode won't accept strings that lenient or strict mode
-     *       would accept. Since prefix and suffix strings are ignored, this is not an issue unless
-     *       you are using custom symbols.
-     * </ul>
-     */
-    FAST,
-  }
-
-  /**
-   * An enum containing the choices for strategy in parsing when choosing between grouping and
-   * decimal separators.
-   */
-  public static enum GroupingMode {
-    /**
-     * Accept decimal equivalents as decimals, and if that fails, accept all equivalence classes
-     * (periods, commas, and whitespace-like) as grouping. This is a more lenient strategy.
-     *
-     * <p>For example, if the formatter's current locale is <em>fr-FR</em>, then "1.234" will parse
-     * as 1234, even though <em>fr-FR</em> does not use a period as the grouping separator.
-     */
-    DEFAULT,
-
-    /**
-     * Accept decimal equivalents as decimals and grouping equivalents as grouping. This strategy is
-     * more strict.
-     *
-     * <p>For example, if the formatter's current locale is <em>fr-FR</em>, then "1.234" will fail
-     * to parse since <em>fr-FR</em> does not use a period as the grouping separator.
-     */
-    RESTRICTED
-  }
-
-  /**
-   * @see Parse#parse(String, ParsePosition, ParseMode, boolean, boolean, DecimalFormatProperties,
-   *     DecimalFormatSymbols)
-   */
-  private static enum StateName {
-    BEFORE_PREFIX,
-    AFTER_PREFIX,
-    AFTER_INTEGER_DIGIT,
-    AFTER_FRACTION_DIGIT,
-    AFTER_EXPONENT_SEPARATOR,
-    AFTER_EXPONENT_DIGIT,
-    BEFORE_SUFFIX,
-    BEFORE_SUFFIX_SEEN_EXPONENT,
-    AFTER_SUFFIX,
-    INSIDE_CURRENCY,
-    INSIDE_DIGIT,
-    INSIDE_STRING,
-    INSIDE_AFFIX_PATTERN;
-  }
-
-  // This set was decided after discussion with icu-design@. See ticket #13309.
-  // Zs+TAB is "horizontal whitespace" according to UTS #18 (blank property).
-  private static final UnicodeSet UNISET_WHITESPACE =
-      new UnicodeSet("[[:Zs:][\\u0009]]").freeze();
-
-  // BiDi characters are skipped over and ignored at any point in the string, even in strict mode.
-  private static final UnicodeSet UNISET_BIDI =
-      new UnicodeSet("[[\\u200E\\u200F\\u061C]]").freeze();
-
-  // TODO: Re-generate these sets from the database. They probably haven't been updated in a while.
-  private static final UnicodeSet UNISET_PERIOD_LIKE =
-      new UnicodeSet("[.\\u2024\\u3002\\uFE12\\uFE52\\uFF0E\\uFF61]").freeze();
-  private static final UnicodeSet UNISET_STRICT_PERIOD_LIKE =
-      new UnicodeSet("[.\\u2024\\uFE52\\uFF0E\\uFF61]").freeze();
-  private static final UnicodeSet UNISET_COMMA_LIKE =
-      new UnicodeSet("[,\\u060C\\u066B\\u3001\\uFE10\\uFE11\\uFE50\\uFE51\\uFF0C\\uFF64]").freeze();
-  private static final UnicodeSet UNISET_STRICT_COMMA_LIKE =
-      new UnicodeSet("[,\\u066B\\uFE10\\uFE50\\uFF0C]").freeze();
-  private static final UnicodeSet UNISET_OTHER_GROUPING_SEPARATORS =
-      new UnicodeSet(
-              "[\\ '\\u00A0\\u066C\\u2000-\\u200A\\u2018\\u2019\\u202F\\u205F\\u3000\\uFF07]")
-          .freeze();
-
-  // For parse return value calculation.
-  private static final BigDecimal MIN_LONG_AS_BIG_DECIMAL = new BigDecimal(Long.MIN_VALUE);
-  private static final BigDecimal MAX_LONG_AS_BIG_DECIMAL = new BigDecimal(Long.MAX_VALUE);
-
-  private enum SeparatorType {
-    COMMA_LIKE,
-    PERIOD_LIKE,
-    OTHER_GROUPING,
-    UNKNOWN;
-
-    static SeparatorType fromCp(int cp, ParseMode mode) {
-      if (mode == ParseMode.FAST) {
-        return SeparatorType.UNKNOWN;
-      } else if (mode == ParseMode.STRICT) {
-        if (UNISET_STRICT_COMMA_LIKE.contains(cp)) return COMMA_LIKE;
-        if (UNISET_STRICT_PERIOD_LIKE.contains(cp)) return PERIOD_LIKE;
-        if (UNISET_OTHER_GROUPING_SEPARATORS.contains(cp)) return OTHER_GROUPING;
-        return UNKNOWN;
-      } else {
-        if (UNISET_COMMA_LIKE.contains(cp)) return COMMA_LIKE;
-        if (UNISET_PERIOD_LIKE.contains(cp)) return PERIOD_LIKE;
-        if (UNISET_OTHER_GROUPING_SEPARATORS.contains(cp)) return OTHER_GROUPING;
-        return UNKNOWN;
-      }
-    }
-  }
-
-  private static enum DigitType {
-    INTEGER,
-    FRACTION,
-    EXPONENT
-  }
-
-  /**
-   * Holds a snapshot in time of a single parse path. This includes the digits seen so far, the
-   * current state name, and other properties like the grouping separator used on this parse path,
-   * details about the exponent and negative signs, etc.
-   */
-  private static class StateItem {
-    // Parser state:
-    // The "trailingChars" is used to keep track of how many characters from the end of the string
-    // are ignorable and should be removed from the parse position should this item be accepted.
-    // The "score" is used to help rank two otherwise equivalent parse paths. Currently, the only
-    // function giving points to the score is prefix/suffix.
-    StateName name;
-    int trailingCount;
-    int score;
-
-    // Numerical value:
-    DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
-    int numDigits;
-    int trailingZeros;
-    int exponent;
-
-    // Other items that we've seen:
-    int groupingCp;
-    long groupingWidths;
-    String isoCode;
-    boolean sawNegative;
-    boolean sawNegativeExponent;
-    boolean sawCurrency;
-    boolean sawNaN;
-    boolean sawInfinity;
-    AffixHolder affix;
-    boolean sawPrefix;
-    boolean sawSuffix;
-    boolean sawDecimalPoint;
-    boolean sawExponentDigit;
-
-    // Data for intermediate parsing steps:
-    StateName returnTo1;
-    StateName returnTo2;
-    // For string literals:
-    CharSequence currentString;
-    int currentOffset;
-    boolean currentTrailing;
-    // For affix patterns:
-    CharSequence currentAffixPattern;
-    long currentStepwiseParserTag;
-    // For currency:
-    TextTrieMap<CurrencyStringInfo>.ParseState currentCurrencyTrieState;
-    // For multi-code-point digits:
-    TextTrieMap<Byte>.ParseState currentDigitTrieState;
-    DigitType currentDigitType;
-
-    // Identification for path tracing:
-    final char id;
-    String path;
-
-    StateItem(char _id) {
-      id = _id;
-    }
-
-    /**
-     * Clears the instance so that it can be re-used.
-     *
-     * @return Myself, for chaining.
-     */
-    StateItem clear() {
-      // Parser state:
-      name = StateName.BEFORE_PREFIX;
-      trailingCount = 0;
-      score = 0;
-
-      // Numerical value:
-      fq.clear();
-      numDigits = 0;
-      trailingZeros = 0;
-      exponent = 0;
-
-      // Other items we've seen:
-      groupingCp = -1;
-      groupingWidths = 0L;
-      isoCode = null;
-      sawNegative = false;
-      sawNegativeExponent = false;
-      sawCurrency = false;
-      sawNaN = false;
-      sawInfinity = false;
-      affix = null;
-      sawPrefix = false;
-      sawSuffix = false;
-      sawDecimalPoint = false;
-      sawExponentDigit = false;
-
-      // Data for intermediate parsing steps:
-      returnTo1 = null;
-      returnTo2 = null;
-      currentString = null;
-      currentOffset = 0;
-      currentTrailing = false;
-      currentAffixPattern = null;
-      currentStepwiseParserTag = 0L;
-      currentCurrencyTrieState = null;
-      currentDigitTrieState = null;
-      currentDigitType = null;
-
-      // Identification for path tracing:
-      // id is constant and is not cleared
-      path = "";
-
-      return this;
-    }
-
-    /**
-     * Sets the internal value of this instance equal to another instance.
-     *
-     * <p>newName and cpOrN1 are required as parameters to this function because every time a code
-     * point is consumed and a state item is copied, both of the corresponding fields should be
-     * updated; it would be an error if they weren't updated.
-     *
-     * @param other The instance to copy from.
-     * @param newName The state name that the new copy should take on.
-     * @param trailing If positive, record this code point as trailing; if negative, reset the
-     *     trailing count to zero.
-     * @return Myself, for chaining.
-     */
-    StateItem copyFrom(StateItem other, StateName newName, int trailing) {
-      // Parser state:
-      name = newName;
-      score = other.score;
-
-      // Either reset trailingCount or add the width of the current code point.
-      trailingCount = (trailing < 0) ? 0 : other.trailingCount + Character.charCount(trailing);
-
-      // Numerical value:
-      fq.copyFrom(other.fq);
-      numDigits = other.numDigits;
-      trailingZeros = other.trailingZeros;
-      exponent = other.exponent;
-
-      // Other items we've seen:
-      groupingCp = other.groupingCp;
-      groupingWidths = other.groupingWidths;
-      isoCode = other.isoCode;
-      sawNegative = other.sawNegative;
-      sawNegativeExponent = other.sawNegativeExponent;
-      sawCurrency = other.sawCurrency;
-      sawNaN = other.sawNaN;
-      sawInfinity = other.sawInfinity;
-      affix = other.affix;
-      sawPrefix = other.sawPrefix;
-      sawSuffix = other.sawSuffix;
-      sawDecimalPoint = other.sawDecimalPoint;
-      sawExponentDigit = other.sawExponentDigit;
-
-      // Data for intermediate parsing steps:
-      returnTo1 = other.returnTo1;
-      returnTo2 = other.returnTo2;
-      currentString = other.currentString;
-      currentOffset = other.currentOffset;
-      currentTrailing = other.currentTrailing;
-      currentAffixPattern = other.currentAffixPattern;
-      currentStepwiseParserTag = other.currentStepwiseParserTag;
-      currentCurrencyTrieState = other.currentCurrencyTrieState;
-      currentDigitTrieState = other.currentDigitTrieState;
-      currentDigitType = other.currentDigitType;
-
-      // Record source node if debugging
-      if (DEBUGGING) {
-        path = other.path + other.id;
-      }
-
-      return this;
-    }
-
-    /**
-     * Adds a digit to the internal representation of this instance.
-     *
-     * @param digit The digit that was read from the string.
-     * @param type Whether the digit occured after the decimal point.
-     */
-    void appendDigit(byte digit, DigitType type) {
-      if (type == DigitType.EXPONENT) {
-        sawExponentDigit = true;
-        int newExponent = exponent * 10 + digit;
-        if (newExponent < exponent) {
-          // overflow
-          exponent = Integer.MAX_VALUE;
-        } else {
-          exponent = newExponent;
-        }
-      } else {
-        numDigits++;
-        if (type == DigitType.FRACTION && digit == 0) {
-          trailingZeros++;
-        } else if (type == DigitType.FRACTION) {
-          fq.appendDigit(digit, trailingZeros, false);
-          trailingZeros = 0;
-        } else {
-          fq.appendDigit(digit, 0, true);
-        }
-      }
-    }
-
-    /** @return Whether or not this item contains a valid number. */
-    public boolean hasNumber() {
-      return numDigits > 0 || sawNaN || sawInfinity;
-    }
-
-    /**
-     * Converts the internal digits from this instance into a Number, preferring a Long, then a
-     * BigInteger, then a BigDecimal. A Double is used for NaN, infinity, and -0.0.
-     *
-     * @return The Number. Never null.
-     */
-    Number toNumber(DecimalFormatProperties properties) {
-      // Check for NaN, infinity, and -0.0
-      if (sawNaN) {
-        return Double.NaN;
-      }
-      if (sawInfinity) {
-        if (sawNegative) {
-          return Double.NEGATIVE_INFINITY;
-        } else {
-          return Double.POSITIVE_INFINITY;
-        }
-      }
-      if (fq.isZero() && sawNegative) {
-        return -0.0;
-      }
-
-      // Check for exponent overflow
-      boolean forceBigDecimal = properties.getParseToBigDecimal();
-      if (exponent == Integer.MAX_VALUE) {
-        if (sawNegativeExponent && sawNegative) {
-          return -0.0;
-        } else if (sawNegativeExponent) {
-          return 0.0;
-        } else if (sawNegative) {
-          return Double.NEGATIVE_INFINITY;
-        } else {
-          return Double.POSITIVE_INFINITY;
-        }
-      } else if (exponent > 1000) {
-        // BigDecimals can handle huge values better than BigIntegers.
-        forceBigDecimal = true;
-      }
-
-      // Multipliers must be applied in reverse.
-      BigDecimal multiplier = properties.getMultiplier();
-      if (properties.getMagnitudeMultiplier() != 0) {
-        if (multiplier == null) multiplier = BigDecimal.ONE;
-        multiplier = multiplier.scaleByPowerOfTen(properties.getMagnitudeMultiplier());
-      }
-      int delta = (sawNegativeExponent ? -1 : 1) * exponent;
-
-      // We need to use a math context in order to prevent non-terminating decimal expansions.
-      // This is only used when dividing by the multiplier.
-      MathContext mc = RoundingUtils.getMathContextOr34Digits(properties);
-
-      // Construct the output number.
-      // This is the only step during fast-mode parsing that incurs object creations.
-      BigDecimal result = fq.toBigDecimal();
-      if (sawNegative) result = result.negate();
-      result = result.scaleByPowerOfTen(delta);
-      if (multiplier != null) {
-        result = result.divide(multiplier, mc);
-      }
-      result = result.stripTrailingZeros();
-      if (forceBigDecimal || result.scale() > 0) {
-        return result;
-      } else if (result.compareTo(MIN_LONG_AS_BIG_DECIMAL) >= 0
-          && result.compareTo(MAX_LONG_AS_BIG_DECIMAL) <= 0) {
-        return result.longValueExact();
-      } else {
-        return result.toBigIntegerExact();
-      }
-    }
-
-    /**
-     * Converts the internal digits to a number, and also associates the number with the parsed
-     * currency.
-     *
-     * @return The CurrencyAmount. Never null.
-     */
-    public CurrencyAmount toCurrencyAmount(DecimalFormatProperties properties) {
-      assert isoCode != null;
-      Number number = toNumber(properties);
-      Currency currency = Currency.getInstance(isoCode);
-      return new CurrencyAmount(number, currency);
-    }
-
-    @Override
-    public String toString() {
-      StringBuilder sb = new StringBuilder();
-      sb.append("[");
-      sb.append(path);
-      sb.append("] ");
-      sb.append(name.name());
-      if (name == StateName.INSIDE_STRING) {
-        sb.append("{");
-        sb.append(currentString);
-        sb.append(":");
-        sb.append(currentOffset);
-        sb.append("}");
-      }
-      if (name == StateName.INSIDE_AFFIX_PATTERN) {
-        sb.append("{");
-        sb.append(currentAffixPattern);
-        sb.append(":");
-        sb.append(AffixUtils.getOffset(currentStepwiseParserTag) - 1);
-        sb.append("}");
-      }
-      sb.append(" ");
-      sb.append(fq.toBigDecimal());
-      sb.append(" grouping:");
-      sb.append(groupingCp == -1 ? new char[] {'?'} : Character.toChars(groupingCp));
-      sb.append(" widths:");
-      sb.append(Long.toHexString(groupingWidths));
-      sb.append(" seen:");
-      sb.append(sawNegative ? 1 : 0);
-      sb.append(sawNegativeExponent ? 1 : 0);
-      sb.append(sawNaN ? 1 : 0);
-      sb.append(sawInfinity ? 1 : 0);
-      sb.append(sawPrefix ? 1 : 0);
-      sb.append(sawSuffix ? 1 : 0);
-      sb.append(sawDecimalPoint ? 1 : 0);
-      sb.append(" trailing:");
-      sb.append(trailingCount);
-      sb.append(" score:");
-      sb.append(score);
-      sb.append(" affix:");
-      sb.append(affix);
-      sb.append(" currency:");
-      sb.append(isoCode);
-      return sb.toString();
-    }
-  }
-
-  /**
-   * Holds an ordered list of {@link StateItem} and other metadata about the string to be parsed.
-   * There are two internal arrays of {@link StateItem}, which are swapped back and forth in order
-   * to avoid object creations. The items in one array can be populated at the same time that items
-   * in the other array are being read from.
-   */
-  private static class ParserState {
-
-    // Basic ParserStateItem lists:
-    StateItem[] items = new StateItem[16];
-    StateItem[] prevItems = new StateItem[16];
-    int length;
-    int prevLength;
-
-    // Properties and Symbols memory:
-    DecimalFormatProperties properties;
-    DecimalFormatSymbols symbols;
-    ParseMode mode;
-    boolean caseSensitive;
-    boolean parseCurrency;
-    GroupingMode groupingMode;
-
-    // Other pre-computed fields:
-    int decimalCp1;
-    int decimalCp2;
-    int groupingCp1;
-    int groupingCp2;
-    SeparatorType decimalType1;
-    SeparatorType decimalType2;
-    SeparatorType groupingType1;
-    SeparatorType groupingType2;
-
-    TextTrieMap<Byte> digitTrie;
-    Set<AffixHolder> affixHolders = new HashSet<AffixHolder>();
-
-    ParserState() {
-      for (int i = 0; i < items.length; i++) {
-        items[i] = new StateItem((char) ('A' + i));
-        prevItems[i] = new StateItem((char) ('A' + i));
-      }
-    }
-
-    /**
-     * Clears the internal state in order to prepare for parsing a new string.
-     *
-     * @return Myself, for chaining.
-     */
-    ParserState clear() {
-      length = 0;
-      prevLength = 0;
-      digitTrie = null;
-      affixHolders.clear();
-      return this;
-    }
-
-    /**
-     * Swaps the internal arrays of {@link StateItem}. Sets the length of the primary list to zero,
-     * so that it can be appended to.
-     */
-    void swap() {
-      StateItem[] temp = prevItems;
-      prevItems = items;
-      items = temp;
-      prevLength = length;
-      length = 0;
-    }
-
-    /**
-     * Swaps the internal arrays of {@link StateItem}. Sets the length of the primary list to the
-     * length of the previous list, so that it can be read from.
-     */
-    void swapBack() {
-      StateItem[] temp = prevItems;
-      prevItems = items;
-      items = temp;
-      length = prevLength;
-      prevLength = 0;
-    }
-
-    /**
-     * Gets the next available {@link StateItem} from the primary list for writing. This method
-     * should be thought of like a list append method, except that there are no object creations
-     * taking place.
-     *
-     * <p>It is the caller's responsibility to call either {@link StateItem#clear} or {@link
-     * StateItem#copyFrom} on the returned object.
-     *
-     * @return A dirty {@link StateItem}.
-     */
-    StateItem getNext() {
-      if (length >= items.length) {
-        // TODO: What to do here? Expand the array?
-        // This case is rare and would happen only with specially designed input.
-        // For now, just overwrite the last entry.
-        length = items.length - 1;
-      }
-      StateItem item = items[length];
-      length++;
-      return item;
-    }
-
-    /** @return The index of the last inserted StateItem via a call to {@link #getNext}. */
-    public int lastInsertedIndex() {
-      assert length > 0;
-      return length - 1;
-    }
-
-    /**
-     * Gets a {@link StateItem} from the primary list. Assumes that the item has already been added
-     * via a call to {@link #getNext}.
-     *
-     * @param i The index of the item to get.
-     * @return The item.
-     */
-    public StateItem getItem(int i) {
-      assert i >= 0 && i < length;
-      return items[i];
-    }
-
-    @Override
-    public String toString() {
-      StringBuilder sb = new StringBuilder();
-      sb.append("<ParseState mode:");
-      sb.append(mode);
-      sb.append(" caseSensitive:");
-      sb.append(caseSensitive);
-      sb.append(" parseCurrency:");
-      sb.append(parseCurrency);
-      sb.append(" groupingMode:");
-      sb.append(groupingMode);
-      sb.append(" decimalCps:");
-      sb.append((char) decimalCp1);
-      sb.append((char) decimalCp2);
-      sb.append(" groupingCps:");
-      sb.append((char) groupingCp1);
-      sb.append((char) groupingCp2);
-      sb.append(" affixes:");
-      sb.append(affixHolders);
-      sb.append(">");
-      return sb.toString();
-    }
-  }
-
-  /**
-   * A wrapper for affixes. Affixes can be string-based or pattern-based, and they can come from
-   * several sources, including the property bag and the locale paterns from CLDR data.
-   */
-  private static class AffixHolder {
-    final String p; // prefix
-    final String s; // suffix
-    final boolean strings;
-    final boolean negative;
-
-    static final AffixHolder EMPTY_POSITIVE = new AffixHolder("", "", true, false);
-    static final AffixHolder EMPTY_NEGATIVE = new AffixHolder("", "", true, true);
-
-    static void addToState(ParserState state, DecimalFormatProperties properties) {
-      AffixHolder pp = fromPropertiesPositivePattern(properties);
-      AffixHolder np = fromPropertiesNegativePattern(properties);
-      AffixHolder ps = fromPropertiesPositiveString(properties);
-      AffixHolder ns = fromPropertiesNegativeString(properties);
-      if (pp != null) state.affixHolders.add(pp);
-      if (ps != null) state.affixHolders.add(ps);
-      if (np != null) state.affixHolders.add(np);
-      if (ns != null) state.affixHolders.add(ns);
-    }
-
-    static AffixHolder fromPropertiesPositivePattern(DecimalFormatProperties properties) {
-      String ppp = properties.getPositivePrefixPattern();
-      String psp = properties.getPositiveSuffixPattern();
-      if (properties.getSignAlwaysShown()) {
-        // TODO: This logic is somewhat duplicated from MurkyModifier.
-        boolean foundSign = false;
-        String npp = properties.getNegativePrefixPattern();
-        String nsp = properties.getNegativeSuffixPattern();
-        if (AffixUtils.containsType(npp, AffixUtils.TYPE_MINUS_SIGN)) {
-          foundSign = true;
-          ppp = AffixUtils.replaceType(npp, AffixUtils.TYPE_MINUS_SIGN, '+');
-        }
-        if (AffixUtils.containsType(nsp, AffixUtils.TYPE_MINUS_SIGN)) {
-          foundSign = true;
-          psp = AffixUtils.replaceType(nsp, AffixUtils.TYPE_MINUS_SIGN, '+');
-        }
-        if (!foundSign) {
-          ppp = "+" + ppp;
-        }
-      }
-      return getInstance(ppp, psp, false, false);
-    }
-
-    static AffixHolder fromPropertiesNegativePattern(DecimalFormatProperties properties) {
-      String npp = properties.getNegativePrefixPattern();
-      String nsp = properties.getNegativeSuffixPattern();
-      if (npp == null && nsp == null) {
-        npp = properties.getPositivePrefixPattern();
-        nsp = properties.getPositiveSuffixPattern();
-        if (npp == null) {
-          npp = "-";
-        } else {
-          npp = "-" + npp;
-        }
-      }
-      return getInstance(npp, nsp, false, true);
-    }
-
-    static AffixHolder fromPropertiesPositiveString(DecimalFormatProperties properties) {
-      String pp = properties.getPositivePrefix();
-      String ps = properties.getPositiveSuffix();
-      if (pp == null && ps == null) return null;
-      return getInstance(pp, ps, true, false);
-    }
-
-    static AffixHolder fromPropertiesNegativeString(DecimalFormatProperties properties) {
-      String np = properties.getNegativePrefix();
-      String ns = properties.getNegativeSuffix();
-      if (np == null && ns == null) return null;
-      return getInstance(np, ns, true, true);
-    }
-
-    static AffixHolder getInstance(String p, String s, boolean strings, boolean negative) {
-      if (p == null && s == null) return negative ? EMPTY_NEGATIVE : EMPTY_POSITIVE;
-      if (p == null) p = "";
-      if (s == null) s = "";
-      if (p.length() == 0 && s.length() == 0) return negative ? EMPTY_NEGATIVE : EMPTY_POSITIVE;
-      return new AffixHolder(p, s, strings, negative);
-    }
-
-    AffixHolder(String pp, String sp, boolean strings, boolean negative) {
-      this.p = pp;
-      this.s = sp;
-      this.strings = strings;
-      this.negative = negative;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      if (other == null) return false;
-      if (this == other) return true;
-      if (!(other instanceof AffixHolder)) return false;
-      AffixHolder _other = (AffixHolder) other;
-      if (!p.equals(_other.p)) return false;
-      if (!s.equals(_other.s)) return false;
-      if (strings != _other.strings) return false;
-      if (negative != _other.negative) return false;
-      return true;
-    }
-
-    @Override
-    public int hashCode() {
-      return p.hashCode() ^ s.hashCode();
-    }
-
-    @Override
-    public String toString() {
-      StringBuilder sb = new StringBuilder();
-      sb.append("{");
-      sb.append(p);
-      sb.append("|");
-      sb.append(s);
-      sb.append("|");
-      sb.append(strings ? 'S' : 'P');
-      sb.append("}");
-      return sb.toString();
-    }
-  }
-
-  /**
-   * A class that holds information about all currency affix patterns for the locale. This allows
-   * the parser to accept currencies in any format that are valid for the locale.
-   */
-  private static class CurrencyAffixPatterns {
-    private final Set<AffixHolder> set = new HashSet<AffixHolder>();
-
-    private static final ConcurrentHashMap<ULocale, CurrencyAffixPatterns> currencyAffixPatterns =
-        new ConcurrentHashMap<ULocale, CurrencyAffixPatterns>();
-
-    static void addToState(ULocale uloc, ParserState state) {
-      CurrencyAffixPatterns value = currencyAffixPatterns.get(uloc);
-      if (value == null) {
-        // There can be multiple threads computing the same CurrencyAffixPatterns simultaneously,
-        // but that scenario is harmless.
-        CurrencyAffixPatterns newValue = new CurrencyAffixPatterns(uloc);
-        currencyAffixPatterns.putIfAbsent(uloc, newValue);
-        value = currencyAffixPatterns.get(uloc);
-      }
-      state.affixHolders.addAll(value.set);
-    }
-
-    private CurrencyAffixPatterns(ULocale uloc) {
-      // Get the basic currency pattern.
-      String pattern = NumberFormat.getPatternForStyle(uloc, NumberFormat.CURRENCYSTYLE);
-      addPattern(pattern);
-
-      // Get the currency plural patterns.
-      // TODO: Update this after CurrencyPluralInfo is replaced.
-      CurrencyPluralInfo pluralInfo = CurrencyPluralInfo.getInstance(uloc);
-      for (StandardPlural plural : StandardPlural.VALUES) {
-        pattern = pluralInfo.getCurrencyPluralPattern(plural.getKeyword());
-        addPattern(pattern);
-      }
-    }
-
-    private static final ThreadLocal<DecimalFormatProperties> threadLocalProperties =
-        new ThreadLocal<DecimalFormatProperties>() {
-          @Override
-          protected DecimalFormatProperties initialValue() {
-            return new DecimalFormatProperties();
-          }
-        };
-
-    private void addPattern(String pattern) {
-      DecimalFormatProperties properties = threadLocalProperties.get();
-      try {
-        PatternStringParser.parseToExistingProperties(pattern, properties);
-      } catch (IllegalArgumentException e) {
-        // This should only happen if there is a bug in CLDR data. Fail silently.
-      }
-      set.add(AffixHolder.fromPropertiesPositivePattern(properties));
-      set.add(AffixHolder.fromPropertiesNegativePattern(properties));
-    }
-  }
-
-  /**
-   * Makes a {@link TextTrieMap} for parsing digit strings. A trie is required only if the digit
-   * strings are longer than one code point. In order for this to be the case, the user would have
-   * needed to specify custom multi-character digits, like "(0)".
-   *
-   * @param digitStrings The list of digit strings from DecimalFormatSymbols.
-   * @return A trie, or null if a trie is not required.
-   */
-  static TextTrieMap<Byte> makeDigitTrie(String[] digitStrings) {
-    boolean requiresTrie = false;
-    for (int i = 0; i < 10; i++) {
-      String str = digitStrings[i];
-      if (Character.charCount(Character.codePointAt(str, 0)) != str.length()) {
-        requiresTrie = true;
-        break;
-      }
-    }
-    if (!requiresTrie) return null;
-
-    // TODO: Consider caching the tries so they don't need to be re-created run to run.
-    // (Low-priority since multi-character digits are rare in practice)
-    TextTrieMap<Byte> trieMap = new TextTrieMap<Byte>(false);
-    for (int i = 0; i < 10; i++) {
-      trieMap.put(digitStrings[i], (byte) i);
-    }
-    return trieMap;
-  }
-
-  protected static final ThreadLocal<ParserState> threadLocalParseState =
-      new ThreadLocal<ParserState>() {
-        @Override
-        protected ParserState initialValue() {
-          return new ParserState();
-        }
-      };
-
-  protected static final ThreadLocal<ParsePosition> threadLocalParsePosition =
-      new ThreadLocal<ParsePosition>() {
-        @Override
-        protected ParsePosition initialValue() {
-          return new ParsePosition(0);
-        }
-      };
-
-  /**
-   * @internal
-   * @deprecated This API is ICU internal only. TODO: Remove this set from ScientificNumberFormat.
-   */
-  @Deprecated
-  public static final UnicodeSet UNISET_PLUS =
-      new UnicodeSet(
-              0x002B, 0x002B, 0x207A, 0x207A, 0x208A, 0x208A, 0x2795, 0x2795, 0xFB29, 0xFB29,
-              0xFE62, 0xFE62, 0xFF0B, 0xFF0B)
-          .freeze();
-
-  /**
-   * @internal
-   * @deprecated This API is ICU internal only. TODO: Remove this set from ScientificNumberFormat.
-   */
-  @Deprecated
-  public static final UnicodeSet UNISET_MINUS =
-      new UnicodeSet(
-              0x002D, 0x002D, 0x207B, 0x207B, 0x208B, 0x208B, 0x2212, 0x2212, 0x2796, 0x2796,
-              0xFE63, 0xFE63, 0xFF0D, 0xFF0D)
-          .freeze();
-
-  public static Number parse(String input, DecimalFormatProperties properties, DecimalFormatSymbols symbols) {
-    ParsePosition ppos = threadLocalParsePosition.get();
-    ppos.setIndex(0);
-    return parse(input, ppos, properties, symbols);
-  }
-
-  // TODO: DELETE ME once debugging is finished
-  public static volatile boolean DEBUGGING = false;
-
-  /**
-   * Implements an iterative parser that maintains a lists of possible states at each code point in
-   * the string. At each code point in the string, the list of possible states is updated based on
-   * the states coming from the previous code point. The parser stops when it reaches the end of the
-   * string or when there are no possible parse paths remaining in the string.
-   *
-   * <p>TODO: This API is not fully flushed out. Right now this is internal-only.
-   *
-   * @param input The string to parse.
-   * @param ppos A {@link ParsePosition} to hold the index at which parsing stopped.
-   * @param properties A property bag, used only for determining the prefix/suffix strings and the
-   *     padding character.
-   * @param symbols A {@link DecimalFormatSymbols} object, used for determining locale-specific
-   *     symbols for grouping/decimal separators, digit strings, and prefix/suffix substitutions.
-   * @return A Number matching the parser's best interpretation of the string.
-   */
-  public static Number parse(
-      CharSequence input,
-      ParsePosition ppos,
-      DecimalFormatProperties properties,
-      DecimalFormatSymbols symbols) {
-    StateItem best = _parse(input, ppos, false, properties, symbols);
-    return (best == null) ? null : best.toNumber(properties);
-  }
-
-  public static CurrencyAmount parseCurrency(
-      String input, DecimalFormatProperties properties, DecimalFormatSymbols symbols) throws ParseException {
-    return parseCurrency(input, null, properties, symbols);
-  }
-
-  public static CurrencyAmount parseCurrency(
-      CharSequence input, ParsePosition ppos, DecimalFormatProperties properties, DecimalFormatSymbols symbols)
-      throws ParseException {
-    if (ppos == null) {
-      ppos = threadLocalParsePosition.get();
-      ppos.setIndex(0);
-      ppos.setErrorIndex(-1);
-    }
-    StateItem best = _parse(input, ppos, true, properties, symbols);
-    return (best == null) ? null : best.toCurrencyAmount(properties);
-  }
-
-  private static StateItem _parse(
-      CharSequence input,
-      ParsePosition ppos,
-      boolean parseCurrency,
-      DecimalFormatProperties properties,
-      DecimalFormatSymbols symbols) {
-
-    if (input == null || ppos == null || properties == null || symbols == null) {
-      throw new IllegalArgumentException("All arguments are required for parse.");
-    }
-
-    ParseMode mode = properties.getParseMode();
-    if (mode == null) mode = ParseMode.LENIENT;
-    boolean integerOnly = properties.getParseIntegerOnly();
-    boolean ignoreExponent = properties.getParseNoExponent();
-    boolean ignoreGrouping = properties.getGroupingSize() <= 0;
-
-    // Set up the initial state
-    ParserState state = threadLocalParseState.get().clear();
-    state.properties = properties;
-    state.symbols = symbols;
-    state.mode = mode;
-    state.parseCurrency = parseCurrency;
-    state.groupingMode = properties.getParseGroupingMode();
-    if (state.groupingMode == null) state.groupingMode = GroupingMode.DEFAULT;
-    state.caseSensitive = properties.getParseCaseSensitive();
-    state.decimalCp1 = Character.codePointAt(symbols.getDecimalSeparatorString(), 0);
-    state.decimalCp2 = Character.codePointAt(symbols.getMonetaryDecimalSeparatorString(), 0);
-    state.groupingCp1 = Character.codePointAt(symbols.getGroupingSeparatorString(), 0);
-    state.groupingCp2 = Character.codePointAt(symbols.getMonetaryGroupingSeparatorString(), 0);
-    state.decimalType1 = SeparatorType.fromCp(state.decimalCp1, mode);
-    state.decimalType2 = SeparatorType.fromCp(state.decimalCp2, mode);
-    state.groupingType1 = SeparatorType.fromCp(state.groupingCp1, mode);
-    state.groupingType2 = SeparatorType.fromCp(state.groupingCp2, mode);
-    StateItem initialStateItem = state.getNext().clear();
-    initialStateItem.name = StateName.BEFORE_PREFIX;
-
-    if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-      state.digitTrie = makeDigitTrie(symbols.getDigitStringsLocal());
-      AffixHolder.addToState(state, properties);
-      if (parseCurrency) {
-        CurrencyAffixPatterns.addToState(symbols.getULocale(), state);
-      }
-    }
-
-    if (DEBUGGING) {
-      System.out.println("Parsing: " + input);
-      System.out.println(properties);
-      System.out.println(state);
-    }
-
-    // Start walking through the string, one codepoint at a time. Backtracking is not allowed. This
-    // is to enforce linear runtime and prevent cases that could result in an infinite loop.
-    int offset = ppos.getIndex();
-    for (; offset < input.length(); ) {
-      int cp = Character.codePointAt(input, offset);
-      state.swap();
-      for (int i = 0; i < state.prevLength; i++) {
-        StateItem item = state.prevItems[i];
-        if (DEBUGGING) {
-          System.out.println(":" + offset + item.id + " " + item);
-        }
-
-        // In the switch statement below, if you see a line like:
-        //    if (state.length > 0 && mode == ParseMode.FAST) break;
-        // it is used for accelerating the fast parse mode. The check is performed only in the
-        // states BEFORE_PREFIX, AFTER_INTEGER_DIGIT, and AFTER_FRACTION_DIGIT, which are the
-        // most common states.
-
-        switch (item.name) {
-          case BEFORE_PREFIX:
-            // Beginning of string
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptMinusOrPlusSign(cp, StateName.BEFORE_PREFIX, state, item, false);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            acceptIntegerDigit(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptBidi(cp, StateName.BEFORE_PREFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptWhitespace(cp, StateName.BEFORE_PREFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptPadding(cp, StateName.BEFORE_PREFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptNan(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptInfinity(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            if (!integerOnly) {
-              acceptDecimalPoint(cp, StateName.AFTER_FRACTION_DIGIT, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptPrefix(cp, StateName.AFTER_PREFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              if (!ignoreGrouping) {
-                acceptGrouping(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-                if (state.length > 0 && mode == ParseMode.FAST) break;
-              }
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_PREFIX, state, item);
-              }
-            }
-            break;
-
-          case AFTER_PREFIX:
-            // Prefix is consumed
-            acceptBidi(cp, StateName.AFTER_PREFIX, state, item);
-            acceptPadding(cp, StateName.AFTER_PREFIX, state, item);
-            acceptNan(cp, StateName.BEFORE_SUFFIX, state, item);
-            acceptInfinity(cp, StateName.BEFORE_SUFFIX, state, item);
-            acceptIntegerDigit(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-            if (!integerOnly) {
-              acceptDecimalPoint(cp, StateName.AFTER_FRACTION_DIGIT, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.AFTER_PREFIX, state, item);
-              if (!ignoreGrouping) {
-                acceptGrouping(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-              }
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.AFTER_PREFIX, state, item);
-              }
-            }
-            break;
-
-          case AFTER_INTEGER_DIGIT:
-            // Previous character was an integer digit (or grouping/whitespace)
-            acceptIntegerDigit(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            if (!integerOnly) {
-              acceptDecimalPoint(cp, StateName.AFTER_FRACTION_DIGIT, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            if (!ignoreGrouping) {
-              acceptGrouping(cp, StateName.AFTER_INTEGER_DIGIT, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            acceptBidi(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptPadding(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            if (!ignoreExponent) {
-              acceptExponentSeparator(cp, StateName.AFTER_EXPONENT_SEPARATOR, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptSuffix(cp, StateName.AFTER_SUFFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.BEFORE_SUFFIX, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.BEFORE_SUFFIX, state, item, false);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_SUFFIX, state, item);
-              }
-            }
-            break;
-
-          case AFTER_FRACTION_DIGIT:
-            // We encountered a decimal point
-            acceptFractionDigit(cp, StateName.AFTER_FRACTION_DIGIT, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptBidi(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            acceptPadding(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (state.length > 0 && mode == ParseMode.FAST) break;
-            if (!ignoreExponent) {
-              acceptExponentSeparator(cp, StateName.AFTER_EXPONENT_SEPARATOR, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptSuffix(cp, StateName.AFTER_SUFFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.BEFORE_SUFFIX, state, item);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.BEFORE_SUFFIX, state, item, false);
-              if (state.length > 0 && mode == ParseMode.FAST) break;
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_SUFFIX, state, item);
-              }
-            }
-            break;
-
-          case AFTER_EXPONENT_SEPARATOR:
-            acceptBidi(cp, StateName.AFTER_EXPONENT_SEPARATOR, state, item);
-            acceptMinusOrPlusSign(cp, StateName.AFTER_EXPONENT_SEPARATOR, state, item, true);
-            acceptExponentDigit(cp, StateName.AFTER_EXPONENT_DIGIT, state, item);
-            break;
-
-          case AFTER_EXPONENT_DIGIT:
-            acceptBidi(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-            acceptPadding(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-            acceptExponentDigit(cp, StateName.AFTER_EXPONENT_DIGIT, state, item);
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptSuffix(cp, StateName.AFTER_SUFFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.BEFORE_SUFFIX, state, item, false);
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-              }
-            }
-            break;
-
-          case BEFORE_SUFFIX:
-            // Accept whitespace, suffixes, and exponent separators
-            acceptBidi(cp, StateName.BEFORE_SUFFIX, state, item);
-            acceptPadding(cp, StateName.BEFORE_SUFFIX, state, item);
-            if (!ignoreExponent) {
-              acceptExponentSeparator(cp, StateName.AFTER_EXPONENT_SEPARATOR, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptSuffix(cp, StateName.AFTER_SUFFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.BEFORE_SUFFIX, state, item);
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.BEFORE_SUFFIX, state, item, false);
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_SUFFIX, state, item);
-              }
-            }
-            break;
-
-          case BEFORE_SUFFIX_SEEN_EXPONENT:
-            // Accept whitespace and suffixes but not exponent separators
-            acceptBidi(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-            acceptPadding(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-            if (mode == ParseMode.LENIENT || mode == ParseMode.STRICT) {
-              acceptSuffix(cp, StateName.AFTER_SUFFIX, state, item);
-            }
-            if (mode == ParseMode.LENIENT || mode == ParseMode.FAST) {
-              acceptWhitespace(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item, false);
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.BEFORE_SUFFIX_SEEN_EXPONENT, state, item);
-              }
-            }
-            break;
-
-          case AFTER_SUFFIX:
-            if ((mode == ParseMode.LENIENT || mode == ParseMode.FAST) && parseCurrency) {
-              // Continue traversing in case there is a currency symbol to consume
-              acceptBidi(cp, StateName.AFTER_SUFFIX, state, item);
-              acceptPadding(cp, StateName.AFTER_SUFFIX, state, item);
-              acceptWhitespace(cp, StateName.AFTER_SUFFIX, state, item);
-              // TODO(sffc): acceptMinusOrPlusSign(cp, StateName.AFTER_SUFFIX, state, item, false);
-              if (parseCurrency) {
-                acceptCurrency(cp, StateName.AFTER_SUFFIX, state, item);
-              }
-            }
-            // Otherwise, do not accept any more characters.
-            break;
-
-          case INSIDE_CURRENCY:
-            acceptCurrencyOffset(cp, state, item);
-            break;
-
-          case INSIDE_DIGIT:
-            acceptDigitTrieOffset(cp, state, item);
-            break;
-
-          case INSIDE_STRING:
-            acceptStringOffset(cp, state, item);
-            break;
-
-          case INSIDE_AFFIX_PATTERN:
-            acceptAffixPatternOffset(cp, state, item);
-            break;
-        }
-      }
-
-      if (state.length == 0) {
-        // No parse paths continue past this point. We have found the longest parsable string
-        // from the input. Restore previous state without the offset and break.
-        state.swapBack();
-        break;
-      }
-
-      offset += Character.charCount(cp);
-    }
-
-    // Post-processing
-    if (state.length == 0) {
-      if (DEBUGGING) {
-        System.out.println("No matches found");
-        System.out.println("- - - - - - - - - -");
-      }
-      return null;
-    } else {
-
-      // Loop through the candidates.  "continue" skips a candidate as invalid.
-      StateItem best = null;
-      outer:
-      for (int i = 0; i < state.length; i++) {
-        StateItem item = state.items[i];
-
-        if (DEBUGGING) {
-          System.out.println(":end " + item);
-        }
-
-        // Check that at least one digit was read.
-        if (!item.hasNumber()) {
-          if (DEBUGGING) System.out.println("-> rejected due to no number value");
-          continue;
-        }
-
-        if (mode == ParseMode.STRICT) {
-          // Perform extra checks for strict mode.
-          // We require that the affixes match.
-          boolean sawPrefix = item.sawPrefix || (item.affix != null && item.affix.p.isEmpty());
-          boolean sawSuffix = item.sawSuffix || (item.affix != null && item.affix.s.isEmpty());
-          boolean hasEmptyAffix =
-              state.affixHolders.contains(AffixHolder.EMPTY_POSITIVE)
-                  || state.affixHolders.contains(AffixHolder.EMPTY_NEGATIVE);
-          if (sawPrefix && sawSuffix) {
-            // OK
-          } else if (!sawPrefix && !sawSuffix && hasEmptyAffix) {
-            // OK
-          } else {
-            // Has a prefix or suffix that doesn't match
-            if (DEBUGGING) System.out.println("-> rejected due to mismatched prefix/suffix");
-            continue;
-          }
-
-          // Check for scientific notation.
-          if (properties.getMinimumExponentDigits() > 0 && !item.sawExponentDigit) {
-            if (DEBUGGING) System.out.println("-> reject due to lack of exponent");
-            continue;
-          }
-
-          // Check that grouping sizes are valid.
-          int grouping1 = properties.getGroupingSize();
-          int grouping2 = properties.getSecondaryGroupingSize();
-          grouping1 = grouping1 > 0 ? grouping1 : grouping2;
-          grouping2 = grouping2 > 0 ? grouping2 : grouping1;
-          long groupingWidths = item.groupingWidths;
-          int numGroupingRegions = 16 - Long.numberOfLeadingZeros(groupingWidths) / 4;
-          // If the last grouping is zero, accept strings like "1," but reject string like "1,.23"
-          // Strip off multiple last-groupings to handle cases like "123,," or "123  "
-          while (numGroupingRegions > 1 && (groupingWidths & 0xf) == 0) {
-            if (item.sawDecimalPoint) {
-              if (DEBUGGING) System.out.println("-> rejected due to decimal point after grouping");
-              continue outer;
-            } else {
-              groupingWidths >>>= 4;
-              numGroupingRegions--;
-            }
-          }
-          if (grouping1 <= 0) {
-            // OK (no grouping data available)
-          } else if (numGroupingRegions <= 1) {
-            // OK (no grouping digits)
-          } else if ((groupingWidths & 0xf) != grouping1) {
-            // First grouping size is invalid
-            if (DEBUGGING) System.out.println("-> rejected due to first grouping violation");
-            continue;
-          } else if (((groupingWidths >>> ((numGroupingRegions - 1) * 4)) & 0xf) > grouping2) {
-            // String like "1234,567" where the highest grouping is too large
-            if (DEBUGGING) System.out.println("-> rejected due to final grouping violation");
-            continue;
-          } else {
-            for (int j = 1; j < numGroupingRegions - 1; j++) {
-              if (((groupingWidths >>> (j * 4)) & 0xf) != grouping2) {
-                // A grouping size somewhere in the middle is invalid
-                if (DEBUGGING) System.out.println("-> rejected due to inner grouping violation");
-                continue outer;
-              }
-            }
-          }
-        }
-
-        // Optionally require that the presence of a decimal point matches the pattern.
-        if (properties.getDecimalPatternMatchRequired()
-            && item.sawDecimalPoint
-                != (properties.getDecimalSeparatorAlwaysShown()
-                    || properties.getMaximumFractionDigits() != 0)) {
-          if (DEBUGGING) System.out.println("-> rejected due to decimal point violation");
-          continue;
-        }
-
-        // When parsing currencies, require that a currency symbol was found.
-        if (parseCurrency && !item.sawCurrency) {
-          if (DEBUGGING) System.out.println("-> rejected due to lack of currency");
-          continue;
-        }
-
-        // If we get here, then this candidate is acceptable.
-        // Use the earliest candidate in the list, or the one with the highest score, or the
-        // one with the fewest trailing digits.
-        if (best == null) {
-          best = item;
-        } else if (item.score > best.score) {
-          best = item;
-        } else if (item.trailingCount < best.trailingCount) {
-          best = item;
-        }
-      }
-
-      if (DEBUGGING) {
-        System.out.println("- - - - - - - - - -");
-      }
-
-      if (best != null) {
-        ppos.setIndex(offset - best.trailingCount);
-        return best;
-      } else {
-        ppos.setErrorIndex(offset);
-        return null;
-      }
-    }
-  }
-
-  /**
-   * If <code>cp</code> is whitespace (as determined by the unicode set {@link #UNISET_WHITESPACE}),
-   * copies <code>item</code> to the new list in <code>state</code> and sets its state name to
-   * <code>nextName</code>.
-   *
-   * @param cp The code point to check.
-   * @param nextName The new state name if the check passes.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptWhitespace(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    if (UNISET_WHITESPACE.contains(cp)) {
-      state.getNext().copyFrom(item, nextName, cp);
-    }
-  }
-
-  /**
-   * If <code>cp</code> is a bidi control character (as determined by the unicode set {@link
-   * #UNISET_BIDI}), copies <code>item</code> to the new list in <code>state</code> and sets its
-   * state name to <code>nextName</code>.
-   *
-   * @param cp The code point to check.
-   * @param nextName The new state name if the check passes.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptBidi(int cp, StateName nextName, ParserState state, StateItem item) {
-    if (UNISET_BIDI.contains(cp)) {
-      state.getNext().copyFrom(item, nextName, cp);
-    }
-  }
-
-  /**
-   * If <code>cp</code> is a padding character (as determined by {@link ParserState#paddingCp}),
-   * copies <code>item</code> to the new list in <code>state</code> and sets its state name to
-   * <code>nextName</code>.
-   *
-   * @param cp The code point to check.
-   * @param nextName The new state name if the check passes.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptPadding(int cp, StateName nextName, ParserState state, StateItem item) {
-    CharSequence padding = state.properties.getPadString();
-    if (padding == null || padding.length() == 0) return;
-    int referenceCp = Character.codePointAt(padding, 0);
-    if (cp == referenceCp) {
-      state.getNext().copyFrom(item, nextName, cp);
-    }
-  }
-
-  private static void acceptIntegerDigit(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    acceptDigitHelper(cp, nextName, state, item, DigitType.INTEGER);
-  }
-
-  private static void acceptFractionDigit(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    acceptDigitHelper(cp, nextName, state, item, DigitType.FRACTION);
-  }
-
-  private static void acceptExponentDigit(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    acceptDigitHelper(cp, nextName, state, item, DigitType.EXPONENT);
-  }
-
-  /**
-   * If <code>cp</code> is a digit character (as determined by either {@link UCharacter#digit} or
-   * {@link ParserState#digitCps}), copies <code>item</code> to the new list in <code>state</code>
-   * and sets its state name to one determined by <code>type</code>. Also copies the digit into a
-   * field in the new item determined by <code>type</code>.
-   *
-   * @param cp The code point to check.
-   * @param nextName The state to set if a digit is accepted.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   * @param type The digit type, which determines the next state and the field into which to insert
-   *     the digit.
-   */
-  private static void acceptDigitHelper(
-      int cp, StateName nextName, ParserState state, StateItem item, DigitType type) {
-    // Check the Unicode digit character property
-    byte digit = (byte) UCharacter.digit(cp, 10);
-    StateItem next = null;
-
-    // Look for the digit:
-    if (digit >= 0) {
-      // Code point is a number
-      next = state.getNext().copyFrom(item, nextName, -1);
-    }
-
-    // Do not perform the expensive string manipulations in fast mode.
-    if (digit < 0 && (state.mode == ParseMode.LENIENT || state.mode == ParseMode.STRICT)) {
-      if (state.digitTrie == null) {
-        // Check custom digits, all of which are at most one code point
-        for (byte d = 0; d < 10; d++) {
-          int referenceCp = Character.codePointAt(state.symbols.getDigitStringsLocal()[d], 0);
-          if (cp == referenceCp) {
-            digit = d;
-            next = state.getNext().copyFrom(item, nextName, -1);
-          }
-        }
-      } else {
-        // Custom digits have more than one code point
-        acceptDigitTrie(cp, nextName, state, item, type);
-      }
-    }
-
-    // Save state
-    recordDigit(next, digit, type);
-  }
-
-  /**
-   * Helper function for {@link acceptDigit} and {@link acceptDigitTrie} to save a complete digit in
-   * a state item and update grouping widths.
-   *
-   * @param next The new StateItem
-   * @param digit The digit to record
-   * @param type The type of the digit to record (INTEGER, FRACTION, or EXPONENT)
-   */
-  private static void recordDigit(StateItem next, byte digit, DigitType type) {
-    if (next == null) return;
-    next.appendDigit(digit, type);
-    if (type == DigitType.INTEGER && (next.groupingWidths & 0xf) < 15) {
-      next.groupingWidths++;
-    }
-  }
-
-  /**
-   * If <code>cp</code> is a sign (as determined by the unicode sets {@link #UNISET_PLUS} and {@link
-   * #UNISET_MINUS}), copies <code>item</code> to the new list in <code>state</code>. Loops back to
-   * the same state name.
-   *
-   * @param cp The code point to check.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptMinusOrPlusSign(
-      int cp, StateName nextName, ParserState state, StateItem item, boolean exponent) {
-    acceptMinusSign(cp, nextName, null, state, item, exponent);
-    acceptPlusSign(cp, nextName, null, state, item, exponent);
-  }
-
-  private static long acceptMinusSign(
-      int cp,
-      StateName returnTo1,
-      StateName returnTo2,
-      ParserState state,
-      StateItem item,
-      boolean exponent) {
-    if (UNISET_MINUS.contains(cp)) {
-      StateItem next = state.getNext().copyFrom(item, returnTo1, -1);
-      next.returnTo1 = returnTo2;
-      if (exponent) {
-        next.sawNegativeExponent = true;
-      } else {
-        next.sawNegative = true;
-      }
-      return 1L << state.lastInsertedIndex();
-    } else {
-      return 0L;
-    }
-  }
-
-  private static long acceptPlusSign(
-      int cp,
-      StateName returnTo1,
-      StateName returnTo2,
-      ParserState state,
-      StateItem item,
-      boolean exponent) {
-    if (UNISET_PLUS.contains(cp)) {
-      StateItem next = state.getNext().copyFrom(item, returnTo1, -1);
-      next.returnTo1 = returnTo2;
-      return 1L << state.lastInsertedIndex();
-    } else {
-      return 0L;
-    }
-  }
-
-  /**
-   * If <code>cp</code> is a grouping separator (as determined by the unicode set {@link
-   * #UNISET_GROUPING}), copies <code>item</code> to the new list in <code>state</code> and loops
-   * back to the same state. Also accepts if <code>cp</code> is the locale-specific grouping
-   * separator in {@link ParserState#groupingCp}, in which case the {@link
-   * StateItem#usesLocaleSymbols} flag is also set.
-   *
-   * @param cp The code point to check.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptGrouping(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    // Do not accept mixed grouping separators in the same string.
-    if (item.groupingCp == -1) {
-      // First time seeing a grouping separator.
-      SeparatorType cpType = SeparatorType.fromCp(cp, state.mode);
-
-      // Always accept if exactly the same as the locale grouping separator.
-      if (cp != state.groupingCp1 && cp != state.groupingCp2) {
-        // Reject if not in one of the three primary equivalence classes.
-        if (cpType == SeparatorType.UNKNOWN) {
-          return;
-        }
-        if (state.groupingMode == GroupingMode.RESTRICTED) {
-          // Reject if not in the same class as the locale grouping separator.
-          if (cpType != state.groupingType1 || cpType != state.groupingType2) {
-            return;
-          }
-        } else {
-          // Reject if in the same class as the decimal separator.
-          if (cpType == SeparatorType.COMMA_LIKE
-              && (state.decimalType1 == SeparatorType.COMMA_LIKE
-                  || state.decimalType2 == SeparatorType.COMMA_LIKE)) {
-            return;
-          }
-          if (cpType == SeparatorType.PERIOD_LIKE
-              && (state.decimalType1 == SeparatorType.PERIOD_LIKE
-                  || state.decimalType2 == SeparatorType.PERIOD_LIKE)) {
-            return;
-          }
-        }
-      }
-
-      // A match was found.
-      StateItem next = state.getNext().copyFrom(item, nextName, cp);
-      next.groupingCp = cp;
-      next.groupingWidths <<= 4;
-    } else {
-      // Have already seen a grouping separator.
-      if (cp == item.groupingCp) {
-        StateItem next = state.getNext().copyFrom(item, nextName, cp);
-        next.groupingWidths <<= 4;
-      }
-    }
-  }
-
-  /**
-   * If <code>cp</code> is a decimal (as determined by the unicode set {@link #UNISET_DECIMAL}),
-   * copies <code>item</code> to the new list in <code>state</code> and goes to {@link
-   * StateName#AFTER_FRACTION_DIGIT}. Also accepts if <code>cp</code> is the locale-specific decimal
-   * point in {@link ParserState#decimalCp}, in which case the {@link StateItem#usesLocaleSymbols}
-   * flag is also set.
-   *
-   * @param cp The code point to check.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptDecimalPoint(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    if (cp == item.groupingCp) {
-      // Don't accept a decimal point that is the same as the grouping separator
-      return;
-    }
-
-    SeparatorType cpType = SeparatorType.fromCp(cp, state.mode);
-
-    // We require that the decimal separator be in the same class as the locale.
-    if (cpType != state.decimalType1 && cpType != state.decimalType2) {
-      return;
-    }
-
-    // If in UNKNOWN or OTHER, require an exact match.
-    if (cpType == SeparatorType.OTHER_GROUPING || cpType == SeparatorType.UNKNOWN) {
-      if (cp != state.decimalCp1 && cp != state.decimalCp2) {
-        return;
-      }
-    }
-
-    // A match was found.
-    StateItem next = state.getNext().copyFrom(item, nextName, -1);
-    next.sawDecimalPoint = true;
-  }
-
-  private static void acceptNan(int cp, StateName nextName, ParserState state, StateItem item) {
-    CharSequence nan = state.symbols.getNaN();
-    long added = acceptString(cp, nextName, null, state, item, nan, 0, false);
-
-    // Set state in the items that were added by the function call
-    for (int i = Long.numberOfTrailingZeros(added); (1L << i) <= added; i++) {
-      if (((1L << i) & added) != 0) {
-        state.getItem(i).sawNaN = true;
-      }
-    }
-  }
-
-  private static void acceptInfinity(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    CharSequence inf = state.symbols.getInfinity();
-    long added = acceptString(cp, nextName, null, state, item, inf, 0, false);
-
-    // Set state in the items that were added by the function call
-    for (int i = Long.numberOfTrailingZeros(added); (1L << i) <= added; i++) {
-      if (((1L << i) & added) != 0) {
-        state.getItem(i).sawInfinity = true;
-      }
-    }
-  }
-
-  private static void acceptExponentSeparator(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    CharSequence exp = state.symbols.getExponentSeparator();
-    acceptString(cp, nextName, null, state, item, exp, 0, true);
-  }
-
-  private static void acceptPrefix(int cp, StateName nextName, ParserState state, StateItem item) {
-    for (AffixHolder holder : state.affixHolders) {
-      acceptAffixHolder(cp, nextName, state, item, holder, true);
-    }
-  }
-
-  private static void acceptSuffix(int cp, StateName nextName, ParserState state, StateItem item) {
-    if (item.affix != null) {
-      acceptAffixHolder(cp, nextName, state, item, item.affix, false);
-    } else {
-      for (AffixHolder holder : state.affixHolders) {
-        acceptAffixHolder(cp, nextName, state, item, holder, false);
-      }
-    }
-  }
-
-  private static void acceptAffixHolder(
-      int cp,
-      StateName nextName,
-      ParserState state,
-      StateItem item,
-      AffixHolder holder,
-      boolean prefix) {
-    if (holder == null) return;
-    String str = prefix ? holder.p : holder.s;
-    long added;
-    if (holder.strings) {
-      added = acceptString(cp, nextName, null, state, item, str, 0, false);
-    } else {
-      added =
-          acceptAffixPattern(cp, nextName, state, item, str, AffixUtils.nextToken(0, str));
-    }
-    // Record state in the added entries
-    for (int i = Long.numberOfTrailingZeros(added); (1L << i) <= added; i++) {
-      if (((1L << i) & added) != 0) {
-        StateItem next = state.getItem(i);
-        next.affix = holder;
-        if (prefix) next.sawPrefix = true;
-        if (!prefix) next.sawSuffix = true;
-        if (holder.negative) next.sawNegative = true;
-        // 10 point reward for consuming a prefix/suffix:
-        next.score += 10;
-        // 1 point reward for positive holders (if there is ambiguity, we want to favor positive):
-        if (!holder.negative) next.score += 1;
-        // 5 point reward for affix holders that have an empty prefix or suffix (we won't see them again):
-        if (!next.sawPrefix && holder.p.isEmpty()) next.score += 5;
-        if (!next.sawSuffix && holder.s.isEmpty()) next.score += 5;
-      }
-    }
-  }
-
-  private static long acceptStringOffset(int cp, ParserState state, StateItem item) {
-    return acceptString(
-        cp,
-        item.returnTo1,
-        item.returnTo2,
-        state,
-        item,
-        item.currentString,
-        item.currentOffset,
-        item.currentTrailing);
-  }
-
-  /**
-   * Accepts a code point if the code point is compatible with the string at the given offset.
-   * Handles runs of ignorable characters.
-   *
-   * <p>This method will add either one or two {@link StateItem} to the {@link ParserState}.
-   *
-   * @param cp The current code point, which will be checked for a match to the string.
-   * @param ret1 The state to return to after reaching the end of the string.
-   * @param ret2 The state to save in <code>returnTo1</code> after reaching the end of the string.
-   *     Set to null if returning to the main state loop.
-   * @param trailing true if this string should be ignored for the purposes of recording trailing
-   *     code points; false if it trailing count should be reset after reading the string.
-   * @param state The current {@link ParserState}
-   * @param item The current {@link StateItem}
-   * @param str The string against which to check for a match.
-   * @param offset The number of chars into the string. Initial value should be 0.
-   * @param trailing false if this string is strong and should reset trailing count to zero when it
-   *     is fully consumed.
-   * @return A bitmask where the bits correspond to the items that were added. Set to 0L if no items
-   *     were added.
-   */
-  private static long acceptString(
-      int cp,
-      StateName ret1,
-      StateName ret2,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      int offset,
-      boolean trailing) {
-    if (str == null || str.length() == 0) return 0L;
-    return acceptStringOrAffixPatternWithIgnorables(
-        cp, ret1, ret2, state, item, str, offset, trailing, true);
-  }
-
-  private static long acceptStringNonIgnorable(
-      int cp,
-      StateName ret1,
-      StateName ret2,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      boolean trailing,
-      int referenceCp,
-      long firstOffsetOrTag,
-      long nextOffsetOrTag) {
-    long added = 0L;
-    int firstOffset = (int) firstOffsetOrTag;
-    int nextOffset = (int) nextOffsetOrTag;
-    if (codePointEquals(referenceCp, cp, state)) {
-      if (firstOffset < str.length()) {
-        added |= acceptStringHelper(cp, ret1, ret2, state, item, str, firstOffset, trailing);
-      }
-      if (nextOffset >= str.length()) {
-        added |= acceptStringHelper(cp, ret1, ret2, state, item, str, nextOffset, trailing);
-      }
-      return added;
-    } else {
-      return 0L;
-    }
-  }
-
-  /**
-   * Internal method that is used to step to the next code point of a string or exit the string if
-   * at the end.
-   *
-   * @param cp See {@link #acceptString}
-   * @param returnTo1 See {@link #acceptString}
-   * @param returnTo2 See {@link #acceptString}
-   * @param state See {@link #acceptString}
-   * @param item See {@link #acceptString}
-   * @param str See {@link #acceptString}
-   * @param newOffset The offset at which the next step should start. If past the end of the string,
-   *     exit the string and return to the outer loop.
-   * @param trailing See {@link #acceptString}
-   * @return Bitmask containing one entry, the one that was added.
-   */
-  private static long acceptStringHelper(
-      int cp,
-      StateName returnTo1,
-      StateName returnTo2,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      int newOffset,
-      boolean trailing) {
-    StateItem next = state.getNext().copyFrom(item, null, cp);
-    next.score += 1; // reward for consuming a cp from string
-    if (newOffset < str.length()) {
-      // String has more code points.
-      next.name = StateName.INSIDE_STRING;
-      next.returnTo1 = returnTo1;
-      next.returnTo2 = returnTo2;
-      next.currentString = str;
-      next.currentOffset = newOffset;
-      next.currentTrailing = trailing;
-    } else {
-      // We've reached the end of the string.
-      next.name = returnTo1;
-      if (!trailing) next.trailingCount = 0;
-      next.returnTo1 = returnTo2;
-      next.returnTo2 = null;
-    }
-    return 1L << state.lastInsertedIndex();
-  }
-
-  private static long acceptAffixPatternOffset(int cp, ParserState state, StateItem item) {
-    return acceptAffixPattern(
-        cp, item.returnTo1, state, item, item.currentAffixPattern, item.currentStepwiseParserTag);
-  }
-
-  /**
-   * Accepts a code point if the code point is compatible with the affix pattern at the offset
-   * encoded in the tag argument.
-   *
-   * @param cp The current code point, which will be checked for a match to the string.
-   * @param returnTo The state to return to after reaching the end of the string.
-   * @param state The current {@link ParserState}
-   * @param item The current {@link StateItem}
-   * @param str The string containing the affix pattern.
-   * @param tag The current state of the stepwise parser. Initial value should be 0L.
-   * @return A bitmask where the bits correspond to the items that were added. Set to 0L if no items
-   *     were added.
-   */
-  private static long acceptAffixPattern(
-      int cp, StateName ret1, ParserState state, StateItem item, CharSequence str, long tag) {
-    if (str == null || str.length() == 0) return 0L;
-    return acceptStringOrAffixPatternWithIgnorables(
-        cp, ret1, null, state, item, str, tag, false, false);
-  }
-
-  private static long acceptAffixPatternNonIgnorable(
-      int cp,
-      StateName returnTo,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      int typeOrCp,
-      long firstTag,
-      long nextTag) {
-
-    // Convert from the returned tag to a code point, string, or currency to check
-    int resolvedCp = -1;
-    CharSequence resolvedStr = null;
-    boolean resolvedMinusSign = false;
-    boolean resolvedPlusSign = false;
-    boolean resolvedCurrency = false;
-    if (typeOrCp < 0) {
-      // Symbol
-      switch (typeOrCp) {
-        case AffixUtils.TYPE_MINUS_SIGN:
-          resolvedMinusSign = true;
-          break;
-        case AffixUtils.TYPE_PLUS_SIGN:
-          resolvedPlusSign = true;
-          break;
-        case AffixUtils.TYPE_PERCENT:
-          resolvedStr = state.symbols.getPercentString();
-          if (resolvedStr.length() != 1 || resolvedStr.charAt(0) != '%') {
-            resolvedCp = '%'; // accept ASCII percent as well as locale percent
-          }
-          break;
-        case AffixUtils.TYPE_PERMILLE:
-          resolvedStr = state.symbols.getPerMillString();
-          if (resolvedStr.length() != 1 || resolvedStr.charAt(0) != '‰') {
-            resolvedCp = '‰'; // accept ASCII permille as well as locale permille
-          }
-          break;
-        case AffixUtils.TYPE_CURRENCY_SINGLE:
-        case AffixUtils.TYPE_CURRENCY_DOUBLE:
-        case AffixUtils.TYPE_CURRENCY_TRIPLE:
-        case AffixUtils.TYPE_CURRENCY_QUAD:
-        case AffixUtils.TYPE_CURRENCY_QUINT:
-        case AffixUtils.TYPE_CURRENCY_OVERFLOW:
-          resolvedCurrency = true;
-          break;
-        default:
-          throw new AssertionError();
-      }
-    } else {
-      resolvedCp = typeOrCp;
-    }
-
-    long added = 0L;
-    if (resolvedCp >= 0 && codePointEquals(cp, resolvedCp, state)) {
-      if (firstTag >= 0) {
-        added |= acceptAffixPatternHelper(cp, returnTo, state, item, str, firstTag);
-      }
-      if (nextTag < 0) {
-        added |= acceptAffixPatternHelper(cp, returnTo, state, item, str, nextTag);
-      }
-    }
-    if (resolvedMinusSign) {
-      if (firstTag >= 0) {
-        added |= acceptMinusSign(cp, StateName.INSIDE_AFFIX_PATTERN, returnTo, state, item, false);
-      }
-      if (nextTag < 0) {
-        added |= acceptMinusSign(cp, returnTo, null, state, item, false);
-      }
-      if (added == 0L) {
-        // Also attempt to accept custom minus sign string
-        String mss = state.symbols.getMinusSignString();
-        int mssCp = Character.codePointAt(mss, 0);
-        if (mss.length() != Character.charCount(mssCp) || !UNISET_MINUS.contains(mssCp)) {
-          resolvedStr = mss;
-        }
-      }
-    }
-    if (resolvedPlusSign) {
-      if (firstTag >= 0) {
-        added |= acceptPlusSign(cp, StateName.INSIDE_AFFIX_PATTERN, returnTo, state, item, false);
-      }
-      if (nextTag < 0) {
-        added |= acceptPlusSign(cp, returnTo, null, state, item, false);
-      }
-      if (added == 0L) {
-        // Also attempt to accept custom plus sign string
-        String pss = state.symbols.getPlusSignString();
-        int pssCp = Character.codePointAt(pss, 0);
-        if (pss.length() != Character.charCount(pssCp) || !UNISET_MINUS.contains(pssCp)) {
-          resolvedStr = pss;
-        }
-      }
-    }
-    if (resolvedStr != null) {
-      if (firstTag >= 0) {
-        added |=
-            acceptString(
-                cp, StateName.INSIDE_AFFIX_PATTERN, returnTo, state, item, resolvedStr, 0, false);
-      }
-      if (nextTag < 0) {
-        added |= acceptString(cp, returnTo, null, state, item, resolvedStr, 0, false);
-      }
-    }
-    if (resolvedCurrency) {
-      if (firstTag >= 0) {
-        added |= acceptCurrency(cp, StateName.INSIDE_AFFIX_PATTERN, returnTo, state, item);
-      }
-      if (nextTag < 0) {
-        added |= acceptCurrency(cp, returnTo, null, state, item);
-      }
-    }
-
-    // Set state in the items that were added by the function calls
-    for (int i = Long.numberOfTrailingZeros(added); (1L << i) <= added; i++) {
-      if (((1L << i) & added) != 0) {
-        state.getItem(i).currentAffixPattern = str;
-        state.getItem(i).currentStepwiseParserTag = firstTag;
-      }
-    }
-    return added;
-  }
-
-  /**
-   * Internal method that is used to step to the next token of a affix pattern or exit the affix
-   * pattern if at the end.
-   *
-   * @param cp See {@link #acceptAffixPattern}
-   * @param returnTo1 See {@link #acceptAffixPattern}
-   * @param state See {@link #acceptAffixPattern}
-   * @param item See {@link #acceptAffixPattern}
-   * @param str See {@link #acceptAffixPattern}
-   * @param newOffset The tag corresponding to the next token in the affix pattern that should be
-   *     recorded and consumed in a future call to {@link #acceptAffixPatternOffset}.
-   * @return Bitmask containing one entry, the one that was added.
-   */
-  private static long acceptAffixPatternHelper(
-      int cp,
-      StateName returnTo,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      long newTag) {
-    StateItem next = state.getNext().copyFrom(item, null, cp);
-    next.score += 1; // reward for consuming a cp from pattern
-    if (newTag >= 0) {
-      // Additional tokens in affix string.
-      next.name = StateName.INSIDE_AFFIX_PATTERN;
-      next.returnTo1 = returnTo;
-      next.currentAffixPattern = str;
-      next.currentStepwiseParserTag = newTag;
-    } else {
-      // Reached last token in affix string.
-      next.name = returnTo;
-      next.trailingCount = 0;
-      next.returnTo1 = null;
-    }
-    return 1L << state.lastInsertedIndex();
-  }
-
-  /**
-   * Consumes tokens from a string or affix pattern following ICU's rules for handling of whitespace
-   * and bidi control characters (collectively called "ignorables"). The methods {@link
-   * #acceptStringHelper}, {@link #acceptAffixPatternHelper}, {@link #acceptStringNonIgnorable}, and
-   * {@link #acceptAffixPatternNonIgnorable} will be called by this method to actually add parse
-   * paths.
-   *
-   * <p>In the "NonIgnorable" functions, two arguments are passed: firstOffsetOrTag and
-   * nextOffsetOrTag. These two arguments should add parse paths according to the following rules:
-   *
-   * <pre>
-   * if (firstOffsetOrTag is valid or inside string boundary) {
-   *   // Add parse path going to firstOffsetOrTag
-   * }
-   * if (nextOffsetOrTag is invalid or beyond string boundary) {
-   *   // Add parse path leaving the string
-   * }
-   * </pre>
-   *
-   * <p>Note that there may be multiple parse paths added by these lines. This is important in order
-   * to properly handle runs of ignorables.
-   *
-   * @param cp See {@link #acceptString} and {@link #acceptAffixPattern}
-   * @param ret1 See {@link #acceptString} and {@link #acceptAffixPattern}
-   * @param ret2 See {@link #acceptString} (affix pattern can pass null)
-   * @param state See {@link #acceptString} and {@link #acceptAffixPattern}
-   * @param item See {@link #acceptString} and {@link #acceptAffixPattern}
-   * @param str See {@link #acceptString} and {@link #acceptAffixPattern}
-   * @param offsetOrTag The current int offset for strings, or the current tag for affix patterns.
-   * @param trailing See {@link #acceptString} (affix patterns can pass false)
-   * @param isString true if the parameters correspond to a string; false if they correspond to an
-   *     affix pattern.
-   * @return A bitmask containing the entries that were added.
-   */
-  private static long acceptStringOrAffixPatternWithIgnorables(
-      int cp,
-      StateName ret1,
-      StateName ret2 /* String only */,
-      ParserState state,
-      StateItem item,
-      CharSequence str,
-      long offsetOrTag /* offset for string; tag for affix pattern */,
-      boolean trailing /* String only */,
-      boolean isString) {
-
-    // Runs of ignorables (whitespace and bidi control marks) can occur at the beginning, middle,
-    // or end of the reference string, or a run across the entire string.
-    //
-    // - A run at the beginning or in the middle corresponds to a run of length *zero or more*
-    //   in the input.
-    // - A run at the end need to be matched exactly.
-    // - A string that contains only ignorable characters also needs to be matched exactly.
-    //
-    // Because the behavior differs, we need logic here to determine which case we have.
-
-    int typeOrCp =
-        isString
-            ? Character.codePointAt(str, (int) offsetOrTag)
-            : AffixUtils.getTypeOrCp(offsetOrTag);
-
-    if (isIgnorable(typeOrCp, state)) {
-      // Look for the next nonignorable code point
-      int nextTypeOrCp = typeOrCp;
-      long prevOffsetOrTag;
-      long nextOffsetOrTag = offsetOrTag;
-      long firstOffsetOrTag = 0L;
-      while (true) {
-        prevOffsetOrTag = nextOffsetOrTag;
-        nextOffsetOrTag =
-            isString
-                ? nextOffsetOrTag + Character.charCount(nextTypeOrCp)
-                : AffixUtils.nextToken(nextOffsetOrTag, str);
-        if (firstOffsetOrTag == 0L) firstOffsetOrTag = nextOffsetOrTag;
-        if (isString ? nextOffsetOrTag >= str.length() : nextOffsetOrTag < 0) {
-          // Integer.MIN_VALUE is an invalid value for either a type or a cp;
-          // use it to indicate the end of the string.
-          nextTypeOrCp = Integer.MIN_VALUE;
-          break;
-        }
-        nextTypeOrCp =
-            isString
-                ? Character.codePointAt(str, (int) nextOffsetOrTag)
-                : AffixUtils.getTypeOrCp(nextOffsetOrTag);
-        if (!isIgnorable(nextTypeOrCp, state)) break;
-      }
-
-      if (nextTypeOrCp == Integer.MIN_VALUE) {
-        // Run at end or string that contains only ignorable characters.
-        if (codePointEquals(cp, typeOrCp, state)) {
-          // Step forward and also exit the string if not at very end.
-          // RETURN
-          long added = 0L;
-          added |=
-              isString
-                  ? acceptStringHelper(
-                      cp, ret1, ret2, state, item, str, (int) firstOffsetOrTag, trailing)
-                  : acceptAffixPatternHelper(cp, ret1, state, item, str, firstOffsetOrTag);
-          if (firstOffsetOrTag != nextOffsetOrTag) {
-            added |=
-                isString
-                    ? acceptStringHelper(
-                        cp, ret1, ret2, state, item, str, (int) nextOffsetOrTag, trailing)
-                    : acceptAffixPatternHelper(cp, ret1, state, item, str, nextOffsetOrTag);
-          }
-          return added;
-        } else {
-          // Code point does not exactly match the run at end.
-          // RETURN
-          return 0L;
-        }
-      } else {
-        // Run at beginning or in middle.
-        if (isIgnorable(cp, state)) {
-          // Consume the ignorable.
-          // RETURN
-          return isString
-              ? acceptStringHelper(
-                  cp, ret1, ret2, state, item, str, (int) prevOffsetOrTag, trailing)
-              : acceptAffixPatternHelper(cp, ret1, state, item, str, prevOffsetOrTag);
-        } else {
-          // Go to nonignorable cp.
-          // FALL THROUGH
-        }
-      }
-
-      // Fall through to the nonignorable code point found above.
-      assert nextTypeOrCp != Integer.MIN_VALUE;
-      typeOrCp = nextTypeOrCp;
-      offsetOrTag = nextOffsetOrTag;
-    }
-    assert !isIgnorable(typeOrCp, state);
-
-    // Look for the next nonignorable code point after this nonignorable code point
-    // to determine if we are at the end of the string.
-    int nextTypeOrCp = typeOrCp;
-    long nextOffsetOrTag = offsetOrTag;
-    long firstOffsetOrTag = 0L;
-    while (true) {
-      nextOffsetOrTag =
-          isString
-              ? nextOffsetOrTag + Character.charCount(nextTypeOrCp)
-              : AffixUtils.nextToken(nextOffsetOrTag, str);
-      if (firstOffsetOrTag == 0L) firstOffsetOrTag = nextOffsetOrTag;
-      if (isString ? nextOffsetOrTag >= str.length() : nextOffsetOrTag < 0) {
-        nextTypeOrCp = -1;
-        break;
-      }
-      nextTypeOrCp =
-          isString
-              ? Character.codePointAt(str, (int) nextOffsetOrTag)
-              : AffixUtils.getTypeOrCp(nextOffsetOrTag);
-      if (!isIgnorable(nextTypeOrCp, state)) break;
-    }
-
-    // Nonignorable logic.
-    return isString
-        ? acceptStringNonIgnorable(
-            cp, ret1, ret2, state, item, str, trailing, typeOrCp, firstOffsetOrTag, nextOffsetOrTag)
-        : acceptAffixPatternNonIgnorable(
-            cp, ret1, state, item, str, typeOrCp, firstOffsetOrTag, nextOffsetOrTag);
-  }
-
-  /**
-   * This method can add up to four items to the new list in <code>state</code>.
-   *
-   * <p>If <code>cp</code> is equal to any known ISO code or long name, copies <code>item</code> to
-   * the new list in <code>state</code> and sets its ISO code to the corresponding currency.
-   *
-   * <p>If <code>cp</code> is the first code point of any ISO code or long name having more them one
-   * code point in length, copies <code>item</code> to the new list in <code>state</code> along with
-   * an instance of {@link TextTrieMap.ParseState} for tracking the following code points.
-   *
-   * @param cp The code point to check.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptCurrency(
-      int cp, StateName nextName, ParserState state, StateItem item) {
-    acceptCurrency(cp, nextName, null, state, item);
-  }
-
-  private static long acceptCurrency(
-      int cp, StateName returnTo1, StateName returnTo2, ParserState state, StateItem item) {
-    if (item.sawCurrency) return 0L;
-    long added = 0L;
-
-    // Accept from local currency information
-    String str1, str2;
-    Currency currency = state.properties.getCurrency();
-    if (currency != null) {
-      str1 = currency.getName(state.symbols.getULocale(), Currency.SYMBOL_NAME, null);
-      str2 = currency.getCurrencyCode();
-      // TODO: Should we also accept long names? In currency mode, they are in the CLDR data.
-    } else {
-      currency = state.symbols.getCurrency();
-      str1 = state.symbols.getCurrencySymbol();
-      str2 = state.symbols.getInternationalCurrencySymbol();
-    }
-    added |= acceptString(cp, returnTo1, returnTo2, state, item, str1, 0, false);
-    added |= acceptString(cp, returnTo1, returnTo2, state, item, str2, 0, false);
-    for (int i = Long.numberOfTrailingZeros(added); (1L << i) <= added; i++) {
-      if (((1L << i) & added) != 0) {
-        state.getItem(i).sawCurrency = true;
-        state.getItem(i).isoCode = str2;
-      }
-    }
-
-    // Accept from CLDR data
-    if (state.parseCurrency) {
-      ULocale uloc = state.symbols.getULocale();
-      TextTrieMap<Currency.CurrencyStringInfo>.ParseState trie1 =
-          Currency.openParseState(uloc, cp, Currency.LONG_NAME);
-      TextTrieMap<Currency.CurrencyStringInfo>.ParseState trie2 =
-          Currency.openParseState(uloc, cp, Currency.SYMBOL_NAME);
-      added |= acceptCurrencyHelper(cp, returnTo1, returnTo2, state, item, trie1);
-      added |= acceptCurrencyHelper(cp, returnTo1, returnTo2, state, item, trie2);
-    }
-
-    return added;
-  }
-
-  /**
-   * If <code>cp</code> is the next code point of any currency, copies <code>item</code> to the new
-   * list in <code>state</code> along with an instance of {@link TextTrieMap.ParseState} for
-   * tracking the following code points.
-   *
-   * <p>This method should only be called in a state following {@link #acceptCurrency}.
-   *
-   * @param cp The code point to check.
-   * @param state The state object to update.
-   * @param item The old state leading into the code point.
-   */
-  private static void acceptCurrencyOffset(int cp, ParserState state, StateItem item) {
-    acceptCurrencyHelper(
-        cp, item.returnTo1, item.returnTo2, state, item, item.currentCurrencyTrieState);
-  }
-
-  private static long acceptCurrencyHelper(
-      int cp,
-      StateName returnTo1,
-      StateName returnTo2,
-      ParserState state,
-      StateItem item,
-      TextTrieMap<Currency.CurrencyStringInfo>.ParseState trieState) {
-    if (trieState == null) return 0L;
-    trieState.accept(cp);
-    long added = 0L;
-    Iterator<Currency.CurrencyStringInfo> currentMatches = trieState.getCurrentMatches();
-    if (currentMatches != null) {
-      // Match on current code point
-      // TODO: What should happen with multiple currency matches?
-      StateItem next = state.getNext().copyFrom(item, returnTo1, -1);
-      next.returnTo1 = returnTo2;
-      next.returnTo2 = null;
-      next.sawCurrency = true;
-      next.isoCode = currentMatches.next().getISOCode();
-      added |= 1L << state.lastInsertedIndex();
-    }
-    if (!trieState.atEnd()) {
-      // Prepare for matches on future code points
-      StateItem next = state.getNext().copyFrom(item, StateName.INSIDE_CURRENCY, -1);
-      next.returnTo1 = returnTo1;
-      next.returnTo2 = returnTo2;
-      next.currentCurrencyTrieState = trieState;
-      added |= 1L << state.lastInsertedIndex();
-    }
-    return added;
-  }
-
-  private static long acceptDigitTrie(
-      int cp, StateName nextName, ParserState state, StateItem item, DigitType type) {
-    assert state.digitTrie != null;
-    TextTrieMap<Byte>.ParseState trieState = state.digitTrie.openParseState(cp);
-    if (trieState == null) return 0L;
-    return acceptDigitTrieHelper(cp, nextName, state, item, type, trieState);
-  }
-
-  private static void acceptDigitTrieOffset(int cp, ParserState state, StateItem item) {
-    acceptDigitTrieHelper(
-        cp, item.returnTo1, state, item, item.currentDigitType, item.currentDigitTrieState);
-  }
-
-  private static long acceptDigitTrieHelper(
-      int cp,
-      StateName returnTo1,
-      ParserState state,
-      StateItem item,
-      DigitType type,
-      TextTrieMap<Byte>.ParseState trieState) {
-    if (trieState == null) return 0L;
-    trieState.accept(cp);
-    long added = 0L;
-    Iterator<Byte> currentMatches = trieState.getCurrentMatches();
-    if (currentMatches != null) {
-      // Match on current code point
-      byte digit = currentMatches.next();
-      StateItem next = state.getNext().copyFrom(item, returnTo1, -1);
-      next.returnTo1 = null;
-      recordDigit(next, digit, type);
-      added |= 1L << state.lastInsertedIndex();
-    }
-    if (!trieState.atEnd()) {
-      // Prepare for matches on future code points
-      StateItem next = state.getNext().copyFrom(item, StateName.INSIDE_DIGIT, -1);
-      next.returnTo1 = returnTo1;
-      next.currentDigitTrieState = trieState;
-      next.currentDigitType = type;
-      added |= 1L << state.lastInsertedIndex();
-    }
-    return added;
-  }
-
-  /**
-   * Checks whether the two given code points are equal after applying case mapping as requested in
-   * the ParserState.
-   *
-   * @see #acceptString
-   * @see #acceptAffixPattern
-   */
-  private static boolean codePointEquals(int cp1, int cp2, ParserState state) {
-    if (!state.caseSensitive) {
-      cp1 = UCharacter.foldCase(cp1, true);
-      cp2 = UCharacter.foldCase(cp2, true);
-    }
-    return cp1 == cp2;
-  }
-
-  /**
-   * Checks whether the given code point is "ignorable" and should be skipped. BiDi control marks
-   * are always ignorable, and whitespace is ignorable in lenient mode.
-   *
-   * <p>Returns false if cp is negative.
-   *
-   * @param cp The code point to test.
-   * @param state The current {@link ParserState}, used for determining strict mode.
-   * @return true if cp is ignorable; false otherwise.
-   */
-  private static boolean isIgnorable(int cp, ParserState state) {
-    if (cp < 0) return false;
-    if (UNISET_BIDI.contains(cp)) return true;
-    return state.mode == ParseMode.LENIENT && UNISET_WHITESPACE.contains(cp);
-  }
-}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternStringParser.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternStringParser.java
index 50336bc..53dd482 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternStringParser.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternStringParser.java
@@ -12,8 +12,8 @@
     public static final int IGNORE_ROUNDING_ALWAYS = 2;
 
     /**
-     * Runs the recursive descent parser on the given pattern string, returning a data structure with raw information
-     * about the pattern string.
+     * Runs the recursive descent parser on the given pattern string, returning a data structure with raw
+     * information about the pattern string.
      *
      * <p>
      * To obtain a more useful form of the data, consider using {@link #parseToProperties} instead.
@@ -35,9 +35,10 @@
      * @param pattern
      *            The pattern string, like "#,##0.00"
      * @param ignoreRounding
-     *            Whether to leave out rounding information (minFrac, maxFrac, and rounding increment) when parsing the
-     *            pattern. This may be desirable if a custom rounding mode, such as CurrencyUsage, is to be used
-     *            instead. One of {@link PatternStringParser#IGNORE_ROUNDING_ALWAYS},
+     *            Whether to leave out rounding information (minFrac, maxFrac, and rounding increment)
+     *            when parsing the pattern. This may be desirable if a custom rounding mode, such as
+     *            CurrencyUsage, is to be used instead. One of
+     *            {@link PatternStringParser#IGNORE_ROUNDING_ALWAYS},
      *            {@link PatternStringParser#IGNORE_ROUNDING_IF_CURRENCY}, or
      *            {@link PatternStringParser#IGNORE_ROUNDING_NEVER}.
      * @return A property bag object.
@@ -55,9 +56,10 @@
     }
 
     /**
-     * Parses a pattern string into an existing property bag. All properties that can be encoded into a pattern string
-     * will be overwritten with either their default value or with the value coming from the pattern string. Properties
-     * that cannot be encoded into a pattern string, such as rounding mode, are not modified.
+     * Parses a pattern string into an existing property bag. All properties that can be encoded into a
+     * pattern string will be overwritten with either their default value or with the value coming from
+     * the pattern string. Properties that cannot be encoded into a pattern string, such as rounding
+     * mode, are not modified.
      *
      * @param pattern
      *            The pattern string, like "#,##0.00"
@@ -68,7 +70,9 @@
      * @throws IllegalArgumentException
      *             If there was a syntax error in the pattern string.
      */
-    public static void parseToExistingProperties(String pattern, DecimalFormatProperties properties,
+    public static void parseToExistingProperties(
+            String pattern,
+            DecimalFormatProperties properties,
             int ignoreRounding) {
         parseToExistingPropertiesImpl(pattern, properties, ignoreRounding);
     }
@@ -111,6 +115,7 @@
             return right - left;
         }
 
+        @Override
         public String getString(int flags) {
             long endpoints = getEndpoints(flags);
             int left = (int) (endpoints & 0xffffffff);
@@ -164,6 +169,11 @@
         public boolean containsSymbolType(int type) {
             return AffixUtils.containsType(pattern, type);
         }
+
+        @Override
+        public boolean hasBody() {
+            return positive.integerTotal > 0;
+        }
     }
 
     public static class ParsedSubpatternInfo {
@@ -262,7 +272,10 @@
         consumePadding(state, result, PadPosition.AFTER_SUFFIX);
     }
 
-    private static void consumePadding(ParserState state, ParsedSubpatternInfo result, PadPosition paddingLocation) {
+    private static void consumePadding(
+            ParserState state,
+            ParsedSubpatternInfo result,
+            PadPosition paddingLocation) {
         if (state.peek() != '*') {
             return;
         }
@@ -504,7 +517,10 @@
     /// END RECURSIVE DESCENT PARSER IMPLEMENTATION ///
     ///////////////////////////////////////////////////
 
-    private static void parseToExistingPropertiesImpl(String pattern, DecimalFormatProperties properties, int ignoreRounding) {
+    private static void parseToExistingPropertiesImpl(
+            String pattern,
+            DecimalFormatProperties properties,
+            int ignoreRounding) {
         if (pattern == null || pattern.length() == 0) {
             // Backwards compatibility requires that we reset to the default values.
             // TODO: Only overwrite the properties that "saveToProperties" normally touches?
@@ -518,7 +534,9 @@
     }
 
     /** Finalizes the temporary data stored in the ParsedPatternInfo to the Properties. */
-    private static void patternInfoToProperties(DecimalFormatProperties properties, ParsedPatternInfo patternInfo,
+    private static void patternInfoToProperties(
+            DecimalFormatProperties properties,
+            ParsedPatternInfo patternInfo,
             int _ignoreRounding) {
         // Translate from PatternParseResult to Properties.
         // Note that most data from "negative" is ignored per the specification of DecimalFormat.
@@ -572,12 +590,14 @@
             properties.setMaximumFractionDigits(-1);
             properties.setRoundingIncrement(null);
             properties.setMinimumSignificantDigits(positive.integerAtSigns);
-            properties.setMaximumSignificantDigits(positive.integerAtSigns + positive.integerTrailingHashSigns);
+            properties.setMaximumSignificantDigits(
+                    positive.integerAtSigns + positive.integerTrailingHashSigns);
         } else if (positive.rounding != null) {
             if (!ignoreRounding) {
                 properties.setMinimumFractionDigits(minFrac);
                 properties.setMaximumFractionDigits(positive.fractionTotal);
-                properties.setRoundingIncrement(positive.rounding.toBigDecimal().setScale(positive.fractionNumerals));
+                properties.setRoundingIncrement(
+                        positive.rounding.toBigDecimal().setScale(positive.fractionNumerals));
             } else {
                 properties.setMinimumFractionDigits(-1);
                 properties.setMaximumFractionDigits(-1);
@@ -633,7 +653,8 @@
         // Padding settings
         if (positive.paddingLocation != null) {
             // The width of the positive prefix and suffix templates are included in the padding
-            int paddingWidth = positive.widthExceptAffixes + AffixUtils.estimateLength(posPrefix)
+            int paddingWidth = positive.widthExceptAffixes
+                    + AffixUtils.estimateLength(posPrefix)
                     + AffixUtils.estimateLength(posSuffix);
             properties.setFormatWidth(paddingWidth);
             String rawPaddingString = patternInfo.getString(AffixPatternProvider.Flags.PADDING);
@@ -662,9 +683,10 @@
         properties.setPositivePrefixPattern(posPrefix);
         properties.setPositiveSuffixPattern(posSuffix);
         if (patternInfo.negative != null) {
-            properties.setNegativePrefixPattern(patternInfo
-                    .getString(AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN | AffixPatternProvider.Flags.PREFIX));
-            properties.setNegativeSuffixPattern(patternInfo.getString(AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN));
+            properties.setNegativePrefixPattern(patternInfo.getString(
+                    AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN | AffixPatternProvider.Flags.PREFIX));
+            properties.setNegativeSuffixPattern(
+                    patternInfo.getString(AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN));
         } else {
             properties.setNegativePrefixPattern(null);
             properties.setNegativeSuffixPattern(null);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternStringUtils.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternStringUtils.java
index 4bed35f..d423c68 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternStringUtils.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternStringUtils.java
@@ -4,7 +4,9 @@
 
 import java.math.BigDecimal;
 
+import com.ibm.icu.impl.StandardPlural;
 import com.ibm.icu.impl.number.Padder.PadPosition;
+import com.ibm.icu.number.NumberFormatter.SignDisplay;
 import com.ibm.icu.text.DecimalFormatSymbols;
 
 /**
@@ -16,8 +18,9 @@
      * Creates a pattern string from a property bag.
      *
      * <p>
-     * Since pattern strings support only a subset of the functionality available in a property bag, a new property bag
-     * created from the string returned by this function may not be the same as the original property bag.
+     * Since pattern strings support only a subset of the functionality available in a property bag, a
+     * new property bag created from the string returned by this function may not be the same as the
+     * original property bag.
      *
      * @param properties
      *            The property bag to serialize.
@@ -61,7 +64,8 @@
 
         // Figure out the grouping sizes.
         int grouping1, grouping2, grouping;
-        if (groupingSize != Math.min(dosMax, -1) && firstGroupingSize != Math.min(dosMax, -1)
+        if (groupingSize != Math.min(dosMax, -1)
+                && firstGroupingSize != Math.min(dosMax, -1)
                 && groupingSize != firstGroupingSize) {
             grouping = groupingSize;
             grouping1 = groupingSize;
@@ -184,7 +188,9 @@
 
         // Negative affixes
         // Ignore if the negative prefix pattern is "-" and the negative suffix is empty
-        if (np != null || ns != null || (npp == null && nsp != null)
+        if (np != null
+                || ns != null
+                || (npp == null && nsp != null)
                 || (npp != null && (npp.length() != 1 || npp.charAt(0) != '-' || nsp.length() != 0))) {
             sb.append(';');
             if (npp != null)
@@ -232,14 +238,15 @@
     }
 
     /**
-     * Converts a pattern between standard notation and localized notation. Localized notation means that instead of
-     * using generic placeholders in the pattern, you use the corresponding locale-specific characters instead. For
-     * example, in locale <em>fr-FR</em>, the period in the pattern "0.000" means "decimal" in standard notation (as it
-     * does in every other locale), but it means "grouping" in localized notation.
+     * Converts a pattern between standard notation and localized notation. Localized notation means that
+     * instead of using generic placeholders in the pattern, you use the corresponding locale-specific
+     * characters instead. For example, in locale <em>fr-FR</em>, the period in the pattern "0.000" means
+     * "decimal" in standard notation (as it does in every other locale), but it means "grouping" in
+     * localized notation.
      *
      * <p>
-     * A greedy string-substitution strategy is used to substitute locale symbols. If two symbols are ambiguous or have
-     * the same prefix, the result is not well-defined.
+     * A greedy string-substitution strategy is used to substitute locale symbols. If two symbols are
+     * ambiguous or have the same prefix, the result is not well-defined.
      *
      * <p>
      * Locale symbols are not allowed to contain the ASCII quote character.
@@ -252,11 +259,14 @@
      * @param symbols
      *            The symbols corresponding to the localized pattern.
      * @param toLocalized
-     *            true to convert from standard to localized notation; false to convert from localized to standard
-     *            notation.
+     *            true to convert from standard to localized notation; false to convert from localized to
+     *            standard notation.
      * @return The pattern expressed in the other notation.
      */
-    public static String convertLocalized(String input, DecimalFormatSymbols symbols, boolean toLocalized) {
+    public static String convertLocalized(
+            String input,
+            DecimalFormatSymbols symbols,
+            boolean toLocalized) {
         if (input == null)
             return null;
 
@@ -390,4 +400,79 @@
         return result.toString();
     }
 
+    /**
+     * This method contains the heart of the logic for rendering LDML affix strings. It handles
+     * sign-always-shown resolution, whether to use the positive or negative subpattern, permille
+     * substitution, and plural forms for CurrencyPluralInfo.
+     */
+    public static void patternInfoToStringBuilder(
+            AffixPatternProvider patternInfo,
+            boolean isPrefix,
+            int signum,
+            SignDisplay signDisplay,
+            StandardPlural plural,
+            boolean perMilleReplacesPercent,
+            StringBuilder output) {
+
+        // Should the output render '+' where '-' would normally appear in the pattern?
+        boolean plusReplacesMinusSign = signum != -1
+                && (signDisplay == SignDisplay.ALWAYS
+                        || signDisplay == SignDisplay.ACCOUNTING_ALWAYS
+                        || (signum == 1
+                                && (signDisplay == SignDisplay.EXCEPT_ZERO
+                                        || signDisplay == SignDisplay.ACCOUNTING_EXCEPT_ZERO)))
+                && patternInfo.positiveHasPlusSign() == false;
+
+        // Should we use the affix from the negative subpattern? (If not, we will use the positive
+        // subpattern.)
+        boolean useNegativeAffixPattern = patternInfo.hasNegativeSubpattern()
+                && (signum == -1 || (patternInfo.negativeHasMinusSign() && plusReplacesMinusSign));
+
+        // Resolve the flags for the affix pattern.
+        int flags = 0;
+        if (useNegativeAffixPattern) {
+            flags |= AffixPatternProvider.Flags.NEGATIVE_SUBPATTERN;
+        }
+        if (isPrefix) {
+            flags |= AffixPatternProvider.Flags.PREFIX;
+        }
+        if (plural != null) {
+            assert plural.ordinal() == (AffixPatternProvider.Flags.PLURAL_MASK & plural.ordinal());
+            flags |= plural.ordinal();
+        }
+
+        // Should we prepend a sign to the pattern?
+        boolean prependSign;
+        if (!isPrefix || useNegativeAffixPattern) {
+            prependSign = false;
+        } else if (signum == -1) {
+            prependSign = signDisplay != SignDisplay.NEVER;
+        } else {
+            prependSign = plusReplacesMinusSign;
+        }
+
+        // Compute the length of the affix pattern.
+        int length = patternInfo.length(flags) + (prependSign ? 1 : 0);
+
+        // Finally, set the result into the StringBuilder.
+        output.setLength(0);
+        for (int index = 0; index < length; index++) {
+            char candidate;
+            if (prependSign && index == 0) {
+                candidate = '-';
+            } else if (prependSign) {
+                candidate = patternInfo.charAt(flags, index - 1);
+            } else {
+                candidate = patternInfo.charAt(flags, index);
+            }
+            if (plusReplacesMinusSign && candidate == '-') {
+                candidate = '+';
+            }
+            if (perMilleReplacesPercent && candidate == '%') {
+                candidate = '‰';
+            }
+            output.append(candidate);
+        }
+    }
+
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Properties.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Properties.java
index bb635cd..59197b6 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Properties.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Properties.java
@@ -8,8 +8,8 @@
 import java.io.Serializable;
 
 /**
- * ICU 59 called the class DecimalFormatProperties as just Properties. We need to keep a thin implementation for the
- * purposes of serialization.
+ * ICU 59 called the class DecimalFormatProperties as just Properties. We need to keep a thin
+ * implementation for the purposes of serialization.
  */
 public class Properties implements Serializable {
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PropertiesAffixPatternProvider.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PropertiesAffixPatternProvider.java
new file mode 100644
index 0000000..6d2eab6
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PropertiesAffixPatternProvider.java
@@ -0,0 +1,148 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number;
+
+public class PropertiesAffixPatternProvider implements AffixPatternProvider {
+    private final String posPrefix;
+    private final String posSuffix;
+    private final String negPrefix;
+    private final String negSuffix;
+
+    public PropertiesAffixPatternProvider(DecimalFormatProperties properties) {
+        // There are two ways to set affixes in DecimalFormat: via the pattern string (applyPattern), and via the
+        // explicit setters (setPositivePrefix and friends).  The way to resolve the settings is as follows:
+        //
+        // 1) If the explicit setting is present for the field, use it.
+        // 2) Otherwise, follows UTS 35 rules based on the pattern string.
+        //
+        // Importantly, the explicit setters affect only the one field they override.  If you set the positive
+        // prefix, that should not affect the negative prefix.  Since it is impossible for the user of this class
+        // to know whether the origin for a string was the override or the pattern, we have to say that we always
+        // have a negative subpattern and perform all resolution logic here.
+
+        // Convenience: Extract the properties into local variables.
+        // Variables are named with three chars: [p/n][p/s][o/p]
+        // [p/n] => p for positive, n for negative
+        // [p/s] => p for prefix, s for suffix
+        // [o/p] => o for escaped custom override string, p for pattern string
+        String ppo = AffixUtils.escape(properties.getPositivePrefix());
+        String pso = AffixUtils.escape(properties.getPositiveSuffix());
+        String npo = AffixUtils.escape(properties.getNegativePrefix());
+        String nso = AffixUtils.escape(properties.getNegativeSuffix());
+        String ppp = properties.getPositivePrefixPattern();
+        String psp = properties.getPositiveSuffixPattern();
+        String npp = properties.getNegativePrefixPattern();
+        String nsp = properties.getNegativeSuffixPattern();
+
+        if (ppo != null) {
+            posPrefix = ppo;
+        } else if (ppp != null) {
+            posPrefix = ppp;
+        } else {
+            // UTS 35: Default positive prefix is empty string.
+            posPrefix = "";
+        }
+
+        if (pso != null) {
+            posSuffix = pso;
+        } else if (psp != null) {
+            posSuffix = psp;
+        } else {
+            // UTS 35: Default positive suffix is empty string.
+            posSuffix = "";
+        }
+
+        if (npo != null) {
+            negPrefix = npo;
+        } else if (npp != null) {
+            negPrefix = npp;
+        } else {
+            // UTS 35: Default negative prefix is "-" with positive prefix.
+            // Important: We prepend the "-" to the pattern, not the override!
+            negPrefix = ppp == null ? "-" : "-" + ppp;
+        }
+
+        if (nso != null) {
+            negSuffix = nso;
+        } else if (nsp != null) {
+            negSuffix = nsp;
+        } else {
+            // UTS 35: Default negative prefix is the positive prefix.
+            negSuffix = psp == null ? "" : psp;
+        }
+    }
+
+    @Override
+    public char charAt(int flags, int i) {
+        return getString(flags).charAt(i);
+    }
+
+    @Override
+    public int length(int flags) {
+        return getString(flags).length();
+    }
+
+    @Override
+    public String getString(int flags) {
+        boolean prefix = (flags & Flags.PREFIX) != 0;
+        boolean negative = (flags & Flags.NEGATIVE_SUBPATTERN) != 0;
+        if (prefix && negative) {
+            return negPrefix;
+        } else if (prefix) {
+            return posPrefix;
+        } else if (negative) {
+            return negSuffix;
+        } else {
+            return posSuffix;
+        }
+    }
+
+    @Override
+    public boolean positiveHasPlusSign() {
+        return AffixUtils.containsType(posPrefix, AffixUtils.TYPE_PLUS_SIGN)
+                || AffixUtils.containsType(posSuffix, AffixUtils.TYPE_PLUS_SIGN);
+    }
+
+    @Override
+    public boolean hasNegativeSubpattern() {
+        // See comments in the constructor for more information on why this is always true.
+        return true;
+    }
+
+    @Override
+    public boolean negativeHasMinusSign() {
+        return AffixUtils.containsType(negPrefix, AffixUtils.TYPE_MINUS_SIGN)
+                || AffixUtils.containsType(negSuffix, AffixUtils.TYPE_MINUS_SIGN);
+    }
+
+    @Override
+    public boolean hasCurrencySign() {
+        return AffixUtils.hasCurrencySymbols(posPrefix) || AffixUtils.hasCurrencySymbols(posSuffix)
+                || AffixUtils.hasCurrencySymbols(negPrefix) || AffixUtils.hasCurrencySymbols(negSuffix);
+    }
+
+    @Override
+    public boolean containsSymbolType(int type) {
+        return AffixUtils.containsType(posPrefix, type) || AffixUtils.containsType(posSuffix, type)
+                || AffixUtils.containsType(negPrefix, type) || AffixUtils.containsType(negSuffix, type);
+    }
+
+    @Override
+    public boolean hasBody() {
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return super.toString()
+                + " {"
+                + posPrefix
+                + "#"
+                + posSuffix
+                + ";"
+                + negPrefix
+                + "#"
+                + negSuffix
+                + "}";
+    }
+}
\ No newline at end of file
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/RoundingUtils.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/RoundingUtils.java
index 0c97552..b9a3cdb 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/RoundingUtils.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/RoundingUtils.java
@@ -9,177 +9,193 @@
 /** @author sffc */
 public class RoundingUtils {
 
-  public static final int SECTION_LOWER = 1;
-  public static final int SECTION_MIDPOINT = 2;
-  public static final int SECTION_UPPER = 3;
+    public static final int SECTION_LOWER = 1;
+    public static final int SECTION_MIDPOINT = 2;
+    public static final int SECTION_UPPER = 3;
 
-  /**
-   * The default rounding mode.
-   */
-  public static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_EVEN;
+    /**
+     * The default rounding mode.
+     */
+    public static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_EVEN;
 
-  /**
-   * The maximum number of fraction places, integer numerals, or significant digits.
-   * TODO: This does not feel like the best home for this value.
-   */
-  public static final int MAX_INT_FRAC_SIG = 100;
+    /**
+     * The maximum number of fraction places, integer numerals, or significant digits. TODO: This does
+     * not feel like the best home for this value.
+     */
+    public static final int MAX_INT_FRAC_SIG = 999;
 
-  /**
-   * Converts a rounding mode and metadata about the quantity being rounded to a boolean determining
-   * whether the value should be rounded toward infinity or toward zero.
-   *
-   * <p>The parameters are of type int because benchmarks on an x86-64 processor against OpenJDK
-   * showed that ints were demonstrably faster than enums in switch statements.
-   *
-   * @param isEven Whether the digit immediately before the rounding magnitude is even.
-   * @param isNegative Whether the quantity is negative.
-   * @param section Whether the part of the quantity to the right of the rounding magnitude is
-   *     exactly halfway between two digits, whether it is in the lower part (closer to zero), or
-   *     whether it is in the upper part (closer to infinity). See {@link #SECTION_LOWER}, {@link
-   *     #SECTION_MIDPOINT}, and {@link #SECTION_UPPER}.
-   * @param roundingMode The integer version of the {@link RoundingMode}, which you can get via
-   *     {@link RoundingMode#ordinal}.
-   * @param reference A reference object to be used when throwing an ArithmeticException.
-   * @return true if the number should be rounded toward zero; false if it should be rounded toward
-   *     infinity.
-   */
-  public static boolean getRoundingDirection(
-      boolean isEven, boolean isNegative, int section, int roundingMode, Object reference) {
-    switch (roundingMode) {
-      case BigDecimal.ROUND_UP:
-        // round away from zero
-        return false;
-
-      case BigDecimal.ROUND_DOWN:
-        // round toward zero
-        return true;
-
-      case BigDecimal.ROUND_CEILING:
-        // round toward positive infinity
-        return isNegative;
-
-      case BigDecimal.ROUND_FLOOR:
-        // round toward negative infinity
-        return !isNegative;
-
-      case BigDecimal.ROUND_HALF_UP:
-        switch (section) {
-          case SECTION_MIDPOINT:
+    /**
+     * Converts a rounding mode and metadata about the quantity being rounded to a boolean determining
+     * whether the value should be rounded toward infinity or toward zero.
+     *
+     * <p>
+     * The parameters are of type int because benchmarks on an x86-64 processor against OpenJDK showed
+     * that ints were demonstrably faster than enums in switch statements.
+     *
+     * @param isEven
+     *            Whether the digit immediately before the rounding magnitude is even.
+     * @param isNegative
+     *            Whether the quantity is negative.
+     * @param section
+     *            Whether the part of the quantity to the right of the rounding magnitude is exactly
+     *            halfway between two digits, whether it is in the lower part (closer to zero), or
+     *            whether it is in the upper part (closer to infinity). See {@link #SECTION_LOWER},
+     *            {@link #SECTION_MIDPOINT}, and {@link #SECTION_UPPER}.
+     * @param roundingMode
+     *            The integer version of the {@link RoundingMode}, which you can get via
+     *            {@link RoundingMode#ordinal}.
+     * @param reference
+     *            A reference object to be used when throwing an ArithmeticException.
+     * @return true if the number should be rounded toward zero; false if it should be rounded toward
+     *         infinity.
+     */
+    public static boolean getRoundingDirection(
+            boolean isEven,
+            boolean isNegative,
+            int section,
+            int roundingMode,
+            Object reference) {
+        switch (roundingMode) {
+        case BigDecimal.ROUND_UP:
+            // round away from zero
             return false;
-          case SECTION_LOWER:
+
+        case BigDecimal.ROUND_DOWN:
+            // round toward zero
             return true;
-          case SECTION_UPPER:
-            return false;
+
+        case BigDecimal.ROUND_CEILING:
+            // round toward positive infinity
+            return isNegative;
+
+        case BigDecimal.ROUND_FLOOR:
+            // round toward negative infinity
+            return !isNegative;
+
+        case BigDecimal.ROUND_HALF_UP:
+            switch (section) {
+            case SECTION_MIDPOINT:
+                return false;
+            case SECTION_LOWER:
+                return true;
+            case SECTION_UPPER:
+                return false;
+            }
+            break;
+
+        case BigDecimal.ROUND_HALF_DOWN:
+            switch (section) {
+            case SECTION_MIDPOINT:
+                return true;
+            case SECTION_LOWER:
+                return true;
+            case SECTION_UPPER:
+                return false;
+            }
+            break;
+
+        case BigDecimal.ROUND_HALF_EVEN:
+            switch (section) {
+            case SECTION_MIDPOINT:
+                return isEven;
+            case SECTION_LOWER:
+                return true;
+            case SECTION_UPPER:
+                return false;
+            }
+            break;
         }
-        break;
 
-      case BigDecimal.ROUND_HALF_DOWN:
-        switch (section) {
-          case SECTION_MIDPOINT:
-            return true;
-          case SECTION_LOWER:
-            return true;
-          case SECTION_UPPER:
+        // Rounding mode UNNECESSARY
+        throw new ArithmeticException("Rounding is required on " + reference.toString());
+    }
+
+    /**
+     * Gets whether the given rounding mode's rounding boundary is at the midpoint. The rounding boundary
+     * is the point at which a number switches from being rounded down to being rounded up. For example,
+     * with rounding mode HALF_EVEN, HALF_UP, or HALF_DOWN, the rounding boundary is at the midpoint, and
+     * this function would return true. However, for UP, DOWN, CEILING, and FLOOR, the rounding boundary
+     * is at the "edge", and this function would return false.
+     *
+     * @param roundingMode
+     *            The integer version of the {@link RoundingMode}.
+     * @return true if rounding mode is HALF_EVEN, HALF_UP, or HALF_DOWN; false otherwise.
+     */
+    public static boolean roundsAtMidpoint(int roundingMode) {
+        switch (roundingMode) {
+        case BigDecimal.ROUND_UP:
+        case BigDecimal.ROUND_DOWN:
+        case BigDecimal.ROUND_CEILING:
+        case BigDecimal.ROUND_FLOOR:
             return false;
-        }
-        break;
 
-      case BigDecimal.ROUND_HALF_EVEN:
-        switch (section) {
-          case SECTION_MIDPOINT:
-            return isEven;
-          case SECTION_LOWER:
+        default:
             return true;
-          case SECTION_UPPER:
-            return false;
         }
-        break;
     }
 
-    // Rounding mode UNNECESSARY
-    throw new ArithmeticException("Rounding is required on " + reference.toString());
-  }
+    private static final MathContext[] MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED = new MathContext[RoundingMode
+            .values().length];
 
-  /**
-   * Gets whether the given rounding mode's rounding boundary is at the midpoint. The rounding
-   * boundary is the point at which a number switches from being rounded down to being rounded up.
-   * For example, with rounding mode HALF_EVEN, HALF_UP, or HALF_DOWN, the rounding boundary is at
-   * the midpoint, and this function would return true. However, for UP, DOWN, CEILING, and FLOOR,
-   * the rounding boundary is at the "edge", and this function would return false.
-   *
-   * @param roundingMode The integer version of the {@link RoundingMode}.
-   * @return true if rounding mode is HALF_EVEN, HALF_UP, or HALF_DOWN; false otherwise.
-   */
-  public static boolean roundsAtMidpoint(int roundingMode) {
-    switch (roundingMode) {
-      case BigDecimal.ROUND_UP:
-      case BigDecimal.ROUND_DOWN:
-      case BigDecimal.ROUND_CEILING:
-      case BigDecimal.ROUND_FLOOR:
-        return false;
+    private static final MathContext[] MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS = new MathContext[RoundingMode
+            .values().length];
 
-      default:
-        return true;
+    static {
+        for (int i = 0; i < MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS.length; i++) {
+            MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[i] = new MathContext(0, RoundingMode.valueOf(i));
+            MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS[i] = new MathContext(34);
+        }
     }
-  }
 
-  private static final MathContext[] MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED =
-      new MathContext[RoundingMode.values().length];
-
-  private static final MathContext[] MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS =
-      new MathContext[RoundingMode.values().length];
-
-  static {
-    for (int i = 0; i < MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS.length; i++) {
-      MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[i] = new MathContext(0, RoundingMode.valueOf(i));
-      MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS[i] = new MathContext(34);
+    /**
+     * Gets the user-specified math context out of the property bag. If there is none, falls back to a
+     * math context with unlimited precision and the user-specified rounding mode, which defaults to
+     * HALF_EVEN (the IEEE 754R default).
+     *
+     * @param properties
+     *            The property bag.
+     * @return A {@link MathContext}. Never null.
+     */
+    public static MathContext getMathContextOrUnlimited(DecimalFormatProperties properties) {
+        MathContext mathContext = properties.getMathContext();
+        if (mathContext == null) {
+            RoundingMode roundingMode = properties.getRoundingMode();
+            if (roundingMode == null)
+                roundingMode = RoundingMode.HALF_EVEN;
+            mathContext = MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[roundingMode.ordinal()];
+        }
+        return mathContext;
     }
-  }
 
-  /**
-   * Gets the user-specified math context out of the property bag. If there is none, falls back to a
-   * math context with unlimited precision and the user-specified rounding mode, which defaults to
-   * HALF_EVEN (the IEEE 754R default).
-   *
-   * @param properties The property bag.
-   * @return A {@link MathContext}. Never null.
-   */
-  public static MathContext getMathContextOrUnlimited(DecimalFormatProperties properties) {
-    MathContext mathContext = properties.getMathContext();
-    if (mathContext == null) {
-      RoundingMode roundingMode = properties.getRoundingMode();
-      if (roundingMode == null) roundingMode = RoundingMode.HALF_EVEN;
-      mathContext = MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[roundingMode.ordinal()];
+    /**
+     * Gets the user-specified math context out of the property bag. If there is none, falls back to a
+     * math context with 34 digits of precision (the 128-bit IEEE 754R default) and the user-specified
+     * rounding mode, which defaults to HALF_EVEN (the IEEE 754R default).
+     *
+     * @param properties
+     *            The property bag.
+     * @return A {@link MathContext}. Never null.
+     */
+    public static MathContext getMathContextOr34Digits(DecimalFormatProperties properties) {
+        MathContext mathContext = properties.getMathContext();
+        if (mathContext == null) {
+            RoundingMode roundingMode = properties.getRoundingMode();
+            if (roundingMode == null)
+                roundingMode = RoundingMode.HALF_EVEN;
+            mathContext = MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS[roundingMode.ordinal()];
+        }
+        return mathContext;
     }
-    return mathContext;
-  }
 
-  /**
-   * Gets the user-specified math context out of the property bag. If there is none, falls back to a
-   * math context with 34 digits of precision (the 128-bit IEEE 754R default) and the user-specified
-   * rounding mode, which defaults to HALF_EVEN (the IEEE 754R default).
-   *
-   * @param properties The property bag.
-   * @return A {@link MathContext}. Never null.
-   */
-  public static MathContext getMathContextOr34Digits(DecimalFormatProperties properties) {
-    MathContext mathContext = properties.getMathContext();
-    if (mathContext == null) {
-      RoundingMode roundingMode = properties.getRoundingMode();
-      if (roundingMode == null) roundingMode = RoundingMode.HALF_EVEN;
-      mathContext = MATH_CONTEXT_BY_ROUNDING_MODE_34_DIGITS[roundingMode.ordinal()];
+    /**
+     * Gets a MathContext with unlimited precision and the specified RoundingMode. Equivalent to "new
+     * MathContext(0, roundingMode)", but pulls from a singleton to prevent object thrashing.
+     *
+     * @param roundingMode
+     *            The {@link RoundingMode} to use.
+     * @return The corresponding {@link MathContext}.
+     */
+    public static MathContext mathContextUnlimited(RoundingMode roundingMode) {
+        return MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[roundingMode.ordinal()];
     }
-    return mathContext;
-  }
-
-  /**
-   * Gets a MathContext with unlimited precision and the specified RoundingMode. Equivalent to "new
-   * MathContext(0, roundingMode)", but pulls from a singleton to prevent object thrashing.
-   *
-   * @param roundingMode The {@link RoundingMode} to use.
-   * @return The corresponding {@link MathContext}.
-   */
-  public static MathContext mathContextUnlimited(RoundingMode roundingMode) {
-    return MATH_CONTEXT_BY_ROUNDING_MODE_UNLIMITED[roundingMode.ordinal()];
-  }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/SimpleModifier.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/SimpleModifier.java
index 94b64be..5ac1bcf 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/SimpleModifier.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/SimpleModifier.java
@@ -6,8 +6,8 @@
 import com.ibm.icu.text.NumberFormat.Field;
 
 /**
- * The second primary implementation of {@link Modifier}, this one consuming a {@link com.ibm.icu.text.SimpleFormatter}
- * pattern.
+ * The second primary implementation of {@link Modifier}, this one consuming a
+ * {@link com.ibm.icu.text.SimpleFormatter} pattern.
  */
 public class SimpleModifier implements Modifier {
     private final String compiledPattern;
@@ -27,18 +27,28 @@
         this.field = field;
         this.strong = strong;
 
-        assert SimpleFormatterImpl.getArgumentLimit(compiledPattern) == 1;
-        if (compiledPattern.charAt(1) != '\u0000') {
+        int argLimit = SimpleFormatterImpl.getArgumentLimit(compiledPattern);
+        if (argLimit == 0) {
+            // No arguments in compiled pattern
             prefixLength = compiledPattern.charAt(1) - ARG_NUM_LIMIT;
-            suffixOffset = 3 + prefixLength;
-        } else {
-            prefixLength = 0;
-            suffixOffset = 2;
-        }
-        if (3 + prefixLength < compiledPattern.length()) {
-            suffixLength = compiledPattern.charAt(suffixOffset) - ARG_NUM_LIMIT;
-        } else {
+            assert 2 + prefixLength == compiledPattern.length();
+            // Set suffixOffset = -1 to indicate no arguments in compiled pattern.
+            suffixOffset = -1;
             suffixLength = 0;
+        } else {
+            assert argLimit == 1;
+            if (compiledPattern.charAt(1) != '\u0000') {
+                prefixLength = compiledPattern.charAt(1) - ARG_NUM_LIMIT;
+                suffixOffset = 3 + prefixLength;
+            } else {
+                prefixLength = 0;
+                suffixOffset = 2;
+            }
+            if (3 + prefixLength < compiledPattern.length()) {
+                suffixLength = compiledPattern.charAt(suffixOffset) - ARG_NUM_LIMIT;
+            } else {
+                suffixLength = 0;
+            }
         }
     }
 
@@ -59,7 +69,8 @@
             count += Character.codePointCount(compiledPattern, 2, 2 + prefixLength);
         }
         if (suffixLength > 0) {
-            count += Character.codePointCount(compiledPattern, 1 + suffixOffset, 1 + suffixOffset + suffixLength);
+            count += Character
+                    .codePointCount(compiledPattern, 1 + suffixOffset, 1 + suffixOffset + suffixLength);
         }
         return count;
     }
@@ -71,12 +82,13 @@
 
     /**
      * TODO: This belongs in SimpleFormatterImpl. The only reason I haven't moved it there yet is because
-     * DoubleSidedStringBuilder is an internal class and SimpleFormatterImpl feels like it should not depend on it.
+     * DoubleSidedStringBuilder is an internal class and SimpleFormatterImpl feels like it should not
+     * depend on it.
      *
      * <p>
-     * Formats a value that is already stored inside the StringBuilder <code>result</code> between the indices
-     * <code>startIndex</code> and <code>endIndex</code> by inserting characters before the start index and after the
-     * end index.
+     * Formats a value that is already stored inside the StringBuilder <code>result</code> between the
+     * indices <code>startIndex</code> and <code>endIndex</code> by inserting characters before the start
+     * index and after the end index.
      *
      * <p>
      * This is well-defined only for patterns with exactly one argument.
@@ -89,14 +101,26 @@
      *            The right index of the value within the string builder.
      * @return The number of characters (UTF-16 code points) that were added to the StringBuilder.
      */
-    public int formatAsPrefixSuffix(NumberStringBuilder result, int startIndex, int endIndex, Field field) {
-        if (prefixLength > 0) {
-            result.insert(startIndex, compiledPattern, 2, 2 + prefixLength, field);
+    public int formatAsPrefixSuffix(
+            NumberStringBuilder result,
+            int startIndex,
+            int endIndex,
+            Field field) {
+        if (suffixOffset == -1) {
+            // There is no argument for the inner number; overwrite the entire segment with our string.
+            return result.splice(startIndex, endIndex, compiledPattern, 2, 2 + prefixLength, field);
+        } else {
+            if (prefixLength > 0) {
+                result.insert(startIndex, compiledPattern, 2, 2 + prefixLength, field);
+            }
+            if (suffixLength > 0) {
+                result.insert(endIndex + prefixLength,
+                        compiledPattern,
+                        1 + suffixOffset,
+                        1 + suffixOffset + suffixLength,
+                        field);
+            }
+            return prefixLength + suffixLength;
         }
-        if (suffixLength > 0) {
-            result.insert(endIndex + prefixLength, compiledPattern, 1 + suffixOffset, 1 + suffixOffset + suffixLength,
-                    field);
-        }
-        return prefixLength + suffixLength;
     }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/AffixMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/AffixMatcher.java
new file mode 100644
index 0000000..8744636
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/AffixMatcher.java
@@ -0,0 +1,274 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+import com.ibm.icu.impl.StandardPlural;
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.impl.Utility;
+import com.ibm.icu.impl.number.AffixPatternProvider;
+import com.ibm.icu.impl.number.AffixUtils;
+import com.ibm.icu.impl.number.PatternStringUtils;
+import com.ibm.icu.number.NumberFormatter.SignDisplay;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ *
+ */
+public class AffixMatcher implements NumberParseMatcher {
+    private final AffixPatternMatcher prefix;
+    private final AffixPatternMatcher suffix;
+    private final int flags;
+
+    /**
+     * Comparator for two AffixMatcher instances which prioritizes longer prefixes followed by longer
+     * suffixes, ensuring that the longest prefix/suffix pair is always chosen.
+     */
+    public static final Comparator<AffixMatcher> COMPARATOR = new Comparator<AffixMatcher>() {
+        @Override
+        public int compare(AffixMatcher o1, AffixMatcher o2) {
+            if (length(o1.prefix) != length(o2.prefix)) {
+                return length(o1.prefix) > length(o2.prefix) ? -1 : 1;
+            } else if (length(o1.suffix) != length(o2.suffix)) {
+                return length(o1.suffix) > length(o2.suffix) ? -1 : 1;
+            } else if (!o1.equals(o2)) {
+                // If the prefix and suffix are the same length, arbitrarily break ties.
+                // We can't return zero unless the elements are equal.
+                return o1.hashCode() > o2.hashCode() ? -1 : 1;
+            } else {
+                return 0;
+            }
+        }
+    };
+
+    private static boolean isInteresting(
+            AffixPatternProvider patternInfo,
+            IgnorablesMatcher ignorables,
+            int parseFlags) {
+        String posPrefixString = patternInfo.getString(AffixPatternProvider.FLAG_POS_PREFIX);
+        String posSuffixString = patternInfo.getString(AffixPatternProvider.FLAG_POS_SUFFIX);
+        String negPrefixString = null;
+        String negSuffixString = null;
+        if (patternInfo.hasNegativeSubpattern()) {
+            negPrefixString = patternInfo.getString(AffixPatternProvider.FLAG_NEG_PREFIX);
+            negSuffixString = patternInfo.getString(AffixPatternProvider.FLAG_NEG_SUFFIX);
+        }
+
+        if (0 == (parseFlags & ParsingUtils.PARSE_FLAG_USE_FULL_AFFIXES)
+                && AffixUtils.containsOnlySymbolsAndIgnorables(posPrefixString, ignorables.getSet())
+                && AffixUtils.containsOnlySymbolsAndIgnorables(posSuffixString, ignorables.getSet())
+                && AffixUtils.containsOnlySymbolsAndIgnorables(negPrefixString, ignorables.getSet())
+                && AffixUtils.containsOnlySymbolsAndIgnorables(negSuffixString, ignorables.getSet())
+                // HACK: Plus and minus sign are a special case: we accept them trailing only if they are
+                // trailing in the pattern string.
+                && !AffixUtils.containsType(posSuffixString, AffixUtils.TYPE_PLUS_SIGN)
+                && !AffixUtils.containsType(posSuffixString, AffixUtils.TYPE_MINUS_SIGN)
+                && !AffixUtils.containsType(negSuffixString, AffixUtils.TYPE_PLUS_SIGN)
+                && !AffixUtils.containsType(negSuffixString, AffixUtils.TYPE_MINUS_SIGN)) {
+            // The affixes contain only symbols and ignorables.
+            // No need to generate affix matchers.
+            return false;
+        }
+        return true;
+    }
+
+    public static void newGenerate(
+            AffixPatternProvider patternInfo,
+            NumberParserImpl output,
+            MatcherFactory factory,
+            IgnorablesMatcher ignorables,
+            int parseFlags) {
+        if (!isInteresting(patternInfo, ignorables, parseFlags)) {
+            return;
+        }
+
+        // The affixes have interesting characters, or we are in strict mode.
+        // Use initial capacity of 6, the highest possible number of AffixMatchers.
+        StringBuilder sb = new StringBuilder();
+        ArrayList<AffixMatcher> matchers = new ArrayList<AffixMatcher>(6);
+        boolean includeUnpaired = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES);
+        SignDisplay signDisplay = (0 != (parseFlags & ParsingUtils.PARSE_FLAG_PLUS_SIGN_ALLOWED))
+                ? SignDisplay.ALWAYS
+                : SignDisplay.NEVER;
+
+        AffixPatternMatcher posPrefix = null;
+        AffixPatternMatcher posSuffix = null;
+
+        // Pre-process the affix strings to resolve LDML rules like sign display.
+        for (int signum = 1; signum >= -1; signum--) {
+            // Generate Prefix
+            PatternStringUtils.patternInfoToStringBuilder(patternInfo,
+                    true,
+                    signum,
+                    signDisplay,
+                    StandardPlural.OTHER,
+                    false,
+                    sb);
+            AffixPatternMatcher prefix = AffixPatternMatcher
+                    .fromAffixPattern(sb.toString(), factory, parseFlags);
+
+            // Generate Suffix
+            PatternStringUtils.patternInfoToStringBuilder(patternInfo,
+                    false,
+                    signum,
+                    signDisplay,
+                    StandardPlural.OTHER,
+                    false,
+                    sb);
+            AffixPatternMatcher suffix = AffixPatternMatcher
+                    .fromAffixPattern(sb.toString(), factory, parseFlags);
+
+            if (signum == 1) {
+                posPrefix = prefix;
+                posSuffix = suffix;
+            } else if (Utility.equals(prefix, posPrefix) && Utility.equals(suffix, posSuffix)) {
+                // Skip adding these matchers (we already have equivalents)
+                continue;
+            }
+
+            // Flags for setting in the ParsedNumber
+            int flags = (signum == -1) ? ParsedNumber.FLAG_NEGATIVE : 0;
+
+            // Note: it is indeed possible for posPrefix and posSuffix to both be null.
+            // We still need to add that matcher for strict mode to work.
+            matchers.add(getInstance(prefix, suffix, flags));
+            if (includeUnpaired && prefix != null && suffix != null) {
+                // The following if statements are designed to prevent adding two identical matchers.
+                if (signum == 1 || !Utility.equals(prefix, posPrefix)) {
+                    matchers.add(getInstance(prefix, null, flags));
+                }
+                if (signum == 1 || !Utility.equals(suffix, posSuffix)) {
+                    matchers.add(getInstance(null, suffix, flags));
+                }
+            }
+        }
+
+        // Put the AffixMatchers in order, and then add them to the output.
+        Collections.sort(matchers, COMPARATOR);
+        output.addMatchers(matchers);
+    }
+
+    private static final AffixMatcher getInstance(
+            AffixPatternMatcher prefix,
+            AffixPatternMatcher suffix,
+            int flags) {
+        // TODO: Special handling for common cases like both strings empty.
+        return new AffixMatcher(prefix, suffix, flags);
+    }
+
+    private AffixMatcher(AffixPatternMatcher prefix, AffixPatternMatcher suffix, int flags) {
+        this.prefix = prefix;
+        this.suffix = suffix;
+        this.flags = flags;
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        if (!result.seenNumber()) {
+            // Prefix
+            // Do not match if:
+            // 1. We have already seen a prefix (result.prefix != null)
+            // 2. The prefix in this AffixMatcher is empty (prefix == null)
+            if (result.prefix != null || prefix == null) {
+                return false;
+            }
+
+            // Attempt to match the prefix.
+            int initialOffset = segment.getOffset();
+            boolean maybeMore = prefix.match(segment, result);
+            if (initialOffset != segment.getOffset()) {
+                result.prefix = prefix.getPattern();
+            }
+            return maybeMore;
+
+        } else {
+            // Suffix
+            // Do not match if:
+            // 1. We have already seen a suffix (result.suffix != null)
+            // 2. The suffix in this AffixMatcher is empty (suffix == null)
+            // 3. The matched prefix does not equal this AffixMatcher's prefix
+            if (result.suffix != null || suffix == null || !matched(prefix, result.prefix)) {
+                return false;
+            }
+
+            // Attempt to match the suffix.
+            int initialOffset = segment.getOffset();
+            boolean maybeMore = suffix.match(segment, result);
+            if (initialOffset != segment.getOffset()) {
+                result.suffix = suffix.getPattern();
+            }
+            return maybeMore;
+        }
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        if (prefix != null) {
+            leadCodePoints.addAll(prefix.getLeadCodePoints());
+        }
+        if (suffix != null) {
+            leadCodePoints.addAll(suffix.getLeadCodePoints());
+        }
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // Check to see if our affix is the one that was matched. If so, set the flags in the result.
+        if (matched(prefix, result.prefix) && matched(suffix, result.suffix)) {
+            // Fill in the result prefix and suffix with non-null values (empty string).
+            // Used by strict mode to determine whether an entire affix pair was matched.
+            if (result.prefix == null) {
+                result.prefix = "";
+            }
+            if (result.suffix == null) {
+                result.suffix = "";
+            }
+            result.flags |= flags;
+        }
+    }
+
+    /**
+     * Helper method to return whether the given AffixPatternMatcher equals the given pattern string.
+     * Either both arguments must be null or the pattern string inside the AffixPatternMatcher must equal
+     * the given pattern string.
+     */
+    static boolean matched(AffixPatternMatcher affix, String patternString) {
+        return (affix == null && patternString == null)
+                || (affix != null && affix.getPattern().equals(patternString));
+    }
+
+    /**
+     * Helper method to return the length of the given AffixPatternMatcher. Returns 0 for null.
+     */
+    private static int length(AffixPatternMatcher matcher) {
+        return matcher == null ? 0 : matcher.getPattern().length();
+    }
+
+    @Override
+    public boolean equals(Object _other) {
+        if (!(_other instanceof AffixMatcher)) {
+            return false;
+        }
+        AffixMatcher other = (AffixMatcher) _other;
+        return Utility.equals(prefix, other.prefix)
+                && Utility.equals(suffix, other.suffix)
+                && flags == other.flags;
+    }
+
+    @Override
+    public int hashCode() {
+        return Utility.hashCode(prefix) ^ Utility.hashCode(suffix) ^ flags;
+    }
+
+    @Override
+    public String toString() {
+        boolean isNegative = 0 != (flags & ParsedNumber.FLAG_NEGATIVE);
+        return "<AffixMatcher" + (isNegative ? ":negative " : " ") + prefix + "#" + suffix + ">";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/AffixPatternMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/AffixPatternMatcher.java
new file mode 100644
index 0000000..43d3888
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/AffixPatternMatcher.java
@@ -0,0 +1,130 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.number.AffixUtils;
+
+/**
+ * A specialized version of {@link SeriesMatcher} that matches EITHER a prefix OR a suffix.
+ * {@link AffixMatcher} combines two of these in order to match both the prefix and suffix.
+ *
+ * @author sffc
+ */
+public class AffixPatternMatcher extends SeriesMatcher implements AffixUtils.TokenConsumer {
+
+    private final String affixPattern;
+
+    // Used during construction only:
+    private MatcherFactory factory;
+    private IgnorablesMatcher ignorables;
+    private int lastTypeOrCp;
+
+    private AffixPatternMatcher(String affixPattern) {
+        this.affixPattern = affixPattern;
+    }
+
+    /**
+     * Creates an AffixPatternMatcher (based on SeriesMatcher) from the given affix pattern. Returns null
+     * if the affix pattern is empty.
+     */
+    public static AffixPatternMatcher fromAffixPattern(
+            String affixPattern,
+            MatcherFactory factory,
+            int parseFlags) {
+        if (affixPattern.isEmpty()) {
+            return null;
+        }
+
+        AffixPatternMatcher series = new AffixPatternMatcher(affixPattern);
+        series.factory = factory;
+        series.ignorables = (0 != (parseFlags & ParsingUtils.PARSE_FLAG_EXACT_AFFIX)) ? null
+                : factory.ignorables();
+        series.lastTypeOrCp = 0;
+        AffixUtils.iterateWithConsumer(affixPattern, series);
+
+        // De-reference the memory
+        series.factory = null;
+        series.ignorables = null;
+        series.lastTypeOrCp = 0;
+
+        series.freeze();
+        return series;
+    }
+
+    /**
+     * This method is NOT intended to be called directly. It is here for the AffixUtils.TokenConsumer
+     * interface only.
+     */
+    @Override
+    public void consumeToken(int typeOrCp) {
+        // This is called by AffixUtils.iterateWithConsumer() for each token.
+
+        // Add an ignorables matcher between tokens except between two literals, and don't put two
+        // ignorables matchers in a row.
+        if (ignorables != null
+                && length() > 0
+                && (lastTypeOrCp < 0 || !ignorables.getSet().contains(lastTypeOrCp))) {
+            addMatcher(ignorables);
+        }
+
+        if (typeOrCp < 0) {
+            // Case 1: the token is a symbol.
+            switch (typeOrCp) {
+            case AffixUtils.TYPE_MINUS_SIGN:
+                addMatcher(factory.minusSign(true));
+                break;
+            case AffixUtils.TYPE_PLUS_SIGN:
+                addMatcher(factory.plusSign(true));
+                break;
+            case AffixUtils.TYPE_PERCENT:
+                addMatcher(factory.percent());
+                break;
+            case AffixUtils.TYPE_PERMILLE:
+                addMatcher(factory.permille());
+                break;
+            case AffixUtils.TYPE_CURRENCY_SINGLE:
+            case AffixUtils.TYPE_CURRENCY_DOUBLE:
+            case AffixUtils.TYPE_CURRENCY_TRIPLE:
+            case AffixUtils.TYPE_CURRENCY_QUAD:
+            case AffixUtils.TYPE_CURRENCY_QUINT:
+                // All currency symbols use the same matcher
+                addMatcher(factory.currency());
+                break;
+            default:
+                throw new AssertionError();
+            }
+
+        } else if (ignorables != null && ignorables.getSet().contains(typeOrCp)) {
+            // Case 2: the token is an ignorable literal.
+            // No action necessary: the ignorables matcher has already been added.
+
+        } else {
+            // Case 3: the token is a non-ignorable literal.
+            addMatcher(CodePointMatcher.getInstance(typeOrCp));
+        }
+        lastTypeOrCp = typeOrCp;
+    }
+
+    public String getPattern() {
+        return affixPattern;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (this == other)
+            return true;
+        if (!(other instanceof AffixPatternMatcher))
+            return false;
+        return affixPattern.equals(((AffixPatternMatcher) other).affixPattern);
+    }
+
+    @Override
+    public int hashCode() {
+        return affixPattern.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return affixPattern;
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/AnyMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/AnyMatcher.java
new file mode 100644
index 0000000..005f8cc
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/AnyMatcher.java
@@ -0,0 +1,97 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * Composes a number of matchers, and succeeds if any of the matchers succeed. Always greedily chooses
+ * the first matcher in the list to succeed.
+ *
+ * @author sffc
+ * @see SeriesMatcher
+ */
+public class AnyMatcher implements NumberParseMatcher {
+
+    protected List<NumberParseMatcher> matchers = null;
+    protected boolean frozen = false;
+
+    public void addMatcher(NumberParseMatcher matcher) {
+        assert !frozen;
+        if (matchers == null) {
+            matchers = new ArrayList<NumberParseMatcher>();
+        }
+        matchers.add(matcher);
+    }
+
+    public void freeze() {
+        frozen = true;
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        assert frozen;
+        if (matchers == null) {
+            return false;
+        }
+
+        int initialOffset = segment.getOffset();
+        boolean maybeMore = false;
+        for (int i = 0; i < matchers.size(); i++) {
+            NumberParseMatcher matcher = matchers.get(i);
+            maybeMore = maybeMore || matcher.match(segment, result);
+            if (segment.getOffset() != initialOffset) {
+                // Match succeeded.
+                // NOTE: Except for a couple edge cases, if a matcher accepted string A, then it will
+                // accept any string starting with A. Therefore, there is no possibility that matchers
+                // later in the list may be evaluated on longer strings, and we can exit the loop here.
+                break;
+            }
+        }
+
+        // None of the matchers succeeded.
+        return maybeMore;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        assert frozen;
+        if (matchers == null) {
+            return UnicodeSet.EMPTY;
+        }
+
+        if (matchers.size() == 1) {
+            return matchers.get(0).getLeadCodePoints();
+        }
+
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        for (int i = 0; i < matchers.size(); i++) {
+            NumberParseMatcher matcher = matchers.get(i);
+            leadCodePoints.addAll(matcher.getLeadCodePoints());
+        }
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        assert frozen;
+        if (matchers == null) {
+            return;
+        }
+
+        for (int i = 0; i < matchers.size(); i++) {
+            NumberParseMatcher matcher = matchers.get(i);
+            matcher.postProcess(result);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<AnyMatcher " + matchers + ">";
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/CodePointMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/CodePointMatcher.java
new file mode 100644
index 0000000..afa6f68
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/CodePointMatcher.java
@@ -0,0 +1,50 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * Matches a single code point, performing no other logic.
+ *
+ * @author sffc
+ */
+public class CodePointMatcher implements NumberParseMatcher {
+
+    private final int cp;
+
+    public static CodePointMatcher getInstance(int cp) {
+        // TODO: Cache certain popular instances?
+        return new CodePointMatcher(cp);
+    }
+
+    private CodePointMatcher(int cp) {
+        this.cp = cp;
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        if (segment.startsWith(cp)) {
+            segment.adjustOffsetByCodePoint();
+            result.setCharsConsumed(segment);
+        }
+        return false;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        return new UnicodeSet().add(cp).freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<CodePointMatcher U+" + Integer.toHexString(cp) + ">";
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/CurrencyMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/CurrencyMatcher.java
new file mode 100644
index 0000000..f3c01e4
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/CurrencyMatcher.java
@@ -0,0 +1,71 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.UnicodeSet;
+import com.ibm.icu.util.Currency;
+import com.ibm.icu.util.ULocale;
+
+/**
+ * A matcher for a single currency instance (not the full trie).
+ */
+public class CurrencyMatcher implements NumberParseMatcher {
+
+    private final String isoCode;
+    private final String currency1;
+    private final String currency2;
+
+    public static CurrencyMatcher getInstance(Currency currency, ULocale loc) {
+        return new CurrencyMatcher(currency.getSubtype(),
+                currency.getSymbol(loc),
+                currency.getCurrencyCode());
+    }
+
+    private CurrencyMatcher(String isoCode, String currency1, String currency2) {
+        this.isoCode = isoCode;
+        this.currency1 = currency1;
+        this.currency2 = currency2;
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        if (result.currencyCode != null) {
+            return false;
+        }
+
+        int overlap1 = segment.getCommonPrefixLength(currency1);
+        if (overlap1 == currency1.length()) {
+            result.currencyCode = isoCode;
+            segment.adjustOffset(overlap1);
+            result.setCharsConsumed(segment);
+        }
+
+        int overlap2 = segment.getCommonPrefixLength(currency2);
+        if (overlap2 == currency2.length()) {
+            result.currencyCode = isoCode;
+            segment.adjustOffset(overlap2);
+            result.setCharsConsumed(segment);
+        }
+
+        return overlap1 == segment.length() || overlap2 == segment.length();
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        ParsingUtils.putLeadCodePoint(currency1, leadCodePoints);
+        ParsingUtils.putLeadCodePoint(currency2, leadCodePoints);
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<CurrencyMatcher " + isoCode + ">";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/CurrencyTrieMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/CurrencyTrieMatcher.java
new file mode 100644
index 0000000..3763059
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/CurrencyTrieMatcher.java
@@ -0,0 +1,71 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import java.util.Iterator;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.impl.TextTrieMap;
+import com.ibm.icu.text.UnicodeSet;
+import com.ibm.icu.util.Currency;
+import com.ibm.icu.util.Currency.CurrencyStringInfo;
+import com.ibm.icu.util.ULocale;
+
+/**
+ * @author sffc
+ *
+ */
+public class CurrencyTrieMatcher implements NumberParseMatcher {
+
+    private final TextTrieMap<CurrencyStringInfo> longNameTrie;
+    private final TextTrieMap<CurrencyStringInfo> symbolTrie;
+
+    public static CurrencyTrieMatcher getInstance(ULocale locale) {
+        // TODO: Pre-compute some of the more popular locales?
+        return new CurrencyTrieMatcher(locale);
+    }
+
+    private CurrencyTrieMatcher(ULocale locale) {
+        // TODO: Currency trie does not currently have an option for case folding.  It defaults to use
+        // case folding on long-names but not symbols.
+        longNameTrie = Currency.getParsingTrie(locale, Currency.LONG_NAME);
+        symbolTrie = Currency.getParsingTrie(locale, Currency.SYMBOL_NAME);
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        if (result.currencyCode != null) {
+            return false;
+        }
+
+        TextTrieMap.Output trieOutput = new TextTrieMap.Output();
+        Iterator<CurrencyStringInfo> values = longNameTrie.get(segment, 0, trieOutput);
+        if (values == null) {
+            values = symbolTrie.get(segment, 0, trieOutput);
+        }
+        if (values != null) {
+            result.currencyCode = values.next().getISOCode();
+            segment.adjustOffset(trieOutput.matchLength);
+            result.setCharsConsumed(segment);
+        }
+        return trieOutput.partialMatch;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        longNameTrie.putLeadCodePoints(leadCodePoints);
+        symbolTrie.putLeadCodePoints(leadCodePoints);
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<CurrencyTrieMatcher>";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/DecimalMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/DecimalMatcher.java
new file mode 100644
index 0000000..779c085
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/DecimalMatcher.java
@@ -0,0 +1,360 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.impl.number.DecimalQuantity_DualStorageBCD;
+import com.ibm.icu.impl.number.Grouper;
+import com.ibm.icu.impl.number.parse.UnicodeSetStaticCache.Key;
+import com.ibm.icu.lang.UCharacter;
+import com.ibm.icu.text.DecimalFormatSymbols;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ *
+ */
+public class DecimalMatcher implements NumberParseMatcher {
+
+    /** If true, only accept strings whose grouping sizes match the locale */
+    private final boolean requireGroupingMatch;
+
+    /** If true, do not accept grouping separators at all */
+    private final boolean groupingDisabled;
+
+    /** If true, do not accept fraction grouping separators */
+    private final boolean fractionGroupingDisabled;
+
+    /** If true, do not accept numbers in the fraction */
+    private final boolean integerOnly;
+
+    /** If true, save the result as an exponent instead of a quantity in the ParsedNumber */
+    private final boolean isScientific;
+
+    private final int grouping1;
+    private final int grouping2;
+
+    private final String groupingSeparator;
+    private final String decimalSeparator;
+
+    // Assumption: these sets all consist of single code points. If this assumption needs to be broken,
+    // fix getLeadCodePoints() as well as matching logic. Be careful of the performance impact.
+    private final UnicodeSet groupingUniSet;
+    private final UnicodeSet decimalUniSet;
+    private final UnicodeSet separatorSet;
+    private final UnicodeSet leadSet;
+    private final String[] digitStrings;
+
+    public static DecimalMatcher getInstance(
+            DecimalFormatSymbols symbols,
+            Grouper grouper,
+            int parseFlags) {
+        // TODO: Cache popular instances?
+        return new DecimalMatcher(symbols, grouper, parseFlags);
+    }
+
+    private DecimalMatcher(DecimalFormatSymbols symbols, Grouper grouper, int parseFlags) {
+        if (0 != (parseFlags & ParsingUtils.PARSE_FLAG_MONETARY_SEPARATORS)) {
+            groupingSeparator = symbols.getMonetaryGroupingSeparatorString();
+            decimalSeparator = symbols.getMonetaryDecimalSeparatorString();
+        } else {
+            groupingSeparator = symbols.getGroupingSeparatorString();
+            decimalSeparator = symbols.getDecimalSeparatorString();
+        }
+        boolean strictSeparators = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_STRICT_SEPARATORS);
+        Key groupingKey = strictSeparators ? Key.STRICT_ALL_SEPARATORS : Key.ALL_SEPARATORS;
+
+        // Attempt to find separators in the static cache
+
+        groupingUniSet = UnicodeSetStaticCache.get(groupingKey);
+        Key decimalKey = UnicodeSetStaticCache.chooseFrom(decimalSeparator,
+                strictSeparators ? Key.STRICT_COMMA : Key.COMMA,
+                strictSeparators ? Key.STRICT_PERIOD : Key.PERIOD);
+        if (decimalKey != null) {
+            decimalUniSet = UnicodeSetStaticCache.get(decimalKey);
+        } else {
+            decimalUniSet = new UnicodeSet().add(decimalSeparator.codePointAt(0)).freeze();
+        }
+
+        if (groupingKey != null && decimalKey != null) {
+            // Everything is available in the static cache
+            separatorSet = groupingUniSet;
+            leadSet = UnicodeSetStaticCache.get(strictSeparators ? Key.DIGITS_OR_ALL_SEPARATORS
+                    : Key.DIGITS_OR_STRICT_ALL_SEPARATORS);
+        } else {
+            separatorSet = new UnicodeSet().addAll(groupingUniSet).addAll(decimalUniSet).freeze();
+            leadSet = null;
+        }
+
+        int cpZero = symbols.getCodePointZero();
+        if (cpZero == -1 || !UCharacter.isDigit(cpZero) || UCharacter.digit(cpZero) != 0) {
+            digitStrings = symbols.getDigitStringsLocal();
+        } else {
+            digitStrings = null;
+        }
+
+        requireGroupingMatch = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_STRICT_GROUPING_SIZE);
+        groupingDisabled = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_GROUPING_DISABLED);
+        fractionGroupingDisabled = 0 != (parseFlags
+                & ParsingUtils.PARSE_FLAG_FRACTION_GROUPING_DISABLED);
+        integerOnly = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_INTEGER_ONLY);
+        isScientific = 0 != (parseFlags & ParsingUtils.PARSE_FLAG_DECIMAL_SCIENTIFIC);
+        grouping1 = grouper.getPrimary();
+        grouping2 = grouper.getSecondary();
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        return match(segment, result, false);
+    }
+
+    public boolean match(StringSegment segment, ParsedNumber result, boolean negativeExponent) {
+        if (result.seenNumber() && !isScientific) {
+            // A number has already been consumed.
+            return false;
+        }
+
+        ParsedNumber backupResult = null;
+        if (requireGroupingMatch) {
+            backupResult = new ParsedNumber();
+            backupResult.copyFrom(result);
+        }
+
+        // strict parsing
+        boolean strictFail = false; // did we exit with a strict parse failure?
+        String actualGroupingString = groupingSeparator;
+        String actualDecimalString = decimalSeparator;
+        int groupedDigitCount = 0; // tracking count of digits delimited by grouping separator
+        int backupOffset = -1; // used for preserving the last confirmed position
+        boolean afterFirstGrouping = false;
+        boolean seenGrouping = false;
+        boolean seenDecimal = false;
+        int digitsAfterDecimal = 0;
+        int initialOffset = segment.getOffset();
+        int exponent = 0;
+        boolean hasPartialPrefix = false;
+        while (segment.length() > 0) {
+            hasPartialPrefix = false;
+
+            // Attempt to match a digit.
+            byte digit = -1;
+
+            // Try by code point digit value.
+            int cp = segment.getCodePoint();
+            if (UCharacter.isDigit(cp)) {
+                segment.adjustOffset(Character.charCount(cp));
+                digit = (byte) UCharacter.digit(cp);
+            }
+
+            // Try by digit string.
+            if (digit == -1 && digitStrings != null) {
+                for (int i = 0; i < digitStrings.length; i++) {
+                    String str = digitStrings[i];
+                    int overlap = segment.getCommonPrefixLength(str);
+                    if (overlap == str.length()) {
+                        segment.adjustOffset(overlap);
+                        digit = (byte) i;
+                        break;
+                    } else if (overlap == segment.length()) {
+                        hasPartialPrefix = true;
+                    }
+                }
+            }
+
+            if (digit >= 0) {
+                // Digit was found.
+                // Check for grouping size violation
+                if (backupOffset != -1) {
+                    if (requireGroupingMatch) {
+                        // comma followed by digit, so group before comma is a secondary
+                        // group. If there was a group separator before that, the group
+                        // must == the secondary group length, else it can be <= the the
+                        // secondary group length.
+                        if ((afterFirstGrouping && groupedDigitCount != grouping2)
+                                || (!afterFirstGrouping && groupedDigitCount > grouping2)) {
+                            strictFail = true;
+                            break;
+                        }
+                    }
+                    afterFirstGrouping = true;
+                    backupOffset = -1;
+                    groupedDigitCount = 0;
+                }
+
+                // Save the digit in the DecimalQuantity or scientific adjustment.
+                if (isScientific) {
+                    int nextExponent = digit + exponent * 10;
+                    if (nextExponent < exponent) {
+                        // Overflow
+                        exponent = Integer.MAX_VALUE;
+                    } else {
+                        exponent = nextExponent;
+                    }
+                } else {
+                    if (result.quantity == null) {
+                        result.quantity = new DecimalQuantity_DualStorageBCD();
+                    }
+                    result.quantity.appendDigit(digit, 0, true);
+                }
+                result.setCharsConsumed(segment);
+                groupedDigitCount++;
+                if (seenDecimal) {
+                    digitsAfterDecimal++;
+                }
+                continue;
+            }
+
+            // Attempt to match a literal grouping or decimal separator
+            int decimalOverlap = segment.getCommonPrefixLength(actualDecimalString);
+            boolean decimalStringMatch = decimalOverlap == actualDecimalString.length();
+            int groupingOverlap = segment.getCommonPrefixLength(actualGroupingString);
+            boolean groupingStringMatch = groupingOverlap == actualGroupingString.length();
+
+            hasPartialPrefix = (decimalOverlap == segment.length())
+                    || (groupingOverlap == segment.length());
+
+            if (!seenDecimal
+                    && !groupingStringMatch
+                    && (decimalStringMatch || (!seenDecimal && decimalUniSet.contains(cp)))) {
+                // matched a decimal separator
+                if (requireGroupingMatch) {
+                    if (backupOffset != -1 || (seenGrouping && groupedDigitCount != grouping1)) {
+                        strictFail = true;
+                        break;
+                    }
+                }
+
+                // If we're only parsing integers, then don't parse this one.
+                if (integerOnly) {
+                    break;
+                }
+
+                seenDecimal = true;
+                if (!decimalStringMatch) {
+                    actualDecimalString = UCharacter.toString(cp);
+                }
+                segment.adjustOffset(actualDecimalString.length());
+                result.setCharsConsumed(segment);
+                result.flags |= ParsedNumber.FLAG_HAS_DECIMAL_SEPARATOR;
+                continue;
+            }
+
+            if (!groupingDisabled
+                    && !decimalStringMatch
+                    && (groupingStringMatch || (!seenGrouping && groupingUniSet.contains(cp)))) {
+                // matched a grouping separator
+                if (requireGroupingMatch) {
+                    if (groupedDigitCount == 0) {
+                        // leading group
+                        strictFail = true;
+                        break;
+                    } else if (backupOffset != -1) {
+                        // two group separators in a row
+                        break;
+                    }
+                }
+
+                if (fractionGroupingDisabled && seenDecimal) {
+                    // Stop parsing here.
+                    break;
+                }
+
+                seenGrouping = true;
+                if (!groupingStringMatch) {
+                    actualGroupingString = UCharacter.toString(cp);
+                }
+                backupOffset = segment.getOffset();
+                segment.adjustOffset(actualGroupingString.length());
+                // Note: do NOT set charsConsumed
+                continue;
+            }
+
+            // Not a digit and not a separator
+            break;
+        }
+
+        // Back up if there was a trailing grouping separator
+        if (backupOffset != -1) {
+            segment.setOffset(backupOffset);
+            hasPartialPrefix = true; // redundant with `groupingOverlap == segment.length()`
+        }
+
+        // Check the final grouping for validity
+        if (requireGroupingMatch
+                && !seenDecimal
+                && seenGrouping
+                && afterFirstGrouping
+                && groupedDigitCount != grouping1) {
+            strictFail = true;
+        }
+
+        if (requireGroupingMatch && strictFail) {
+            result.copyFrom(backupResult);
+            segment.setOffset(initialOffset);
+        }
+
+        if (result.quantity == null && segment.getOffset() != initialOffset) {
+            // Strings that start with a separator but have no digits.
+            // We don't need a backup of ParsedNumber because no changes could have been made to it.
+            segment.setOffset(initialOffset);
+            hasPartialPrefix = true;
+        }
+
+        if (result.quantity != null) {
+            // The final separator was a decimal separator.
+            result.quantity.adjustMagnitude(-digitsAfterDecimal);
+        }
+
+        if (isScientific && segment.getOffset() != initialOffset) {
+            assert result.quantity != null; // scientific notation always comes after the number
+            boolean overflow = (exponent == Integer.MAX_VALUE);
+            if (!overflow) {
+                try {
+                    result.quantity.adjustMagnitude(negativeExponent ? -exponent : exponent);
+                } catch (ArithmeticException e) {
+                    overflow = true;
+                }
+            }
+            if (overflow) {
+                if (negativeExponent) {
+                    // Set to zero
+                    result.quantity.clear();
+                } else {
+                    // Set to infinity
+                    result.quantity = null;
+                    result.flags |= ParsedNumber.FLAG_INFINITY;
+                }
+            }
+        }
+
+        return segment.length() == 0 || hasPartialPrefix;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        if (digitStrings == null && leadSet != null) {
+            return leadSet;
+        }
+
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        // Assumption: the sets are all single code points.
+        leadCodePoints.addAll(UnicodeSetStaticCache.get(Key.DIGITS));
+        leadCodePoints.addAll(separatorSet);
+        if (digitStrings != null) {
+            for (int i = 0; i < digitStrings.length; i++) {
+                ParsingUtils.putLeadCodePoint(digitStrings[i], leadCodePoints);
+            }
+        }
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<DecimalMatcher>";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/FlagHandler.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/FlagHandler.java
new file mode 100644
index 0000000..37d3911
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/FlagHandler.java
@@ -0,0 +1,28 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+/**
+ * Unconditionally applies a given set of flags to the ParsedNumber in the post-processing step.
+ */
+public class FlagHandler extends ValidationMatcher {
+
+    public static final FlagHandler PERCENT = new FlagHandler(ParsedNumber.FLAG_PERCENT);
+    public static final FlagHandler PERMILLE = new FlagHandler(ParsedNumber.FLAG_PERMILLE);
+
+    private final int flags;
+
+    private FlagHandler(int flags) {
+        this.flags = flags;
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        result.flags |= flags;
+    }
+
+    @Override
+    public String toString() {
+        return "<FlagsHandler " + Integer.toHexString(flags) + ">";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/IgnorablesMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/IgnorablesMatcher.java
new file mode 100644
index 0000000..190396b
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/IgnorablesMatcher.java
@@ -0,0 +1,43 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ *
+ */
+public class IgnorablesMatcher extends SymbolMatcher implements NumberParseMatcher.Flexible {
+
+    public static final IgnorablesMatcher DEFAULT = new IgnorablesMatcher(
+            UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.DEFAULT_IGNORABLES));
+
+    public static final IgnorablesMatcher STRICT = new IgnorablesMatcher(
+            UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.STRICT_IGNORABLES));
+
+    public static IgnorablesMatcher getInstance(UnicodeSet ignorables) {
+        assert ignorables.isFrozen();
+        return new IgnorablesMatcher(ignorables);
+    }
+
+    private IgnorablesMatcher(UnicodeSet ignorables) {
+        super("", ignorables);
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return false;
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<IgnorablesMatcher>";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/InfinityMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/InfinityMatcher.java
new file mode 100644
index 0000000..ecf816a
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/InfinityMatcher.java
@@ -0,0 +1,48 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.DecimalFormatSymbols;
+
+/**
+ * @author sffc
+ *
+ */
+public class InfinityMatcher extends SymbolMatcher {
+
+    private static final InfinityMatcher DEFAULT = new InfinityMatcher();
+
+    public static InfinityMatcher getInstance(DecimalFormatSymbols symbols) {
+        String symbolString = symbols.getInfinity();
+        if (DEFAULT.uniSet.contains(symbolString)) {
+            return DEFAULT;
+        } else {
+            return new InfinityMatcher(symbolString);
+        }
+    }
+
+    private InfinityMatcher(String symbolString) {
+        super(symbolString, DEFAULT.uniSet);
+    }
+
+    private InfinityMatcher() {
+        super(UnicodeSetStaticCache.Key.INFINITY);
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return 0 != (result.flags & ParsedNumber.FLAG_INFINITY);
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.flags |= ParsedNumber.FLAG_INFINITY;
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<PercentMatcher>";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/MatcherFactory.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/MatcherFactory.java
new file mode 100644
index 0000000..d5640d4
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/MatcherFactory.java
@@ -0,0 +1,46 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.text.DecimalFormatSymbols;
+import com.ibm.icu.util.Currency;
+import com.ibm.icu.util.ULocale;
+
+/**
+ * @author sffc
+ *
+ */
+public class MatcherFactory {
+    Currency currency;
+    DecimalFormatSymbols symbols;
+    IgnorablesMatcher ignorables;
+    ULocale locale;
+
+    public MinusSignMatcher minusSign(boolean allowTrailing) {
+        return MinusSignMatcher.getInstance(symbols, allowTrailing);
+    }
+
+    public PlusSignMatcher plusSign(boolean allowTrailing) {
+        return PlusSignMatcher.getInstance(symbols, allowTrailing);
+    }
+
+    public PercentMatcher percent() {
+        return PercentMatcher.getInstance(symbols);
+    }
+
+    public PermilleMatcher permille() {
+        return PermilleMatcher.getInstance(symbols);
+    }
+
+    public AnyMatcher currency() {
+        AnyMatcher any = new AnyMatcher();
+        any.addMatcher(CurrencyMatcher.getInstance(currency, locale));
+        any.addMatcher(CurrencyTrieMatcher.getInstance(locale));
+        any.freeze();
+        return any;
+    }
+
+    public IgnorablesMatcher ignorables() {
+        return ignorables;
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/MinusSignMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/MinusSignMatcher.java
new file mode 100644
index 0000000..08e9d1a
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/MinusSignMatcher.java
@@ -0,0 +1,54 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.DecimalFormatSymbols;
+
+/**
+ * @author sffc
+ *
+ */
+public class MinusSignMatcher extends SymbolMatcher {
+
+    private static final MinusSignMatcher DEFAULT = new MinusSignMatcher(false);
+    private static final MinusSignMatcher DEFAULT_ALLOW_TRAILING = new MinusSignMatcher(true);
+
+    public static MinusSignMatcher getInstance(DecimalFormatSymbols symbols, boolean allowTrailing) {
+        String symbolString = symbols.getMinusSignString();
+        if (DEFAULT.uniSet.contains(symbolString)) {
+            return allowTrailing ? DEFAULT_ALLOW_TRAILING : DEFAULT;
+        } else {
+            return new MinusSignMatcher(symbolString, allowTrailing);
+        }
+    }
+
+    private final boolean allowTrailing;
+
+    private MinusSignMatcher(String symbolString, boolean allowTrailing) {
+        super(symbolString, DEFAULT.uniSet);
+        this.allowTrailing = allowTrailing;
+    }
+
+    private MinusSignMatcher(boolean allowTrailing) {
+        super(UnicodeSetStaticCache.Key.MINUS_SIGN);
+        this.allowTrailing = allowTrailing;
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return 0 != (result.flags & ParsedNumber.FLAG_NEGATIVE)
+                || (allowTrailing ? false : result.seenNumber());
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.flags |= ParsedNumber.FLAG_NEGATIVE;
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<MinusSignMatcher>";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/MultiplierHandler.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/MultiplierHandler.java
new file mode 100644
index 0000000..e2c2250
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/MultiplierHandler.java
@@ -0,0 +1,39 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+
+/**
+ * @author sffc
+ *
+ */
+public class MultiplierHandler extends ValidationMatcher {
+
+    private final BigDecimal multiplier;
+    private final MathContext mc;
+    private final boolean isNegative;
+
+    public MultiplierHandler(BigDecimal multiplier, MathContext mc) {
+        this.multiplier = BigDecimal.ONE.divide(multiplier, mc).abs();
+        this.mc = mc;
+        isNegative = multiplier.signum() < 0;
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        if (result.quantity != null) {
+            result.quantity.multiplyBy(multiplier);
+            result.quantity.roundToMagnitude(result.quantity.getMagnitude() - mc.getPrecision(), mc);
+            if (isNegative) {
+                result.flags ^= ParsedNumber.FLAG_NEGATIVE;
+            }
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<MultiplierHandler " + multiplier + ">";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NanMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NanMatcher.java
new file mode 100644
index 0000000..f78d0e8
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NanMatcher.java
@@ -0,0 +1,58 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.DecimalFormatSymbols;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ *
+ */
+public class NanMatcher extends SymbolMatcher {
+
+    private static final NanMatcher DEFAULT = new NanMatcher("NaN");
+
+    public static NanMatcher getInstance(DecimalFormatSymbols symbols, int parseFlags) {
+        String symbolString = symbols.getNaN();
+        if (DEFAULT.string.equals(symbolString)) {
+            return DEFAULT;
+        } else {
+            return new NanMatcher(symbolString);
+        }
+    }
+
+    private NanMatcher(String symbolString) {
+        super(symbolString, UnicodeSet.EMPTY);
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        // Overriding this here to allow use of statically allocated sets
+        int leadCp = string.codePointAt(0);
+        UnicodeSet s = UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.NAN_LEAD);
+        if (s.contains(leadCp)) {
+            return s;
+        } else {
+            return super.getLeadCodePoints();
+        }
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return result.seenNumber();
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.flags |= ParsedNumber.FLAG_NAN;
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<NanMatcher>";
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParseMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParseMatcher.java
new file mode 100644
index 0000000..bd772ca
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParseMatcher.java
@@ -0,0 +1,62 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * Given a string, there should NOT be more than one way to consume the string with the same matcher
+ * applied multiple times. If there is, the non-greedy parsing algorithm will be unhappy and may enter an
+ * exponential-time loop. For example, consider the "A Matcher" that accepts "any number of As". Given
+ * the string "AAAA", there are 2^N = 8 ways to apply the A Matcher to this string: you could have the A
+ * Matcher apply 4 times to each character; you could have it apply just once to all the characters; you
+ * could have it apply to the first 2 characters and the second 2 characters; and so on. A better version
+ * of the "A Matcher" would be for it to accept exactly one A, and allow the algorithm to run it
+ * repeatedly to consume a string of multiple As. The A Matcher can implement the Flexible interface
+ * below to signal that it can be applied multiple times in a row.
+ *
+ * @author sffc
+ */
+public interface NumberParseMatcher {
+
+    /**
+     * Matchers can implement the Flexible interface to indicate that they are optional and can be run
+     * repeatedly. Used by SeriesMatcher, primarily in the context of IgnorablesMatcher.
+     */
+    public interface Flexible {
+    }
+
+    /**
+     * Runs this matcher starting at the beginning of the given StringSegment. If this matcher finds
+     * something interesting in the StringSegment, it should update the offset of the StringSegment
+     * corresponding to how many chars were matched.
+     *
+     * @param segment
+     *            The StringSegment to match against. Matches always start at the beginning of the
+     *            segment. The segment is guaranteed to contain at least one char.
+     * @param result
+     *            The data structure to store results if the match succeeds.
+     * @return Whether this matcher thinks there may be more interesting chars beyond the end of the
+     *         string segment.
+     */
+    public boolean match(StringSegment segment, ParsedNumber result);
+
+    /**
+     * Should return a set representing all possible chars (UTF-16 code units) that could be the first
+     * char that this matcher can consume. This method is only called during construction phase, and its
+     * return value is used to skip this matcher unless a segment begins with a char in this set. To make
+     * this matcher always run, return {@link UnicodeSet#ALL_CODE_POINTS}.
+     */
+    public UnicodeSet getLeadCodePoints();
+
+    /**
+     * Method called at the end of a parse, after all matchers have failed to consume any more chars.
+     * Allows a matcher to make final modifications to the result given the knowledge that no more
+     * matches are possible.
+     *
+     * @param result
+     *            The data structure to store results.
+     */
+    public void postProcess(ParsedNumber result);
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParserImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParserImpl.java
new file mode 100644
index 0000000..a614a3b
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParserImpl.java
@@ -0,0 +1,493 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import java.text.ParsePosition;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.impl.number.AffixPatternProvider;
+import com.ibm.icu.impl.number.AffixUtils;
+import com.ibm.icu.impl.number.CustomSymbolCurrency;
+import com.ibm.icu.impl.number.DecimalFormatProperties;
+import com.ibm.icu.impl.number.Grouper;
+import com.ibm.icu.impl.number.PatternStringParser;
+import com.ibm.icu.impl.number.PatternStringParser.ParsedPatternInfo;
+import com.ibm.icu.impl.number.PropertiesAffixPatternProvider;
+import com.ibm.icu.impl.number.RoundingUtils;
+import com.ibm.icu.number.NumberFormatter.GroupingStrategy;
+import com.ibm.icu.text.DecimalFormatSymbols;
+import com.ibm.icu.text.UnicodeSet;
+import com.ibm.icu.util.Currency;
+import com.ibm.icu.util.CurrencyAmount;
+import com.ibm.icu.util.ULocale;
+
+/**
+ * Primary number parsing implementation class.
+ *
+ * @author sffc
+ *
+ */
+public class NumberParserImpl {
+
+    @Deprecated
+    public static NumberParserImpl removeMeWhenMerged(ULocale locale, String pattern, int parseFlags) {
+        NumberParserImpl parser = new NumberParserImpl(parseFlags);
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
+        IgnorablesMatcher ignorables = IgnorablesMatcher.DEFAULT;
+
+        MatcherFactory factory = new MatcherFactory();
+        factory.currency = Currency.getInstance("USD");
+        factory.symbols = symbols;
+        factory.ignorables = ignorables;
+        factory.locale = locale;
+
+        ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(pattern);
+        AffixMatcher.newGenerate(patternInfo, parser, factory, ignorables, parseFlags);
+
+        Grouper grouper = Grouper.forStrategy(GroupingStrategy.AUTO).withLocaleData(locale, patternInfo);
+        parser.addMatcher(DecimalMatcher.getInstance(symbols, grouper, parseFlags));
+        parser.addMatcher(CurrencyTrieMatcher.getInstance(locale));
+        parser.addMatcher(NanMatcher.getInstance(symbols, parseFlags));
+
+        parser.freeze();
+        return parser;
+    }
+
+    // TODO: Find a better place for this enum.
+    /** Controls the set of rules for parsing a string. */
+    public static enum ParseMode {
+        /**
+         * Lenient mode should be used if you want to accept malformed user input. It will use heuristics
+         * to attempt to parse through typographical errors in the string.
+         */
+        LENIENT,
+
+        /**
+         * Strict mode should be used if you want to require that the input is well-formed. More
+         * specifically, it differs from lenient mode in the following ways:
+         *
+         * <ul>
+         * <li>Grouping widths must match the grouping settings. For example, "12,3,45" will fail if the
+         * grouping width is 3, as in the pattern "#,##0".
+         * <li>The string must contain a complete prefix and suffix. For example, if the pattern is
+         * "{#};(#)", then "{123}" or "(123)" would match, but "{123", "123}", and "123" would all fail.
+         * (The latter strings would be accepted in lenient mode.)
+         * <li>Whitespace may not appear at arbitrary places in the string. In lenient mode, whitespace
+         * is allowed to occur arbitrarily before and after prefixes and exponent separators.
+         * <li>Leading grouping separators are not allowed, as in ",123".
+         * <li>Minus and plus signs can only appear if specified in the pattern. In lenient mode, a plus
+         * or minus sign can always precede a number.
+         * <li>The set of characters that can be interpreted as a decimal or grouping separator is
+         * smaller.
+         * <li><strong>If currency parsing is enabled,</strong> currencies must only appear where
+         * specified in either the current pattern string or in a valid pattern string for the current
+         * locale. For example, if the pattern is "¤0.00", then "$1.23" would match, but "1.23$" would
+         * fail to match.
+         * </ul>
+         */
+        STRICT,
+    }
+
+    @Deprecated
+    public static NumberParserImpl createParserFromPattern(
+            ULocale locale,
+            String pattern,
+            boolean strictGrouping) {
+        // Temporary frontend for testing.
+
+        int parseFlags = ParsingUtils.PARSE_FLAG_IGNORE_CASE
+                | ParsingUtils.PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES
+                | ParsingUtils.PARSE_FLAG_OPTIMIZE;
+        if (strictGrouping) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_STRICT_GROUPING_SIZE;
+        }
+
+        NumberParserImpl parser = new NumberParserImpl(parseFlags);
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(locale);
+        IgnorablesMatcher ignorables = IgnorablesMatcher.DEFAULT;
+
+        MatcherFactory factory = new MatcherFactory();
+        factory.currency = Currency.getInstance("USD");
+        factory.symbols = symbols;
+        factory.ignorables = ignorables;
+        factory.locale = locale;
+
+        ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(pattern);
+        AffixMatcher.newGenerate(patternInfo, parser, factory, ignorables, parseFlags);
+
+        Grouper grouper = Grouper.forStrategy(GroupingStrategy.AUTO).withLocaleData(locale, patternInfo);
+
+        parser.addMatcher(ignorables);
+        parser.addMatcher(DecimalMatcher.getInstance(symbols, grouper, parseFlags));
+        parser.addMatcher(MinusSignMatcher.getInstance(symbols, false));
+        parser.addMatcher(NanMatcher.getInstance(symbols, parseFlags));
+        parser.addMatcher(ScientificMatcher.getInstance(symbols, grouper));
+        parser.addMatcher(CurrencyTrieMatcher.getInstance(locale));
+        parser.addMatcher(new RequireNumberMatcher());
+
+        parser.freeze();
+        return parser;
+    }
+
+    public static Number parseStatic(
+            String input,
+            ParsePosition ppos,
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols) {
+        NumberParserImpl parser = createParserFromProperties(properties, symbols, false, false);
+        ParsedNumber result = new ParsedNumber();
+        parser.parse(input, true, result);
+        if (result.success()) {
+            ppos.setIndex(result.charEnd);
+            return result.getNumber();
+        } else {
+            ppos.setErrorIndex(result.charEnd);
+            return null;
+        }
+    }
+
+    public static CurrencyAmount parseStaticCurrency(
+            String input,
+            ParsePosition ppos,
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols) {
+        NumberParserImpl parser = createParserFromProperties(properties, symbols, true, false);
+        ParsedNumber result = new ParsedNumber();
+        parser.parse(input, true, result);
+        if (result.success()) {
+            ppos.setIndex(result.charEnd);
+            // TODO: Clean this up
+            Currency currency;
+            if (result.currencyCode != null) {
+                currency = Currency.getInstance(result.currencyCode);
+            } else {
+                assert 0 != (result.flags & ParsedNumber.FLAG_HAS_DEFAULT_CURRENCY);
+                currency = CustomSymbolCurrency
+                        .resolve(properties.getCurrency(), symbols.getULocale(), symbols);
+            }
+            return new CurrencyAmount(result.getNumber(), currency);
+        } else {
+            ppos.setErrorIndex(result.charEnd);
+            return null;
+        }
+    }
+
+    public static NumberParserImpl createDefaultParserForLocale(ULocale loc, boolean optimize) {
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(loc);
+        DecimalFormatProperties properties = PatternStringParser.parseToProperties("0");
+        return createParserFromProperties(properties, symbols, false, optimize);
+    }
+
+    public static NumberParserImpl createParserFromProperties(
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols,
+            boolean parseCurrency,
+            boolean optimize) {
+
+        ULocale locale = symbols.getULocale();
+        AffixPatternProvider patternInfo = new PropertiesAffixPatternProvider(properties);
+        Currency currency = CustomSymbolCurrency.resolve(properties.getCurrency(), locale, symbols);
+        boolean isStrict = properties.getParseMode() == ParseMode.STRICT;
+        Grouper grouper = Grouper.forProperties(properties);
+        int parseFlags = 0;
+        // Fraction grouping is disabled by default because it has never been supported in DecimalFormat
+        parseFlags |= ParsingUtils.PARSE_FLAG_FRACTION_GROUPING_DISABLED;
+        if (!properties.getParseCaseSensitive()) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_IGNORE_CASE;
+        }
+        if (properties.getParseIntegerOnly()) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_INTEGER_ONLY;
+        }
+        if (properties.getSignAlwaysShown()) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_PLUS_SIGN_ALLOWED;
+        }
+        if (isStrict) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_STRICT_GROUPING_SIZE;
+            parseFlags |= ParsingUtils.PARSE_FLAG_STRICT_SEPARATORS;
+            parseFlags |= ParsingUtils.PARSE_FLAG_USE_FULL_AFFIXES;
+            parseFlags |= ParsingUtils.PARSE_FLAG_EXACT_AFFIX;
+        } else {
+            parseFlags |= ParsingUtils.PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES;
+        }
+        if (grouper.getPrimary() <= 0) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_GROUPING_DISABLED;
+        }
+        if (parseCurrency || patternInfo.hasCurrencySign()) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_MONETARY_SEPARATORS;
+        }
+        if (optimize) {
+            parseFlags |= ParsingUtils.PARSE_FLAG_OPTIMIZE;
+        }
+        IgnorablesMatcher ignorables = isStrict ? IgnorablesMatcher.STRICT : IgnorablesMatcher.DEFAULT;
+
+        NumberParserImpl parser = new NumberParserImpl(parseFlags);
+
+        MatcherFactory factory = new MatcherFactory();
+        factory.currency = currency;
+        factory.symbols = symbols;
+        factory.ignorables = ignorables;
+        factory.locale = locale;
+
+        //////////////////////
+        /// AFFIX MATCHERS ///
+        //////////////////////
+
+        // Set up a pattern modifier with mostly defaults to generate AffixMatchers.
+        AffixMatcher.newGenerate(patternInfo, parser, factory, ignorables, parseFlags);
+
+        ////////////////////////
+        /// CURRENCY MATCHER ///
+        ////////////////////////
+
+        if (parseCurrency || patternInfo.hasCurrencySign()) {
+            parser.addMatcher(CurrencyMatcher.getInstance(currency, locale));
+            parser.addMatcher(CurrencyTrieMatcher.getInstance(locale));
+        }
+
+        ///////////////
+        /// PERCENT ///
+        ///////////////
+
+        // ICU-TC meeting, April 11, 2018: accept percent/permille only if it is in the pattern,
+        // and to maintain regressive behavior, divide by 100 even if no percent sign is present.
+        if (patternInfo.containsSymbolType(AffixUtils.TYPE_PERCENT)) {
+            parser.addMatcher(PercentMatcher.getInstance(symbols));
+            // causes number to be always scaled by 100:
+            parser.addMatcher(FlagHandler.PERCENT);
+        }
+        if (patternInfo.containsSymbolType(AffixUtils.TYPE_PERMILLE)) {
+            parser.addMatcher(PermilleMatcher.getInstance(symbols));
+            // causes number to be always scaled by 1000:
+            parser.addMatcher(FlagHandler.PERMILLE);
+        }
+
+        ///////////////////////////////
+        /// OTHER STANDARD MATCHERS ///
+        ///////////////////////////////
+
+        if (!isStrict) {
+            parser.addMatcher(PlusSignMatcher.getInstance(symbols, false));
+            parser.addMatcher(MinusSignMatcher.getInstance(symbols, false));
+        }
+        parser.addMatcher(NanMatcher.getInstance(symbols, parseFlags));
+        parser.addMatcher(InfinityMatcher.getInstance(symbols));
+        String padString = properties.getPadString();
+        if (padString != null && !ignorables.getSet().contains(padString)) {
+            parser.addMatcher(PaddingMatcher.getInstance(padString));
+        }
+        parser.addMatcher(ignorables);
+        parser.addMatcher(DecimalMatcher.getInstance(symbols, grouper, parseFlags));
+        if (!properties.getParseNoExponent()) {
+            parser.addMatcher(ScientificMatcher.getInstance(symbols, grouper));
+        }
+
+        //////////////////
+        /// VALIDATORS ///
+        //////////////////
+
+        parser.addMatcher(new RequireNumberMatcher());
+        if (isStrict) {
+            parser.addMatcher(new RequireAffixMatcher());
+        }
+        if (isStrict && properties.getMinimumExponentDigits() > 0) {
+            parser.addMatcher(new RequireExponentMatcher());
+        }
+        if (parseCurrency) {
+            parser.addMatcher(new RequireCurrencyMatcher());
+        }
+        if (properties.getDecimalPatternMatchRequired()) {
+            boolean patternHasDecimalSeparator = properties.getDecimalSeparatorAlwaysShown()
+                    || properties.getMaximumFractionDigits() != 0;
+            parser.addMatcher(RequireDecimalSeparatorMatcher.getInstance(patternHasDecimalSeparator));
+        }
+        if (properties.getMultiplier() != null) {
+            // We need to use a math context in order to prevent non-terminating decimal expansions.
+            // This is only used when dividing by the multiplier.
+            parser.addMatcher(new MultiplierHandler(properties.getMultiplier(),
+                    RoundingUtils.getMathContextOr34Digits(properties)));
+        }
+
+        parser.freeze();
+        return parser;
+    }
+
+    private final int parseFlags;
+    private final List<NumberParseMatcher> matchers;
+    private final List<UnicodeSet> leadCodePointses;
+    private Comparator<ParsedNumber> comparator;
+    private boolean frozen;
+
+    /**
+     * Creates a new, empty parser.
+     *
+     * @param parseFlags
+     *            The parser settings defined in the PARSE_FLAG_* fields.
+     */
+    public NumberParserImpl(int parseFlags) {
+        matchers = new ArrayList<NumberParseMatcher>();
+        if (0 != (parseFlags & ParsingUtils.PARSE_FLAG_OPTIMIZE)) {
+            leadCodePointses = new ArrayList<UnicodeSet>();
+        } else {
+            leadCodePointses = null;
+        }
+        comparator = ParsedNumber.COMPARATOR; // default value
+        this.parseFlags = parseFlags;
+        frozen = false;
+    }
+
+    public void addMatcher(NumberParseMatcher matcher) {
+        assert !frozen;
+        this.matchers.add(matcher);
+        if (leadCodePointses != null) {
+            addLeadCodePointsForMatcher(matcher);
+        }
+    }
+
+    public void addMatchers(Collection<? extends NumberParseMatcher> matchers) {
+        assert !frozen;
+        this.matchers.addAll(matchers);
+        if (leadCodePointses != null) {
+            for (NumberParseMatcher matcher : matchers) {
+                addLeadCodePointsForMatcher(matcher);
+            }
+        }
+    }
+
+    private void addLeadCodePointsForMatcher(NumberParseMatcher matcher) {
+        UnicodeSet leadCodePoints = matcher.getLeadCodePoints();
+        assert leadCodePoints.isFrozen();
+        // TODO: Avoid the clone operation here.
+        if (0 != (parseFlags & ParsingUtils.PARSE_FLAG_IGNORE_CASE)) {
+            leadCodePoints = leadCodePoints.cloneAsThawed().closeOver(UnicodeSet.ADD_CASE_MAPPINGS)
+                    .freeze();
+        }
+        this.leadCodePointses.add(leadCodePoints);
+    }
+
+    public void setComparator(Comparator<ParsedNumber> comparator) {
+        assert !frozen;
+        this.comparator = comparator;
+    }
+
+    public void freeze() {
+        frozen = true;
+    }
+
+    public void parse(String input, boolean greedy, ParsedNumber result) {
+        parse(input, 0, greedy, result);
+    }
+
+    /**
+     * Primary entrypoint to parsing code path.
+     *
+     * @param input
+     *            The string to parse. This is a String, not CharSequence, to enforce assumptions about
+     *            immutability (CharSequences are not guaranteed to be immutable).
+     * @param start
+     *            The index into the string at which to start parsing.
+     * @param greedy
+     *            Whether to use the faster but potentially less accurate greedy code path.
+     * @param result
+     *            Output variable to store results.
+     */
+    public void parse(String input, int start, boolean greedy, ParsedNumber result) {
+        assert frozen;
+        assert start >= 0 && start < input.length();
+        StringSegment segment = new StringSegment(input,
+                0 != (parseFlags & ParsingUtils.PARSE_FLAG_IGNORE_CASE));
+        segment.adjustOffset(start);
+        if (greedy) {
+            parseGreedyRecursive(segment, result);
+        } else {
+            parseLongestRecursive(segment, result);
+        }
+        for (NumberParseMatcher matcher : matchers) {
+            matcher.postProcess(result);
+        }
+        // Android Patch: to be removed in ICU 62
+        result.postProcess();
+        // End Android Patch
+    }
+
+    private void parseGreedyRecursive(StringSegment segment, ParsedNumber result) {
+        // Base Case
+        if (segment.length() == 0) {
+            return;
+        }
+
+        int initialOffset = segment.getOffset();
+        int leadCp = segment.getCodePoint();
+        for (int i = 0; i < matchers.size(); i++) {
+            if (leadCodePointses != null && !leadCodePointses.get(i).contains(leadCp)) {
+                continue;
+            }
+            NumberParseMatcher matcher = matchers.get(i);
+            matcher.match(segment, result);
+            if (segment.getOffset() != initialOffset) {
+                // In a greedy parse, recurse on only the first match.
+                parseGreedyRecursive(segment, result);
+                // The following line resets the offset so that the StringSegment says the same across
+                // the function
+                // call boundary. Since we recurse only once, this line is not strictly necessary.
+                segment.setOffset(initialOffset);
+                return;
+            }
+        }
+
+        // NOTE: If we get here, the greedy parse completed without consuming the entire string.
+    }
+
+    private void parseLongestRecursive(StringSegment segment, ParsedNumber result) {
+        // Base Case
+        if (segment.length() == 0) {
+            return;
+        }
+
+        // TODO: Give a nice way for the matcher to reset the ParsedNumber?
+        ParsedNumber initial = new ParsedNumber();
+        initial.copyFrom(result);
+        ParsedNumber candidate = new ParsedNumber();
+
+        int initialOffset = segment.getOffset();
+        for (int i = 0; i < matchers.size(); i++) {
+            NumberParseMatcher matcher = matchers.get(i);
+
+            // In a non-greedy parse, we attempt all possible matches and pick the best.
+            for (int charsToConsume = 0; charsToConsume < segment.length();) {
+                charsToConsume += Character.charCount(Character.codePointAt(segment, charsToConsume));
+
+                // Run the matcher on a segment of the current length.
+                candidate.copyFrom(initial);
+                segment.setLength(charsToConsume);
+                boolean maybeMore = matcher.match(segment, candidate);
+                segment.resetLength();
+
+                // If the entire segment was consumed, recurse.
+                if (segment.getOffset() - initialOffset == charsToConsume) {
+                    parseLongestRecursive(segment, candidate);
+                    if (comparator.compare(candidate, result) > 0) {
+                        result.copyFrom(candidate);
+                    }
+                }
+
+                // Since the segment can be re-used, reset the offset.
+                // This does not have an effect if the matcher did not consume any chars.
+                segment.setOffset(initialOffset);
+
+                // Unless the matcher wants to see the next char, continue to the next matcher.
+                if (!maybeMore) {
+                    break;
+                }
+            }
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<NumberParserImpl matchers=" + matchers.toString() + ">";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PaddingMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PaddingMatcher.java
new file mode 100644
index 0000000..51c36b1
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PaddingMatcher.java
@@ -0,0 +1,36 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ *
+ */
+public class PaddingMatcher extends SymbolMatcher implements NumberParseMatcher.Flexible {
+
+    public static PaddingMatcher getInstance(String padString) {
+        return new PaddingMatcher(padString);
+    }
+
+    private PaddingMatcher(String symbolString) {
+        super(symbolString, UnicodeSet.EMPTY);
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return false;
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<PaddingMatcher>";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ParsedNumber.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ParsedNumber.java
new file mode 100644
index 0000000..db7f3b0
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ParsedNumber.java
@@ -0,0 +1,177 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import java.math.BigDecimal;
+import java.util.Comparator;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.impl.number.DecimalQuantity_DualStorageBCD;
+
+/**
+ * @author sffc
+ *
+ */
+public class ParsedNumber {
+
+    public DecimalQuantity_DualStorageBCD quantity;
+
+    /**
+     * The index of the last char consumed during parsing. If parsing started at index 0, this is equal
+     * to the number of chars consumed. This is NOT necessarily the same as the StringSegment offset;
+     * "weak" chars, like whitespace, change the offset, but the charsConsumed is not touched until a
+     * "strong" char is encountered.
+     */
+    public int charEnd;
+
+    /**
+     * Boolean flags (see constants below).
+     */
+    public int flags;
+
+    /**
+     * The pattern string corresponding to the prefix that got consumed.
+     */
+    public String prefix;
+
+    /**
+     * The pattern string corresponding to the suffix that got consumed.
+     */
+    public String suffix;
+
+    /**
+     * The currency that got consumed.
+     */
+    public String currencyCode;
+
+    public static final int FLAG_NEGATIVE = 0x0001;
+    public static final int FLAG_PERCENT = 0x0002;
+    public static final int FLAG_PERMILLE = 0x0004;
+    public static final int FLAG_HAS_EXPONENT = 0x0008;
+    public static final int FLAG_HAS_DEFAULT_CURRENCY = 0x0010;
+    public static final int FLAG_HAS_DECIMAL_SEPARATOR = 0x0020;
+    public static final int FLAG_NAN = 0x0040;
+    public static final int FLAG_INFINITY = 0x0080;
+    public static final int FLAG_FAIL = 0x0100;
+
+    /** A Comparator that favors ParsedNumbers with the most chars consumed. */
+    public static final Comparator<ParsedNumber> COMPARATOR = new Comparator<ParsedNumber>() {
+        @Override
+        public int compare(ParsedNumber o1, ParsedNumber o2) {
+            return o1.charEnd - o2.charEnd;
+        }
+    };
+
+    public ParsedNumber() {
+        clear();
+    }
+
+    /**
+     * Clears the data from this ParsedNumber, in effect failing the current parse.
+     */
+    public void clear() {
+        quantity = null;
+        charEnd = 0;
+        flags = 0;
+        prefix = null;
+        suffix = null;
+        currencyCode = null;
+    }
+
+    public void copyFrom(ParsedNumber other) {
+        quantity = other.quantity == null ? null
+                : (DecimalQuantity_DualStorageBCD) other.quantity.createCopy();
+        charEnd = other.charEnd;
+        flags = other.flags;
+        prefix = other.prefix;
+        suffix = other.suffix;
+        currencyCode = other.currencyCode;
+    }
+
+    /**
+     * Call this method to register that a "strong" char was consumed. This should be done after calling
+     * {@link StringSegment#setOffset} or {@link StringSegment#adjustOffset} except when the char is
+     * "weak", like whitespace.
+     *
+     * <p>
+     * <strong>What is a strong versus weak char?</strong> The behavior of number parsing is to "stop"
+     * after reading the number, even if there is other content following the number. For example, after
+     * parsing the string "123 " (123 followed by a space), the cursor should be set to 3, not 4, even
+     * though there are matchers that accept whitespace. In this example, the digits are strong, whereas
+     * the whitespace is weak. Grouping separators are weak, whereas decimal separators are strong. Most
+     * other chars are strong.
+     *
+     * @param segment
+     *            The current StringSegment, usually immediately following a call to setOffset.
+     */
+    public void setCharsConsumed(StringSegment segment) {
+        charEnd = segment.getOffset();
+    }
+
+    // Android Patch: to be removed in ICU 62
+    public void postProcess() {
+        if (quantity != null && 0 != (flags & FLAG_PERCENT)) {
+            quantity.adjustMagnitude(-2);
+        }
+        if (quantity != null && 0 != (flags & FLAG_PERMILLE)) {
+            quantity.adjustMagnitude(-3);
+        }
+    }
+    // End Android Patch
+
+    /**
+     * Returns whether this the parse was successful. To be successful, at least one char must have been
+     * consumed, and the failure flag must not be set.
+     */
+    public boolean success() {
+        return charEnd > 0 && 0 == (flags & FLAG_FAIL);
+    }
+
+    public boolean seenNumber() {
+        return quantity != null || 0 != (flags & FLAG_NAN) || 0 != (flags & FLAG_INFINITY);
+    }
+
+    public Number getNumber() {
+        return getNumber(false);
+    }
+
+    public Number getNumber(boolean forceBigDecimal) {
+        boolean sawNegative = 0 != (flags & FLAG_NEGATIVE);
+        boolean sawNaN = 0 != (flags & FLAG_NAN);
+        boolean sawInfinity = 0 != (flags & FLAG_INFINITY);
+
+        // Check for NaN, infinity, and -0.0
+        if (sawNaN) {
+            return Double.NaN;
+        }
+        if (sawInfinity) {
+            if (sawNegative) {
+                return Double.NEGATIVE_INFINITY;
+            } else {
+                return Double.POSITIVE_INFINITY;
+            }
+        }
+        if (quantity.isZero() && sawNegative) {
+            return -0.0;
+        }
+
+        if (quantity.fitsInLong() && !forceBigDecimal) {
+            long l = quantity.toLong();
+            if (0 != (flags & FLAG_NEGATIVE)) {
+                l *= -1;
+            }
+            return l;
+        }
+
+        BigDecimal d = quantity.toBigDecimal();
+        if (0 != (flags & FLAG_NEGATIVE)) {
+            d = d.negate();
+        }
+        // Special case: MIN_LONG
+        if (d.compareTo(BigDecimal.valueOf(Long.MIN_VALUE)) == 0 && !forceBigDecimal) {
+            return Long.MIN_VALUE;
+        }
+        return d;
+
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ParsingUtils.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ParsingUtils.java
new file mode 100644
index 0000000..4d17cd6
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ParsingUtils.java
@@ -0,0 +1,42 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.text.UnicodeSet;
+import com.ibm.icu.text.UnicodeSet.EntryRange;
+
+/**
+ * A collection of utility functions used by the number parsing package.
+ */
+public class ParsingUtils {
+
+    public static final int PARSE_FLAG_IGNORE_CASE = 0x0001;
+    public static final int PARSE_FLAG_MONETARY_SEPARATORS = 0x0002;
+    public static final int PARSE_FLAG_STRICT_SEPARATORS = 0x0004;
+    public static final int PARSE_FLAG_STRICT_GROUPING_SIZE = 0x0008;
+    public static final int PARSE_FLAG_INTEGER_ONLY = 0x0010;
+    public static final int PARSE_FLAG_GROUPING_DISABLED = 0x0020;
+    public static final int PARSE_FLAG_DECIMAL_SCIENTIFIC = 0x0040;
+    public static final int PARSE_FLAG_INCLUDE_UNPAIRED_AFFIXES = 0x0080;
+    public static final int PARSE_FLAG_USE_FULL_AFFIXES = 0x0100;
+    public static final int PARSE_FLAG_EXACT_AFFIX = 0x0200;
+    public static final int PARSE_FLAG_PLUS_SIGN_ALLOWED = 0x0400;
+    public static final int PARSE_FLAG_FRACTION_GROUPING_DISABLED = 0x0800;
+    public static final int PARSE_FLAG_OPTIMIZE = 0x1000;
+
+    public static void putLeadCodePoints(UnicodeSet input, UnicodeSet output) {
+        for (EntryRange range : input.ranges()) {
+            output.add(range.codepoint, range.codepointEnd);
+        }
+        for (String str : input.strings()) {
+            output.add(str.codePointAt(0));
+        }
+    }
+
+    public static void putLeadCodePoint(String input, UnicodeSet output) {
+        if (!input.isEmpty()) {
+            output.add(input.codePointAt(0));
+        }
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PercentMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PercentMatcher.java
new file mode 100644
index 0000000..3944c31
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PercentMatcher.java
@@ -0,0 +1,48 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.DecimalFormatSymbols;
+
+/**
+ * @author sffc
+ *
+ */
+public class PercentMatcher extends SymbolMatcher {
+
+    private static final PercentMatcher DEFAULT = new PercentMatcher();
+
+    public static PercentMatcher getInstance(DecimalFormatSymbols symbols) {
+        String symbolString = symbols.getPercentString();
+        if (DEFAULT.uniSet.contains(symbolString)) {
+            return DEFAULT;
+        } else {
+            return new PercentMatcher(symbolString);
+        }
+    }
+
+    private PercentMatcher(String symbolString) {
+        super(symbolString, DEFAULT.uniSet);
+    }
+
+    private PercentMatcher() {
+        super(UnicodeSetStaticCache.Key.PERCENT_SIGN);
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return 0 != (result.flags & ParsedNumber.FLAG_PERCENT);
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.flags |= ParsedNumber.FLAG_PERCENT;
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<PercentMatcher>";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PermilleMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PermilleMatcher.java
new file mode 100644
index 0000000..3ad6e09
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PermilleMatcher.java
@@ -0,0 +1,48 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.DecimalFormatSymbols;
+
+/**
+ * @author sffc
+ *
+ */
+public class PermilleMatcher extends SymbolMatcher {
+
+    private static final PermilleMatcher DEFAULT = new PermilleMatcher();
+
+    public static PermilleMatcher getInstance(DecimalFormatSymbols symbols) {
+        String symbolString = symbols.getPerMillString();
+        if (DEFAULT.uniSet.contains(symbolString)) {
+            return DEFAULT;
+        } else {
+            return new PermilleMatcher(symbolString);
+        }
+    }
+
+    private PermilleMatcher(String symbolString) {
+        super(symbolString, DEFAULT.uniSet);
+    }
+
+    private PermilleMatcher() {
+        super(UnicodeSetStaticCache.Key.PERMILLE_SIGN);
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return 0 != (result.flags & ParsedNumber.FLAG_PERMILLE);
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.flags |= ParsedNumber.FLAG_PERMILLE;
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<PermilleMatcher>";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PlusSignMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PlusSignMatcher.java
new file mode 100644
index 0000000..d7b9411
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/PlusSignMatcher.java
@@ -0,0 +1,53 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.DecimalFormatSymbols;
+
+/**
+ * @author sffc
+ *
+ */
+public class PlusSignMatcher extends SymbolMatcher {
+
+    private static final PlusSignMatcher DEFAULT = new PlusSignMatcher(false);
+    private static final PlusSignMatcher DEFAULT_ALLOW_TRAILING = new PlusSignMatcher(true);
+
+    public static PlusSignMatcher getInstance(DecimalFormatSymbols symbols, boolean allowTrailing) {
+        String symbolString = symbols.getPlusSignString();
+        if (DEFAULT.uniSet.contains(symbolString)) {
+            return allowTrailing ? DEFAULT_ALLOW_TRAILING : DEFAULT;
+        } else {
+            return new PlusSignMatcher(symbolString, allowTrailing);
+        }
+    }
+
+    private final boolean allowTrailing;
+
+    private PlusSignMatcher(String symbolString, boolean allowTrailing) {
+        super(symbolString, DEFAULT.uniSet);
+        this.allowTrailing = allowTrailing;
+    }
+
+    private PlusSignMatcher(boolean allowTrailing) {
+        super(UnicodeSetStaticCache.Key.PLUS_SIGN);
+        this.allowTrailing = allowTrailing;
+    }
+
+    @Override
+    protected boolean isDisabled(ParsedNumber result) {
+        return allowTrailing ? false : result.seenNumber();
+    }
+
+    @Override
+    protected void accept(StringSegment segment, ParsedNumber result) {
+        result.setCharsConsumed(segment);
+    }
+
+    @Override
+    public String toString() {
+        return "<PlusSignMatcher>";
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireAffixMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireAffixMatcher.java
new file mode 100644
index 0000000..f1dbdd4
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireAffixMatcher.java
@@ -0,0 +1,24 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+/**
+ * @author sffc
+ *
+ */
+public class RequireAffixMatcher extends ValidationMatcher {
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        if (result.prefix == null || result.suffix == null) {
+            // We saw a prefix or a suffix but not both. Fail the parse.
+            result.flags |= ParsedNumber.FLAG_FAIL;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<RequireAffix>";
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireCurrencyMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireCurrencyMatcher.java
new file mode 100644
index 0000000..c561f69
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireCurrencyMatcher.java
@@ -0,0 +1,23 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+/**
+ * @author sffc
+ *
+ */
+public class RequireCurrencyMatcher extends ValidationMatcher {
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        if (result.currencyCode == null && 0 == (result.flags & ParsedNumber.FLAG_HAS_DEFAULT_CURRENCY)) {
+            result.flags |= ParsedNumber.FLAG_FAIL;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<RequireCurrency>";
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireDecimalSeparatorMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireDecimalSeparatorMatcher.java
new file mode 100644
index 0000000..6c536e8
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireDecimalSeparatorMatcher.java
@@ -0,0 +1,36 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+/**
+ * @author sffc
+ *
+ */
+public class RequireDecimalSeparatorMatcher extends ValidationMatcher {
+
+    private static final RequireDecimalSeparatorMatcher A = new RequireDecimalSeparatorMatcher(true);
+    private static final RequireDecimalSeparatorMatcher B = new RequireDecimalSeparatorMatcher(false);
+
+    private final boolean patternHasDecimalSeparator;
+
+    public static RequireDecimalSeparatorMatcher getInstance(boolean patternHasDecimalSeparator) {
+        return patternHasDecimalSeparator ? A : B;
+    }
+
+    private RequireDecimalSeparatorMatcher(boolean patternHasDecimalSeparator) {
+        this.patternHasDecimalSeparator = patternHasDecimalSeparator;
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        boolean parseHasDecimalSeparator = 0 != (result.flags & ParsedNumber.FLAG_HAS_DECIMAL_SEPARATOR);
+        if (parseHasDecimalSeparator != patternHasDecimalSeparator) {
+            result.flags |= ParsedNumber.FLAG_FAIL;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<RequireDecimalSeparator>";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireExponentMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireExponentMatcher.java
new file mode 100644
index 0000000..59586bc
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireExponentMatcher.java
@@ -0,0 +1,23 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+/**
+ * @author sffc
+ *
+ */
+public class RequireExponentMatcher extends ValidationMatcher {
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        if (0 == (result.flags & ParsedNumber.FLAG_HAS_EXPONENT)) {
+            result.flags |= ParsedNumber.FLAG_FAIL;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<RequireExponent>";
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireNumberMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireNumberMatcher.java
new file mode 100644
index 0000000..13d6a31
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/RequireNumberMatcher.java
@@ -0,0 +1,24 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+/**
+ * @author sffc
+ *
+ */
+public class RequireNumberMatcher extends ValidationMatcher {
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // Require that a number is matched.
+        if (!result.seenNumber()) {
+            result.flags |= ParsedNumber.FLAG_FAIL;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<RequireNumber>";
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ScientificMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ScientificMatcher.java
new file mode 100644
index 0000000..a665654
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ScientificMatcher.java
@@ -0,0 +1,98 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.impl.number.Grouper;
+import com.ibm.icu.text.DecimalFormatSymbols;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ *
+ */
+public class ScientificMatcher implements NumberParseMatcher {
+
+    private final String exponentSeparatorString;
+    private final DecimalMatcher exponentMatcher;
+
+    public static ScientificMatcher getInstance(DecimalFormatSymbols symbols, Grouper grouper) {
+        // TODO: Static-initialize most common instances?
+        return new ScientificMatcher(symbols, grouper);
+    }
+
+    private ScientificMatcher(DecimalFormatSymbols symbols, Grouper grouper) {
+        exponentSeparatorString = symbols.getExponentSeparator();
+        exponentMatcher = DecimalMatcher.getInstance(symbols,
+                grouper,
+                ParsingUtils.PARSE_FLAG_DECIMAL_SCIENTIFIC | ParsingUtils.PARSE_FLAG_INTEGER_ONLY);
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        // Only accept scientific notation after the mantissa.
+        if (!result.seenNumber()) {
+            return false;
+        }
+
+        // First match the scientific separator, and then match another number after it.
+        int overlap1 = segment.getCommonPrefixLength(exponentSeparatorString);
+        if (overlap1 == exponentSeparatorString.length()) {
+            // Full exponent separator match.
+
+            // First attempt to get a code point, returning true if we can't get one.
+            segment.adjustOffset(overlap1);
+            if (segment.length() == 0) {
+                return true;
+            }
+
+            // Allow a sign, and then try to match digits.
+            boolean minusSign = false;
+            if (segment.startsWith(UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.MINUS_SIGN))) {
+                minusSign = true;
+                segment.adjustOffsetByCodePoint();
+            } else if (segment.startsWith(UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.PLUS_SIGN))) {
+                segment.adjustOffsetByCodePoint();
+            }
+
+            int digitsOffset = segment.getOffset();
+            boolean digitsReturnValue = exponentMatcher.match(segment, result, minusSign);
+            if (segment.getOffset() != digitsOffset) {
+                // At least one exponent digit was matched.
+                result.flags |= ParsedNumber.FLAG_HAS_EXPONENT;
+            } else {
+                // No exponent digits were matched; un-match the exponent separator.
+                segment.adjustOffset(-overlap1);
+            }
+            return digitsReturnValue;
+
+        } else if (overlap1 == segment.length()) {
+            // Partial exponent separator match
+            return true;
+        }
+
+        // No match
+        return false;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        int leadCp = exponentSeparatorString.codePointAt(0);
+        UnicodeSet s = UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.SCIENTIFIC_LEAD);
+        if (s.contains(leadCp)) {
+            return s;
+        } else {
+            return new UnicodeSet().add(leadCp).freeze();
+        }
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    @Override
+    public String toString() {
+        return "<ScientificMatcher " + exponentSeparatorString + ">";
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/SeriesMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/SeriesMatcher.java
new file mode 100644
index 0000000..8c8c67f
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/SeriesMatcher.java
@@ -0,0 +1,114 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * Composes a number of matchers, running one after another. Matches the input string only if all of the
+ * matchers in the series succeed. Performs greedy matches within the context of the series.
+ *
+ * @author sffc
+ * @see AnyMatcher
+ */
+public class SeriesMatcher implements NumberParseMatcher {
+
+    protected List<NumberParseMatcher> matchers = null;
+    protected boolean frozen = false;
+
+    public void addMatcher(NumberParseMatcher matcher) {
+        assert !frozen;
+        if (matchers == null) {
+            matchers = new ArrayList<NumberParseMatcher>();
+        }
+        matchers.add(matcher);
+    }
+
+    public void freeze() {
+        frozen = true;
+    }
+
+    public int length() {
+        return matchers == null ? 0 : matchers.size();
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        assert frozen;
+        if (matchers == null) {
+            return false;
+        }
+
+        // TODO: Give a nice way to reset ParsedNumber to avoid the copy here.
+        ParsedNumber backup = new ParsedNumber();
+        backup.copyFrom(result);
+
+        int initialOffset = segment.getOffset();
+        boolean maybeMore = true;
+        for (int i = 0; i < matchers.size();) {
+            NumberParseMatcher matcher = matchers.get(i);
+            int matcherOffset = segment.getOffset();
+            if (segment.length() != 0) {
+                maybeMore = matcher.match(segment, result);
+            } else {
+                // Nothing for this matcher to match; ask for more.
+                maybeMore = true;
+            }
+
+            boolean success = (segment.getOffset() != matcherOffset);
+            boolean isFlexible = matcher instanceof NumberParseMatcher.Flexible;
+            if (success && isFlexible) {
+                // Match succeeded, and this is a flexible matcher. Re-run it.
+            } else if (success) {
+                // Match succeeded, and this is NOT a flexible matcher. Proceed to the next matcher.
+                i++;
+            } else if (isFlexible) {
+                // Match failed, and this is a flexible matcher. Try again with the next matcher.
+                i++;
+            } else {
+                // Match failed, and this is NOT a flexible matcher. Exit.
+                segment.setOffset(initialOffset);
+                result.copyFrom(backup);
+                return maybeMore;
+            }
+        }
+
+        // All matchers in the series succeeded.
+        return maybeMore;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        assert frozen;
+        if (matchers == null) {
+            return UnicodeSet.EMPTY;
+        }
+
+        // SeriesMatchers are never allowed to start with a Flexible matcher.
+        assert !(matchers.get(0) instanceof NumberParseMatcher.Flexible);
+        return matchers.get(0).getLeadCodePoints();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        assert frozen;
+        if (matchers == null) {
+            return;
+        }
+
+        for (int i = 0; i < matchers.size(); i++) {
+            NumberParseMatcher matcher = matchers.get(i);
+            matcher.postProcess(result);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "<SeriesMatcher " + matchers + ">";
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/SymbolMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/SymbolMatcher.java
new file mode 100644
index 0000000..77a5f8f
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/SymbolMatcher.java
@@ -0,0 +1,81 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * @author sffc
+ *
+ */
+public abstract class SymbolMatcher implements NumberParseMatcher {
+    protected final String string;
+    protected final UnicodeSet uniSet;
+
+    // TODO: Implement this class using only UnicodeSet and not String?
+    // How to deal with case folding?
+
+    protected SymbolMatcher(String symbolString, UnicodeSet symbolUniSet) {
+        string = symbolString;
+        uniSet = symbolUniSet;
+    }
+
+    protected SymbolMatcher(UnicodeSetStaticCache.Key key) {
+        string = "";
+        uniSet = UnicodeSetStaticCache.get(key);
+    }
+
+    public UnicodeSet getSet() {
+        return uniSet;
+    }
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        // Smoke test first; this matcher might be disabled.
+        if (isDisabled(result)) {
+            return false;
+        }
+
+        // Test the string first in order to consume trailing chars greedily.
+        int overlap = 0;
+        if (!string.isEmpty()) {
+            overlap = segment.getCommonPrefixLength(string);
+            if (overlap == string.length()) {
+                segment.adjustOffset(string.length());
+                accept(segment, result);
+                return false;
+            }
+        }
+
+        if (segment.startsWith(uniSet)) {
+            segment.adjustOffsetByCodePoint();
+            accept(segment, result);
+            return false;
+        }
+
+        return overlap == segment.length();
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        if (string.isEmpty()) {
+            // Assumption: for sets from UnicodeSetStaticCache, uniSet == leadCodePoints.
+            return uniSet;
+        }
+
+        UnicodeSet leadCodePoints = new UnicodeSet();
+        ParsingUtils.putLeadCodePoints(uniSet, leadCodePoints);
+        ParsingUtils.putLeadCodePoint(string, leadCodePoints);
+        return leadCodePoints.freeze();
+    }
+
+    @Override
+    public void postProcess(ParsedNumber result) {
+        // No-op
+    }
+
+    protected abstract boolean isDisabled(ParsedNumber result);
+
+    protected abstract void accept(StringSegment segment, ParsedNumber result);
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/UnicodeSetStaticCache.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/UnicodeSetStaticCache.java
new file mode 100644
index 0000000..d458f07
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/UnicodeSetStaticCache.java
@@ -0,0 +1,129 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import java.util.EnumMap;
+import java.util.Map;
+
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * This class statically initializes UnicodeSets useful for number parsing. Microbenchmarks show this to
+ * bring a very sizeable performance boost.
+ *
+ * IMPORTANT ASSUMPTION: All of the sets contain code points (no strings) and they are all case-folded.
+ * If this assumption were ever broken, logic in classes such as SymbolMatcher would need to be updated
+ * in order to return well-formed sets upon calls to getLeadCodePoints().
+ *
+ * @author sffc
+ */
+public class UnicodeSetStaticCache {
+    public static enum Key {
+        // Ignorables
+        BIDI,
+        WHITESPACE,
+        DEFAULT_IGNORABLES,
+        STRICT_IGNORABLES,
+
+        // Separators
+        // Notes:
+        // - COMMA is a superset of STRICT_COMMA
+        // - PERIOD is a superset of SCRICT_PERIOD
+        // - ALL_SEPARATORS is the union of COMMA, PERIOD, and OTHER_GROUPING_SEPARATORS
+        // - STRICT_ALL_SEPARATORS is the union of STRICT_COMMA, STRICT_PERIOD, and OTHER_GRP_SEPARATORS
+        COMMA,
+        PERIOD,
+        STRICT_COMMA,
+        STRICT_PERIOD,
+        OTHER_GROUPING_SEPARATORS,
+        ALL_SEPARATORS,
+        STRICT_ALL_SEPARATORS,
+
+        // Symbols
+        // TODO: NaN?
+        MINUS_SIGN,
+        PLUS_SIGN,
+        PERCENT_SIGN,
+        PERMILLE_SIGN,
+        INFINITY,
+
+        // Other
+        DIGITS,
+        NAN_LEAD,
+        SCIENTIFIC_LEAD,
+        CWCF, // TODO: Check if this is being used and remove it if not.
+
+        // Combined Separators with Digits (for lead code points)
+        DIGITS_OR_ALL_SEPARATORS,
+        DIGITS_OR_STRICT_ALL_SEPARATORS,
+    };
+
+    private static final Map<Key, UnicodeSet> unicodeSets = new EnumMap<Key, UnicodeSet>(Key.class);
+
+    public static UnicodeSet get(Key key) {
+        return unicodeSets.get(key);
+    }
+
+    public static Key chooseFrom(String str, Key key1) {
+        return get(key1).contains(str) ? key1 : null;
+    }
+
+    public static Key chooseFrom(String str, Key key1, Key key2) {
+        return get(key1).contains(str) ? key1 : chooseFrom(str, key2);
+    }
+
+    public static Key chooseFrom(String str, Key key1, Key key2, Key key3) {
+        return get(key1).contains(str) ? key1 : chooseFrom(str, key2, key3);
+    }
+
+    private static UnicodeSet computeUnion(Key k1, Key k2) {
+        return new UnicodeSet().addAll(get(k1)).addAll(get(k2)).freeze();
+    }
+
+    private static UnicodeSet computeUnion(Key k1, Key k2, Key k3) {
+        return new UnicodeSet().addAll(get(k1)).addAll(get(k2)).addAll(get(k3)).freeze();
+    }
+
+    static {
+        // BiDi characters are skipped over and ignored at any point in the string, even in strict mode.
+        unicodeSets.put(Key.BIDI, new UnicodeSet("[[\\u200E\\u200F\\u061C]]").freeze());
+
+        // This set was decided after discussion with icu-design@. See ticket #13309.
+        // Zs+TAB is "horizontal whitespace" according to UTS #18 (blank property).
+        unicodeSets.put(Key.WHITESPACE, new UnicodeSet("[[:Zs:][\\u0009]]").freeze());
+
+        unicodeSets.put(Key.DEFAULT_IGNORABLES, computeUnion(Key.BIDI, Key.WHITESPACE));
+        unicodeSets.put(Key.STRICT_IGNORABLES, get(Key.BIDI));
+
+        // TODO: Re-generate these sets from the UCD. They probably haven't been updated in a while.
+        unicodeSets.put(Key.COMMA, new UnicodeSet("[,،٫、︐︑﹐﹑,、]").freeze());
+        unicodeSets.put(Key.STRICT_COMMA, new UnicodeSet("[,٫︐﹐,]").freeze());
+        unicodeSets.put(Key.PERIOD, new UnicodeSet("[.․。︒﹒.。]").freeze());
+        unicodeSets.put(Key.STRICT_PERIOD, new UnicodeSet("[.․﹒.。]").freeze());
+        unicodeSets.put(Key.OTHER_GROUPING_SEPARATORS,
+                new UnicodeSet("['٬‘’'\\u0020\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]").freeze());
+        unicodeSets.put(Key.ALL_SEPARATORS,
+                computeUnion(Key.COMMA, Key.PERIOD, Key.OTHER_GROUPING_SEPARATORS));
+        unicodeSets.put(Key.STRICT_ALL_SEPARATORS,
+                computeUnion(Key.STRICT_COMMA, Key.STRICT_PERIOD, Key.OTHER_GROUPING_SEPARATORS));
+
+        unicodeSets.put(Key.MINUS_SIGN, new UnicodeSet("[-⁻₋−➖﹣-]").freeze());
+        unicodeSets.put(Key.PLUS_SIGN, new UnicodeSet("[+⁺₊➕﬩﹢+]").freeze());
+
+        // TODO: Fill in the next three sets.
+        unicodeSets.put(Key.PERCENT_SIGN, new UnicodeSet("[%٪]").freeze());
+        unicodeSets.put(Key.PERMILLE_SIGN, new UnicodeSet("[‰؉]").freeze());
+        unicodeSets.put(Key.INFINITY, new UnicodeSet("[∞]").freeze());
+
+        unicodeSets.put(Key.DIGITS, new UnicodeSet("[:digit:]").freeze());
+        unicodeSets.put(Key.NAN_LEAD,
+                new UnicodeSet("[NnТтmeՈոс¤НнчTtsҳ\u975e\u1002\u0e9a\u10d0\u0f68\u0644\u0646]")
+                        .freeze());
+        unicodeSets.put(Key.SCIENTIFIC_LEAD, new UnicodeSet("[Ee×·е\u0627]").freeze());
+        unicodeSets.put(Key.CWCF, new UnicodeSet("[:CWCF:]").freeze());
+
+        unicodeSets.put(Key.DIGITS_OR_ALL_SEPARATORS, computeUnion(Key.DIGITS, Key.ALL_SEPARATORS));
+        unicodeSets.put(Key.DIGITS_OR_STRICT_ALL_SEPARATORS,
+                computeUnion(Key.DIGITS, Key.STRICT_ALL_SEPARATORS));
+    }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ValidationMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ValidationMatcher.java
new file mode 100644
index 0000000..913dcf8
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/ValidationMatcher.java
@@ -0,0 +1,23 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.text.UnicodeSet;
+
+/**
+ * A Matcher used only for post-process validation, not for consuming characters at runtime.
+ */
+public abstract class ValidationMatcher implements NumberParseMatcher {
+
+    @Override
+    public boolean match(StringSegment segment, ParsedNumber result) {
+        return false;
+    }
+
+    @Override
+    public UnicodeSet getLeadCodePoints() {
+        return UnicodeSet.EMPTY;
+    }
+
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/lang/UCharacter.java b/icu4j/main/classes/core/src/com/ibm/icu/lang/UCharacter.java
index be1545a..0adc58a 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/lang/UCharacter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/lang/UCharacter.java
@@ -146,7 +146,7 @@
  * Comparison:<ul>
  * <li> isUWhiteSpace=UCHAR_WHITE_SPACE: Unicode White_Space property;
  *       most of general categories "Z" (separators) + most whitespace ISO controls
- *       (including no-break spaces, but excluding IS1..IS4 and ZWSP)
+ *       (including no-break spaces, but excluding IS1..IS4)
  * <li> isWhitespace: Java isWhitespace; Z + whitespace ISO controls but excluding no-break spaces
  * <li> isSpaceChar: just Z (including no-break spaces)</ul>
  *
@@ -5124,37 +5124,6 @@
     }
 
     /**
-     * Return a string with just the first word titlecased, for menus and UI, etc. This does not affect most of the string,
-     * and sometimes has no effect at all; the original string is returned whenever casing
-     * would not be appropriate for the first word (such as for CJK characters or initial numbers).
-     * Initial non-letters are skipped in order to find the character to change.
-     * Characters past the first affected are left untouched: see also TITLECASE_NO_LOWERCASE.
-     * <p>Examples:
-     * <table border='1'><tr><th>Source</th><th>Result</th><th>Locale</th></tr>
-     * <tr><td>anglo-American locale</td><td>Anglo-American locale</td></tr>
-     * <tr><td>“contact us”</td><td>“Contact us”</td></tr>
-     * <tr><td>49ers win!</td><td>49ers win!</td></tr>
-     * <tr><td>丰(abc)</td><td>丰(abc)</td></tr>
-     * <tr><td>«ijs»</td><td>«Ijs»</td></tr>
-     * <tr><td>«ijs»</td><td>«IJs»</td><td>nl-BE</td></tr>
-     * <tr><td>«ijs»</td><td>«İjs»</td><td>tr-DE</td></tr>
-     * </table>
-     * @param locale the locale for accessing exceptional behavior (eg for tr).
-     * @param str the source string to change
-     * @return the modified string, or the original if no modifications were necessary.
-     * @internal
-     * @deprecated ICU internal only
-     */
-    @Deprecated
-    public static String toTitleFirst(ULocale locale, String str) {
-        // TODO: Remove this function. Inline it where it is called in CLDR.
-        return TO_TITLE_WHOLE_STRING_NO_LOWERCASE.apply(locale.toLocale(), null, str);
-    }
-
-    private static final com.ibm.icu.text.CaseMap.Title TO_TITLE_WHOLE_STRING_NO_LOWERCASE =
-            com.ibm.icu.text.CaseMap.toTitle().wholeString().noLowercase();
-
-    /**
      * {@icu} <p>Returns the titlecase version of the argument string.
      * <p>Position for titlecasing is determined by the argument break
      * iterator, hence the user can customize his break iterator for
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/CompactNotation.java b/icu4j/main/classes/core/src/com/ibm/icu/number/CompactNotation.java
index f9a3835..5219f00 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/CompactNotation.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/CompactNotation.java
@@ -10,6 +10,7 @@
 import com.ibm.icu.impl.StandardPlural;
 import com.ibm.icu.impl.number.CompactData;
 import com.ibm.icu.impl.number.CompactData.CompactType;
+import com.ibm.icu.impl.number.DecimalFormatProperties;
 import com.ibm.icu.impl.number.DecimalQuantity;
 import com.ibm.icu.impl.number.MicroProps;
 import com.ibm.icu.impl.number.MicroPropsGenerator;
@@ -21,13 +22,13 @@
 import com.ibm.icu.text.PluralRules;
 import com.ibm.icu.util.ULocale;
 
-
 /**
- * A class that defines the scientific notation style to be used when formatting numbers in NumberFormatter.
+ * A class that defines the scientific notation style to be used when formatting numbers in
+ * NumberFormatter.
  *
  * <p>
- * This class exposes no public functionality. To create a CompactNotation, use one of the factory methods in
- * {@link Notation}.
+ * This class exposes no public functionality. To create a CompactNotation, use one of the factory
+ * methods in {@link Notation}.
  *
  * @draft ICU 60
  * @provisional This API might change or be removed in a future release.
@@ -38,6 +39,17 @@
     final CompactStyle compactStyle;
     final Map<String, Map<String, String>> compactCustomData;
 
+    /**
+     * Create a compact notation with custom data.
+     * @internal
+     * @deprecated This API is ICU internal only.
+     * @see DecimalFormatProperties#setCompactCustomData
+     */
+    @Deprecated
+    public static CompactNotation forCustomData(Map<String, Map<String, String>> compactCustomData) {
+        return new CompactNotation(compactCustomData);
+    }
+
     /* package-private */ CompactNotation(CompactStyle compactStyle) {
         compactCustomData = null;
         this.compactStyle = compactStyle;
@@ -48,26 +60,32 @@
         this.compactCustomData = compactCustomData;
     }
 
-    /* package-private */ MicroPropsGenerator withLocaleData(ULocale locale, String nsName, CompactType compactType,
-            PluralRules rules, MutablePatternModifier buildReference, MicroPropsGenerator parent) {
+    /* package-private */ MicroPropsGenerator withLocaleData(
+            ULocale locale,
+            String nsName,
+            CompactType compactType,
+            PluralRules rules,
+            MutablePatternModifier buildReference,
+            MicroPropsGenerator parent) {
         // TODO: Add a data cache? It would be keyed by locale, nsName, compact type, and compact style.
         return new CompactHandler(this, locale, nsName, compactType, rules, buildReference, parent);
     }
 
     private static class CompactHandler implements MicroPropsGenerator {
 
-        private static class CompactModInfo {
-            public ImmutablePatternModifier mod;
-            public int numDigits;
-        }
-
         final PluralRules rules;
         final MicroPropsGenerator parent;
-        final Map<String, CompactModInfo> precomputedMods;
+        final Map<String, ImmutablePatternModifier> precomputedMods;
         final CompactData data;
 
-        private CompactHandler(CompactNotation notation, ULocale locale, String nsName, CompactType compactType,
-                PluralRules rules, MutablePatternModifier buildReference, MicroPropsGenerator parent) {
+        private CompactHandler(
+                CompactNotation notation,
+                ULocale locale,
+                String nsName,
+                CompactType compactType,
+                PluralRules rules,
+                MutablePatternModifier buildReference,
+                MicroPropsGenerator parent) {
             this.rules = rules;
             this.parent = parent;
             this.data = new CompactData();
@@ -78,7 +96,7 @@
             }
             if (buildReference != null) {
                 // Safe code path
-                precomputedMods = new HashMap<String, CompactModInfo>();
+                precomputedMods = new HashMap<String, ImmutablePatternModifier>();
                 precomputeAllModifiers(buildReference);
             } else {
                 // Unsafe code path
@@ -92,12 +110,9 @@
             data.getUniquePatterns(allPatterns);
 
             for (String patternString : allPatterns) {
-                CompactModInfo info = new CompactModInfo();
                 ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(patternString);
                 buildReference.setPatternInfo(patternInfo);
-                info.mod = buildReference.createImmutable();
-                info.numDigits = patternInfo.positive.integerTotal;
-                precomputedMods.put(patternString, info);
+                precomputedMods.put(patternString, buildReference.createImmutable());
             }
         }
 
@@ -120,28 +135,22 @@
 
             StandardPlural plural = quantity.getStandardPlural(rules);
             String patternString = data.getPattern(magnitude, plural);
-            @SuppressWarnings("unused") // see #13075
-            int numDigits = -1;
             if (patternString == null) {
                 // Use the default (non-compact) modifier.
                 // No need to take any action.
             } else if (precomputedMods != null) {
                 // Safe code path.
                 // Java uses a hash set here for O(1) lookup. C++ uses a linear search.
-                CompactModInfo info = precomputedMods.get(patternString);
-                info.mod.applyToMicros(micros, quantity);
-                numDigits = info.numDigits;
+                ImmutablePatternModifier mod = precomputedMods.get(patternString);
+                mod.applyToMicros(micros, quantity);
             } else {
                 // Unsafe code path.
                 // Overwrite the PatternInfo in the existing modMiddle.
                 assert micros.modMiddle instanceof MutablePatternModifier;
                 ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(patternString);
                 ((MutablePatternModifier) micros.modMiddle).setPatternInfo(patternInfo);
-                numDigits = patternInfo.positive.integerTotal;
             }
 
-            // FIXME: Deal with numDigits == 0 (Awaiting a test case)
-
             // We already performed rounding. Do not perform it again.
             micros.rounding = Rounder.constructPassThrough();
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/CurrencyRounder.java b/icu4j/main/classes/core/src/com/ibm/icu/number/CurrencyRounder.java
index 97e3631..dd0d0f0 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/CurrencyRounder.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/CurrencyRounder.java
@@ -5,8 +5,8 @@
 import com.ibm.icu.util.Currency;
 
 /**
- * A class that defines a rounding strategy parameterized by a currency to be used when formatting numbers in
- * NumberFormatter.
+ * A class that defines a rounding strategy parameterized by a currency to be used when formatting
+ * numbers in NumberFormatter.
  *
  * <p>
  * To create a CurrencyRounder, use one of the factory methods on Rounder.
@@ -24,13 +24,13 @@
      * Associates a currency with this rounding strategy.
      *
      * <p>
-     * <strong>Calling this method is <em>not required</em></strong>, because the currency specified in unit() or via a
-     * CurrencyAmount passed into format(Measure) is automatically applied to currency rounding strategies. However,
-     * this method enables you to override that automatic association.
+     * <strong>Calling this method is <em>not required</em></strong>, because the currency specified in
+     * unit() or via a CurrencyAmount passed into format(Measure) is automatically applied to currency
+     * rounding strategies. However, this method enables you to override that automatic association.
      *
      * <p>
-     * This method also enables numbers to be formatted using currency rounding rules without explicitly using a
-     * currency format.
+     * This method also enables numbers to be formatted using currency rounding rules without explicitly
+     * using a currency format.
      *
      * @param currency
      *            The currency to associate with this rounding strategy.
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/FormattedNumber.java b/icu4j/main/classes/core/src/com/ibm/icu/number/FormattedNumber.java
index cec506f..b267fd2 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/FormattedNumber.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/FormattedNumber.java
@@ -15,8 +15,8 @@
 import com.ibm.icu.util.ICUUncheckedIOException;
 
 /**
- * The result of a number formatting operation. This class allows the result to be exported in several data types,
- * including a String, an AttributedCharacterIterator, and a BigDecimal.
+ * The result of a number formatting operation. This class allows the result to be exported in several
+ * data types, including a String, an AttributedCharacterIterator, and a BigDecimal.
  *
  * @draft ICU 60
  * @provisional This API might change or be removed in a future release.
@@ -47,12 +47,12 @@
     }
 
     /**
-     * Append the formatted number to an Appendable, such as a StringBuilder. This may be slightly more efficient than
-     * creating a String.
+     * Append the formatted number to an Appendable, such as a StringBuilder. This may be slightly more
+     * efficient than creating a String.
      *
      * <p>
-     * If an IOException occurs when appending to the Appendable, an unchecked {@link ICUUncheckedIOException} is thrown
-     * instead.
+     * If an IOException occurs when appending to the Appendable, an unchecked
+     * {@link ICUUncheckedIOException} is thrown instead.
      *
      * @param appendable
      *            The Appendable to which to append the formatted number string.
@@ -73,16 +73,18 @@
     }
 
     /**
-     * Determine the start and end indices of the first occurrence of the given <em>field</em> in the output string.
-     * This allows you to determine the locations of the integer part, fraction part, and sign.
+     * Determine the start and end indices of the first occurrence of the given <em>field</em> in the
+     * output string. This allows you to determine the locations of the integer part, fraction part, and
+     * sign.
      *
      * <p>
-     * If multiple different field attributes are needed, this method can be called repeatedly, or if <em>all</em> field
-     * attributes are needed, consider using getFieldIterator().
+     * If multiple different field attributes are needed, this method can be called repeatedly, or if
+     * <em>all</em> field attributes are needed, consider using getFieldIterator().
      *
      * <p>
-     * If a field occurs multiple times in an output string, such as a grouping separator, this method will only ever
-     * return the first occurrence. Use getFieldIterator() to access all occurrences of an attribute.
+     * If a field occurs multiple times in an output string, such as a grouping separator, this method
+     * will only ever return the first occurrence. Use getFieldIterator() to access all occurrences of an
+     * attribute.
      *
      * @param fieldPosition
      *            The FieldPosition to populate with the start and end indices of the desired field.
@@ -106,13 +108,15 @@
     }
 
     /**
-     * Export the formatted number as an AttributedCharacterIterator. This allows you to determine which characters in
-     * the output string correspond to which <em>fields</em>, such as the integer part, fraction part, and sign.
+     * Export the formatted number as an AttributedCharacterIterator. This allows you to determine which
+     * characters in the output string correspond to which <em>fields</em>, such as the integer part,
+     * fraction part, and sign.
      *
      * <p>
      * If information on only one field is needed, consider using populateFieldPosition() instead.
      *
-     * @return An AttributedCharacterIterator, containing information on the field attributes of the number string.
+     * @return An AttributedCharacterIterator, containing information on the field attributes of the
+     *         number string.
      * @draft ICU 60
      * @provisional This API might change or be removed in a future release.
      * @see com.ibm.icu.text.NumberFormat.Field
@@ -124,8 +128,9 @@
     }
 
     /**
-     * Export the formatted number as a BigDecimal. This endpoint is useful for obtaining the exact number being printed
-     * after scaling and rounding have been applied by the number formatting pipeline.
+     * Export the formatted number as a BigDecimal. This endpoint is useful for obtaining the exact
+     * number being printed after scaling and rounding have been applied by the number formatting
+     * pipeline.
      *
      * @return A BigDecimal representation of the formatted number.
      * @draft ICU 60
@@ -138,31 +143,29 @@
 
     /**
      * @internal
-     * @deprecated This API is ICU internal only.
+     * @deprecated This API is ICU internal only. Use {@link #populateFieldPosition} or
+     *             {@link #getFieldIterator} for similar functionality.
      */
     @Deprecated
     public String getPrefix() {
         NumberStringBuilder temp = new NumberStringBuilder();
-        int length = micros.modOuter.apply(temp, 0, 0);
-        length += micros.modMiddle.apply(temp, 0, length);
-        /* length += */ micros.modInner.apply(temp, 0, length);
-        int prefixLength = micros.modOuter.getPrefixLength() + micros.modMiddle.getPrefixLength()
-                + micros.modInner.getPrefixLength();
+        // #13453: DecimalFormat wants the affixes from the pattern only (modMiddle).
+        micros.modMiddle.apply(temp, 0, 0);
+        int prefixLength = micros.modMiddle.getPrefixLength();
         return temp.subSequence(0, prefixLength).toString();
     }
 
     /**
      * @internal
-     * @deprecated This API is ICU internal only.
+     * @deprecated This API is ICU internal only. Use {@link #populateFieldPosition} or
+     *             {@link #getFieldIterator} for similar functionality.
      */
     @Deprecated
     public String getSuffix() {
         NumberStringBuilder temp = new NumberStringBuilder();
-        int length = micros.modOuter.apply(temp, 0, 0);
-        length += micros.modMiddle.apply(temp, 0, length);
-        length += micros.modInner.apply(temp, 0, length);
-        int prefixLength = micros.modOuter.getPrefixLength() + micros.modMiddle.getPrefixLength()
-                + micros.modInner.getPrefixLength();
+        // #13453: DecimalFormat wants the affixes from the pattern only (modMiddle).
+        int length = micros.modMiddle.apply(temp, 0, 0);
+        int prefixLength = micros.modMiddle.getPrefixLength();
         return temp.subSequence(prefixLength, length).toString();
     }
 
@@ -185,7 +188,9 @@
     public int hashCode() {
         // NumberStringBuilder and BigDecimal are mutable, so we can't call
         // #equals() or #hashCode() on them directly.
-        return Arrays.hashCode(nsb.toCharArray()) ^ Arrays.hashCode(nsb.toFieldArray()) ^ fq.toBigDecimal().hashCode();
+        return Arrays.hashCode(nsb.toCharArray())
+                ^ Arrays.hashCode(nsb.toFieldArray())
+                ^ fq.toBigDecimal().hashCode();
     }
 
     /**
@@ -206,7 +211,7 @@
         // #equals() or #hashCode() on them directly.
         FormattedNumber _other = (FormattedNumber) other;
         return Arrays.equals(nsb.toCharArray(), _other.nsb.toCharArray())
-                ^ Arrays.equals(nsb.toFieldArray(), _other.nsb.toFieldArray())
-                ^ fq.toBigDecimal().equals(_other.fq.toBigDecimal());
+                && Arrays.equals(nsb.toFieldArray(), _other.nsb.toFieldArray())
+                && fq.toBigDecimal().equals(_other.fq.toBigDecimal());
     }
 }
\ No newline at end of file
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/FractionRounder.java b/icu4j/main/classes/core/src/com/ibm/icu/number/FractionRounder.java
index 5662e36..61ed736 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/FractionRounder.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/FractionRounder.java
@@ -5,8 +5,8 @@
 import com.ibm.icu.impl.number.RoundingUtils;
 
 /**
- * A class that defines a rounding strategy based on a number of fraction places and optionally significant digits to be
- * used when formatting numbers in NumberFormatter.
+ * A class that defines a rounding strategy based on a number of fraction places and optionally
+ * significant digits to be used when formatting numbers in NumberFormatter.
  *
  * <p>
  * To create a FractionRounder, use one of the factory methods on Rounder.
@@ -21,15 +21,16 @@
     }
 
     /**
-     * Ensure that no less than this number of significant digits are retained when rounding according to fraction
-     * rules.
+     * Ensure that no less than this number of significant digits are retained when rounding according to
+     * fraction rules.
      *
      * <p>
-     * For example, with integer rounding, the number 3.141 becomes "3". However, with minimum figures set to 2, 3.141
-     * becomes "3.1" instead.
+     * For example, with integer rounding, the number 3.141 becomes "3". However, with minimum figures
+     * set to 2, 3.141 becomes "3.1" instead.
      *
      * <p>
-     * This setting does not affect the number of trailing zeros. For example, 3.01 would print as "3", not "3.0".
+     * This setting does not affect the number of trailing zeros. For example, 3.01 would print as "3",
+     * not "3.0".
      *
      * @param minSignificantDigits
      *            The number of significant figures to guarantee.
@@ -39,25 +40,26 @@
      * @see NumberFormatter
      */
     public Rounder withMinDigits(int minSignificantDigits) {
-        if (minSignificantDigits > 0 && minSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (minSignificantDigits >= 1 && minSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructFractionSignificant(this, minSignificantDigits, -1);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Ensure that no more than this number of significant digits are retained when rounding according to fraction
-     * rules.
+     * Ensure that no more than this number of significant digits are retained when rounding according to
+     * fraction rules.
      *
      * <p>
-     * For example, with integer rounding, the number 123.4 becomes "123". However, with maximum figures set to 2, 123.4
-     * becomes "120" instead.
+     * For example, with integer rounding, the number 123.4 becomes "123". However, with maximum figures
+     * set to 2, 123.4 becomes "120" instead.
      *
      * <p>
-     * This setting does not affect the number of trailing zeros. For example, with fixed fraction of 2, 123.4 would
-     * become "120.00".
+     * This setting does not affect the number of trailing zeros. For example, with fixed fraction of 2,
+     * 123.4 would become "120.00".
      *
      * @param maxSignificantDigits
      *            Round the number to no more than this number of significant figures.
@@ -67,11 +69,12 @@
      * @see NumberFormatter
      */
     public Rounder withMaxDigits(int maxSignificantDigits) {
-        if (maxSignificantDigits > 0 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (maxSignificantDigits >= 1 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructFractionSignificant(this, -1, maxSignificantDigits);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 }
\ No newline at end of file
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/Grouper.java b/icu4j/main/classes/core/src/com/ibm/icu/number/Grouper.java
deleted file mode 100644
index 6d1c193..0000000
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/Grouper.java
+++ /dev/null
@@ -1,114 +0,0 @@
-// © 2017 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html#License
-package com.ibm.icu.number;
-
-import com.ibm.icu.impl.number.DecimalQuantity;
-import com.ibm.icu.impl.number.PatternStringParser.ParsedPatternInfo;
-
-/**
- * @internal
- * @deprecated This API is a technical preview. It is likely to change in an upcoming release.
- */
-@Deprecated
-public class Grouper {
-
-    // Conveniences for Java handling of bytes
-    private static final byte N2 = -2;
-    private static final byte N1 = -1;
-    private static final byte B2 = 2;
-    private static final byte B3 = 3;
-
-    private static final Grouper DEFAULTS = new Grouper(N2, N2, false);
-    private static final Grouper MIN2 = new Grouper(N2, N2, true);
-    private static final Grouper NONE = new Grouper(N1, N1, false);
-
-    private final byte grouping1; // -2 means "needs locale data"; -1 means "no grouping"
-    private final byte grouping2;
-    private final boolean min2;
-
-    private Grouper(byte grouping1, byte grouping2, boolean min2) {
-        this.grouping1 = grouping1;
-        this.grouping2 = grouping2;
-        this.min2 = min2;
-    }
-
-    /**
-     * @internal
-     * @deprecated This API is a technical preview. It is likely to change in an upcoming release.
-     */
-    @Deprecated
-    public static Grouper defaults() {
-        return DEFAULTS;
-    }
-
-    /**
-     * @internal
-     * @deprecated This API is a technical preview. It is likely to change in an upcoming release.
-     */
-    @Deprecated
-    public static Grouper minTwoDigits() {
-        return MIN2;
-    }
-
-    /**
-     * @internal
-     * @deprecated This API is a technical preview. It is likely to change in an upcoming release.
-     */
-    @Deprecated
-    public static Grouper none() {
-        return NONE;
-    }
-
-    //////////////////////////
-    // PACKAGE-PRIVATE APIS //
-    //////////////////////////
-
-    private static final Grouper GROUPING_3 = new Grouper(B3, B3, false);
-    private static final Grouper GROUPING_3_2 = new Grouper(B3, B2, false);
-    private static final Grouper GROUPING_3_MIN2 = new Grouper(B3, B3, true);
-    private static final Grouper GROUPING_3_2_MIN2 = new Grouper(B3, B2, true);
-
-    static Grouper getInstance(byte grouping1, byte grouping2, boolean min2) {
-        if (grouping1 == -1) {
-            return NONE;
-        } else if (!min2 && grouping1 == 3 && grouping2 == 3) {
-            return GROUPING_3;
-        } else if (!min2 && grouping1 == 3 && grouping2 == 2) {
-            return GROUPING_3_2;
-        } else if (min2 && grouping1 == 3 && grouping2 == 3) {
-            return GROUPING_3_MIN2;
-        } else if (min2 && grouping1 == 3 && grouping2 == 2) {
-            return GROUPING_3_2_MIN2;
-        } else {
-            return new Grouper(grouping1, grouping2, min2);
-        }
-    }
-
-    Grouper withLocaleData(ParsedPatternInfo patternInfo) {
-        if (grouping1 != -2) {
-            return this;
-        }
-        // TODO: short or byte?
-        byte grouping1 = (byte) (patternInfo.positive.groupingSizes & 0xffff);
-        byte grouping2 = (byte) ((patternInfo.positive.groupingSizes >>> 16) & 0xffff);
-        byte grouping3 = (byte) ((patternInfo.positive.groupingSizes >>> 32) & 0xffff);
-        if (grouping2 == -1) {
-            grouping1 = -1;
-        }
-        if (grouping3 == -1) {
-            grouping2 = grouping1;
-        }
-        return getInstance(grouping1, grouping2, min2);
-    }
-
-    boolean groupAtPosition(int position, DecimalQuantity value) {
-        assert grouping1 != -2;
-        if (grouping1 == -1 || grouping1 == 0) {
-            // Either -1 or 0 means "no grouping"
-            return false;
-        }
-        position -= grouping1;
-        return position >= 0 && (position % grouping2) == 0
-                && value.getUpperDisplayMagnitude() - grouping1 + 1 >= (min2 ? 2 : 1);
-    }
-}
\ No newline at end of file
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/IntegerWidth.java b/icu4j/main/classes/core/src/com/ibm/icu/number/IntegerWidth.java
index 90fe0dc..db59f23 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/IntegerWidth.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/IntegerWidth.java
@@ -27,7 +27,8 @@
     }
 
     /**
-     * Pad numbers at the beginning with zeros to guarantee a certain number of numerals before the decimal separator.
+     * Pad numbers at the beginning with zeros to guarantee a certain number of numerals before the
+     * decimal separator.
      *
      * <p>
      * For example, with minInt=3, the number 55 will get printed as "055".
@@ -42,11 +43,12 @@
     public static IntegerWidth zeroFillTo(int minInt) {
         if (minInt == 1) {
             return DEFAULT;
-        } else if (minInt >= 0 && minInt < RoundingUtils.MAX_INT_FRAC_SIG) {
+        } else if (minInt >= 0 && minInt <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return new IntegerWidth(minInt, -1);
         } else {
-            throw new IllegalArgumentException(
-                    "Integer digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Integer digits must be between 0 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
@@ -56,7 +58,8 @@
      * For example, with maxInt=3, the number 1234 will get printed as "234".
      *
      * @param maxInt
-     *            The maximum number of places before the decimal separator.
+     *            The maximum number of places before the decimal separator. maxInt == -1 means no
+     *            truncation.
      * @return An IntegerWidth for passing to the NumberFormatter integerWidth() setter.
      * @draft ICU 60
      * @provisional This API might change or be removed in a future release.
@@ -65,13 +68,14 @@
     public IntegerWidth truncateAt(int maxInt) {
         if (maxInt == this.maxInt) {
             return this;
-        } else if (maxInt >= 0 && maxInt < RoundingUtils.MAX_INT_FRAC_SIG) {
+        } else if (maxInt >= 0 && maxInt <= RoundingUtils.MAX_INT_FRAC_SIG && maxInt >= minInt) {
             return new IntegerWidth(minInt, maxInt);
         } else if (maxInt == -1) {
-            return new IntegerWidth(minInt, maxInt);
+            return new IntegerWidth(minInt, -1);
         } else {
-            throw new IllegalArgumentException(
-                    "Integer digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Integer digits must be between -1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 }
\ No newline at end of file
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/LocalizedNumberFormatter.java b/icu4j/main/classes/core/src/com/ibm/icu/number/LocalizedNumberFormatter.java
index 3be9101..f614d1d 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/LocalizedNumberFormatter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/LocalizedNumberFormatter.java
@@ -38,8 +38,8 @@
     }
 
     /**
-     * Format the given byte, short, int, or long to a string using the settings specified in the NumberFormatter fluent
-     * setting chain.
+     * Format the given byte, short, int, or long to a string using the settings specified in the
+     * NumberFormatter fluent setting chain.
      *
      * @param input
      *            The number to format.
@@ -53,8 +53,8 @@
     }
 
     /**
-     * Format the given float or double to a string using the settings specified in the NumberFormatter fluent setting
-     * chain.
+     * Format the given float or double to a string using the settings specified in the NumberFormatter
+     * fluent setting chain.
      *
      * @param input
      *            The number to format.
@@ -68,8 +68,8 @@
     }
 
     /**
-     * Format the given {@link BigInteger}, {@link BigDecimal}, or other {@link Number} to a string using the settings
-     * specified in the NumberFormatter fluent setting chain.
+     * Format the given {@link BigInteger}, {@link BigDecimal}, or other {@link Number} to a string using
+     * the settings specified in the NumberFormatter fluent setting chain.
      *
      * @param input
      *            The number to format.
@@ -83,12 +83,12 @@
     }
 
     /**
-     * Format the given {@link Measure} or {@link CurrencyAmount} to a string using the settings specified in the
-     * NumberFormatter fluent setting chain.
+     * Format the given {@link Measure} or {@link CurrencyAmount} to a string using the settings
+     * specified in the NumberFormatter fluent setting chain.
      *
      * <p>
-     * The unit specified here overrides any unit that may have been specified in the setter chain. This method is
-     * intended for cases when each input to the number formatter has a different unit.
+     * The unit specified here overrides any unit that may have been specified in the setter chain. This
+     * method is intended for cases when each input to the number formatter has a different unit.
      *
      * @param input
      *            The number to format.
@@ -115,8 +115,9 @@
     }
 
     /**
-     * This is the core entrypoint to the number formatting pipeline. It performs self-regulation: a static code path
-     * for the first few calls, and compiling a more efficient data structure if called repeatedly.
+     * This is the core entrypoint to the number formatting pipeline. It performs self-regulation: a
+     * static code path for the first few calls, and compiling a more efficient data structure if called
+     * repeatedly.
      *
      * <p>
      * This function is very hot, being called in every call to the number formatting pipeline.
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/Notation.java b/icu4j/main/classes/core/src/com/ibm/icu/number/Notation.java
index c1ec6c9..409a4e9 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/Notation.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/Notation.java
@@ -15,8 +15,14 @@
 public class Notation {
 
     // TODO: Support engineering intervals other than 3?
-    private static final ScientificNotation SCIENTIFIC = new ScientificNotation(1, false, 1, SignDisplay.AUTO);
-    private static final ScientificNotation ENGINEERING = new ScientificNotation(3, false, 1, SignDisplay.AUTO);
+    private static final ScientificNotation SCIENTIFIC = new ScientificNotation(1,
+            false,
+            1,
+            SignDisplay.AUTO);
+    private static final ScientificNotation ENGINEERING = new ScientificNotation(3,
+            false,
+            1,
+            SignDisplay.AUTO);
     private static final CompactNotation COMPACT_SHORT = new CompactNotation(CompactStyle.SHORT);
     private static final CompactNotation COMPACT_LONG = new CompactNotation(CompactStyle.LONG);
     private static final SimpleNotation SIMPLE = new SimpleNotation();
@@ -25,10 +31,11 @@
     }
 
     /**
-     * Print the number using scientific notation (also known as scientific form, standard index form, or standard form
-     * in the UK). The format for scientific notation varies by locale; for example, many Western locales display the
-     * number in the form "#E0", where the number is displayed with one digit before the decimal separator, zero or more
-     * digits after the decimal separator, and the corresponding power of 10 displayed after the "E".
+     * Print the number using scientific notation (also known as scientific form, standard index form, or
+     * standard form in the UK). The format for scientific notation varies by locale; for example, many
+     * Western locales display the number in the form "#E0", where the number is displayed with one digit
+     * before the decimal separator, zero or more digits after the decimal separator, and the
+     * corresponding power of 10 displayed after the "E".
      *
      * <p>
      * Example outputs in <em>en-US</em> when printing 8.765E4 through 8.765E-3:
@@ -55,8 +62,8 @@
     }
 
     /**
-     * Print the number using engineering notation, a variant of scientific notation in which the exponent must be
-     * divisible by 3.
+     * Print the number using engineering notation, a variant of scientific notation in which the
+     * exponent must be divisible by 3.
      *
      * <p>
      * Example outputs in <em>en-US</em> when printing 8.765E4 through 8.765E-3:
@@ -86,18 +93,18 @@
      * Print the number using short-form compact notation.
      *
      * <p>
-     * <em>Compact notation</em>, defined in Unicode Technical Standard #35 Part 3 Section 2.4.1, prints numbers with
-     * localized prefixes or suffixes corresponding to different powers of ten. Compact notation is similar to
-     * engineering notation in how it scales numbers.
+     * <em>Compact notation</em>, defined in Unicode Technical Standard #35 Part 3 Section 2.4.1, prints
+     * numbers with localized prefixes or suffixes corresponding to different powers of ten. Compact
+     * notation is similar to engineering notation in how it scales numbers.
      *
      * <p>
-     * Compact notation is ideal for displaying large numbers (over ~1000) to humans while at the same time minimizing
-     * screen real estate.
+     * Compact notation is ideal for displaying large numbers (over ~1000) to humans while at the same
+     * time minimizing screen real estate.
      *
      * <p>
-     * In short form, the powers of ten are abbreviated. In <em>en-US</em>, the abbreviations are "K" for thousands, "M"
-     * for millions, "B" for billions, and "T" for trillions. Example outputs in <em>en-US</em> when printing 8.765E7
-     * through 8.765E0:
+     * In short form, the powers of ten are abbreviated. In <em>en-US</em>, the abbreviations are "K" for
+     * thousands, "M" for millions, "B" for billions, and "T" for trillions. Example outputs in
+     * <em>en-US</em> when printing 8.765E7 through 8.765E0:
      *
      * <pre>
      * 88M
@@ -111,10 +118,10 @@
      * </pre>
      *
      * <p>
-     * When compact notation is specified without an explicit rounding strategy, numbers are rounded off to the closest
-     * integer after scaling the number by the corresponding power of 10, but with a digit shown after the decimal
-     * separator if there is only one digit before the decimal separator. The default compact notation rounding strategy
-     * is equivalent to:
+     * When compact notation is specified without an explicit rounding strategy, numbers are rounded off
+     * to the closest integer after scaling the number by the corresponding power of 10, but with a digit
+     * shown after the decimal separator if there is only one digit before the decimal separator. The
+     * default compact notation rounding strategy is equivalent to:
      *
      * <pre>
      * Rounder.integer().withMinDigits(2)
@@ -134,8 +141,8 @@
      * {@link #compactShort}.
      *
      * <p>
-     * In long form, the powers of ten are spelled out fully. Example outputs in <em>en-US</em> when printing 8.765E7
-     * through 8.765E0:
+     * In long form, the powers of ten are spelled out fully. Example outputs in <em>en-US</em> when
+     * printing 8.765E7 through 8.765E0:
      *
      * <pre>
      * 88 million
@@ -158,11 +165,12 @@
     }
 
     /**
-     * Print the number using simple notation without any scaling by powers of ten. This is the default behavior.
+     * Print the number using simple notation without any scaling by powers of ten. This is the default
+     * behavior.
      *
      * <p>
-     * Since this is the default behavior, this method needs to be called only when it is necessary to override a
-     * previous setting.
+     * Since this is the default behavior, this method needs to be called only when it is necessary to
+     * override a previous setting.
      *
      * <p>
      * Example outputs in <em>en-US</em> when printing 8.765E7 through 8.765E0:
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatter.java b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatter.java
index 2b788a4..dd7651b 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatter.java
@@ -10,7 +10,8 @@
 import com.ibm.icu.util.ULocale;
 
 /**
- * The main entrypoint to the localized number formatting library introduced in ICU 60. Basic usage examples:
+ * The main entrypoint to the localized number formatting library introduced in ICU 60. Basic usage
+ * examples:
  *
  * <pre>
  * // Most basic usage:
@@ -39,21 +40,25 @@
  * </pre>
  *
  * <p>
- * This API offers more features than {@link com.ibm.icu.text.DecimalFormat} and is geared toward new users of ICU.
+ * This API offers more features than {@link com.ibm.icu.text.DecimalFormat} and is geared toward new
+ * users of ICU.
  *
  * <p>
- * NumberFormatter instances are immutable and thread safe. This means that invoking a configuration method has no
- * effect on the receiving instance; you must store and use the new number formatter instance it returns instead.
+ * NumberFormatter instances are immutable and thread safe. This means that invoking a configuration
+ * method has no effect on the receiving instance; you must store and use the new number formatter
+ * instance it returns instead.
  *
  * <pre>
- * UnlocalizedNumberFormatter formatter = UnlocalizedNumberFormatter.with().notation(Notation.scientific());
+ * UnlocalizedNumberFormatter formatter = UnlocalizedNumberFormatter.with()
+ *         .notation(Notation.scientific());
  * formatter.rounding(Rounder.maxFraction(2)); // does nothing!
  * formatter.locale(ULocale.ENGLISH).format(9.8765).toString(); // prints "9.8765E0", not "9.88E0"
  * </pre>
  *
  * <p>
- * This API is based on the <em>fluent</em> design pattern popularized by libraries such as Google's Guava. For
- * extensive details on the design of this API, read <a href="https://goo.gl/szi5VB">the design doc</a>.
+ * This API is based on the <em>fluent</em> design pattern popularized by libraries such as Google's
+ * Guava. For extensive details on the design of this API, read <a href="https://goo.gl/szi5VB">the
+ * design doc</a>.
  *
  * @author Shane Carr
  * @draft ICU 60
@@ -64,8 +69,8 @@
     private static final UnlocalizedNumberFormatter BASE = new UnlocalizedNumberFormatter();
 
     /**
-     * An enum declaring how to render units, including currencies. Example outputs when formatting 123 USD and 123
-     * meters in <em>en-CA</em>:
+     * An enum declaring how to render units, including currencies. Example outputs when formatting 123
+     * USD and 123 meters in <em>en-CA</em>:
      *
      * <ul>
      * <li>NARROW: "$123.00" and "123 m"
@@ -84,13 +89,14 @@
      */
     public static enum UnitWidth {
         /**
-         * Print an abbreviated version of the unit name. Similar to SHORT, but always use the shortest available
-         * abbreviation or symbol. This option can be used when the context hints at the identity of the unit. For more
-         * information on the difference between NARROW and SHORT, see SHORT.
+         * Print an abbreviated version of the unit name. Similar to SHORT, but always use the shortest
+         * available abbreviation or symbol. This option can be used when the context hints at the
+         * identity of the unit. For more information on the difference between NARROW and SHORT, see
+         * SHORT.
          *
          * <p>
-         * In CLDR, this option corresponds to the "Narrow" format for measure units and the "¤¤¤¤¤" placeholder for
-         * currencies.
+         * In CLDR, this option corresponds to the "Narrow" format for measure units and the "¤¤¤¤¤"
+         * placeholder for currencies.
          *
          * @draft ICU 60
          * @provisional This API might change or be removed in a future release.
@@ -99,16 +105,16 @@
         NARROW,
 
         /**
-         * Print an abbreviated version of the unit name. Similar to NARROW, but use a slightly wider abbreviation or
-         * symbol when there may be ambiguity. This is the default behavior.
+         * Print an abbreviated version of the unit name. Similar to NARROW, but use a slightly wider
+         * abbreviation or symbol when there may be ambiguity. This is the default behavior.
          *
          * <p>
-         * For example, in <em>es-US</em>, the SHORT form for Fahrenheit is "{0} °F", but the NARROW form is "{0}°",
-         * since Fahrenheit is the customary unit for temperature in that locale.
+         * For example, in <em>es-US</em>, the SHORT form for Fahrenheit is "{0} °F", but the NARROW form
+         * is "{0}°", since Fahrenheit is the customary unit for temperature in that locale.
          *
          * <p>
-         * In CLDR, this option corresponds to the "Short" format for measure units and the "¤" placeholder for
-         * currencies.
+         * In CLDR, this option corresponds to the "Short" format for measure units and the "¤"
+         * placeholder for currencies.
          *
          * @draft ICU 60
          * @provisional This API might change or be removed in a future release.
@@ -120,8 +126,8 @@
          * Print the full name of the unit, without any abbreviations.
          *
          * <p>
-         * In CLDR, this option corresponds to the default format for measure units and the "¤¤¤" placeholder for
-         * currencies.
+         * In CLDR, this option corresponds to the default format for measure units and the "¤¤¤"
+         * placeholder for currencies.
          *
          * @draft ICU 60
          * @provisional This API might change or be removed in a future release.
@@ -130,8 +136,8 @@
         FULL_NAME,
 
         /**
-         * Use the three-digit ISO XXX code in place of the symbol for displaying currencies. The behavior of this
-         * option is currently undefined for use with measure units.
+         * Use the three-digit ISO XXX code in place of the symbol for displaying currencies. The
+         * behavior of this option is currently undefined for use with measure units.
          *
          * <p>
          * In CLDR, this option corresponds to the "¤¤" placeholder for currencies.
@@ -143,9 +149,9 @@
         ISO_CODE,
 
         /**
-         * Format the number according to the specified unit, but do not display the unit. For currencies, apply
-         * monetary symbols and formats as with SHORT, but omit the currency symbol. For measure units, the behavior is
-         * equivalent to not specifying the unit at all.
+         * Format the number according to the specified unit, but do not display the unit. For
+         * currencies, apply monetary symbols and formats as with SHORT, but omit the currency symbol.
+         * For measure units, the behavior is equivalent to not specifying the unit at all.
          *
          * @draft ICU 60
          * @provisional This API might change or be removed in a future release.
@@ -155,15 +161,119 @@
     }
 
     /**
-     * An enum declaring how to denote positive and negative numbers. Example outputs when formatting 123 and -123 in
-     * <em>en-US</em>:
+     * An enum declaring the strategy for when and how to display grouping separators (i.e., the
+     * separator, often a comma or period, after every 2-3 powers of ten). The choices are several
+     * pre-built strategies for different use cases that employ locale data whenever possible. Example
+     * outputs for 1234 and 1234567 in <em>en-IN</em>:
      *
      * <ul>
-     * <li>AUTO: "123" and "-123"
-     * <li>ALWAYS: "+123" and "-123"
-     * <li>NEVER: "123" and "123"
-     * <li>ACCOUNTING: "$123" and "($123)"
-     * <li>ACCOUNTING_ALWAYS: "+$123" and "($123)"
+     * <li>OFF: 1234 and 12345
+     * <li>MIN2: 1234 and 12,34,567
+     * <li>AUTO: 1,234 and 12,34,567
+     * <li>ON_ALIGNED: 1,234 and 12,34,567
+     * <li>THOUSANDS: 1,234 and 1,234,567
+     * </ul>
+     *
+     * <p>
+     * The default is AUTO, which displays grouping separators unless the locale data says that grouping
+     * is not customary. To force grouping for all numbers greater than 1000 consistently across locales,
+     * use ON_ALIGNED. On the other hand, to display grouping less frequently than the default, use MIN2
+     * or OFF. See the docs of each option for details.
+     *
+     * <p>
+     * Note: This enum specifies the strategy for grouping sizes. To set which character to use as the
+     * grouping separator, use the "symbols" setter.
+     *
+     * @draft ICU 61
+     * @provisional This API might change or be removed in a future release.
+     * @see NumberFormatter
+     */
+    public static enum GroupingStrategy {
+        /**
+         * Do not display grouping separators in any locale.
+         *
+         * @draft ICU 61
+         * @provisional This API might change or be removed in a future release.
+         * @see NumberFormatter
+         */
+        OFF,
+
+        /**
+         * Display grouping using locale defaults, except do not show grouping on values smaller than
+         * 10000 (such that there is a <em>minimum of two digits</em> before the first separator).
+         *
+         * <p>
+         * Note that locales may restrict grouping separators to be displayed only on 1 million or
+         * greater (for example, ee and hu) or disable grouping altogether (for example, bg currency).
+         *
+         * <p>
+         * Locale data is used to determine whether to separate larger numbers into groups of 2
+         * (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
+         *
+         * @draft ICU 61
+         * @provisional This API might change or be removed in a future release.
+         * @see NumberFormatter
+         */
+        MIN2,
+
+        /**
+         * Display grouping using the default strategy for all locales. This is the default behavior.
+         *
+         * <p>
+         * Note that locales may restrict grouping separators to be displayed only on 1 million or
+         * greater (for example, ee and hu) or disable grouping altogether (for example, bg currency).
+         *
+         * <p>
+         * Locale data is used to determine whether to separate larger numbers into groups of 2
+         * (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
+         *
+         * @draft ICU 61
+         * @provisional This API might change or be removed in a future release.
+         * @see NumberFormatter
+         */
+        AUTO,
+
+        /**
+         * Always display the grouping separator on values of at least 1000.
+         *
+         * <p>
+         * This option ignores the locale data that restricts or disables grouping, described in MIN2 and
+         * AUTO. This option may be useful to normalize the alignment of numbers, such as in a
+         * spreadsheet.
+         *
+         * <p>
+         * Locale data is used to determine whether to separate larger numbers into groups of 2
+         * (customary in South Asia) or groups of 3 (customary in Europe and the Americas).
+         *
+         * @draft ICU 61
+         * @provisional This API might change or be removed in a future release.
+         * @see NumberFormatter
+         */
+        ON_ALIGNED,
+
+        /**
+         * Use the Western defaults: groups of 3 and enabled for all numbers 1000 or greater. Do not use
+         * locale data for determining the grouping strategy.
+         *
+         * @draft ICU 61
+         * @provisional This API might change or be removed in a future release.
+         * @see NumberFormatter
+         */
+        THOUSANDS
+    }
+
+    /**
+     * An enum declaring how to denote positive and negative numbers. Example outputs when formatting
+     * 123, 0, and -123 in <em>en-US</em>:
+     *
+     * <ul>
+     * <li>AUTO: "123", "0", and "-123"
+     * <li>ALWAYS: "+123", "+0", and "-123"
+     * <li>NEVER: "123", "0", and "123"
+     * <li>ACCOUNTING: "$123", "$0", and "($123)"
+     * <li>ACCOUNTING_ALWAYS: "+$123", "+$0", and "($123)"
+     * <li>EXCEPT_ZERO: "+123", "0", and "-123"
+     * <li>ACCOUNTING_EXCEPT_ZERO: "+$123", "$0", and "($123)"
      * </ul>
      *
      * <p>
@@ -175,8 +285,8 @@
      */
     public static enum SignDisplay {
         /**
-         * Show the minus sign on negative numbers, and do not show the sign on positive numbers. This is the default
-         * behavior.
+         * Show the minus sign on negative numbers, and do not show the sign on positive numbers. This is
+         * the default behavior.
          *
          * @draft ICU 60
          * @provisional This API might change or be removed in a future release.
@@ -185,7 +295,8 @@
         AUTO,
 
         /**
-         * Show the minus sign on negative numbers and the plus sign on positive numbers.
+         * Show the minus sign on negative numbers and the plus sign on positive numbers, including zero.
+         * To hide the sign on zero, see {@link #EXCEPT_ZERO}.
          *
          * @draft ICU 60
          * @provisional This API might change or be removed in a future release.
@@ -203,16 +314,17 @@
         NEVER,
 
         /**
-         * Use the locale-dependent accounting format on negative numbers, and do not show the sign on positive numbers.
+         * Use the locale-dependent accounting format on negative numbers, and do not show the sign on
+         * positive numbers.
          *
          * <p>
-         * The accounting format is defined in CLDR and varies by locale; in many Western locales, the format is a pair
-         * of parentheses around the number.
+         * The accounting format is defined in CLDR and varies by locale; in many Western locales, the
+         * format is a pair of parentheses around the number.
          *
          * <p>
-         * Note: Since CLDR defines the accounting format in the monetary context only, this option falls back to the
-         * AUTO sign display strategy when formatting without a currency unit. This limitation may be lifted in the
-         * future.
+         * Note: Since CLDR defines the accounting format in the monetary context only, this option falls
+         * back to the AUTO sign display strategy when formatting without a currency unit. This
+         * limitation may be lifted in the future.
          *
          * @draft ICU 60
          * @provisional This API might change or be removed in a future release.
@@ -221,19 +333,42 @@
         ACCOUNTING,
 
         /**
-         * Use the locale-dependent accounting format on negative numbers, and show the plus sign on positive numbers.
-         * For more information on the accounting format, see the ACCOUNTING sign display strategy.
+         * Use the locale-dependent accounting format on negative numbers, and show the plus sign on
+         * positive numbers, including zero. For more information on the accounting format, see the
+         * ACCOUNTING sign display strategy. To hide the sign on zero, see
+         * {@link #ACCOUNTING_EXCEPT_ZERO}.
          *
          * @draft ICU 60
          * @provisional This API might change or be removed in a future release.
          * @see NumberFormatter
          */
         ACCOUNTING_ALWAYS,
+
+        /**
+         * Show the minus sign on negative numbers and the plus sign on positive numbers. Do not show a
+         * sign on zero.
+         *
+         * @draft ICU 61
+         * @provisional This API might change or be removed in a future release.
+         * @see NumberFormatter
+         */
+        EXCEPT_ZERO,
+
+        /**
+         * Use the locale-dependent accounting format on negative numbers, and show the plus sign on
+         * positive numbers. Do not show a sign on zero. For more information on the accounting format,
+         * see the ACCOUNTING sign display strategy.
+         *
+         * @draft ICU 61
+         * @provisional This API might change or be removed in a future release.
+         * @see NumberFormatter
+         */
+        ACCOUNTING_EXCEPT_ZERO,
     }
 
     /**
-     * An enum declaring how to render the decimal separator. Example outputs when formatting 1 and 1.1 in
-     * <em>en-US</em>:
+     * An enum declaring how to render the decimal separator. Example outputs when formatting 1 and 1.1
+     * in <em>en-US</em>:
      *
      * <ul>
      * <li>AUTO: "1" and "1.1"
@@ -246,8 +381,8 @@
      */
     public static enum DecimalSeparatorDisplay {
         /**
-         * Show the decimal separator when there are one or more digits to display after the separator, and do not show
-         * it otherwise. This is the default behavior.
+         * Show the decimal separator when there are one or more digits to display after the separator,
+         * and do not show it otherwise. This is the default behavior.
          *
          * @draft ICU 60
          * @provisional This API might change or be removed in a future release.
@@ -266,8 +401,9 @@
     }
 
     /**
-     * Use a default threshold of 3. This means that the third time .format() is called, the data structures get built
-     * using the "safe" code path. The first two calls to .format() will trigger the unsafe code path.
+     * Use a default threshold of 3. This means that the third time .format() is called, the data
+     * structures get built using the "safe" code path. The first two calls to .format() will trigger the
+     * unsafe code path.
      */
     static final long DEFAULT_THRESHOLD = 3;
 
@@ -278,8 +414,8 @@
     }
 
     /**
-     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is not currently known at
-     * the call site.
+     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is not
+     * currently known at the call site.
      *
      * @return An {@link UnlocalizedNumberFormatter}, to be used for chaining.
      * @draft ICU 60
@@ -290,8 +426,8 @@
     }
 
     /**
-     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is known at the call
-     * site.
+     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is known
+     * at the call site.
      *
      * @param locale
      *            The locale from which to load formats and symbols for number formatting.
@@ -304,8 +440,8 @@
     }
 
     /**
-     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is known at the call
-     * site.
+     * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is known
+     * at the call site.
      *
      * @param locale
      *            The locale from which to load formats and symbols for number formatting.
@@ -322,8 +458,10 @@
      * @deprecated ICU 60 This API is ICU internal only.
      */
     @Deprecated
-    public static UnlocalizedNumberFormatter fromDecimalFormat(DecimalFormatProperties properties,
-            DecimalFormatSymbols symbols, DecimalFormatProperties exportedProperties) {
+    public static UnlocalizedNumberFormatter fromDecimalFormat(
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols,
+            DecimalFormatProperties exportedProperties) {
         MacroProps macros = NumberPropertyMapper.oldToNew(properties, symbols, exportedProperties);
         return NumberFormatter.with().macros(macros);
     }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterImpl.java
index 74b4942..c0cf83f 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterImpl.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterImpl.java
@@ -2,9 +2,12 @@
 // License & terms of use: http://www.unicode.org/copyright.html#License
 package com.ibm.icu.number;
 
+import com.ibm.icu.impl.CurrencyData;
+import com.ibm.icu.impl.CurrencyData.CurrencyFormatInfo;
 import com.ibm.icu.impl.number.CompactData.CompactType;
 import com.ibm.icu.impl.number.ConstantAffixModifier;
 import com.ibm.icu.impl.number.DecimalQuantity;
+import com.ibm.icu.impl.number.Grouper;
 import com.ibm.icu.impl.number.LongNameHandler;
 import com.ibm.icu.impl.number.MacroProps;
 import com.ibm.icu.impl.number.MicroProps;
@@ -15,6 +18,7 @@
 import com.ibm.icu.impl.number.PatternStringParser;
 import com.ibm.icu.impl.number.PatternStringParser.ParsedPatternInfo;
 import com.ibm.icu.number.NumberFormatter.DecimalSeparatorDisplay;
+import com.ibm.icu.number.NumberFormatter.GroupingStrategy;
 import com.ibm.icu.number.NumberFormatter.SignDisplay;
 import com.ibm.icu.number.NumberFormatter.UnitWidth;
 import com.ibm.icu.text.DecimalFormatSymbols;
@@ -25,12 +29,12 @@
 import com.ibm.icu.util.MeasureUnit;
 
 /**
- * This is the "brain" of the number formatting pipeline. It ties all the pieces together, taking in a MacroProps and a
- * DecimalQuantity and outputting a properly formatted number string.
+ * This is the "brain" of the number formatting pipeline. It ties all the pieces together, taking in a
+ * MacroProps and a DecimalQuantity and outputting a properly formatted number string.
  *
  * <p>
- * This class, as well as NumberPropertyMapper, could go into the impl package, but they depend on too many
- * package-private members of the public APIs.
+ * This class, as well as NumberPropertyMapper, could go into the impl package, but they depend on too
+ * many package-private members of the public APIs.
  */
 class NumberFormatterImpl {
 
@@ -40,8 +44,13 @@
         return new NumberFormatterImpl(microPropsGenerator);
     }
 
-    /** Builds and evaluates an "unsafe" MicroPropsGenerator, which is cheaper but can be used only once. */
-    public static MicroProps applyStatic(MacroProps macros, DecimalQuantity inValue, NumberStringBuilder outString) {
+    /**
+     * Builds and evaluates an "unsafe" MicroPropsGenerator, which is cheaper but can be used only once.
+     */
+    public static MicroProps applyStatic(
+            MacroProps macros,
+            DecimalQuantity inValue,
+            NumberStringBuilder outString) {
         MicroPropsGenerator microPropsGenerator = macrosToMicroGenerator(macros, false);
         MicroProps micros = microPropsGenerator.processQuantity(inValue);
         microsToString(micros, inValue, outString);
@@ -84,17 +93,17 @@
     }
 
     /**
-     * Synthesizes the MacroProps into a MicroPropsGenerator. All information, including the locale, is encoded into the
-     * MicroPropsGenerator, except for the quantity itself, which is left abstract and must be provided to the returned
-     * MicroPropsGenerator instance.
+     * Synthesizes the MacroProps into a MicroPropsGenerator. All information, including the locale, is
+     * encoded into the MicroPropsGenerator, except for the quantity itself, which is left abstract and
+     * must be provided to the returned MicroPropsGenerator instance.
      *
      * @see MicroPropsGenerator
      * @param macros
      *            The {@link MacroProps} to consume. This method does not mutate the MacroProps instance.
      * @param safe
-     *            If true, the returned MicroPropsGenerator will be thread-safe. If false, the returned value will
-     *            <em>not</em> be thread-safe, intended for a single "one-shot" use only. Building the thread-safe
-     *            object is more expensive.
+     *            If true, the returned MicroPropsGenerator will be thread-safe. If false, the returned
+     *            value will <em>not</em> be thread-safe, intended for a single "one-shot" use only.
+     *            Building the thread-safe object is more expensive.
      */
     private static MicroPropsGenerator macrosToMicroGenerator(MacroProps macros, boolean safe) {
         MicroProps micros = new MicroProps(safe);
@@ -109,7 +118,9 @@
         boolean isPercent = isNoUnit && unitIsPercent(macros.unit);
         boolean isPermille = isNoUnit && unitIsPermille(macros.unit);
         boolean isCldrUnit = !isCurrency && !isNoUnit;
-        boolean isAccounting = macros.sign == SignDisplay.ACCOUNTING || macros.sign == SignDisplay.ACCOUNTING_ALWAYS;
+        boolean isAccounting = macros.sign == SignDisplay.ACCOUNTING
+                || macros.sign == SignDisplay.ACCOUNTING_ALWAYS
+                || macros.sign == SignDisplay.ACCOUNTING_EXCEPT_ZERO;
         Currency currency = isCurrency ? (Currency) macros.unit : DEFAULT_CURRENCY;
         UnitWidth unitWidth = UnitWidth.SHORT;
         if (macros.unitWidth != null) {
@@ -127,33 +138,49 @@
         }
         String nsName = ns.getName();
 
-        // Load and parse the pattern string. It is used for grouping sizes and affixes only.
-        int patternStyle;
-        if (isPercent || isPermille) {
-            patternStyle = NumberFormat.PERCENTSTYLE;
-        } else if (!isCurrency || unitWidth == UnitWidth.FULL_NAME) {
-            patternStyle = NumberFormat.NUMBERSTYLE;
-        } else if (isAccounting) {
-            // NOTE: Although ACCOUNTING and ACCOUNTING_ALWAYS are only supported in currencies right now,
-            // the API contract allows us to add support to other units in the future.
-            patternStyle = NumberFormat.ACCOUNTINGCURRENCYSTYLE;
-        } else {
-            patternStyle = NumberFormat.CURRENCYSTYLE;
-        }
-        String pattern = NumberFormat.getPatternForStyleAndNumberingSystem(macros.loc, nsName, patternStyle);
-        ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(pattern);
-
-        /////////////////////////////////////////////////////////////////////////////////////
-        /// START POPULATING THE DEFAULT MICROPROPS AND BUILDING THE MICROPROPS GENERATOR ///
-        /////////////////////////////////////////////////////////////////////////////////////
-
-        // Symbols
+        // Resolve the symbols. Do this here because currency may need to customize them.
         if (macros.symbols instanceof DecimalFormatSymbols) {
             micros.symbols = (DecimalFormatSymbols) macros.symbols;
         } else {
             micros.symbols = DecimalFormatSymbols.forNumberingSystem(macros.loc, ns);
         }
 
+        // Load and parse the pattern string. It is used for grouping sizes and affixes only.
+        // If we are formatting currency, check for a currency-specific pattern.
+        String pattern = null;
+        if (isCurrency) {
+            CurrencyFormatInfo info = CurrencyData.provider.getInstance(macros.loc, true)
+                    .getFormatInfo(currency.getCurrencyCode());
+            if (info != null) {
+                pattern = info.currencyPattern;
+                // It's clunky to clone an object here, but this code is not frequently executed.
+                micros.symbols = (DecimalFormatSymbols) micros.symbols.clone();
+                micros.symbols.setMonetaryDecimalSeparatorString(info.monetaryDecimalSeparator);
+                micros.symbols.setMonetaryGroupingSeparatorString(info.monetaryGroupingSeparator);
+            }
+        }
+        if (pattern == null) {
+            int patternStyle;
+            if (isPercent || isPermille) {
+                patternStyle = NumberFormat.PERCENTSTYLE;
+            } else if (!isCurrency || unitWidth == UnitWidth.FULL_NAME) {
+                patternStyle = NumberFormat.NUMBERSTYLE;
+            } else if (isAccounting) {
+                // NOTE: Although ACCOUNTING and ACCOUNTING_ALWAYS are only supported in currencies
+                // right now, the API contract allows us to add support to other units in the future.
+                patternStyle = NumberFormat.ACCOUNTINGCURRENCYSTYLE;
+            } else {
+                patternStyle = NumberFormat.CURRENCYSTYLE;
+            }
+            pattern = NumberFormat
+                    .getPatternForStyleAndNumberingSystem(macros.loc, nsName, patternStyle);
+        }
+        ParsedPatternInfo patternInfo = PatternStringParser.parseToPatternInfo(pattern);
+
+        /////////////////////////////////////////////////////////////////////////////////////
+        /// START POPULATING THE DEFAULT MICROPROPS AND BUILDING THE MICROPROPS GENERATOR ///
+        /////////////////////////////////////////////////////////////////////////////////////
+
         // Multiplier (compatibility mode value).
         if (macros.multiplier != null) {
             chain = macros.multiplier.copyAndChain(chain);
@@ -172,15 +199,17 @@
         micros.rounding = micros.rounding.withLocaleData(currency);
 
         // Grouping strategy
-        if (macros.grouper != null) {
-            micros.grouping = macros.grouper;
+        if (macros.grouping instanceof Grouper) {
+            micros.grouping = (Grouper) macros.grouping;
+        } else if (macros.grouping instanceof GroupingStrategy) {
+            micros.grouping = Grouper.forStrategy((GroupingStrategy) macros.grouping);
         } else if (macros.notation instanceof CompactNotation) {
             // Compact notation uses minGrouping by default since ICU 59
-            micros.grouping = Grouper.minTwoDigits();
+            micros.grouping = Grouper.forStrategy(GroupingStrategy.MIN2);
         } else {
-            micros.grouping = Grouper.defaults();
+            micros.grouping = Grouper.forStrategy(GroupingStrategy.AUTO);
         }
-        micros.grouping = micros.grouping.withLocaleData(patternInfo);
+        micros.grouping = micros.grouping.withLocaleData(macros.loc, patternInfo);
 
         // Padding strategy
         if (macros.padder != null) {
@@ -247,7 +276,8 @@
                 // Lazily create PluralRules
                 rules = PluralRules.forLocale(macros.loc);
             }
-            chain = LongNameHandler.forMeasureUnit(macros.loc, macros.unit, unitWidth, rules, chain);
+            chain = LongNameHandler
+                    .forMeasureUnit(macros.loc, macros.unit, macros.perUnit, unitWidth, rules, chain);
         } else if (isCurrency && unitWidth == UnitWidth.FULL_NAME) {
             if (rules == null) {
                 // Lazily create PluralRules
@@ -267,11 +297,15 @@
                 // Lazily create PluralRules
                 rules = PluralRules.forLocale(macros.loc);
             }
-            CompactType compactType = (macros.unit instanceof Currency && macros.unitWidth != UnitWidth.FULL_NAME)
-                    ? CompactType.CURRENCY
-                    : CompactType.DECIMAL;
-            chain = ((CompactNotation) macros.notation).withLocaleData(macros.loc, nsName, compactType, rules,
-                    safe ? patternMod : null, chain);
+            CompactType compactType = (macros.unit instanceof Currency
+                    && macros.unitWidth != UnitWidth.FULL_NAME) ? CompactType.CURRENCY
+                            : CompactType.DECIMAL;
+            chain = ((CompactNotation) macros.notation).withLocaleData(macros.loc,
+                    nsName,
+                    compactType,
+                    rules,
+                    safe ? patternMod : null,
+                    chain);
         }
 
         return chain;
@@ -289,7 +323,10 @@
      * @param string
      *            The output string. Will be mutated.
      */
-    private static void microsToString(MicroProps micros, DecimalQuantity quantity, NumberStringBuilder string) {
+    private static void microsToString(
+            MicroProps micros,
+            DecimalQuantity quantity,
+            NumberStringBuilder string) {
         micros.rounding.apply(quantity);
         if (micros.integerWidth.maxInt == -1) {
             quantity.setIntegerLength(micros.integerWidth.minInt, Integer.MAX_VALUE);
@@ -309,7 +346,10 @@
         }
     }
 
-    private static int writeNumber(MicroProps micros, DecimalQuantity quantity, NumberStringBuilder string) {
+    private static int writeNumber(
+            MicroProps micros,
+            DecimalQuantity quantity,
+            NumberStringBuilder string) {
         int length = 0;
         if (quantity.isInfinite()) {
             length += string.insert(length, micros.symbols.getInfinity(), NumberFormat.Field.INTEGER);
@@ -322,9 +362,12 @@
             length += writeIntegerDigits(micros, quantity, string);
 
             // Add the decimal point
-            if (quantity.getLowerDisplayMagnitude() < 0 || micros.decimal == DecimalSeparatorDisplay.ALWAYS) {
-                length += string.insert(length, micros.useCurrency ? micros.symbols.getMonetaryDecimalSeparatorString()
-                        : micros.symbols.getDecimalSeparatorString(), NumberFormat.Field.DECIMAL_SEPARATOR);
+            if (quantity.getLowerDisplayMagnitude() < 0
+                    || micros.decimal == DecimalSeparatorDisplay.ALWAYS) {
+                length += string.insert(length,
+                        micros.useCurrency ? micros.symbols.getMonetaryDecimalSeparatorString()
+                                : micros.symbols.getDecimalSeparatorString(),
+                        NumberFormat.Field.DECIMAL_SEPARATOR);
             }
 
             // Add the fraction digits
@@ -334,30 +377,40 @@
         return length;
     }
 
-    private static int writeIntegerDigits(MicroProps micros, DecimalQuantity quantity, NumberStringBuilder string) {
+    private static int writeIntegerDigits(
+            MicroProps micros,
+            DecimalQuantity quantity,
+            NumberStringBuilder string) {
         int length = 0;
         int integerCount = quantity.getUpperDisplayMagnitude() + 1;
         for (int i = 0; i < integerCount; i++) {
             // Add grouping separator
             if (micros.grouping.groupAtPosition(i, quantity)) {
-                length += string.insert(0, micros.useCurrency ? micros.symbols.getMonetaryGroupingSeparatorString()
-                        : micros.symbols.getGroupingSeparatorString(), NumberFormat.Field.GROUPING_SEPARATOR);
+                length += string.insert(0,
+                        micros.useCurrency ? micros.symbols.getMonetaryGroupingSeparatorString()
+                                : micros.symbols.getGroupingSeparatorString(),
+                        NumberFormat.Field.GROUPING_SEPARATOR);
             }
 
             // Get and append the next digit value
             byte nextDigit = quantity.getDigit(i);
             if (micros.symbols.getCodePointZero() != -1) {
-                length += string.insertCodePoint(0, micros.symbols.getCodePointZero() + nextDigit,
+                length += string.insertCodePoint(0,
+                        micros.symbols.getCodePointZero() + nextDigit,
                         NumberFormat.Field.INTEGER);
             } else {
-                length += string.insert(0, micros.symbols.getDigitStringsLocal()[nextDigit],
+                length += string.insert(0,
+                        micros.symbols.getDigitStringsLocal()[nextDigit],
                         NumberFormat.Field.INTEGER);
             }
         }
         return length;
     }
 
-    private static int writeFractionDigits(MicroProps micros, DecimalQuantity quantity, NumberStringBuilder string) {
+    private static int writeFractionDigits(
+            MicroProps micros,
+            DecimalQuantity quantity,
+            NumberStringBuilder string) {
         int length = 0;
         int fractionCount = -quantity.getLowerDisplayMagnitude();
         for (int i = 0; i < fractionCount; i++) {
@@ -367,7 +420,8 @@
                 length += string.appendCodePoint(micros.symbols.getCodePointZero() + nextDigit,
                         NumberFormat.Field.FRACTION);
             } else {
-                length += string.append(micros.symbols.getDigitStringsLocal()[nextDigit], NumberFormat.Field.FRACTION);
+                length += string.append(micros.symbols.getDigitStringsLocal()[nextDigit],
+                        NumberFormat.Field.FRACTION);
             }
         }
         return length;
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterSettings.java b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterSettings.java
index 884fb64..0143f2e 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterSettings.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterSettings.java
@@ -5,6 +5,7 @@
 import com.ibm.icu.impl.number.MacroProps;
 import com.ibm.icu.impl.number.Padder;
 import com.ibm.icu.number.NumberFormatter.DecimalSeparatorDisplay;
+import com.ibm.icu.number.NumberFormatter.GroupingStrategy;
 import com.ibm.icu.number.NumberFormatter.SignDisplay;
 import com.ibm.icu.number.NumberFormatter.UnitWidth;
 import com.ibm.icu.text.DecimalFormatSymbols;
@@ -16,9 +17,9 @@
 import com.ibm.icu.util.ULocale;
 
 /**
- * An abstract base class for specifying settings related to number formatting. This class is implemented by
- * {@link UnlocalizedNumberFormatter} and {@link LocalizedNumberFormatter}. This class is not intended for public
- * subclassing.
+ * An abstract base class for specifying settings related to number formatting. This class is implemented
+ * by {@link UnlocalizedNumberFormatter} and {@link LocalizedNumberFormatter}. This class is not intended
+ * for public subclassing.
  *
  * @draft ICU 60
  * @provisional This API might change or be removed in a future release.
@@ -31,7 +32,7 @@
     static final int KEY_NOTATION = 2;
     static final int KEY_UNIT = 3;
     static final int KEY_ROUNDER = 4;
-    static final int KEY_GROUPER = 5;
+    static final int KEY_GROUPING = 5;
     static final int KEY_PADDER = 6;
     static final int KEY_INTEGER = 7;
     static final int KEY_SYMBOLS = 8;
@@ -39,7 +40,8 @@
     static final int KEY_SIGN = 10;
     static final int KEY_DECIMAL = 11;
     static final int KEY_THRESHOLD = 12;
-    static final int KEY_MAX = 13;
+    static final int KEY_PER_UNIT = 13;
+    static final int KEY_MAX = 14;
 
     final NumberFormatterSettings<?> parent;
     final int key;
@@ -62,8 +64,8 @@
      * </ul>
      *
      * <p>
-     * All notation styles will be properly localized with locale data, and all notation styles are compatible with
-     * units, rounding strategies, and other number formatter settings.
+     * All notation styles will be properly localized with locale data, and all notation styles are
+     * compatible with units, rounding strategies, and other number formatter settings.
      *
      * <p>
      * Pass this method the return value of a {@link Notation} factory method. For example:
@@ -96,13 +98,13 @@
      *
      * <p>
      * <strong>Note:</strong> The unit can also be specified by passing a {@link Measure} to
-     * {@link LocalizedNumberFormatter#format(Measure)}. Units specified via the format method take precedence over
-     * units specified here. This setter is designed for situations when the unit is constant for the duration of the
-     * number formatting process.
+     * {@link LocalizedNumberFormatter#format(Measure)}. Units specified via the format method take
+     * precedence over units specified here. This setter is designed for situations when the unit is
+     * constant for the duration of the number formatting process.
      *
      * <p>
-     * All units will be properly localized with locale data, and all units are compatible with notation styles,
-     * rounding strategies, and other number formatter settings.
+     * All units will be properly localized with locale data, and all units are compatible with notation
+     * styles, rounding strategies, and other number formatter settings.
      *
      * <p>
      * Pass this method any instance of {@link MeasureUnit}. For units of measure:
@@ -123,6 +125,10 @@
      * NumberFormatter.with().unit(NoUnit.PERCENT)
      * </pre>
      *
+     * <p>
+     * See {@link #perUnit} for information on how to format strings like "5 meters per second".
+     *
+     * <p>
      * The default is to render without units (equivalent to {@link NoUnit#BASE}).
      *
      * @param unit
@@ -131,6 +137,7 @@
      * @see MeasureUnit
      * @see Currency
      * @see NoUnit
+     * @see #perUnit
      * @draft ICU 60
      * @provisional This API might change or be removed in a future release.
      */
@@ -139,6 +146,34 @@
     }
 
     /**
+     * Sets a unit to be used in the denominator. For example, to format "3 m/s", pass METER to the unit
+     * and SECOND to the perUnit.
+     *
+     * <p>
+     * Pass this method any instance of {@link MeasureUnit}. For example:
+     *
+     * <pre>
+     * NumberFormatter.with().unit(MeasureUnit.METER).perUnit(MeasureUnit.SECOND)
+     * </pre>
+     *
+     * <p>
+     * The default is not to display any unit in the denominator.
+     *
+     * <p>
+     * If a per-unit is specified without a primary unit via {@link #unit}, the behavior is undefined.
+     *
+     * @param perUnit
+     *            The unit to render in the denominator.
+     * @return The fluent chain
+     * @see #unit
+     * @draft ICU 61
+     * @provisional This API might change or be removed in a future release.
+     */
+    public T perUnit(MeasureUnit perUnit) {
+        return create(KEY_PER_UNIT, perUnit);
+    }
+
+    /**
      * Specifies the rounding strategy to use when formatting numbers.
      *
      * <ul>
@@ -157,10 +192,10 @@
      *
      * <p>
      * In most cases, the default rounding strategy is to round to 6 fraction places; i.e.,
-     * <code>Rounder.maxFraction(6)</code>. The exceptions are if compact notation is being used, then the compact
-     * notation rounding strategy is used (see {@link Notation#compactShort} for details), or if the unit is a currency,
-     * then standard currency rounding is used, which varies from currency to currency (see {@link Rounder#currency} for
-     * details).
+     * <code>Rounder.maxFraction(6)</code>. The exceptions are if compact notation is being used, then
+     * the compact notation rounding strategy is used (see {@link Notation#compactShort} for details), or
+     * if the unit is a currency, then standard currency rounding is used, which varies from currency to
+     * currency (see {@link Rounder#currency} for details).
      *
      * @param rounder
      *            The rounding strategy to use.
@@ -186,25 +221,24 @@
      * The exact grouping widths will be chosen based on the locale.
      *
      * <p>
-     * Pass this method the return value of one of the factory methods on {@link Grouper}. For example:
+     * Pass this method an element from the {@link GroupingStrategy} enum. For example:
      *
      * <pre>
-     * NumberFormatter.with().grouping(Grouper.min2())
+     * NumberFormatter.with().grouping(GroupingStrategy.MIN2)
      * </pre>
      *
-     * The default is to perform grouping without concern for the minimum grouping digits.
+     * The default is to perform grouping according to locale data; most locales, but not all locales,
+     * enable it by default.
      *
-     * @param grouper
+     * @param strategy
      *            The grouping strategy to use.
      * @return The fluent chain.
-     * @see Grouper
-     * @see Notation
-     * @internal
-     * @deprecated ICU 60 This API is technical preview; see #7861.
+     * @see GroupingStrategy
+     * @draft ICU 61
+     * @provisional This API might change or be removed in a future release.
      */
-    @Deprecated
-    public T grouping(Grouper grouper) {
-        return create(KEY_GROUPER, grouper);
+    public T grouping(GroupingStrategy strategy) {
+        return create(KEY_GROUPING, strategy);
     }
 
     /**
@@ -237,8 +271,8 @@
     }
 
     /**
-     * Specifies the symbols (decimal separator, grouping separator, percent sign, numerals, etc.) to use when rendering
-     * numbers.
+     * Specifies the symbols (decimal separator, grouping separator, percent sign, numerals, etc.) to use
+     * when rendering numbers.
      *
      * <ul>
      * <li><em>en_US</em> symbols: "12,345.67"
@@ -255,17 +289,17 @@
      * </pre>
      *
      * <p>
-     * <strong>Note:</strong> DecimalFormatSymbols automatically chooses the best numbering system based on the locale.
-     * In the examples above, the first three are using the Latin numbering system, and the fourth is using the Myanmar
-     * numbering system.
+     * <strong>Note:</strong> DecimalFormatSymbols automatically chooses the best numbering system based
+     * on the locale. In the examples above, the first three are using the Latin numbering system, and
+     * the fourth is using the Myanmar numbering system.
      *
      * <p>
-     * <strong>Note:</strong> The instance of DecimalFormatSymbols will be copied: changes made to the symbols object
-     * after passing it into the fluent chain will not be seen.
+     * <strong>Note:</strong> The instance of DecimalFormatSymbols will be copied: changes made to the
+     * symbols object after passing it into the fluent chain will not be seen.
      *
      * <p>
-     * <strong>Note:</strong> Calling this method will override the NumberingSystem previously specified in
-     * {@link #symbols(NumberingSystem)}.
+     * <strong>Note:</strong> Calling this method will override the NumberingSystem previously specified
+     * in {@link #symbols(NumberingSystem)}.
      *
      * <p>
      * The default is to choose the symbols based on the locale specified in the fluent chain.
@@ -292,16 +326,16 @@
      * </ul>
      *
      * <p>
-     * Pass this method an instance of {@link NumberingSystem}. For example, to force the locale to always use the Latin
-     * alphabet numbering system (ASCII digits):
+     * Pass this method an instance of {@link NumberingSystem}. For example, to force the locale to
+     * always use the Latin alphabet numbering system (ASCII digits):
      *
      * <pre>
      * NumberFormatter.with().symbols(NumberingSystem.LATIN)
      * </pre>
      *
      * <p>
-     * <strong>Note:</strong> Calling this method will override the DecimalFormatSymbols previously specified in
-     * {@link #symbols(DecimalFormatSymbols)}.
+     * <strong>Note:</strong> Calling this method will override the DecimalFormatSymbols previously
+     * specified in {@link #symbols(DecimalFormatSymbols)}.
      *
      * <p>
      * The default is to choose the best numbering system for the locale.
@@ -378,8 +412,8 @@
     }
 
     /**
-     * Sets the decimal separator display strategy. This affects integer numbers with no fraction part. Most common
-     * values:
+     * Sets the decimal separator display strategy. This affects integer numbers with no fraction part.
+     * Most common values:
      *
      * <ul>
      * <li>Auto: "1"
@@ -430,8 +464,8 @@
     }
 
     /**
-     * Internal fluent setter to support a custom regulation threshold. A threshold of 1 causes the data structures to
-     * be built right away. A threshold of 0 prevents the data structures from being built.
+     * Internal fluent setter to support a custom regulation threshold. A threshold of 1 causes the data
+     * structures to be built right away. A threshold of 0 prevents the data structures from being built.
      *
      * @internal
      * @deprecated ICU 60 This API is ICU internal only.
@@ -478,9 +512,9 @@
                     macros.rounder = (Rounder) current.value;
                 }
                 break;
-            case KEY_GROUPER:
-                if (macros.grouper == null) {
-                    macros.grouper = (Grouper) current.value;
+            case KEY_GROUPING:
+                if (macros.grouping == null) {
+                    macros.grouping = /* (Object) */ current.value;
                 }
                 break;
             case KEY_PADDER:
@@ -518,6 +552,11 @@
                     macros.threshold = (Long) current.value;
                 }
                 break;
+            case KEY_PER_UNIT:
+                if (macros.perUnit == null) {
+                    macros.perUnit = (MeasureUnit) current.value;
+                }
+                break;
             default:
                 throw new AssertionError("Unknown key: " + current.key);
             }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberPropertyMapper.java b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberPropertyMapper.java
index f1cdafe..c7a1a66 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberPropertyMapper.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberPropertyMapper.java
@@ -5,16 +5,16 @@
 import java.math.BigDecimal;
 import java.math.MathContext;
 
-import com.ibm.icu.impl.StandardPlural;
 import com.ibm.icu.impl.number.AffixPatternProvider;
-import com.ibm.icu.impl.number.AffixUtils;
+import com.ibm.icu.impl.number.CurrencyPluralInfoAffixProvider;
 import com.ibm.icu.impl.number.CustomSymbolCurrency;
 import com.ibm.icu.impl.number.DecimalFormatProperties;
+import com.ibm.icu.impl.number.Grouper;
 import com.ibm.icu.impl.number.MacroProps;
 import com.ibm.icu.impl.number.MultiplierImpl;
 import com.ibm.icu.impl.number.Padder;
 import com.ibm.icu.impl.number.PatternStringParser;
-import com.ibm.icu.impl.number.PatternStringParser.ParsedPatternInfo;
+import com.ibm.icu.impl.number.PropertiesAffixPatternProvider;
 import com.ibm.icu.impl.number.RoundingUtils;
 import com.ibm.icu.number.NumberFormatter.DecimalSeparatorDisplay;
 import com.ibm.icu.number.NumberFormatter.SignDisplay;
@@ -22,7 +22,6 @@
 import com.ibm.icu.number.Rounder.IncrementRounderImpl;
 import com.ibm.icu.number.Rounder.SignificantRounderImpl;
 import com.ibm.icu.text.CompactDecimalFormat.CompactStyle;
-import com.ibm.icu.text.CurrencyPluralInfo;
 import com.ibm.icu.text.DecimalFormatSymbols;
 import com.ibm.icu.util.Currency;
 import com.ibm.icu.util.Currency.CurrencyUsage;
@@ -30,20 +29,22 @@
 
 /**
  * <p>
- * This class, as well as NumberFormatterImpl, could go into the impl package, but they depend on too many
- * package-private members of the public APIs.
+ * This class, as well as NumberFormatterImpl, could go into the impl package, but they depend on too
+ * many package-private members of the public APIs.
  */
 final class NumberPropertyMapper {
 
     /** Convenience method to create a NumberFormatter directly from Properties. */
-    public static UnlocalizedNumberFormatter create(DecimalFormatProperties properties, DecimalFormatSymbols symbols) {
+    public static UnlocalizedNumberFormatter create(
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols) {
         MacroProps macros = oldToNew(properties, symbols, null);
         return NumberFormatter.with().macros(macros);
     }
 
     /**
-     * Convenience method to create a NumberFormatter directly from a pattern string. Something like this could become
-     * public API if there is demand.
+     * Convenience method to create a NumberFormatter directly from a pattern string. Something like this
+     * could become public API if there is demand.
      */
     public static UnlocalizedNumberFormatter create(String pattern, DecimalFormatSymbols symbols) {
         DecimalFormatProperties properties = PatternStringParser.parseToProperties(pattern);
@@ -51,19 +52,22 @@
     }
 
     /**
-     * Creates a new {@link MacroProps} object based on the content of a {@link DecimalFormatProperties} object. In
-     * other words, maps Properties to MacroProps. This function is used by the JDK-compatibility API to call into the
-     * ICU 60 fluent number formatting pipeline.
+     * Creates a new {@link MacroProps} object based on the content of a {@link DecimalFormatProperties}
+     * object. In other words, maps Properties to MacroProps. This function is used by the
+     * JDK-compatibility API to call into the ICU 60 fluent number formatting pipeline.
      *
      * @param properties
      *            The property bag to be mapped.
      * @param symbols
      *            The symbols associated with the property bag.
      * @param exportedProperties
-     *            A property bag in which to store validated properties.
+     *            A property bag in which to store validated properties. Used by some DecimalFormat
+     *            getters.
      * @return A new MacroProps containing all of the information in the Properties.
      */
-    public static MacroProps oldToNew(DecimalFormatProperties properties, DecimalFormatSymbols symbols,
+    public static MacroProps oldToNew(
+            DecimalFormatProperties properties,
+            DecimalFormatSymbols symbols,
             DecimalFormatProperties exportedProperties) {
         MacroProps macros = new MacroProps();
         ULocale locale = symbols.getULocale();
@@ -96,8 +100,10 @@
         // UNITS //
         ///////////
 
-        boolean useCurrency = ((properties.getCurrency() != null) || properties.getCurrencyPluralInfo() != null
-                || properties.getCurrencyUsage() != null || affixProvider.hasCurrencySign());
+        boolean useCurrency = ((properties.getCurrency() != null)
+                || properties.getCurrencyPluralInfo() != null
+                || properties.getCurrencyUsage() != null
+                || affixProvider.hasCurrencySign());
         Currency currency = CustomSymbolCurrency.resolve(properties.getCurrency(), locale, symbols);
         CurrencyUsage currencyUsage = properties.getCurrencyUsage();
         boolean explicitCurrencyUsage = currencyUsage != null;
@@ -122,7 +128,8 @@
         MathContext mathContext = RoundingUtils.getMathContextOrUnlimited(properties);
         boolean explicitMinMaxFrac = minFrac != -1 || maxFrac != -1;
         boolean explicitMinMaxSig = minSig != -1 || maxSig != -1;
-        // Resolve min/max frac for currencies, required for the validation logic and for when minFrac or maxFrac was
+        // Resolve min/max frac for currencies, required for the validation logic and for when minFrac or
+        // maxFrac was
         // set (but not both) on a currency instance.
         // NOTE: Increments are handled in "Rounder.constructCurrency()".
         if (useCurrency) {
@@ -151,7 +158,8 @@
             minFrac = minFrac < 0 ? 0 : minFrac;
             maxFrac = maxFrac < 0 ? Integer.MAX_VALUE : maxFrac < minFrac ? minFrac : maxFrac;
             minInt = minInt <= 0 ? 1 : minInt > RoundingUtils.MAX_INT_FRAC_SIG ? 1 : minInt;
-            maxInt = maxInt < 0 ? -1 : maxInt < minInt ? minInt : maxInt > RoundingUtils.MAX_INT_FRAC_SIG ? -1 : maxInt;
+            maxInt = maxInt < 0 ? -1
+                    : maxInt < minInt ? minInt : maxInt > RoundingUtils.MAX_INT_FRAC_SIG ? -1 : maxInt;
         }
         Rounder rounding = null;
         if (explicitCurrencyUsage) {
@@ -159,10 +167,12 @@
         } else if (roundingIncrement != null) {
             rounding = Rounder.constructIncrement(roundingIncrement);
         } else if (explicitMinMaxSig) {
-            minSig = minSig < 1 ? 1 : minSig > RoundingUtils.MAX_INT_FRAC_SIG ? RoundingUtils.MAX_INT_FRAC_SIG : minSig;
+            minSig = minSig < 1 ? 1
+                    : minSig > RoundingUtils.MAX_INT_FRAC_SIG ? RoundingUtils.MAX_INT_FRAC_SIG : minSig;
             maxSig = maxSig < 0 ? RoundingUtils.MAX_INT_FRAC_SIG
                     : maxSig < minSig ? minSig
-                            : maxSig > RoundingUtils.MAX_INT_FRAC_SIG ? RoundingUtils.MAX_INT_FRAC_SIG : maxSig;
+                            : maxSig > RoundingUtils.MAX_INT_FRAC_SIG ? RoundingUtils.MAX_INT_FRAC_SIG
+                                    : maxSig;
             rounding = Rounder.constructSignificant(minSig, maxSig);
         } else if (explicitMinMaxFrac) {
             rounding = Rounder.constructFraction(minFrac, maxFrac);
@@ -184,21 +194,15 @@
         // GROUPING STRATEGY //
         ///////////////////////
 
-        int grouping1 = properties.getGroupingSize();
-        int grouping2 = properties.getSecondaryGroupingSize();
-        int minGrouping = properties.getMinimumGroupingDigits();
-        assert grouping1 >= -2; // value of -2 means to forward no grouping information
-        grouping1 = grouping1 > 0 ? grouping1 : grouping2 > 0 ? grouping2 : grouping1;
-        grouping2 = grouping2 > 0 ? grouping2 : grouping1;
-        // TODO: Is it important to handle minGrouping > 2?
-        macros.grouper = Grouper.getInstance((byte) grouping1, (byte) grouping2, minGrouping == 2);
+        macros.grouping = Grouper.forProperties(properties);
 
         /////////////
         // PADDING //
         /////////////
 
         if (properties.getFormatWidth() != -1) {
-            macros.padder = new Padder(properties.getPadString(), properties.getFormatWidth(),
+            macros.padder = new Padder(properties.getPadString(),
+                    properties.getFormatWidth(),
                     properties.getPadPosition());
         }
 
@@ -246,7 +250,8 @@
             // Scientific notation also involves overriding the rounding mode.
             // TODO: Overriding here is a bit of a hack. Should this logic go earlier?
             if (macros.rounder instanceof FractionRounder) {
-                // For the purposes of rounding, get the original min/max int/frac, since the local variables
+                // For the purposes of rounding, get the original min/max int/frac, since the local
+                // variables
                 // have been manipulated for display purposes.
                 int minInt_ = properties.getMinimumIntegerDigits();
                 int minFrac_ = properties.getMinimumFractionDigits();
@@ -334,178 +339,4 @@
 
         return macros;
     }
-
-    private static class PropertiesAffixPatternProvider implements AffixPatternProvider {
-        private final String posPrefix;
-        private final String posSuffix;
-        private final String negPrefix;
-        private final String negSuffix;
-
-        public PropertiesAffixPatternProvider(DecimalFormatProperties properties) {
-            // There are two ways to set affixes in DecimalFormat: via the pattern string (applyPattern), and via the
-            // explicit setters (setPositivePrefix and friends).  The way to resolve the settings is as follows:
-            //
-            // 1) If the explicit setting is present for the field, use it.
-            // 2) Otherwise, follows UTS 35 rules based on the pattern string.
-            //
-            // Importantly, the explicit setters affect only the one field they override.  If you set the positive
-            // prefix, that should not affect the negative prefix.  Since it is impossible for the user of this class
-            // to know whether the origin for a string was the override or the pattern, we have to say that we always
-            // have a negative subpattern and perform all resolution logic here.
-
-            // Convenience: Extract the properties into local variables.
-            // Variables are named with three chars: [p/n][p/s][o/p]
-            // [p/n] => p for positive, n for negative
-            // [p/s] => p for prefix, s for suffix
-            // [o/p] => o for escaped custom override string, p for pattern string
-            String ppo = AffixUtils.escape(properties.getPositivePrefix());
-            String pso = AffixUtils.escape(properties.getPositiveSuffix());
-            String npo = AffixUtils.escape(properties.getNegativePrefix());
-            String nso = AffixUtils.escape(properties.getNegativeSuffix());
-            String ppp = properties.getPositivePrefixPattern();
-            String psp = properties.getPositiveSuffixPattern();
-            String npp = properties.getNegativePrefixPattern();
-            String nsp = properties.getNegativeSuffixPattern();
-
-            if (ppo != null) {
-                posPrefix = ppo;
-            } else if (ppp != null) {
-                posPrefix = ppp;
-            } else {
-                // UTS 35: Default positive prefix is empty string.
-                posPrefix = "";
-            }
-
-            if (pso != null) {
-                posSuffix = pso;
-            } else if (psp != null) {
-                posSuffix = psp;
-            } else {
-                // UTS 35: Default positive suffix is empty string.
-                posSuffix = "";
-            }
-
-            if (npo != null) {
-                negPrefix = npo;
-            } else if (npp != null) {
-                negPrefix = npp;
-            } else {
-                // UTS 35: Default negative prefix is "-" with positive prefix.
-                // Important: We prepend the "-" to the pattern, not the override!
-                negPrefix = ppp == null ? "-" : "-" + ppp;
-            }
-
-            if (nso != null) {
-                negSuffix = nso;
-            } else if (nsp != null) {
-                negSuffix = nsp;
-            } else {
-                // UTS 35: Default negative prefix is the positive prefix.
-                negSuffix = psp == null ? "" : psp;
-            }
-        }
-
-        @Override
-        public char charAt(int flags, int i) {
-            return getStringForFlags(flags).charAt(i);
-        }
-
-        @Override
-        public int length(int flags) {
-            return getStringForFlags(flags).length();
-        }
-
-        private String getStringForFlags(int flags) {
-            boolean prefix = (flags & Flags.PREFIX) != 0;
-            boolean negative = (flags & Flags.NEGATIVE_SUBPATTERN) != 0;
-            if (prefix && negative) {
-                return negPrefix;
-            } else if (prefix) {
-                return posPrefix;
-            } else if (negative) {
-                return negSuffix;
-            } else {
-                return posSuffix;
-            }
-        }
-
-        @Override
-        public boolean positiveHasPlusSign() {
-            return AffixUtils.containsType(posPrefix, AffixUtils.TYPE_PLUS_SIGN)
-                    || AffixUtils.containsType(posSuffix, AffixUtils.TYPE_PLUS_SIGN);
-        }
-
-        @Override
-        public boolean hasNegativeSubpattern() {
-            // See comments in the constructor for more information on why this is always true.
-            return true;
-        }
-
-        @Override
-        public boolean negativeHasMinusSign() {
-            return AffixUtils.containsType(negPrefix, AffixUtils.TYPE_MINUS_SIGN)
-                    || AffixUtils.containsType(negSuffix, AffixUtils.TYPE_MINUS_SIGN);
-        }
-
-        @Override
-        public boolean hasCurrencySign() {
-            return AffixUtils.hasCurrencySymbols(posPrefix) || AffixUtils.hasCurrencySymbols(posSuffix)
-                    || AffixUtils.hasCurrencySymbols(negPrefix) || AffixUtils.hasCurrencySymbols(negSuffix);
-        }
-
-        @Override
-        public boolean containsSymbolType(int type) {
-            return AffixUtils.containsType(posPrefix, type) || AffixUtils.containsType(posSuffix, type)
-                    || AffixUtils.containsType(negPrefix, type) || AffixUtils.containsType(negSuffix, type);
-        }
-    }
-
-    private static class CurrencyPluralInfoAffixProvider implements AffixPatternProvider {
-        private final AffixPatternProvider[] affixesByPlural;
-
-        public CurrencyPluralInfoAffixProvider(CurrencyPluralInfo cpi) {
-            affixesByPlural = new ParsedPatternInfo[StandardPlural.COUNT];
-            for (StandardPlural plural : StandardPlural.VALUES) {
-                affixesByPlural[plural.ordinal()] = PatternStringParser
-                        .parseToPatternInfo(cpi.getCurrencyPluralPattern(plural.getKeyword()));
-            }
-        }
-
-        @Override
-        public char charAt(int flags, int i) {
-            int pluralOrdinal = (flags & Flags.PLURAL_MASK);
-            return affixesByPlural[pluralOrdinal].charAt(flags, i);
-        }
-
-        @Override
-        public int length(int flags) {
-            int pluralOrdinal = (flags & Flags.PLURAL_MASK);
-            return affixesByPlural[pluralOrdinal].length(flags);
-        }
-
-        @Override
-        public boolean positiveHasPlusSign() {
-            return affixesByPlural[StandardPlural.OTHER.ordinal()].positiveHasPlusSign();
-        }
-
-        @Override
-        public boolean hasNegativeSubpattern() {
-            return affixesByPlural[StandardPlural.OTHER.ordinal()].hasNegativeSubpattern();
-        }
-
-        @Override
-        public boolean negativeHasMinusSign() {
-            return affixesByPlural[StandardPlural.OTHER.ordinal()].negativeHasMinusSign();
-        }
-
-        @Override
-        public boolean hasCurrencySign() {
-            return affixesByPlural[StandardPlural.OTHER.ordinal()].hasCurrencySign();
-        }
-
-        @Override
-        public boolean containsSymbolType(int type) {
-            return affixesByPlural[StandardPlural.OTHER.ordinal()].containsSymbolType(type);
-        }
-    }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/Rounder.java b/icu4j/main/classes/core/src/com/ibm/icu/number/Rounder.java
index e48c558..783adf3 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/Rounder.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/Rounder.java
@@ -34,11 +34,12 @@
      * Show all available digits to full precision.
      *
      * <p>
-     * <strong>NOTE:</strong> When formatting a <em>double</em>, this method, along with {@link #minFraction} and
-     * {@link #minDigits}, will trigger complex algorithm similar to <em>Dragon4</em> to determine the low-order digits
-     * and the number of digits to display based on the value of the double. If the number of fraction places or
-     * significant digits can be bounded, consider using {@link #maxFraction} or {@link #maxDigits} instead to maximize
-     * performance. For more information, read the following blog post.
+     * <strong>NOTE:</strong> When formatting a <em>double</em>, this method, along with
+     * {@link #minFraction} and {@link #minDigits}, will trigger complex algorithm similar to
+     * <em>Dragon4</em> to determine the low-order digits and the number of digits to display based on
+     * the value of the double. If the number of fraction places or significant digits can be bounded,
+     * consider using {@link #maxFraction} or {@link #maxDigits} instead to maximize performance. For
+     * more information, read the following blog post.
      *
      * <p>
      * http://www.serpentine.com/blog/2011/06/29/here-be-dragons-advances-in-problems-you-didnt-even-know-you-had/
@@ -65,8 +66,9 @@
     }
 
     /**
-     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator).
-     * Additionally, pad with zeros to ensure that this number of places are always shown.
+     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the
+     * decimal separator). Additionally, pad with zeros to ensure that this number of places are always
+     * shown.
      *
      * <p>
      * Example output with minMaxFractionPlaces = 3:
@@ -86,8 +88,8 @@
      * This method is equivalent to {@link #minMaxFraction} with both arguments equal.
      *
      * @param minMaxFractionPlaces
-     *            The minimum and maximum number of numerals to display after the decimal separator (rounding if too
-     *            long or padding with zeros if too short).
+     *            The minimum and maximum number of numerals to display after the decimal separator
+     *            (rounding if too long or padding with zeros if too short).
      * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter.
      * @draft ICU 60
      * @provisional This API might change or be removed in a future release.
@@ -97,111 +99,122 @@
         if (minMaxFractionPlaces >= 0 && minMaxFractionPlaces <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructFraction(minMaxFractionPlaces, minMaxFractionPlaces);
         } else {
-            throw new IllegalArgumentException(
-                    "Fraction length must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Fraction length must be between 0 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Always show at least a certain number of fraction places after the decimal separator, padding with zeros if
-     * necessary. Do not perform rounding (display numbers to their full precision).
+     * Always show at least a certain number of fraction places after the decimal separator, padding with
+     * zeros if necessary. Do not perform rounding (display numbers to their full precision).
      *
      * <p>
-     * <strong>NOTE:</strong> If you are formatting <em>doubles</em>, see the performance note in {@link #unlimited}.
+     * <strong>NOTE:</strong> If you are formatting <em>doubles</em>, see the performance note in
+     * {@link #unlimited}.
      *
      * @param minFractionPlaces
-     *            The minimum number of numerals to display after the decimal separator (padding with zeros if
-     *            necessary).
+     *            The minimum number of numerals to display after the decimal separator (padding with
+     *            zeros if necessary).
      * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter.
      * @draft ICU 60
      * @provisional This API might change or be removed in a future release.
      * @see NumberFormatter
      */
     public static FractionRounder minFraction(int minFractionPlaces) {
-        if (minFractionPlaces >= 0 && minFractionPlaces < RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (minFractionPlaces >= 0 && minFractionPlaces <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructFraction(minFractionPlaces, -1);
         } else {
-            throw new IllegalArgumentException(
-                    "Fraction length must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Fraction length must be between 0 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator).
-     * Unlike the other fraction rounding strategies, this strategy does <em>not</em> pad zeros to the end of the
-     * number.
+     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the
+     * decimal separator). Unlike the other fraction rounding strategies, this strategy does <em>not</em>
+     * pad zeros to the end of the number.
      *
      * @param maxFractionPlaces
-     *            The maximum number of numerals to display after the decimal mark (rounding if necessary).
+     *            The maximum number of numerals to display after the decimal mark (rounding if
+     *            necessary).
      * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter.
      * @draft ICU 60
      * @provisional This API might change or be removed in a future release.
      * @see NumberFormatter
      */
     public static FractionRounder maxFraction(int maxFractionPlaces) {
-        if (maxFractionPlaces >= 0 && maxFractionPlaces < RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (maxFractionPlaces >= 0 && maxFractionPlaces <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructFraction(0, maxFractionPlaces);
         } else {
-            throw new IllegalArgumentException(
-                    "Fraction length must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Fraction length must be between 0 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator);
-     * in addition, always show at least a certain number of places after the decimal separator, padding with zeros if
-     * necessary.
+     * Show numbers rounded if necessary to a certain number of fraction places (numerals after the
+     * decimal separator); in addition, always show at least a certain number of places after the decimal
+     * separator, padding with zeros if necessary.
      *
      * @param minFractionPlaces
-     *            The minimum number of numerals to display after the decimal separator (padding with zeros if
-     *            necessary).
+     *            The minimum number of numerals to display after the decimal separator (padding with
+     *            zeros if necessary).
      * @param maxFractionPlaces
-     *            The maximum number of numerals to display after the decimal separator (rounding if necessary).
+     *            The maximum number of numerals to display after the decimal separator (rounding if
+     *            necessary).
      * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter.
      * @draft ICU 60
      * @provisional This API might change or be removed in a future release.
      * @see NumberFormatter
      */
     public static FractionRounder minMaxFraction(int minFractionPlaces, int maxFractionPlaces) {
-        if (minFractionPlaces >= 0 && maxFractionPlaces <= RoundingUtils.MAX_INT_FRAC_SIG
+        if (minFractionPlaces >= 0
+                && maxFractionPlaces <= RoundingUtils.MAX_INT_FRAC_SIG
                 && minFractionPlaces <= maxFractionPlaces) {
             return constructFraction(minFractionPlaces, maxFractionPlaces);
         } else {
-            throw new IllegalArgumentException(
-                    "Fraction length must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Fraction length must be between 0 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Show numbers rounded if necessary to a certain number of significant digits or significant figures. Additionally,
-     * pad with zeros to ensure that this number of significant digits/figures are always shown.
+     * Show numbers rounded if necessary to a certain number of significant digits or significant
+     * figures. Additionally, pad with zeros to ensure that this number of significant digits/figures are
+     * always shown.
      *
      * <p>
      * This method is equivalent to {@link #minMaxDigits} with both arguments equal.
      *
      * @param minMaxSignificantDigits
-     *            The minimum and maximum number of significant digits to display (rounding if too long or padding with
-     *            zeros if too short).
+     *            The minimum and maximum number of significant digits to display (rounding if too long
+     *            or padding with zeros if too short).
      * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter.
      * @draft ICU 60
      * @provisional This API might change or be removed in a future release.
      * @see NumberFormatter
      */
     public static Rounder fixedDigits(int minMaxSignificantDigits) {
-        if (minMaxSignificantDigits > 0 && minMaxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (minMaxSignificantDigits >= 1 && minMaxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructSignificant(minMaxSignificantDigits, minMaxSignificantDigits);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Always show at least a certain number of significant digits/figures, padding with zeros if necessary. Do not
-     * perform rounding (display numbers to their full precision).
+     * Always show at least a certain number of significant digits/figures, padding with zeros if
+     * necessary. Do not perform rounding (display numbers to their full precision).
      *
      * <p>
-     * <strong>NOTE:</strong> If you are formatting <em>doubles</em>, see the performance note in {@link #unlimited}.
+     * <strong>NOTE:</strong> If you are formatting <em>doubles</em>, see the performance note in
+     * {@link #unlimited}.
      *
      * @param minSignificantDigits
      *            The minimum number of significant digits to display (padding with zeros if too short).
@@ -211,11 +224,12 @@
      * @see NumberFormatter
      */
     public static Rounder minDigits(int minSignificantDigits) {
-        if (minSignificantDigits > 0 && minSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (minSignificantDigits >= 1 && minSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructSignificant(minSignificantDigits, -1);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
@@ -230,17 +244,18 @@
      * @see NumberFormatter
      */
     public static Rounder maxDigits(int maxSignificantDigits) {
-        if (maxSignificantDigits > 0 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (maxSignificantDigits >= 1 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             return constructSignificant(0, maxSignificantDigits);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Show numbers rounded if necessary to a certain number of significant digits/figures; in addition, always show at
-     * least a certain number of significant digits, padding with zeros if necessary.
+     * Show numbers rounded if necessary to a certain number of significant digits/figures; in addition,
+     * always show at least a certain number of significant digits, padding with zeros if necessary.
      *
      * @param minSignificantDigits
      *            The minimum number of significant digits to display (padding with zeros if necessary).
@@ -252,23 +267,26 @@
      * @see NumberFormatter
      */
     public static Rounder minMaxDigits(int minSignificantDigits, int maxSignificantDigits) {
-        if (minSignificantDigits > 0 && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG
+        if (minSignificantDigits >= 1
+                && maxSignificantDigits <= RoundingUtils.MAX_INT_FRAC_SIG
                 && minSignificantDigits <= maxSignificantDigits) {
             return constructSignificant(minSignificantDigits, maxSignificantDigits);
         } else {
-            throw new IllegalArgumentException(
-                    "Significant digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Significant digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Show numbers rounded if necessary to the closest multiple of a certain rounding increment. For example, if the
-     * rounding increment is 0.5, then round 1.2 to 1 and round 1.3 to 1.5.
+     * Show numbers rounded if necessary to the closest multiple of a certain rounding increment. For
+     * example, if the rounding increment is 0.5, then round 1.2 to 1 and round 1.3 to 1.5.
      *
      * <p>
-     * In order to ensure that numbers are padded to the appropriate number of fraction places, set the scale on the
-     * rounding increment BigDecimal. For example, to round to the nearest 0.5 and always display 2 numerals after the
-     * decimal separator (to display 1.2 as "1.00" and 1.3 as "1.50"), you can run:
+     * In order to ensure that numbers are padded to the appropriate number of fraction places, set the
+     * scale on the rounding increment BigDecimal. For example, to round to the nearest 0.5 and always
+     * display 2 numerals after the decimal separator (to display 1.2 as "1.00" and 1.3 as "1.50"), you
+     * can run:
      *
      * <pre>
      * Rounder.increment(new BigDecimal("0.50"))
@@ -293,18 +311,20 @@
     }
 
     /**
-     * Show numbers rounded and padded according to the rules for the currency unit. The most common rounding settings
-     * for currencies include <code>Rounder.fixedFraction(2)</code>, <code>Rounder.integer()</code>, and
-     * <code>Rounder.increment(0.05)</code> for cash transactions ("nickel rounding").
+     * Show numbers rounded and padded according to the rules for the currency unit. The most common
+     * rounding settings for currencies include <code>Rounder.fixedFraction(2)</code>,
+     * <code>Rounder.integer()</code>, and <code>Rounder.increment(0.05)</code> for cash transactions
+     * ("nickel rounding").
      *
      * <p>
      * The exact rounding details will be resolved at runtime based on the currency unit specified in the
-     * NumberFormatter chain. To round according to the rules for one currency while displaying the symbol for another
-     * currency, the withCurrency() method can be called on the return value of this method.
+     * NumberFormatter chain. To round according to the rules for one currency while displaying the
+     * symbol for another currency, the withCurrency() method can be called on the return value of this
+     * method.
      *
      * @param currencyUsage
-     *            Either STANDARD (for digital transactions) or CASH (for transactions where the rounding increment may
-     *            be limited by the available denominations of cash or coins).
+     *            Either STANDARD (for digital transactions) or CASH (for transactions where the rounding
+     *            increment may be limited by the available denominations of cash or coins).
      * @return A CurrencyRounder for chaining or passing to the NumberFormatter rounding() setter.
      * @draft ICU 60
      * @provisional This API might change or be removed in a future release.
@@ -319,8 +339,8 @@
     }
 
     /**
-     * Sets the {@link java.math.RoundingMode} to use when picking the direction to round (up or down). Common values
-     * include HALF_EVEN, HALF_UP, and FLOOR. The default is HALF_EVEN.
+     * Sets the {@link java.math.RoundingMode} to use when picking the direction to round (up or down).
+     * Common values include HALF_EVEN, HALF_UP, and FLOOR. The default is HALF_EVEN.
      *
      * @param roundingMode
      *            The RoundingMode to use.
@@ -470,8 +490,8 @@
     }
 
     /**
-     * Returns a valid working Rounder. If the Rounder is a CurrencyRounder, applies the given currency. Otherwise,
-     * simply passes through the argument.
+     * Returns a valid working Rounder. If the Rounder is a CurrencyRounder, applies the given currency.
+     * Otherwise, simply passes through the argument.
      *
      * @param currency
      *            A currency object to use in case the input object needs it.
@@ -485,29 +505,58 @@
         }
     }
 
+    /**
+     * Rounding endpoint used by Engineering and Compact notation. Chooses the most appropriate
+     * multiplier (magnitude adjustment), applies the adjustment, rounds, and returns the chosen
+     * multiplier.
+     *
+     * <p>
+     * In most cases, this is simple. However, when rounding the number causes it to cross a multiplier
+     * boundary, we need to re-do the rounding. For example, to display 999,999 in Engineering notation
+     * with 2 sigfigs, first you guess the multiplier to be -3. However, then you end up getting 1000E3,
+     * which is not the correct output. You then change your multiplier to be -6, and you get 1.0E6,
+     * which is correct.
+     *
+     * @param input
+     *            The quantity to process.
+     * @param producer
+     *            Function to call to return a multiplier based on a magnitude.
+     * @return The number of orders of magnitude the input was adjusted by this method.
+     */
     int chooseMultiplierAndApply(DecimalQuantity input, MultiplierProducer producer) {
-        // TODO: Make a better and more efficient implementation.
-        // TODO: Avoid the object creation here.
-        DecimalQuantity copy = input.createCopy();
-
+        // Do not call this method with zero.
         assert !input.isZero();
+
+        // Perform the first attempt at rounding.
         int magnitude = input.getMagnitude();
         int multiplier = producer.getMultiplier(magnitude);
         input.adjustMagnitude(multiplier);
         apply(input);
 
-        // If the number turned to zero when rounding, do not re-attempt the rounding.
-        if (!input.isZero() && input.getMagnitude() == magnitude + multiplier + 1) {
-            magnitude += 1;
-            input.copyFrom(copy);
-            multiplier = producer.getMultiplier(magnitude);
-            input.adjustMagnitude(multiplier);
-            assert input.getMagnitude() == magnitude + multiplier - 1;
-            apply(input);
-            assert input.getMagnitude() == magnitude + multiplier;
+        // If the number rounded to zero, exit.
+        if (input.isZero()) {
+            return multiplier;
         }
 
-        return multiplier;
+        // If the new magnitude after rounding is the same as it was before rounding, then we are done.
+        // This case applies to most numbers.
+        if (input.getMagnitude() == magnitude + multiplier) {
+            return multiplier;
+        }
+
+        // If the above case DIDN'T apply, then we have a case like 99.9 -> 100 or 999.9 -> 1000:
+        // The number rounded up to the next magnitude. Check if the multiplier changes; if it doesn't,
+        // we do not need to make any more adjustments.
+        int _multiplier = producer.getMultiplier(magnitude + 1);
+        if (multiplier == _multiplier) {
+            return multiplier;
+        }
+
+        // We have a case like 999.9 -> 1000, where the correct output is "1K", not "1000".
+        // Fix the magnitude and re-apply the rounding strategy.
+        input.adjustMagnitude(_multiplier - multiplier);
+        apply(input);
+        return _multiplier;
     }
 
     ///////////////
@@ -538,7 +587,8 @@
         @Override
         public void apply(DecimalQuantity value) {
             value.roundToMagnitude(getRoundingMagnitudeFraction(maxFrac), mathContext);
-            value.setFractionLength(Math.max(0, -getDisplayMagnitudeFraction(minFrac)), Integer.MAX_VALUE);
+            value.setFractionLength(Math.max(0, -getDisplayMagnitudeFraction(minFrac)),
+                    Integer.MAX_VALUE);
         }
     }
 
@@ -554,10 +604,14 @@
         @Override
         public void apply(DecimalQuantity value) {
             value.roundToMagnitude(getRoundingMagnitudeSignificant(value, maxSig), mathContext);
-            value.setFractionLength(Math.max(0, -getDisplayMagnitudeSignificant(value, minSig)), Integer.MAX_VALUE);
+            value.setFractionLength(Math.max(0, -getDisplayMagnitudeSignificant(value, minSig)),
+                    Integer.MAX_VALUE);
         }
 
-        /** Version of {@link #apply} that obeys minInt constraints. Used for scientific notation compatibility mode. */
+        /**
+         * Version of {@link #apply} that obeys minInt constraints. Used for scientific notation
+         * compatibility mode.
+         */
         public void apply(DecimalQuantity quantity, int minInt) {
             assert quantity.isZero();
             quantity.setFractionLength(minSig - minInt, Integer.MAX_VALUE);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/ScientificNotation.java b/icu4j/main/classes/core/src/com/ibm/icu/number/ScientificNotation.java
index fe0e274..e121fb7 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/ScientificNotation.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/ScientificNotation.java
@@ -15,7 +15,8 @@
 import com.ibm.icu.text.NumberFormat;
 
 /**
- * A class that defines the scientific notation style to be used when formatting numbers in NumberFormatter.
+ * A class that defines the scientific notation style to be used when formatting numbers in
+ * NumberFormatter.
  *
  * <p>
  * To create a ScientificNotation, use one of the factory methods in {@link Notation}.
@@ -31,7 +32,10 @@
     int minExponentDigits;
     SignDisplay exponentSignDisplay;
 
-    /* package-private */ ScientificNotation(int engineeringInterval, boolean requireMinInt, int minExponentDigits,
+    /* package-private */ ScientificNotation(
+            int engineeringInterval,
+            boolean requireMinInt,
+            int minExponentDigits,
             SignDisplay exponentSignDisplay) {
         this.engineeringInterval = engineeringInterval;
         this.requireMinInt = requireMinInt;
@@ -40,12 +44,12 @@
     }
 
     /**
-     * Sets the minimum number of digits to show in the exponent of scientific notation, padding with zeros if
-     * necessary. Useful for fixed-width display.
+     * Sets the minimum number of digits to show in the exponent of scientific notation, padding with
+     * zeros if necessary. Useful for fixed-width display.
      *
      * <p>
-     * For example, with minExponentDigits=2, the number 123 will be printed as "1.23E02" in <em>en-US</em> instead of
-     * the default "1.23E2".
+     * For example, with minExponentDigits=2, the number 123 will be printed as "1.23E02" in
+     * <em>en-US</em> instead of the default "1.23E2".
      *
      * @param minExponentDigits
      *            The minimum number of digits to show in the exponent.
@@ -55,23 +59,24 @@
      * @see NumberFormatter
      */
     public ScientificNotation withMinExponentDigits(int minExponentDigits) {
-        if (minExponentDigits >= 0 && minExponentDigits < RoundingUtils.MAX_INT_FRAC_SIG) {
+        if (minExponentDigits >= 1 && minExponentDigits <= RoundingUtils.MAX_INT_FRAC_SIG) {
             ScientificNotation other = (ScientificNotation) this.clone();
             other.minExponentDigits = minExponentDigits;
             return other;
         } else {
-            throw new IllegalArgumentException(
-                    "Integer digits must be between 0 and " + RoundingUtils.MAX_INT_FRAC_SIG);
+            throw new IllegalArgumentException("Integer digits must be between 1 and "
+                    + RoundingUtils.MAX_INT_FRAC_SIG
+                    + " (inclusive)");
         }
     }
 
     /**
-     * Sets whether to show the sign on positive and negative exponents in scientific notation. The default is AUTO,
-     * showing the minus sign but not the plus sign.
+     * Sets whether to show the sign on positive and negative exponents in scientific notation. The
+     * default is AUTO, showing the minus sign but not the plus sign.
      *
      * <p>
-     * For example, with exponentSignDisplay=ALWAYS, the number 123 will be printed as "1.23E+2" in <em>en-US</em>
-     * instead of the default "1.23E2".
+     * For example, with exponentSignDisplay=ALWAYS, the number 123 will be printed as "1.23E+2" in
+     * <em>en-US</em> instead of the default "1.23E2".
      *
      * @param exponentSignDisplay
      *            The strategy for displaying the sign in the exponent.
@@ -101,21 +106,27 @@
         }
     }
 
-    /* package-private */ MicroPropsGenerator withLocaleData(DecimalFormatSymbols symbols, boolean build,
+    /* package-private */ MicroPropsGenerator withLocaleData(
+            DecimalFormatSymbols symbols,
+            boolean build,
             MicroPropsGenerator parent) {
         return new ScientificHandler(this, symbols, build, parent);
     }
 
-    // NOTE: The object lifecycle of ScientificModifier and ScientificHandler differ greatly in Java and C++.
+    // NOTE: The object lifecycle of ScientificModifier and ScientificHandler differ greatly in Java and
+    // C++.
     //
     // During formatting, we need to provide an object with state (the exponent) as the inner modifier.
     //
     // In Java, where the priority is put on reducing object creations, the unsafe code path re-uses the
-    // ScientificHandler as a ScientificModifier, and the safe code path pre-computes 25 ScientificModifier
+    // ScientificHandler as a ScientificModifier, and the safe code path pre-computes 25
+    // ScientificModifier
     // instances. This scheme reduces the number of object creations by 1 in both safe and unsafe.
     //
-    // In C++, MicroProps provides a pre-allocated ScientificModifier, and ScientificHandler simply populates
-    // the state (the exponent) into that ScientificModifier. There is no difference between safe and unsafe.
+    // In C++, MicroProps provides a pre-allocated ScientificModifier, and ScientificHandler simply
+    // populates
+    // the state (the exponent) into that ScientificModifier. There is no difference between safe and
+    // unsafe.
 
     private static class ScientificHandler implements MicroPropsGenerator, MultiplierProducer, Modifier {
 
@@ -125,7 +136,10 @@
         final MicroPropsGenerator parent;
         /* unsafe */ int exponent;
 
-        private ScientificHandler(ScientificNotation notation, DecimalFormatSymbols symbols, boolean safe,
+        private ScientificHandler(
+                ScientificNotation notation,
+                DecimalFormatSymbols symbols,
+                boolean safe,
                 MicroPropsGenerator parent) {
             this.notation = notation;
             this.symbols = symbols;
@@ -152,7 +166,8 @@
             if (quantity.isZero()) {
                 if (notation.requireMinInt && micros.rounding instanceof SignificantRounderImpl) {
                     // Show "00.000E0" on pattern "00.000E0"
-                    ((SignificantRounderImpl) micros.rounding).apply(quantity, notation.engineeringInterval);
+                    ((SignificantRounderImpl) micros.rounding).apply(quantity,
+                            notation.engineeringInterval);
                     exponent = 0;
                 } else {
                     micros.rounding.apply(quantity);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/SimpleNotation.java b/icu4j/main/classes/core/src/com/ibm/icu/number/SimpleNotation.java
index 7007a3a..bd9ca6e 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/SimpleNotation.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/SimpleNotation.java
@@ -6,8 +6,8 @@
  * A class that defines the simple notation style to be used when formatting numbers in NumberFormatter.
  *
  * <p>
- * This class exposes no public functionality. To create a SimpleNotation, use one of the factory methods in
- * {@link Notation}.
+ * This class exposes no public functionality. To create a SimpleNotation, use one of the factory methods
+ * in {@link Notation}.
  *
  * @draft ICU 60
  * @provisional This API might change or be removed in a future release.
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/UnlocalizedNumberFormatter.java b/icu4j/main/classes/core/src/com/ibm/icu/number/UnlocalizedNumberFormatter.java
index bc82c90..decce7f 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/UnlocalizedNumberFormatter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/UnlocalizedNumberFormatter.java
@@ -7,7 +7,8 @@
 import com.ibm.icu.util.ULocale;
 
 /**
- * A NumberFormatter that does not yet have a locale. In order to format numbers, a locale must be specified.
+ * A NumberFormatter that does not yet have a locale. In order to format numbers, a locale must be
+ * specified.
  *
  * @see NumberFormatter
  * @draft ICU 60
@@ -25,8 +26,8 @@
     }
 
     /**
-     * Associate the given locale with the number formatter. The locale is used for picking the appropriate symbols,
-     * formats, and other data for number display.
+     * Associate the given locale with the number formatter. The locale is used for picking the
+     * appropriate symbols, formats, and other data for number display.
      *
      * <p>
      * To use the Java default locale, call Locale.getDefault():
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/BreakIterator.java b/icu4j/main/classes/core/src/com/ibm/icu/text/BreakIterator.java
index 451b8c0..a8a953b 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/BreakIterator.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/BreakIterator.java
@@ -445,14 +445,13 @@
 
     /**
      * For RuleBasedBreakIterators, return the status tag from the
-     * break rule that determined the most recently
-     * returned break position.
+     * break rule that determined the boundary at the current iteration position.
      * <p>
      * For break iterator types that do not support a rule status,
      * a default value of 0 is returned.
      * <p>
-     * @return The status from the break rule that determined the most recently
-     *         returned break position.
+     * @return The status from the break rule that determined the boundary
+     * at the current iteration position.
      *
      * @stable ICU 52
      */
@@ -463,7 +462,7 @@
 
     /**
      * For RuleBasedBreakIterators, get the status (tag) values from the break rule(s)
-     * that determined the most recently returned break position.
+     * that determined the the boundary at the current iteration position.
      * <p>
      * For break iterator types that do not support rule status,
      * no values are returned.
@@ -474,7 +473,7 @@
      *
      * @param fillInArray an array to be filled in with the status values.
      * @return          The number of rule status values from rules that determined
-     *                  the most recent boundary returned by the break iterator.
+     *                  the the boundary at the current iteration position.
      *                  In the event that the array is too small, the return value
      *                  is the total number of status values that were available,
      *                  not the reduced number that were actually returned.
@@ -883,10 +882,6 @@
 
         BreakIteratorCache cache = new BreakIteratorCache(where, result);
         iterCache[kind] = CacheValue.getInstance(cache);
-        if (result instanceof RuleBasedBreakIterator) {
-            RuleBasedBreakIterator rbbi = (RuleBasedBreakIterator)result;
-            rbbi.setBreakType(kind);
-        }
 
         return result;
     }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/BreakIteratorFactory.java b/icu4j/main/classes/core/src/com/ibm/icu/text/BreakIteratorFactory.java
index f46ede1..a2817bc 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/BreakIteratorFactory.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/BreakIteratorFactory.java
@@ -161,7 +161,6 @@
         // TODO: Determine valid and actual locale correctly.
         ULocale uloc = ULocale.forLocale(rb.getLocale());
         iter.setLocale(uloc, uloc);
-        iter.setBreakType(kind);
 
         // filtered break
         if (kind == BreakIterator.KIND_SENTENCE) {
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/BurmeseBreakEngine.java b/icu4j/main/classes/core/src/com/ibm/icu/text/BurmeseBreakEngine.java
index 141e3e0..6dc682a 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/BurmeseBreakEngine.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/BurmeseBreakEngine.java
@@ -61,7 +61,6 @@
     }
 
     public BurmeseBreakEngine() throws IOException {
-        super(BreakIterator.KIND_WORD, BreakIterator.KIND_LINE);
         setCharacters(fBurmeseWordSet);
         // Initialize dictionary
         fDictionary = DictionaryData.loadDictionaryFor("Mymr");
@@ -80,12 +79,9 @@
     }
 
     @Override
-    public boolean handles(int c, int breakType) {
-        if (breakType == BreakIterator.KIND_WORD || breakType == BreakIterator.KIND_LINE) {
-            int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
-            return (script == UScript.MYANMAR);
-        }
-        return false;
+    public boolean handles(int c) {
+        int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
+        return (script == UScript.MYANMAR);
     }
 
     @Override
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/CaseMap.java b/icu4j/main/classes/core/src/com/ibm/icu/text/CaseMap.java
index 67a13a8..8680714 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/CaseMap.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/CaseMap.java
@@ -15,8 +15,7 @@
  *
  * This class is not intended for public subclassing.
  *
- * @draft ICU 59
- * @provisional This API might change or be removed in a future release.
+ * @stable ICU 59
  */
 public abstract class CaseMap {
     /**
@@ -37,26 +36,22 @@
 
     /**
      * @return Lowercasing object with default options.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public static Lower toLower() { return Lower.DEFAULT; }
     /**
      * @return Uppercasing object with default options.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public static Upper toUpper() { return Upper.DEFAULT; }
     /**
      * @return Titlecasing object with default options.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public static Title toTitle() { return Title.DEFAULT; }
     /**
      * @return Case folding object with default options.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public static Fold fold() { return Fold.DEFAULT; }
 
@@ -65,8 +60,7 @@
      * omits unchanged text when case-mapping with {@link Edits}.
      *
      * @return an options object with this option.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public abstract CaseMap omitUnchangedText();
 
@@ -74,8 +68,7 @@
      * Lowercasing options and methods. Immutable.
      *
      * @see #toLower()
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public static final class Lower extends CaseMap {
         private static final Lower DEFAULT = new Lower(0);
@@ -84,8 +77,7 @@
 
         /**
          * {@inheritDoc}
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         @Override
         public Lower omitUnchangedText() {
@@ -125,8 +117,7 @@
          * @return dest with the result string (or only changes) appended.
          *
          * @see UCharacter#toLowerCase(Locale, String)
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
          public <A extends Appendable> A apply(
                  Locale locale, CharSequence src, A dest, Edits edits) {
@@ -138,8 +129,7 @@
      * Uppercasing options and methods. Immutable.
      *
      * @see #toUpper()
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public static final class Upper extends CaseMap {
         private static final Upper DEFAULT = new Upper(0);
@@ -148,8 +138,7 @@
 
         /**
          * {@inheritDoc}
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         @Override
         public Upper omitUnchangedText() {
@@ -189,8 +178,7 @@
          * @return dest with the result string (or only changes) appended.
          *
          * @see UCharacter#toUpperCase(Locale, String)
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
          public <A extends Appendable> A apply(
                  Locale locale, CharSequence src, A dest, Edits edits) {
@@ -202,8 +190,7 @@
      * Titlecasing options and methods. Immutable.
      *
      * @see #toTitle()
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public static final class Title extends CaseMap {
         private static final Title DEFAULT = new Title(0);
@@ -248,8 +235,7 @@
 
         /**
          * {@inheritDoc}
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         @Override
         public Title omitUnchangedText() {
@@ -271,8 +257,7 @@
          * @return an options object with this option.
          * @see UCharacter#TITLECASE_NO_LOWERCASE
          * @see #adjustToCased()
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public Title noLowercase() {
             return new Title(internalOptions | UCharacter.TITLECASE_NO_LOWERCASE);
@@ -291,8 +276,7 @@
          *
          * @return an options object with this option.
          * @see UCharacter#TITLECASE_NO_BREAK_ADJUSTMENT
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public Title noBreakAdjustment() {
             return new Title(CaseMapImpl.addTitleAdjustmentOption(
@@ -380,8 +364,7 @@
          * @return dest with the result string (or only changes) appended.
          *
          * @see UCharacter#toTitleCase(Locale, String, BreakIterator, int)
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
          public <A extends Appendable> A apply(
                  Locale locale, BreakIterator iter, CharSequence src, A dest, Edits edits) {
@@ -399,8 +382,7 @@
      * Case folding options and methods. Immutable.
      *
      * @see #fold()
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public static final class Fold extends CaseMap {
         private static final Fold DEFAULT = new Fold(0);
@@ -412,8 +394,7 @@
 
         /**
          * {@inheritDoc}
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         @Override
         public Fold omitUnchangedText() {
@@ -431,8 +412,7 @@
          *
          * @return an options object with this option.
          * @see UCharacter#FOLD_CASE_EXCLUDE_SPECIAL_I
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public Fold turkic() {
             return (internalOptions & CaseMapImpl.OMIT_UNCHANGED_TEXT) == 0 ?
@@ -474,8 +454,7 @@
          * @return dest with the result string (or only changes) appended.
          *
          * @see UCharacter#foldCase(String, int)
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
          public <A extends Appendable> A apply(CharSequence src, A dest, Edits edits) {
              return CaseMapImpl.fold(internalOptions, src, dest, edits);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/CjkBreakEngine.java b/icu4j/main/classes/core/src/com/ibm/icu/text/CjkBreakEngine.java
index b2c4c61..60ce286 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/CjkBreakEngine.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/CjkBreakEngine.java
@@ -38,7 +38,6 @@
     private DictionaryMatcher fDictionary = null;
 
     public CjkBreakEngine(boolean korean) throws IOException {
-        super(BreakIterator.KIND_WORD);
         fDictionary = DictionaryData.loadDictionaryFor("Hira");
         if (korean) {
             setCharacters(fHangulWordSet);
@@ -102,7 +101,7 @@
         boolean isNormalized = Normalizer.quickCheck(prenormstr, Normalizer.NFKC) == Normalizer.YES ||
                                Normalizer.isNormalized(prenormstr, Normalizer.NFKC, 0);
         CharacterIterator text;
-        int numChars = 0;
+        int numCodePts = 0;
         if (isNormalized) {
             text = new java.text.StringCharacterIterator(prenormstr);
             int index = 0;
@@ -110,8 +109,8 @@
             while (index < prenormstr.length()) {
                 int codepoint = prenormstr.codePointAt(index);
                 index += Character.charCount(codepoint);
-                numChars++;
-                charPositions[numChars] = index;
+                numCodePts++;
+                charPositions[numCodePts] = index;
             }
         } else {
             String normStr = Normalizer.normalize(prenormstr, Normalizer.NFKC);
@@ -122,37 +121,43 @@
             charPositions[0] = 0;
             while (index < normalizer.endIndex()) {
                 normalizer.next();
-                numChars++;
+                numCodePts++;
                 index = normalizer.getIndex();
-                charPositions[numChars] = index;
+                charPositions[numCodePts] = index;
             }
         }
 
         // From here on out, do the algorithm. Note that our indices
         // refer to indices within the normalized string.
-        int[] bestSnlp = new int[numChars + 1];
+        int[] bestSnlp = new int[numCodePts + 1];
         bestSnlp[0] = 0;
-        for (int i = 1; i <= numChars; i++) {
+        for (int i = 1; i <= numCodePts; i++) {
             bestSnlp[i] = kint32max;
         }
 
-        int[] prev = new int[numChars + 1];
-        for (int i = 0; i <= numChars; i++) {
+        int[] prev = new int[numCodePts + 1];
+        for (int i = 0; i <= numCodePts; i++) {
             prev[i] = -1;
         }
 
         final int maxWordSize = 20;
-        int values[] = new int[numChars];
-        int lengths[] = new int[numChars];
+        int values[] = new int[numCodePts];
+        int lengths[] = new int[numCodePts];
         // dynamic programming to find the best segmentation
+
+        // In outer loop, i  is the code point index,
+        //                ix is the corresponding code unit index.
+        //    They differ when the string contains supplementary characters.
+        int ix = 0;
+        text.setIndex(ix);
         boolean is_prev_katakana = false;
-        for (int i = 0; i < numChars; i++) {
-            text.setIndex(i);
+        for (int i = 0; i < numCodePts; i++, text.setIndex(ix), next32(text)) {
+            ix = text.getIndex();
             if (bestSnlp[i] == kint32max) {
                 continue;
             }
 
-            int maxSearchLength = (i + maxWordSize < numChars) ? maxWordSize : (numChars - i);
+            int maxSearchLength = (i + maxWordSize < numCodePts) ? maxWordSize : (numCodePts - i);
             int[] count_ = new int[1];
             fDictionary.matches(text, maxSearchLength, lengths, count_, maxSearchLength, values);
             int count = count_[0];
@@ -162,7 +167,7 @@
             // with the highest value possible (i.e. the least likely to occur).
             // Exclude Korean characters from this treatment, as they should be
             // left together by default.
-            text.setIndex(i);  // fDictionary.matches() advances the text position; undo that.
+            text.setIndex(ix);  // fDictionary.matches() advances the text position; undo that.
             if ((count == 0 || lengths[0] != 1) && current32(text) != DONE32 && !fHangulWordSet.contains(current32(text))) {
                 values[count] = maxSnlp;
                 lengths[count] = 1;
@@ -186,7 +191,7 @@
             if (!is_prev_katakana && is_katakana) {
                 int j = i + 1;
                 next32(text);
-                while (j < numChars && (j - i) < kMaxKatakanaGroupLength && isKatakana(current32(text))) {
+                while (j < numCodePts && (j - i) < kMaxKatakanaGroupLength && isKatakana(current32(text))) {
                     next32(text);
                     ++j;
                 }
@@ -202,13 +207,13 @@
             is_prev_katakana = is_katakana;
         }
 
-        int t_boundary[] = new int[numChars + 1];
+        int t_boundary[] = new int[numCodePts + 1];
         int numBreaks = 0;
-        if (bestSnlp[numChars] == kint32max) {
-            t_boundary[numBreaks] = numChars;
+        if (bestSnlp[numCodePts] == kint32max) {
+            t_boundary[numBreaks] = numCodePts;
             numBreaks++;
         } else {
-            for (int i = numChars; i > 0; i = prev[i]) {
+            for (int i = numCodePts; i > 0; i = prev[i]) {
                 t_boundary[numBreaks] = i;
                 numBreaks++;
             }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/CompactDecimalFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/CompactDecimalFormat.java
index 7feeb33..e185a54 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/CompactDecimalFormat.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/CompactDecimalFormat.java
@@ -13,10 +13,19 @@
 import java.util.Locale;
 
 import com.ibm.icu.impl.number.DecimalFormatProperties;
+import com.ibm.icu.number.NumberFormatter;
 import com.ibm.icu.util.CurrencyAmount;
 import com.ibm.icu.util.ULocale;
 
 /**
+ * Formats numbers in compact (abbreviated) notation, like "1.2K" instead of "1200".
+ *
+ * <p>
+ * <strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * {@link NumberFormatter} fits their use case.  Although not deprecated, this
+ * class, CompactDecimalFormat, is provided for backwards compatibility only.
+ * <hr>
+ *
  * The CompactDecimalFormat produces abbreviated numbers, suitable for display in environments will
  * limited real estate. For example, 'Hits: 1.2B' instead of 'Hits: 1,200,000,000'. The format will
  * be appropriate for the given language, such as "1,2 Mrd." for German.
@@ -70,6 +79,9 @@
   }
 
   /**
+   * <strong>NOTE:</strong> New users are strongly encouraged to use
+   * {@link NumberFormatter} instead of NumberFormat.
+   * <hr>
    * Creates a CompactDecimalFormat appropriate for a locale. The result may be affected by the
    * number system in the locale, such as ar-u-nu-latn.
    *
@@ -82,6 +94,9 @@
   }
 
   /**
+   * <strong>NOTE:</strong> New users are strongly encouraged to use
+   * {@link NumberFormatter} instead of NumberFormat.
+   * <hr>
    * Creates a CompactDecimalFormat appropriate for a locale. The result may be affected by the
    * number system in the locale, such as ar-u-nu-latn.
    *
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyDisplayNames.java b/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyDisplayNames.java
index 4489577..7bf1d0f 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyDisplayNames.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyDisplayNames.java
@@ -111,17 +111,31 @@
 
     /**
      * Returns the symbol for the currency with the provided ISO code.  If
-     * there is no data for the ISO code, substitutes isoCode or returns null.
+     * there is no data for the ISO code, substitutes isoCode, or returns null
+     * if noSubstitute was set in the factory method.
      *
      * @param isoCode the three-letter ISO code.
-     * @return the display name.
+     * @return the symbol.
      * @stable ICU 4.4
      */
     public abstract String getSymbol(String isoCode);
 
     /**
+     * Returns the narrow symbol for the currency with the provided ISO code.
+     * If there is no data for narrow symbol, substitutes isoCode, or returns
+     * null if noSubstitute was set in the factory method.
+     *
+     * @param isoCode the three-letter ISO code.
+     * @return the narrow symbol.
+     * @draft ICU 61
+     * @provisional This API might change or be removed in a future release.
+     */
+    public abstract String getNarrowSymbol(String isoCode);
+
+    /**
      * Returns the 'long name' for the currency with the provided ISO code.
-     * If there is no data for the ISO code, substitutes isoCode or returns null.
+     * If there is no data for the ISO code, substitutes isoCode, or returns null
+     * if noSubstitute was set in the factory method.
      *
      * @param isoCode the three-letter ISO code
      * @return the display name
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyFormat.java
index 3142226..c3cc937 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyFormat.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyFormat.java
@@ -17,16 +17,14 @@
 import java.text.ParsePosition;
 
 import com.ibm.icu.util.CurrencyAmount;
-import com.ibm.icu.util.Measure;
 import com.ibm.icu.util.ULocale;
 
 /**
- * Temporary internal concrete subclass of MeasureFormat implementing
- * parsing and formatting of CurrencyAmount objects.  This class is
- * likely to be redesigned and rewritten in the near future.
+ * Temporary internal concrete subclass of MeasureFormat implementing parsing and formatting of
+ * CurrencyAmount objects. This class is likely to be redesigned and rewritten in the near future.
  *
- * <p>This class currently delegates to DecimalFormat for parsing and
- * formatting.
+ * <p>
+ * This class currently delegates to DecimalFormat for parsing and formatting.
  *
  * @see com.ibm.icu.text.UFormat
  * @see com.ibm.icu.text.DecimalFormat
@@ -35,88 +33,42 @@
 class CurrencyFormat extends MeasureFormat {
     // Generated by serialver from JDK 1.4.1_01
     static final long serialVersionUID = -931679363692504634L;
-    
-    private NumberFormat fmt;
-    private transient final MeasureFormat mf;
 
     public CurrencyFormat(ULocale locale) {
-        // Needed for getLocale(ULocale.VALID_LOCALE).
-        setLocale(locale, locale);
-        mf = MeasureFormat.getInstance(locale, FormatWidth.WIDE);
-        fmt = NumberFormat.getCurrencyInstance(locale.toLocale());
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Object clone() {
-        CurrencyFormat result = (CurrencyFormat) super.clone();
-        result.fmt = (NumberFormat) fmt.clone();
-        return result;
+        super(locale, FormatWidth.DEFAULT_CURRENCY);
     }
 
     /**
      * Override Format.format().
+     *
      * @see java.text.Format#format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition)
      */
+    @Override
     public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
         if (!(obj instanceof CurrencyAmount)) {
             throw new IllegalArgumentException("Invalid type: " + obj.getClass().getName());
         }
-        CurrencyAmount currency = (CurrencyAmount) obj;
-            
-        fmt.setCurrency(currency.getCurrency());
-        return fmt.format(currency.getNumber(), toAppendTo, pos);
+        return super.format(obj, toAppendTo, pos);
     }
 
     /**
      * Override Format.parseObject().
+     *
      * @see java.text.Format#parseObject(java.lang.String, java.text.ParsePosition)
      */
     @Override
     public CurrencyAmount parseObject(String source, ParsePosition pos) {
-        return fmt.parseCurrency(source, pos);
+        return getNumberFormatInternal().parseCurrency(source, pos);
     }
-    
-    // boilerplate code to make CurrencyFormat otherwise follow the contract of
-    // MeasureFormat
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public StringBuilder formatMeasures(
-            StringBuilder appendTo, FieldPosition fieldPosition, Measure... measures) {
-        return mf.formatMeasures(appendTo, fieldPosition, measures);
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public MeasureFormat.FormatWidth getWidth() {
-        return mf.getWidth();
-    }
-    
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public NumberFormat getNumberFormat() {
-        return mf.getNumberFormat();
-    }
-    
-    // End boilerplate.
-    
+
     // Serialization
-    
+
     private Object writeReplace() throws ObjectStreamException {
-        return mf.toCurrencyProxy();
+        return toCurrencyProxy();
     }
-    
+
     // Preserve backward serialize backward compatibility.
     private Object readResolve() throws ObjectStreamException {
-        return new CurrencyFormat(fmt.getLocale(ULocale.ACTUAL_LOCALE));
+        return new CurrencyFormat(getLocale(ULocale.ACTUAL_LOCALE));
     }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyPluralInfo.java b/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyPluralInfo.java
index 3e89cdb..afc0c2e 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyPluralInfo.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/CurrencyPluralInfo.java
@@ -260,7 +260,7 @@
      * @deprecated This API is ICU internal only.
      */
     @Deprecated
-    String select(PluralRules.FixedDecimal numberInfo) {
+    public String select(PluralRules.FixedDecimal numberInfo) {
         return pluralRules.select(numberInfo);
     }
 
@@ -268,8 +268,11 @@
      * Currency plural pattern iterator.
      *
      * @return a iterator on the currency plural pattern key set.
+     * @internal
+     * @deprecated This API is ICU internal only.
      */
-    Iterator<String> pluralPatternIterator() {
+    @Deprecated
+    public Iterator<String> pluralPatternIterator() {
         return pluralCountToCurrencyUnitPattern.keySet().iterator();
     }
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java b/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java
index 77f24bf..2378846 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java
@@ -217,13 +217,22 @@
         public void put(UResource.Key key, UResource.Value value, boolean noFallback) {
             UResource.Table itemsTable = value.getTable();
             for (int i = 0; itemsTable.getKeyAndValue(i, key, value); ++i) {
-                int field = getCLDRFieldNumber(key);
-                if (field == -1) { continue; }
+                if (value.getType() != UResourceBundle.TABLE) {
+                    // Typically get either UResourceBundle.TABLE = 2 or ICUResourceBundle.ALIAS = 3.
+                    // Currently fillInMissing() is being used instead of following the ALIAS, so
+                    // skip ALIAS entries which cause UResourceTypeMismatchException in the line
+                    // UResource.Table detailsTable = value.getTable()
+                    continue;
+                }
+                int fieldAndWidth = getCLDRFieldAndWidthNumber(key);
+                if (fieldAndWidth == -1) { continue; }
+                int field = fieldAndWidth / DisplayWidth.COUNT;
+                DisplayWidth width = CLDR_FIELD_WIDTH[fieldAndWidth % DisplayWidth.COUNT];
                 UResource.Table detailsTable = value.getTable();
                 for (int j = 0; detailsTable.getKeyAndValue(j, key, value); ++j) {
                     if (!key.contentEquals("dn")) continue;
-                    if (getAppendItemName(field) == null) {
-                        setAppendItemName(field, value.toString());
+                    if (getFieldDisplayName(field, width) == null) {
+                        setFieldDisplayName(field, width, value.toString());
                     }
                     break;
                 }
@@ -236,10 +245,16 @@
             if (getAppendItemFormat(i) == null) {
                 setAppendItemFormat(i, "{0} \u251C{2}: {1}\u2524");
             }
-            if (getAppendItemName(i) == null) {
-                setAppendItemName(i, "F" + i);
+            if (getFieldDisplayName(i, DisplayWidth.WIDE) == null) {
+                setFieldDisplayName(i, DisplayWidth.WIDE, "F" + i);
             }
-        }
+            if (getFieldDisplayName(i, DisplayWidth.ABBREVIATED) == null) {
+                setFieldDisplayName(i, DisplayWidth.ABBREVIATED, getFieldDisplayName(i, DisplayWidth.WIDE));
+            }
+            if (getFieldDisplayName(i, DisplayWidth.NARROW) == null) {
+                setFieldDisplayName(i, DisplayWidth.NARROW, getFieldDisplayName(i, DisplayWidth.ABBREVIATED));
+            }
+       }
     }
 
     private class AvailableFormatsSink extends UResource.Sink {
@@ -505,10 +520,13 @@
         return -1;
     }
 
-    private static int getCLDRFieldNumber(UResource.Key key) {
+    private static int getCLDRFieldAndWidthNumber(UResource.Key key) {
         for (int i = 0; i < CLDR_FIELD_NAME.length; ++i) {
-            if (key.contentEquals(CLDR_FIELD_NAME[i])) {
-                return i;
+            for (int j = 0; j < DisplayWidth.COUNT; ++j) {
+                String fullKey = CLDR_FIELD_NAME[i].concat(CLDR_FIELD_WIDTH[j].cldrKey());
+                if (key.contentEquals(fullKey)) {
+                    return i * DisplayWidth.COUNT + j;
+                }
             }
         }
         return -1;
@@ -1102,6 +1120,52 @@
     @Deprecated
     public static final int TYPE_LIMIT = 16;
 
+    /**
+     * Field display name width constants for getFieldDisplayName
+     * @draft ICU 61
+     */
+    public enum DisplayWidth {
+        /**
+         * The full field name
+         * @draft ICU 61
+         */
+        WIDE(""),
+        /**
+         * An abbreviated field name
+         * (may be the same as the wide version, if short enough)
+         * @draft ICU 61
+         */
+        ABBREVIATED("-short"),
+        /**
+         * The shortest possible field name
+         * (may be the same as the abbreviated version)
+         * @draft ICU 61
+         */
+        NARROW("-narrow");
+        /**
+         * The count of available widths
+         * @internal
+         * @deprecated This API is ICU internal only.
+         */
+        @Deprecated
+        private static int COUNT = DisplayWidth.values().length;
+        private final String cldrKey;
+        DisplayWidth(String cldrKey) {
+            this.cldrKey = cldrKey;
+        }
+        private String cldrKey() {
+            return cldrKey;
+        }
+    }
+
+    /**
+     * The field name width for use in appendItems
+     */
+    private static final DisplayWidth APPENDITEM_WIDTH = DisplayWidth.WIDE;
+    private static final int APPENDITEM_WIDTH_INT = APPENDITEM_WIDTH.ordinal();
+    private static final DisplayWidth[] CLDR_FIELD_WIDTH = DisplayWidth.values();
+
+
     // Option masks for getBestPattern, replaceFieldTypes (individual masks may be ORed together)
 
     /**
@@ -1192,20 +1256,55 @@
      * @stable ICU 3.6
      */
     public void setAppendItemName(int field, String value) {
-        checkFrozen();
-        appendItemNames[field] = value;
+        setFieldDisplayName(field, APPENDITEM_WIDTH, value);
     }
 
     /**
-     * Getter corresponding to setAppendItemNames. Values below 0 or at or above
-     * TYPE_LIMIT are illegal arguments.
+     * Getter corresponding to setAppendItemName. Values below 0 or at or above
+     * TYPE_LIMIT are illegal arguments. Note: The more general method
+     * for getting date/time field display names is getFieldDisplayName.
      *
      * @param field The index to get the append item name.
      * @return name for field
+     * @see #getFieldDisplayName(int, DisplayWidth)
      * @stable ICU 3.6
      */
     public String getAppendItemName(int field) {
-        return appendItemNames[field];
+        return getFieldDisplayName(field, APPENDITEM_WIDTH);
+    }
+
+    /**
+     * The private interface to set a display name for a particular date/time field,
+     * in one of several possible display widths.
+     *
+     * @param field The field type, such as ERA.
+     * @param width The desired DisplayWidth, such as DisplayWidth.ABBREVIATED.
+     * @param value The display name to set
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    private void setFieldDisplayName(int field, DisplayWidth width, String value) {
+        checkFrozen();
+        if (field < TYPE_LIMIT && field >= 0) {
+            fieldDisplayNames[field][width.ordinal()] = value;
+        }
+    }
+
+    /**
+     * The general interface to get a display name for a particular date/time field,
+     * in one of several possible display widths.
+     *
+     * @param field The field type, such as ERA.
+     * @param width The desired DisplayWidth, such as DisplayWidth.ABBREVIATED.
+     * @return.     The display name for the field
+     * @draft ICU 61
+     */
+    public String getFieldDisplayName(int field, DisplayWidth width) {
+        if (field >= TYPE_LIMIT || field < 0) {
+            return "";
+        }
+        return fieldDisplayNames[field][width.ordinal()];
     }
 
     /**
@@ -1294,7 +1393,7 @@
             result.skeleton2pattern = (TreeMap<DateTimeMatcher, PatternWithSkeletonFlag>) skeleton2pattern.clone();
             result.basePattern_pattern = (TreeMap<String, PatternWithSkeletonFlag>) basePattern_pattern.clone();
             result.appendItemFormats = appendItemFormats.clone();
-            result.appendItemNames = appendItemNames.clone();
+            result.fieldDisplayNames = fieldDisplayNames.clone();
             result.current = new DateTimeMatcher();
             result.fp = new FormatParser();
             result._distanceInfo = new DistanceInfo();
@@ -1796,7 +1895,7 @@
     private String decimal = "?";
     private String dateTimeFormat = "{1} {0}";
     private String[] appendItemFormats = new String[TYPE_LIMIT];
-    private String[] appendItemNames = new String[TYPE_LIMIT];
+    private String[][] fieldDisplayNames = new String[TYPE_LIMIT][DisplayWidth.COUNT];
     private char defaultHourFormatChar = 'H';
     //private boolean chineseMonthHack = false;
     //private boolean isComplete = false;
@@ -1857,7 +1956,7 @@
     }
 
     private String getAppendName(int foundMask) {
-        return "'" + appendItemNames[foundMask] + "'";
+        return "'" + fieldDisplayNames[foundMask][APPENDITEM_WIDTH_INT] + "'";
     }
     private String getAppendFormat(int foundMask) {
         return appendItemFormats[foundMask];
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/DecimalFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/DecimalFormat.java
index 58a0189..c7bb125 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/DecimalFormat.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/DecimalFormat.java
@@ -10,15 +10,16 @@
 import java.math.RoundingMode;
 import java.text.AttributedCharacterIterator;
 import java.text.FieldPosition;
-import java.text.ParseException;
 import java.text.ParsePosition;
 
 import com.ibm.icu.impl.number.AffixUtils;
 import com.ibm.icu.impl.number.DecimalFormatProperties;
 import com.ibm.icu.impl.number.Padder.PadPosition;
-import com.ibm.icu.impl.number.Parse;
 import com.ibm.icu.impl.number.PatternStringParser;
 import com.ibm.icu.impl.number.PatternStringUtils;
+import com.ibm.icu.impl.number.parse.NumberParserImpl;
+import com.ibm.icu.impl.number.parse.NumberParserImpl.ParseMode;
+import com.ibm.icu.impl.number.parse.ParsedNumber;
 import com.ibm.icu.lang.UCharacter;
 import com.ibm.icu.math.BigDecimal;
 import com.ibm.icu.math.MathContext;
@@ -33,7 +34,15 @@
 import com.ibm.icu.util.ULocale.Category;
 
 /**
- * {@icuenhanced java.text.DecimalFormat}.{@icu _usage_} <code>DecimalFormat</code> is the primary
+ * {@icuenhanced java.text.DecimalFormat}.{@icu _usage_}
+ *
+ * <p>
+ * <strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * {@link NumberFormatter} fits their use case.  Although not deprecated, this
+ * class, DecimalFormat, is only provided for java.text.DecimalFormat compatibility.
+ * <hr>
+ *
+ * <code>DecimalFormat</code> is the primary
  * concrete subclass of {@link NumberFormat}. It has a variety of features designed to make it
  * possible to parse and format numbers in any locale, including support for Western, Arabic, or
  * Indic digits. It supports different flavors of numbers, including integers ("123"), fixed-point
@@ -277,6 +286,9 @@
    */
   transient volatile DecimalFormatProperties exportedProperties;
 
+  transient volatile NumberParserImpl parser;
+  transient volatile NumberParserImpl parserWithCurrency;
+
   //=====================================================================================//
   //                                    CONSTRUCTORS                                     //
   //=====================================================================================//
@@ -786,17 +798,38 @@
    */
   @Override
   public Number parse(String text, ParsePosition parsePosition) {
-    DecimalFormatProperties pprops = threadLocalProperties.get();
-    synchronized (this) {
-      pprops.copyFrom(properties);
-    }
-    // Backwards compatibility: use currency parse mode if this is a currency instance
-    Number result = Parse.parse(text, parsePosition, pprops, symbols);
-    // Backwards compatibility: return com.ibm.icu.math.BigDecimal
-    if (result instanceof java.math.BigDecimal) {
-      result = safeConvertBigDecimal((java.math.BigDecimal) result);
-    }
-    return result;
+      if (text == null) {
+          throw new IllegalArgumentException("Text cannot be null");
+      }
+      if (parsePosition == null) {
+          parsePosition = new ParsePosition(0);
+      }
+      if (parsePosition.getIndex() < 0) {
+          throw new IllegalArgumentException("Cannot start parsing at a negative offset");
+      }
+      if (parsePosition.getIndex() >= text.length()) {
+          // For backwards compatibility, this is not an exception, just an empty result.
+          return null;
+      }
+
+      ParsedNumber result = new ParsedNumber();
+      // Note: if this is a currency instance, currencies will be matched despite the fact that we are not in the
+      // parseCurrency method (backwards compatibility)
+      int startIndex = parsePosition.getIndex();
+      parser.parse(text, startIndex, true, result);
+      if (result.success()) {
+          parsePosition.setIndex(result.charEnd);
+          // TODO: Accessing properties here is technically not thread-safe
+          Number number = result.getNumber(properties.getParseToBigDecimal());
+          // Backwards compatibility: return com.ibm.icu.math.BigDecimal
+          if (number instanceof java.math.BigDecimal) {
+              number = safeConvertBigDecimal((java.math.BigDecimal) number);
+          }
+          return number;
+      } else {
+          parsePosition.setErrorIndex(startIndex + result.charEnd);
+          return null;
+      }
   }
 
   /**
@@ -806,23 +839,37 @@
    */
   @Override
   public CurrencyAmount parseCurrency(CharSequence text, ParsePosition parsePosition) {
-    try {
-      DecimalFormatProperties pprops = threadLocalProperties.get();
-      synchronized (this) {
-        pprops.copyFrom(properties);
+      if (text == null) {
+          throw new IllegalArgumentException("Text cannot be null");
       }
-      CurrencyAmount result = Parse.parseCurrency(text, parsePosition, pprops, symbols);
-      if (result == null) return null;
-      Number number = result.getNumber();
-      // Backwards compatibility: return com.ibm.icu.math.BigDecimal
-      if (number instanceof java.math.BigDecimal) {
-        number = safeConvertBigDecimal((java.math.BigDecimal) number);
-        result = new CurrencyAmount(number, result.getCurrency());
+      if (parsePosition == null) {
+          parsePosition = new ParsePosition(0);
       }
-      return result;
-    } catch (ParseException e) {
-      return null;
-    }
+      if (parsePosition.getIndex() < 0) {
+          throw new IllegalArgumentException("Cannot start parsing at a negative offset");
+      }
+      if (parsePosition.getIndex() >= text.length()) {
+          // For backwards compatibility, this is not an exception, just an empty result.
+          return null;
+      }
+
+      ParsedNumber result = new ParsedNumber();
+      int startIndex = parsePosition.getIndex();
+      parserWithCurrency.parse(text.toString(), startIndex, true, result);
+      if (result.success()) {
+          parsePosition.setIndex(result.charEnd);
+          // TODO: Accessing properties here is technically not thread-safe
+          Number number = result.getNumber(properties.getParseToBigDecimal());
+          // Backwards compatibility: return com.ibm.icu.math.BigDecimal
+          if (number instanceof java.math.BigDecimal) {
+              number = safeConvertBigDecimal((java.math.BigDecimal) number);
+          }
+          Currency currency = Currency.getInstance(result.currencyCode);
+          return new CurrencyAmount(number, currency);
+      } else {
+          parsePosition.setErrorIndex(startIndex + result.charEnd);
+          return null;
+      }
   }
 
   //=====================================================================================//
@@ -2092,7 +2139,7 @@
    */
   public synchronized void setParseBigDecimal(boolean value) {
     properties.setParseToBigDecimal(value);
-    // refreshFormatter() not needed
+    refreshFormatter();
   }
 
   /**
@@ -2123,7 +2170,7 @@
    */
   @Override
   public synchronized boolean isParseStrict() {
-    return properties.getParseMode() == Parse.ParseMode.STRICT;
+    return properties.getParseMode() == ParseMode.STRICT;
   }
 
   /**
@@ -2134,9 +2181,9 @@
    */
   @Override
   public synchronized void setParseStrict(boolean parseStrict) {
-    Parse.ParseMode mode = parseStrict ? Parse.ParseMode.STRICT : Parse.ParseMode.LENIENT;
+    ParseMode mode = parseStrict ? ParseMode.STRICT : ParseMode.LENIENT;
     properties.setParseMode(mode);
-    // refreshFormatter() not needed
+    refreshFormatter();
   }
 
   /**
@@ -2165,7 +2212,7 @@
   @Override
   public synchronized void setParseIntegerOnly(boolean parseIntegerOnly) {
     properties.setParseIntegerOnly(parseIntegerOnly);
-    // refreshFormatter() not needed
+    refreshFormatter();
   }
 
   /**
@@ -2459,6 +2506,8 @@
     }
     assert locale != null;
     formatter = NumberFormatter.fromDecimalFormat(properties, symbols, exportedProperties).locale(locale);
+    parser = NumberParserImpl.createParserFromProperties(properties, symbols, false, false);
+    parserWithCurrency = NumberParserImpl.createParserFromProperties(properties, symbols, true, false);
   }
 
   /**
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/DictionaryBreakEngine.java b/icu4j/main/classes/core/src/com/ibm/icu/text/DictionaryBreakEngine.java
index 3ed8791..baee319 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/DictionaryBreakEngine.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/DictionaryBreakEngine.java
@@ -9,7 +9,6 @@
 package com.ibm.icu.text;
 
 import java.text.CharacterIterator;
-import java.util.BitSet;
 
 import com.ibm.icu.impl.CharacterIteration;
 
@@ -169,27 +168,21 @@
     }
 
     UnicodeSet fSet = new UnicodeSet();
-    private BitSet fTypes = new BitSet(32);
 
     /**
-     * @param breakTypes The types of break iterators that can use this engine.
-     *  For example, BreakIterator.KIND_LINE
+     *  Constructor
      */
-    public DictionaryBreakEngine(Integer... breakTypes) {
-        for (Integer type: breakTypes) {
-            fTypes.set(type);
-        }
+    public DictionaryBreakEngine() {
     }
 
     @Override
-    public boolean handles(int c, int breakType) {
-        return fTypes.get(breakType) &&  // this type can use us
-                fSet.contains(c);        // we recognize the character
+    public boolean handles(int c) {
+        return fSet.contains(c);        // we recognize the character
     }
 
     @Override
     public int findBreaks(CharacterIterator text, int startPos, int endPos,
-            int breakType, DequeI foundBreaks) {
+            DequeI foundBreaks) {
         int result = 0;
 
          // Find the span of characters included in the set.
@@ -208,8 +201,6 @@
         rangeStart = start;
         rangeEnd = current;
 
-        // if (breakType >= 0 && breakType < 32 && (((uint32_t)1 << breakType) & fTypes)) {
-        // TODO: Why does icu4c have this?
         result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks);
         text.setIndex(current);
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/Edits.java b/icu4j/main/classes/core/src/com/ibm/icu/text/Edits.java
index aede16b..0a076bb 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/Edits.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/Edits.java
@@ -10,8 +10,7 @@
  * Supports replacements, insertions, deletions in linear progression.
  * Does not support moving/reordering of text.
  *
- * @draft ICU 59
- * @provisional This API might change or be removed in a future release.
+ * @stable ICU 59
  */
 public final class Edits {
     // 0000uuuuuuuuuuuu records u+1 unchanged text units.
@@ -40,8 +39,7 @@
 
     /**
      * Constructs an empty object.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public Edits() {
         array = new char[STACK_CAPACITY];
@@ -49,8 +47,7 @@
 
     /**
      * Resets the data but may not release memory.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public void reset() {
         length = delta = numChanges = 0;
@@ -66,8 +63,7 @@
     /**
      * Adds a record for an unchanged segment of text.
      * Normally called from inside ICU string transformation functions, not user code.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public void addUnchanged(int unchangedLength) {
         if(unchangedLength < 0) {
@@ -99,8 +95,7 @@
     /**
      * Adds a record for a text replacement/insertion/deletion.
      * Normally called from inside ICU string transformation functions, not user code.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public void addReplace(int oldLength, int newLength) {
         if(oldLength < 0 || newLength < 0) {
@@ -197,14 +192,12 @@
     /**
      * How much longer is the new text compared with the old text?
      * @return new length minus old length
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public int lengthDelta() { return delta; }
     /**
      * @return true if there are any change edits
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public boolean hasChanges()  { return numChanges != 0; }
 
@@ -219,8 +212,7 @@
      * Access to the list of edits.
      * @see #getCoarseIterator
      * @see #getFineIterator
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public static final class Iterator {
         private final char[] array;
@@ -291,8 +283,7 @@
         /**
          * Advances to the next edit.
          * @return true if there is another edit
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public boolean next() {
             return next(onlyChanges_);
@@ -511,8 +502,7 @@
          *
          * @param i source index
          * @return true if the edit for the source index was found
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public boolean findSourceIndex(int i) {
             return findIndex(i, true) == 0;
@@ -707,41 +697,35 @@
         /**
          * @return true if this edit replaces oldLength() units with newLength() different ones.
          *         false if oldLength units remain unchanged.
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public boolean hasChange() { return changed; }
         /**
          * @return the number of units in the original string which are replaced or remain unchanged.
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public int oldLength() { return oldLength_; }
         /**
          * @return the number of units in the modified string, if hasChange() is true.
          *         Same as oldLength if hasChange() is false.
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public int newLength() { return newLength_; }
 
         /**
          * @return the current index into the source string
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public int sourceIndex() { return srcIndex; }
         /**
          * @return the current index into the replacement-characters-only string,
          *         not counting unchanged spans
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public int replacementIndex() { return replIndex; }
         /**
          * @return the current index into the full destination string
-         * @draft ICU 59
-         * @provisional This API might change or be removed in a future release.
+         * @stable ICU 59
          */
         public int destinationIndex() { return destIndex; }
     };
@@ -750,8 +734,7 @@
      * Returns an Iterator for coarse-grained changes for simple string updates.
      * Skips non-changes.
      * @return an Iterator that merges adjacent changes.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public Iterator getCoarseChangesIterator() {
         return new Iterator(array, length, true, true);
@@ -760,8 +743,7 @@
     /**
      * Returns an Iterator for coarse-grained changes and non-changes for simple string updates.
      * @return an Iterator that merges adjacent changes.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public Iterator getCoarseIterator() {
         return new Iterator(array, length, false, true);
@@ -771,8 +753,7 @@
      * Returns an Iterator for fine-grained changes for modifying styled text.
      * Skips non-changes.
      * @return an Iterator that separates adjacent changes.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public Iterator getFineChangesIterator() {
         return new Iterator(array, length, true, false);
@@ -781,8 +762,7 @@
     /**
      * Returns an Iterator for fine-grained changes and non-changes for modifying styled text.
      * @return an Iterator that separates adjacent changes.
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public Iterator getFineIterator() {
         return new Iterator(array, length, false, false);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/KhmerBreakEngine.java b/icu4j/main/classes/core/src/com/ibm/icu/text/KhmerBreakEngine.java
index 7c8926c..f2a3a46 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/KhmerBreakEngine.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/KhmerBreakEngine.java
@@ -16,7 +16,7 @@
 import com.ibm.icu.lang.UScript;
 
 class KhmerBreakEngine extends DictionaryBreakEngine {
-    
+
     // Constants for KhmerBreakIterator
     // How many words in a row are "good enough"?
     private static final byte KHMER_LOOKAHEAD = 3;
@@ -29,14 +29,14 @@
     private static final byte KHMER_MIN_WORD = 2;
     // Minimum number of characters for two words
     private static final byte KHMER_MIN_WORD_SPAN = KHMER_MIN_WORD * 2;
-    
-    
+
+
     private DictionaryMatcher fDictionary;
     private static UnicodeSet fKhmerWordSet;
     private static UnicodeSet fEndWordSet;
     private static UnicodeSet fBeginWordSet;
     private static UnicodeSet fMarkSet;
-    
+
     static {
         // Initialize UnicodeSets
         fKhmerWordSet = new UnicodeSet();
@@ -56,42 +56,42 @@
         fMarkSet.compact();
         fEndWordSet.compact();
         fBeginWordSet.compact();
-        
+
         // Freeze the static UnicodeSet
         fKhmerWordSet.freeze();
         fMarkSet.freeze();
         fEndWordSet.freeze();
         fBeginWordSet.freeze();
     }
-    
+
     public KhmerBreakEngine() throws IOException {
-        super(BreakIterator.KIND_WORD, BreakIterator.KIND_LINE);
         setCharacters(fKhmerWordSet);
         // Initialize dictionary
         fDictionary = DictionaryData.loadDictionaryFor("Khmr");
     }
 
+    @Override
     public boolean equals(Object obj) {
         // Normally is a singleton, but it's possible to have duplicates
         //   during initialization. All are equivalent.
         return obj instanceof KhmerBreakEngine;
     }
 
+    @Override
     public int hashCode() {
         return getClass().hashCode();
     }
- 
-    public boolean handles(int c, int breakType) {
-        if (breakType == BreakIterator.KIND_WORD || breakType == BreakIterator.KIND_LINE) {
-            int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
-            return (script == UScript.KHMER);
-        }
-        return false;
+
+    @Override
+    public boolean handles(int c) {
+        int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
+        return (script == UScript.KHMER);
     }
 
-    public int divideUpDictionaryRange(CharacterIterator fIter, int rangeStart, int rangeEnd, 
+    @Override
+    public int divideUpDictionaryRange(CharacterIterator fIter, int rangeStart, int rangeEnd,
             DequeI foundBreaks) {
-               
+
         if ((rangeEnd - rangeStart) < KHMER_MIN_WORD_SPAN) {
             return 0;  // Not enough characters for word
         }
@@ -163,7 +163,7 @@
                 // no preceding word, or the non-word shares less than the minimum threshold
                 // of characters with a dictionary word, then scan to resynchronize
                 if (words[wordsFound%KHMER_LOOKAHEAD].candidates(fIter, fDictionary, rangeEnd) <= 0 &&
-                        (wordLength == 0 || 
+                        (wordLength == 0 ||
                                 words[wordsFound%KHMER_LOOKAHEAD].longestPrefix() < KHMER_PREFIX_COMBINE_THRESHOLD)) {
                     // Look for a plausible word boundary
                     int remaining = rangeEnd - (current + wordLength);
@@ -209,7 +209,7 @@
 
             // Look ahead for possible suffixes if a dictionary word does not follow.
             // We do this in code rather than using a rule so that the heuristic
-            // resynch continues to function. For example, one of the suffix characters 
+            // resynch continues to function. For example, one of the suffix characters
             // could be a typo in the middle of a word.
             // NOT CURRENTLY APPLICABLE TO KHMER
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/LanguageBreakEngine.java b/icu4j/main/classes/core/src/com/ibm/icu/text/LanguageBreakEngine.java
index 649b28b..84db0c8 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/LanguageBreakEngine.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/LanguageBreakEngine.java
@@ -17,11 +17,9 @@
 interface LanguageBreakEngine {
     /**
      * @param c A Unicode codepoint value
-     * @param breakType The kind of break iterator that is wanting to make use
-     *  of this engine - character, word, line, sentence
      * @return true if the engine can handle this character, false otherwise
      */
-    boolean handles(int c, int breakType);
+    boolean handles(int c);
 
     /**
      * Implements the actual breaking logic. Find any breaks within a run in the supplied text.
@@ -30,13 +28,11 @@
      * @param startPos The index of the beginning of the range
      * @param endPos The index of the possible end of our range. It is possible,
      *  however, that the range ends earlier
-     * @param breakType The kind of break iterator that is wanting to make use
-     *  of this engine - character, word, line, sentence
      * @param foundBreaks A data structure to receive the break positions.
      * @return the number of breaks found
      */
     int findBreaks(CharacterIterator text, int startPos, int endPos,
-            int breakType, DictionaryBreakEngine.DequeI foundBreaks);
+            DictionaryBreakEngine.DequeI foundBreaks);
 }
 
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/LaoBreakEngine.java b/icu4j/main/classes/core/src/com/ibm/icu/text/LaoBreakEngine.java
index 3937549..d9f13fe 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/LaoBreakEngine.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/LaoBreakEngine.java
@@ -16,7 +16,7 @@
 import com.ibm.icu.lang.UScript;
 
 class LaoBreakEngine extends DictionaryBreakEngine {
-    
+
     // Constants for LaoBreakIterator
     // How many words in a row are "good enough"?
     private static final byte LAO_LOOKAHEAD = 3;
@@ -27,13 +27,13 @@
     private static final byte LAO_PREFIX_COMBINE_THRESHOLD = 3;
     // Minimum word size
     private static final byte LAO_MIN_WORD = 2;
-    
+
     private DictionaryMatcher fDictionary;
     private static UnicodeSet fLaoWordSet;
     private static UnicodeSet fEndWordSet;
     private static UnicodeSet fBeginWordSet;
     private static UnicodeSet fMarkSet;
-    
+
     static {
         // Initialize UnicodeSets
         fLaoWordSet = new UnicodeSet();
@@ -55,43 +55,43 @@
         fMarkSet.compact();
         fEndWordSet.compact();
         fBeginWordSet.compact();
-        
+
         // Freeze the static UnicodeSet
         fLaoWordSet.freeze();
         fMarkSet.freeze();
         fEndWordSet.freeze();
         fBeginWordSet.freeze();
     }
-    
+
     public LaoBreakEngine() throws IOException {
-        super(BreakIterator.KIND_WORD, BreakIterator.KIND_LINE);
         setCharacters(fLaoWordSet);
         // Initialize dictionary
         fDictionary = DictionaryData.loadDictionaryFor("Laoo");
     }
 
+    @Override
     public boolean equals(Object obj) {
         // Normally is a singleton, but it's possible to have duplicates
         //   during initialization. All are equivalent.
         return obj instanceof LaoBreakEngine;
     }
 
+    @Override
     public int hashCode() {
         return getClass().hashCode();
     }
-    
-    public boolean handles(int c, int breakType) {
-        if (breakType == BreakIterator.KIND_WORD || breakType == BreakIterator.KIND_LINE) {
-            int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
-            return (script == UScript.LAO);
-        }
-        return false;
+
+    @Override
+    public boolean handles(int c) {
+        int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
+        return (script == UScript.LAO);
     }
 
+    @Override
     public int divideUpDictionaryRange(CharacterIterator fIter, int rangeStart, int rangeEnd,
             DequeI foundBreaks) {
-        
-        
+
+
         if ((rangeEnd - rangeStart) < LAO_MIN_WORD) {
             return 0;  // Not enough characters for word
         }
@@ -162,7 +162,7 @@
                 // no preceding word, or the non-word shares less than the minimum threshold
                 // of characters with a dictionary word, then scan to resynchronize
                 if (words[wordsFound%LAO_LOOKAHEAD].candidates(fIter, fDictionary, rangeEnd) <= 0 &&
-                        (wordLength == 0 || 
+                        (wordLength == 0 ||
                                 words[wordsFound%LAO_LOOKAHEAD].longestPrefix() < LAO_PREFIX_COMBINE_THRESHOLD)) {
                     // Look for a plausible word boundary
                     int remaining = rangeEnd - (current + wordLength);
@@ -208,7 +208,7 @@
 
             // Look ahead for possible suffixes if a dictionary word does not follow.
             // We do this in code rather than using a rule so that the heuristic
-            // resynch continues to function. For example, one of the suffix characters 
+            // resynch continues to function. For example, one of the suffix characters
             // could be a typo in the middle of a word.
             // NOT CURRENTLY APPLICABLE TO LAO
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/ListFormatter.java b/icu4j/main/classes/core/src/com/ibm/icu/text/ListFormatter.java
index daec20b..6775ea1 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/ListFormatter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/ListFormatter.java
@@ -8,6 +8,7 @@
  */
 package com.ibm.icu.text;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -19,6 +20,7 @@
 import com.ibm.icu.impl.ICUResourceBundle;
 import com.ibm.icu.impl.SimpleCache;
 import com.ibm.icu.impl.SimpleFormatterImpl;
+import com.ibm.icu.util.ICUUncheckedIOException;
 import com.ibm.icu.util.ULocale;
 import com.ibm.icu.util.UResourceBundle;
 
@@ -36,7 +38,7 @@
     private final String middle;
     private final String end;
     private final ULocale locale;
-    
+
     /**
      * Indicates the style of Listformatter
      * @internal
@@ -72,9 +74,9 @@
          */
         @Deprecated
         DURATION_NARROW("unit-narrow");
-        
+
         private final String name;
-        
+
         Style(String name) {
             this.name = name;
         }
@@ -86,7 +88,7 @@
         public String getName() {
             return name;
         }
-        
+
     }
 
     /**
@@ -153,7 +155,7 @@
     public static ListFormatter getInstance(Locale locale) {
         return getInstance(ULocale.forLocale(locale), Style.STANDARD);
     }
-    
+
     /**
      * Create a list formatter that is appropriate for a locale and style.
      *
@@ -201,7 +203,7 @@
     public String format(Collection<?> items) {
         return format(items, -1).toString();
     }
-    
+
     // Formats a collection of objects and returns the formatted string plus the offset
     // in the string where the index th element appears. index is zero based. If index is
     // negative or greater than or equal to the size of items then this function returns -1 for
@@ -224,7 +226,7 @@
         }
         return builder.append(end, it.next(), index == count - 1);
     }
-    
+
     /**
      * Returns the pattern to use for a particular item count.
      * @param count the item count.
@@ -243,7 +245,7 @@
         }
         return format(list);
     }
-    
+
     /**
      * Returns the locale of this object.
      * @internal
@@ -253,19 +255,19 @@
     public ULocale getLocale() {
         return locale;
     }
-    
+
     // Builds a formatted list
     static class FormattedListBuilder {
         private StringBuilder current;
         private int offset;
-        
+
         // Start is the first object in the list; If recordOffset is true, records the offset of
         // this first object.
         public FormattedListBuilder(Object start, boolean recordOffset) {
             this.current = new StringBuilder(start.toString());
             this.offset = recordOffset ? 0 : -1;
         }
-        
+
         // Appends additional object. pattern is a template indicating where the new object gets
         // added in relation to the rest of the list. {0} represents the rest of the list; {1}
         // represents the new object in pattern. next is the object to be added. If recordOffset
@@ -288,16 +290,24 @@
             return this;
         }
 
+        public void appendTo(Appendable appendable) {
+            try {
+                appendable.append(current);
+            } catch(IOException e) {
+                throw new ICUUncheckedIOException(e);
+            }
+        }
+
         @Override
         public String toString() {
             return current.toString();
         }
-        
+
         // Gets the last recorded offset or -1 if no offset recorded.
         public int getOffset() {
             return offset;
         }
-        
+
         private boolean offsetRecorded() {
             return offset >= 0;
         }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/MeasureFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/MeasureFormat.java
index a22c18b..cf0d2dc 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/MeasureFormat.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/MeasureFormat.java
@@ -18,12 +18,12 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.io.ObjectStreamException;
+import java.math.RoundingMode;
 import java.text.FieldPosition;
 import java.text.ParsePosition;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
-import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
@@ -35,13 +35,15 @@
 import com.ibm.icu.impl.ICUResourceBundle;
 import com.ibm.icu.impl.SimpleCache;
 import com.ibm.icu.impl.SimpleFormatterImpl;
-import com.ibm.icu.impl.StandardPlural;
-import com.ibm.icu.impl.UResource;
-import com.ibm.icu.math.BigDecimal;
-import com.ibm.icu.text.PluralRules.Factory;
+import com.ibm.icu.impl.number.LongNameHandler;
+import com.ibm.icu.number.FormattedNumber;
+import com.ibm.icu.number.LocalizedNumberFormatter;
+import com.ibm.icu.number.NumberFormatter;
+import com.ibm.icu.number.NumberFormatter.UnitWidth;
+import com.ibm.icu.number.Rounder;
+import com.ibm.icu.text.ListFormatter.FormattedListBuilder;
 import com.ibm.icu.util.Currency;
-import com.ibm.icu.util.CurrencyAmount;
-import com.ibm.icu.util.ICUException;
+import com.ibm.icu.util.ICUUncheckedIOException;
 import com.ibm.icu.util.Measure;
 import com.ibm.icu.util.MeasureUnit;
 import com.ibm.icu.util.TimeZone;
@@ -53,59 +55,56 @@
 /**
  * A formatter for Measure objects.
  *
- * <p>To format a Measure object, first create a formatter
- * object using a MeasureFormat factory method.  Then use that
- * object's format or formatMeasures methods.
+ * <p>
+ * <strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * {@link NumberFormatter} fits their use case.  Although not deprecated, this
+ * class, MeasureFormat, is provided for backwards compatibility only.
+ * <hr>
+ *
+ * <p>
+ * To format a Measure object, first create a formatter object using a MeasureFormat factory method. Then
+ * use that object's format or formatMeasures methods.
  *
  * Here is sample code:
+ *
  * <pre>
- *      MeasureFormat fmtFr = MeasureFormat.getInstance(
- *              ULocale.FRENCH, FormatWidth.SHORT);
- *      Measure measure = new Measure(23, MeasureUnit.CELSIUS);
+ * MeasureFormat fmtFr = MeasureFormat.getInstance(ULocale.FRENCH, FormatWidth.SHORT);
+ * Measure measure = new Measure(23, MeasureUnit.CELSIUS);
  *
- *      // Output: 23 °C
- *      System.out.println(fmtFr.format(measure));
+ * // Output: 23 °C
+ * System.out.println(fmtFr.format(measure));
  *
- *      Measure measureF = new Measure(70, MeasureUnit.FAHRENHEIT);
+ * Measure measureF = new Measure(70, MeasureUnit.FAHRENHEIT);
  *
- *      // Output: 70 °F
- *      System.out.println(fmtFr.format(measureF));
+ * // Output: 70 °F
+ * System.out.println(fmtFr.format(measureF));
  *
- *      MeasureFormat fmtFrFull = MeasureFormat.getInstance(
- *              ULocale.FRENCH, FormatWidth.WIDE);
- *      // Output: 70 pieds et 5,3 pouces
- *      System.out.println(fmtFrFull.formatMeasures(
- *              new Measure(70, MeasureUnit.FOOT),
- *              new Measure(5.3, MeasureUnit.INCH)));
+ * MeasureFormat fmtFrFull = MeasureFormat.getInstance(ULocale.FRENCH, FormatWidth.WIDE);
+ * // Output: 70 pieds et 5,3 pouces
+ * System.out.println(fmtFrFull.formatMeasures(new Measure(70, MeasureUnit.FOOT),
+ *         new Measure(5.3, MeasureUnit.INCH)));
  *
- *      // Output: 1 pied et 1 pouce
- *      System.out.println(fmtFrFull.formatMeasures(
- *              new Measure(1, MeasureUnit.FOOT),
- *              new Measure(1, MeasureUnit.INCH)));
+ * // Output: 1 pied et 1 pouce
+ * System.out.println(
+ *         fmtFrFull.formatMeasures(new Measure(1, MeasureUnit.FOOT), new Measure(1, MeasureUnit.INCH)));
  *
- *      MeasureFormat fmtFrNarrow = MeasureFormat.getInstance(
-                ULocale.FRENCH, FormatWidth.NARROW);
- *      // Output: 1′ 1″
- *      System.out.println(fmtFrNarrow.formatMeasures(
- *              new Measure(1, MeasureUnit.FOOT),
- *              new Measure(1, MeasureUnit.INCH)));
+ * MeasureFormat fmtFrNarrow = MeasureFormat.getInstance(ULocale.FRENCH, FormatWidth.NARROW);
+ * // Output: 1′ 1″
+ * System.out.println(fmtFrNarrow.formatMeasures(new Measure(1, MeasureUnit.FOOT),
+ *         new Measure(1, MeasureUnit.INCH)));
  *
+ * MeasureFormat fmtEn = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
  *
- *      MeasureFormat fmtEn = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
- *
- *      // Output: 1 inch, 2 feet
- *      fmtEn.formatMeasures(
- *              new Measure(1, MeasureUnit.INCH),
- *              new Measure(2, MeasureUnit.FOOT));
+ * // Output: 1 inch, 2 feet
+ * fmtEn.formatMeasures(new Measure(1, MeasureUnit.INCH), new Measure(2, MeasureUnit.FOOT));
  * </pre>
  * <p>
- * This class does not do conversions from one unit to another. It simply formats
- * whatever units it is given
+ * This class does not do conversions from one unit to another. It simply formats whatever units it is
+ * given
  * <p>
- * This class is immutable and thread-safe so long as its deprecated subclass,
- * TimeUnitFormat, is never used. TimeUnitFormat is not thread-safe, and is
- * mutable. Although this class has existing subclasses, this class does not support new
- * sub-classes.
+ * This class is immutable and thread-safe so long as its deprecated subclass, TimeUnitFormat, is never
+ * used. TimeUnitFormat is not thread-safe, and is mutable. Although this class has existing subclasses,
+ * this class does not support new sub-classes.
  *
  * @see com.ibm.icu.text.UFormat
  * @author Alan Liu
@@ -113,14 +112,9 @@
  */
 public class MeasureFormat extends UFormat {
 
-
     // Generated by serialver from JDK 1.4.1_01
     static final long serialVersionUID = -7182021401701778240L;
 
-    private final transient MeasureFormatData cache;
-
-    private final transient ImmutableNumberFormat numberFormat;
-
     private final transient FormatWidth formatWidth;
 
     // PluralRules is documented as being immutable which implies thread-safety.
@@ -128,18 +122,13 @@
 
     private final transient NumericFormatters numericFormatters;
 
-    private final transient ImmutableNumberFormat currencyFormat;
+    private final transient NumberFormat numberFormat;
 
-    private final transient ImmutableNumberFormat integerFormat;
+    private final transient LocalizedNumberFormatter numberFormatter;
 
-    private static final SimpleCache<ULocale, MeasureFormatData> localeMeasureFormatData
-    = new SimpleCache<ULocale, MeasureFormatData>();
+    private static final SimpleCache<ULocale, NumericFormatters> localeToNumericDurationFormatters = new SimpleCache<ULocale, NumericFormatters>();
 
-    private static final SimpleCache<ULocale, NumericFormatters> localeToNumericDurationFormatters
-    = new SimpleCache<ULocale,NumericFormatters>();
-
-    private static final Map<MeasureUnit, Integer> hmsTo012 =
-            new HashMap<MeasureUnit, Integer>();
+    private static final Map<MeasureUnit, Integer> hmsTo012 = new HashMap<MeasureUnit, Integer>();
 
     static {
         hmsTo012.put(MeasureUnit.HOUR, 0);
@@ -166,57 +155,73 @@
          *
          * @stable ICU 53
          */
-        WIDE(ListFormatter.Style.DURATION, NumberFormat.PLURALCURRENCYSTYLE),
+        WIDE(ListFormatter.Style.DURATION, UnitWidth.FULL_NAME, UnitWidth.FULL_NAME),
 
         /**
          * Abbreviate when possible.
          *
          * @stable ICU 53
          */
-        SHORT(ListFormatter.Style.DURATION_SHORT, NumberFormat.ISOCURRENCYSTYLE),
+        SHORT(ListFormatter.Style.DURATION_SHORT, UnitWidth.SHORT, UnitWidth.ISO_CODE),
 
         /**
          * Brief. Use only a symbol for the unit when possible.
          *
          * @stable ICU 53
          */
-        NARROW(ListFormatter.Style.DURATION_NARROW, NumberFormat.CURRENCYSTYLE),
+        NARROW(ListFormatter.Style.DURATION_NARROW, UnitWidth.NARROW, UnitWidth.SHORT),
 
         /**
-         * Identical to NARROW except when formatMeasures is called with
-         * an hour and minute; minute and second; or hour, minute, and second Measures.
-         * In these cases formatMeasures formats as 5:37:23 instead of 5h, 37m, 23s.
+         * Identical to NARROW except when formatMeasures is called with an hour and minute; minute and
+         * second; or hour, minute, and second Measures. In these cases formatMeasures formats as 5:37:23
+         * instead of 5h, 37m, 23s.
          *
          * @stable ICU 53
          */
-        NUMERIC(ListFormatter.Style.DURATION_NARROW, NumberFormat.CURRENCYSTYLE);
+        NUMERIC(ListFormatter.Style.DURATION_NARROW, UnitWidth.NARROW, UnitWidth.SHORT),
 
-        // Be sure to update the toFormatWidth and fromFormatWidth() functions
-        // when adding an enum value.
-        private static final int INDEX_COUNT = 3;  // NARROW.ordinal() + 1
+        /**
+         * The default format width for getCurrencyFormat(), which is to show the symbol for currency
+         * (UnitWidth.SHORT) but wide for other units.
+         *
+         * @internal Use {@link #getCurrencyFormat()}
+         * @deprecated ICU 61 This API is ICU internal only.
+         */
+        @Deprecated
+        DEFAULT_CURRENCY(ListFormatter.Style.DURATION, UnitWidth.FULL_NAME, UnitWidth.SHORT);
 
         private final ListFormatter.Style listFormatterStyle;
-        private final int currencyStyle;
 
-        private FormatWidth(ListFormatter.Style style, int currencyStyle) {
+        /**
+         * The {@link UnitWidth} (used for newer NumberFormatter API) that corresponds to this
+         * FormatWidth (used for the older APIs) for all units except currencies.
+         */
+        final UnitWidth unitWidth;
+
+        /**
+         * The {@link UnitWidth} (used for newer NumberFormatter API) that corresponds to this
+         * FormatWidth (used for the older APIs) for currencies.
+         */
+        final UnitWidth currencyWidth;
+
+        private FormatWidth(ListFormatter.Style style, UnitWidth unitWidth, UnitWidth currencyWidth) {
             this.listFormatterStyle = style;
-            this.currencyStyle = currencyStyle;
+            this.unitWidth = unitWidth;
+            this.currencyWidth = currencyWidth;
         }
 
         ListFormatter.Style getListFormatterStyle() {
             return listFormatterStyle;
         }
-
-        int getCurrencyStyle() {
-            return currencyStyle;
-        }
     }
 
     /**
      * Create a format from the locale, formatWidth, and format.
      *
-     * @param locale the locale.
-     * @param formatWidth hints how long formatted strings should be.
+     * @param locale
+     *            the locale.
+     * @param formatWidth
+     *            hints how long formatted strings should be.
      * @return The new MeasureFormat object.
      * @stable ICU 53
      */
@@ -227,8 +232,10 @@
     /**
      * Create a format from the {@link java.util.Locale} and formatWidth.
      *
-     * @param locale the {@link java.util.Locale}.
-     * @param formatWidth hints how long formatted strings should be.
+     * @param locale
+     *            the {@link java.util.Locale}.
+     * @param formatWidth
+     *            hints how long formatted strings should be.
      * @return The new MeasureFormat object.
      * @stable ICU 54
      */
@@ -239,78 +246,65 @@
     /**
      * Create a format from the locale, formatWidth, and format.
      *
-     * @param locale the locale.
-     * @param formatWidth hints how long formatted strings should be.
-     * @param format This is defensively copied.
+     * @param locale
+     *            the locale.
+     * @param formatWidth
+     *            hints how long formatted strings should be.
+     * @param format
+     *            This is defensively copied.
      * @return The new MeasureFormat object.
      * @stable ICU 53
      */
-    public static MeasureFormat getInstance(ULocale locale, FormatWidth formatWidth, NumberFormat format) {
-        PluralRules rules = PluralRules.forLocale(locale);
-        NumericFormatters formatters = null;
-        MeasureFormatData data = localeMeasureFormatData.get(locale);
-        if (data == null) {
-            data = loadLocaleData(locale);
-            localeMeasureFormatData.put(locale, data);
-        }
-        if (formatWidth == FormatWidth.NUMERIC) {
-            formatters = localeToNumericDurationFormatters.get(locale);
-            if (formatters == null) {
-                formatters = loadNumericFormatters(locale);
-                localeToNumericDurationFormatters.put(locale, formatters);
-            }
-        }
-        NumberFormat intFormat = NumberFormat.getInstance(locale);
-        intFormat.setMaximumFractionDigits(0);
-        intFormat.setMinimumFractionDigits(0);
-        intFormat.setRoundingMode(BigDecimal.ROUND_DOWN);
-        return new MeasureFormat(
-                locale,
-                data,
-                formatWidth,
-                new ImmutableNumberFormat(format),
-                rules,
-                formatters,
-                new ImmutableNumberFormat(NumberFormat.getInstance(locale, formatWidth.getCurrencyStyle())),
-                new ImmutableNumberFormat(intFormat));
+    public static MeasureFormat getInstance(
+            ULocale locale,
+            FormatWidth formatWidth,
+            NumberFormat format) {
+        return new MeasureFormat(locale, formatWidth, format, null, null);
     }
 
     /**
      * Create a format from the {@link java.util.Locale}, formatWidth, and format.
      *
-     * @param locale the {@link java.util.Locale}.
-     * @param formatWidth hints how long formatted strings should be.
-     * @param format This is defensively copied.
+     * @param locale
+     *            the {@link java.util.Locale}.
+     * @param formatWidth
+     *            hints how long formatted strings should be.
+     * @param format
+     *            This is defensively copied.
      * @return The new MeasureFormat object.
      * @stable ICU 54
      */
-    public static MeasureFormat getInstance(Locale locale, FormatWidth formatWidth, NumberFormat format) {
+    public static MeasureFormat getInstance(
+            Locale locale,
+            FormatWidth formatWidth,
+            NumberFormat format) {
         return getInstance(ULocale.forLocale(locale), formatWidth, format);
     }
 
     /**
-     * Able to format Collection&lt;? extends Measure&gt;, Measure[], and Measure
-     * by delegating to formatMeasures.
-     * If the pos argument identifies a NumberFormat field,
-     * then its indices are set to the beginning and end of the first such field
-     * encountered. MeasureFormat itself does not supply any fields.
+     * Able to format Collection&lt;? extends Measure&gt;, Measure[], and Measure by delegating to
+     * formatMeasures. If the pos argument identifies a NumberFormat field, then its indices are set to
+     * the beginning and end of the first such field encountered. MeasureFormat itself does not supply
+     * any fields.
      *
-     * Calling a
-     * <code>formatMeasures</code> method is preferred over calling
-     * this method as they give better performance.
+     * Calling a <code>formatMeasures</code> method is preferred over calling this method as they give
+     * better performance.
      *
-     * @param obj must be a Collection&lt;? extends Measure&gt;, Measure[], or Measure object.
-     * @param toAppendTo Formatted string appended here.
-     * @param pos Identifies a field in the formatted text.
+     * @param obj
+     *            must be a Collection&lt;? extends Measure&gt;, Measure[], or Measure object.
+     * @param toAppendTo
+     *            Formatted string appended here.
+     * @param fpos
+     *            Identifies a field in the formatted text.
      * @see java.text.Format#format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition)
      *
      * @stable ICU53
      */
     @Override
-    public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
+    public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition fpos) {
         int prevLength = toAppendTo.length();
-        FieldPosition fpos =
-                new FieldPosition(pos.getFieldAttribute(), pos.getField());
+        fpos.setBeginIndex(0);
+        fpos.setEndIndex(0);
         if (obj instanceof Collection) {
             Collection<?> coll = (Collection<?>) obj;
             Measure[] measures = new Measure[coll.size()];
@@ -321,25 +315,29 @@
                 }
                 measures[idx++] = (Measure) o;
             }
-            toAppendTo.append(formatMeasures(new StringBuilder(), fpos, measures));
+            formatMeasuresInternal(toAppendTo, fpos, measures);
         } else if (obj instanceof Measure[]) {
-            toAppendTo.append(formatMeasures(new StringBuilder(), fpos, (Measure[]) obj));
-        } else if (obj instanceof Measure){
-            toAppendTo.append(formatMeasure((Measure) obj, numberFormat, new StringBuilder(), fpos));
+            formatMeasuresInternal(toAppendTo, fpos, (Measure[]) obj);
+        } else if (obj instanceof Measure) {
+            FormattedNumber result = formatMeasure((Measure) obj);
+            result.populateFieldPosition(fpos); // No offset: toAppendTo.length() is considered below
+            result.appendTo(toAppendTo);
         } else {
             throw new IllegalArgumentException(obj.toString());
         }
-        if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) {
-            pos.setBeginIndex(fpos.getBeginIndex() + prevLength);
-            pos.setEndIndex(fpos.getEndIndex() + prevLength);
+        if (prevLength > 0 && fpos.getEndIndex() != 0) {
+            fpos.setBeginIndex(fpos.getBeginIndex() + prevLength);
+            fpos.setEndIndex(fpos.getEndIndex() + prevLength);
         }
         return toAppendTo;
     }
 
     /**
      * Parses text from a string to produce a <code>Measure</code>.
+     *
      * @see java.text.Format#parseObject(java.lang.String, java.text.ParsePosition)
-     * @throws UnsupportedOperationException Not supported.
+     * @throws UnsupportedOperationException
+     *             Not supported.
      * @draft ICU 53 (Retain)
      * @provisional This API might change or be removed in a future release.
      */
@@ -349,149 +347,36 @@
     }
 
     /**
-     * Format a sequence of measures. Uses the ListFormatter unit lists.
-     * So, for example, one could format “3 feet, 2 inches”.
-     * Zero values are formatted (eg, “3 feet, 0 inches”). It is the caller’s
-     * responsibility to have the appropriate values in appropriate order,
-     * and using the appropriate Number values. Typically the units should be
-     * in descending order, with all but the last Measure having integer values
-     * (eg, not “3.2 feet, 2 inches”).
+     * Format a sequence of measures. Uses the ListFormatter unit lists. So, for example, one could
+     * format “3 feet, 2 inches”. Zero values are formatted (eg, “3 feet, 0 inches”). It is the caller’s
+     * responsibility to have the appropriate values in appropriate order, and using the appropriate
+     * Number values. Typically the units should be in descending order, with all but the last Measure
+     * having integer values (eg, not “3.2 feet, 2 inches”).
      *
-     * @param measures a sequence of one or more measures.
+     * @param measures
+     *            a sequence of one or more measures.
      * @return the formatted string.
      * @stable ICU 53
      */
     public final String formatMeasures(Measure... measures) {
-        return formatMeasures(
-                new StringBuilder(),
-                DontCareFieldPosition.INSTANCE,
-                measures).toString();
+        return formatMeasures(new StringBuilder(), DontCareFieldPosition.INSTANCE, measures).toString();
     }
 
-    /**
-     * Format a range of measures, such as "3.4-5.1 meters". It is the caller’s
-     * responsibility to have the appropriate values in appropriate order,
-     * and using the appropriate Number values.
-     * <br>Note: If the format doesn’t have enough decimals, or lowValue ≥ highValue,
-     * the result will be a degenerate range, like “5-5 meters”.
-     * <br>Currency Units are not yet supported.
-     *
-     * @param lowValue low value in range
-     * @param highValue high value in range
-     * @return the formatted string.
-     * @internal
-     * @deprecated This API is ICU internal only.
-     */
-    @Deprecated
-    public final String formatMeasureRange(Measure lowValue, Measure highValue) {
-        MeasureUnit unit = lowValue.getUnit();
-        if (!unit.equals(highValue.getUnit())) {
-            throw new IllegalArgumentException("Units must match: " + unit + " ≠ " + highValue.getUnit());
-        }
-        Number lowNumber = lowValue.getNumber();
-        Number highNumber = highValue.getNumber();
-        final boolean isCurrency = unit instanceof Currency;
-
-        UFieldPosition lowFpos = new UFieldPosition();
-        UFieldPosition highFpos = new UFieldPosition();
-        StringBuffer lowFormatted = null;
-        StringBuffer highFormatted = null;
-
-        if (isCurrency) {
-            Currency currency = (Currency) unit;
-            int fracDigits = currency.getDefaultFractionDigits();
-            int maxFrac = numberFormat.nf.getMaximumFractionDigits();
-            int minFrac = numberFormat.nf.getMinimumFractionDigits();
-            if (fracDigits != maxFrac || fracDigits != minFrac) {
-                DecimalFormat currentNumberFormat = (DecimalFormat) numberFormat.get();
-                currentNumberFormat.setMaximumFractionDigits(fracDigits);
-                currentNumberFormat.setMinimumFractionDigits(fracDigits);
-                lowFormatted = currentNumberFormat.format(lowNumber, new StringBuffer(), lowFpos);
-                highFormatted = currentNumberFormat.format(highNumber, new StringBuffer(), highFpos);
-            }
-        }
-        if (lowFormatted == null) {
-            lowFormatted = numberFormat.format(lowNumber, new StringBuffer(), lowFpos);
-            highFormatted = numberFormat.format(highNumber, new StringBuffer(), highFpos);
-        }
-
-        final double lowDouble = lowNumber.doubleValue();
-        String keywordLow = rules.select(new PluralRules.FixedDecimal(lowDouble,
-                lowFpos.getCountVisibleFractionDigits(), lowFpos.getFractionDigits()));
-
-        final double highDouble = highNumber.doubleValue();
-        String keywordHigh = rules.select(new PluralRules.FixedDecimal(highDouble,
-                highFpos.getCountVisibleFractionDigits(), highFpos.getFractionDigits()));
-
-        final PluralRanges pluralRanges = Factory.getDefaultFactory().getPluralRanges(getLocale());
-        StandardPlural resolvedPlural = pluralRanges.get(
-                StandardPlural.fromString(keywordLow),
-                StandardPlural.fromString(keywordHigh));
-
-        String rangeFormatter = getRangeFormat(getLocale(), formatWidth);
-        String formattedNumber = SimpleFormatterImpl.formatCompiledPattern(
-                rangeFormatter, lowFormatted, highFormatted);
-
-        if (isCurrency) {
-            // Nasty hack
-            currencyFormat.format(1d); // have to call this for the side effect
-
-            Currency currencyUnit = (Currency) unit;
-            StringBuilder result = new StringBuilder();
-            appendReplacingCurrency(currencyFormat.getPrefix(lowDouble >= 0), currencyUnit, resolvedPlural, result);
-            result.append(formattedNumber);
-            appendReplacingCurrency(currencyFormat.getSuffix(highDouble >= 0), currencyUnit, resolvedPlural, result);
-            return result.toString();
-            //            StringBuffer buffer = new StringBuffer();
-            //            CurrencyAmount currencyLow = (CurrencyAmount) lowValue;
-            //            CurrencyAmount currencyHigh = (CurrencyAmount) highValue;
-            //            FieldPosition pos = new FieldPosition(NumberFormat.INTEGER_FIELD);
-            //            currencyFormat.format(currencyLow, buffer, pos);
-            //            int startOfInteger = pos.getBeginIndex();
-            //            StringBuffer buffer2 = new StringBuffer();
-            //            FieldPosition pos2 = new FieldPosition(0);
-            //            currencyFormat.format(currencyHigh, buffer2, pos2);
-        } else {
-            String formatter =
-                    getPluralFormatter(lowValue.getUnit(), formatWidth, resolvedPlural.ordinal());
-            return SimpleFormatterImpl.formatCompiledPattern(formatter, formattedNumber);
-        }
-    }
-
-    private void appendReplacingCurrency(String affix, Currency unit, StandardPlural resolvedPlural, StringBuilder result) {
-        String replacement = "¤";
-        int pos = affix.indexOf(replacement);
-        if (pos < 0) {
-            replacement = "XXX";
-            pos = affix.indexOf(replacement);
-        }
-        if (pos < 0) {
-            result.append(affix);
-        } else {
-            // for now, just assume single
-            result.append(affix.substring(0,pos));
-            // we have a mismatch between the number style and the currency style, so remap
-            int currentStyle = formatWidth.getCurrencyStyle();
-            if (currentStyle == NumberFormat.ISOCURRENCYSTYLE) {
-                result.append(unit.getCurrencyCode());
-            } else {
-                result.append(unit.getName(currencyFormat.nf.getLocale(ULocale.ACTUAL_LOCALE),
-                        currentStyle == NumberFormat.CURRENCYSTYLE ? Currency.SYMBOL_NAME :  Currency.PLURAL_LONG_NAME,
-                                resolvedPlural.getKeyword(), null));
-            }
-            result.append(affix.substring(pos+replacement.length()));
-        }
-    }
+    // NOTE: For formatMeasureRange(), see http://bugs.icu-project.org/trac/ticket/12454
 
     /**
      * Formats a single measure per unit.
      *
      * An example of such a formatted string is "3.5 meters per second."
      *
-     * @param measure  the measure object. In above example, 3.5 meters.
-     * @param perUnit  the per unit. In above example, it is MeasureUnit.SECOND
-     * @param appendTo formatted string appended here.
-     * @param pos      The field position.
+     * @param measure
+     *            the measure object. In above example, 3.5 meters.
+     * @param perUnit
+     *            the per unit. In above example, it is MeasureUnit.SECOND
+     * @param appendTo
+     *            formatted string appended here.
+     * @param pos
+     *            The field position.
      * @return appendTo.
      * @stable ICU 55
      */
@@ -500,47 +385,57 @@
             MeasureUnit perUnit,
             StringBuilder appendTo,
             FieldPosition pos) {
-        MeasureUnit resolvedUnit = MeasureUnit.resolveUnitPerUnit(
-                measure.getUnit(), perUnit);
-        if (resolvedUnit != null) {
-            Measure newMeasure = new Measure(measure.getNumber(), resolvedUnit);
-            return formatMeasure(newMeasure, numberFormat, appendTo, pos);
-        }
-        FieldPosition fpos = new FieldPosition(
-                pos.getFieldAttribute(), pos.getField());
-        int offset = withPerUnitAndAppend(
-                formatMeasure(measure, numberFormat, new StringBuilder(), fpos),
-                perUnit,
-                appendTo);
-        if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) {
-            pos.setBeginIndex(fpos.getBeginIndex() + offset);
-            pos.setEndIndex(fpos.getEndIndex() + offset);
-        }
+        FormattedNumber result = getUnitFormatterFromCache(NUMBER_FORMATTER_STANDARD,
+                measure.getUnit(),
+                perUnit).format(measure.getNumber());
+        result.populateFieldPosition(pos, appendTo.length());
+        result.appendTo(appendTo);
         return appendTo;
     }
 
     /**
      * Formats a sequence of measures.
      *
-     * If the fieldPosition argument identifies a NumberFormat field,
-     * then its indices are set to the beginning and end of the first such field
-     * encountered. MeasureFormat itself does not supply any fields.
+     * If the fieldPosition argument identifies a NumberFormat field, then its indices are set to the
+     * beginning and end of the first such field encountered. MeasureFormat itself does not supply any
+     * fields.
      *
-     * @param appendTo the formatted string appended here.
-     * @param fieldPosition Identifies a field in the formatted text.
-     * @param measures the measures to format.
+     * @param appendTo
+     *            the formatted string appended here.
+     * @param fpos
+     *            Identifies a field in the formatted text.
+     * @param measures
+     *            the measures to format.
      * @return appendTo.
      * @see MeasureFormat#formatMeasures(Measure...)
      * @stable ICU 53
      */
     public StringBuilder formatMeasures(
-            StringBuilder appendTo, FieldPosition fieldPosition, Measure... measures) {
+            StringBuilder appendTo,
+            FieldPosition fpos,
+            Measure... measures) {
+        int prevLength = appendTo.length();
+        formatMeasuresInternal(appendTo, fpos, measures);
+        if (prevLength > 0 && fpos.getEndIndex() > 0) {
+            fpos.setBeginIndex(fpos.getBeginIndex() + prevLength);
+            fpos.setEndIndex(fpos.getEndIndex() + prevLength);
+        }
+        return appendTo;
+    }
+
+    private void formatMeasuresInternal(
+            Appendable appendTo,
+            FieldPosition fieldPosition,
+            Measure... measures) {
         // fast track for trivial cases
         if (measures.length == 0) {
-            return appendTo;
+            return;
         }
         if (measures.length == 1) {
-            return formatMeasure(measures[0], numberFormat, appendTo, fieldPosition);
+            FormattedNumber result = formatMeasure(measures[0]);
+            result.populateFieldPosition(fieldPosition);
+            result.appendTo(appendTo);
+            return;
         }
 
         if (formatWidth == FormatWidth.NUMERIC) {
@@ -548,57 +443,49 @@
             // track.
             Number[] hms = toHMS(measures);
             if (hms != null) {
-                return formatNumeric(hms, appendTo);
+                formatNumeric(hms, appendTo);
+                return;
             }
         }
 
-        ListFormatter listFormatter = ListFormatter.getInstance(
-                getLocale(), formatWidth.getListFormatterStyle());
+        ListFormatter listFormatter = ListFormatter.getInstance(getLocale(),
+                formatWidth.getListFormatterStyle());
         if (fieldPosition != DontCareFieldPosition.INSTANCE) {
-            return formatMeasuresSlowTrack(listFormatter, appendTo, fieldPosition, measures);
+            formatMeasuresSlowTrack(listFormatter, appendTo, fieldPosition, measures);
+            return;
         }
         // Fast track: No field position.
         String[] results = new String[measures.length];
         for (int i = 0; i < measures.length; i++) {
-            results[i] = formatMeasure(
-                    measures[i],
-                    i == measures.length - 1 ? numberFormat : integerFormat);
+            if (i == measures.length - 1) {
+                results[i] = formatMeasure(measures[i]).toString();
+            } else {
+                results[i] = formatMeasureInteger(measures[i]).toString();
+            }
         }
-        return appendTo.append(listFormatter.format((Object[]) results));
-
+        FormattedListBuilder builder = listFormatter.format(Arrays.asList(results), -1);
+        builder.appendTo(appendTo);
     }
 
     /**
-     * Gets the display name of the specified {@link MeasureUnit} corresponding to the current
-     * locale and format width.
-     * @param unit  The unit for which to get a display name.
-     * @return  The display name in the locale and width specified in
-     *          {@link MeasureFormat#getInstance}, or null if there is no display name available
-     *          for the specified unit.
+     * Gets the display name of the specified {@link MeasureUnit} corresponding to the current locale and
+     * format width.
+     *
+     * @param unit
+     *            The unit for which to get a display name.
+     * @return The display name in the locale and width specified in {@link MeasureFormat#getInstance},
+     *         or null if there is no display name available for the specified unit.
      *
      * @stable ICU 58
      */
     public String getUnitDisplayName(MeasureUnit unit) {
-        FormatWidth width = getRegularWidth(formatWidth);
-        Map<FormatWidth, String> styleToDnam = cache.unitToStyleToDnam.get(unit);
-        if (styleToDnam == null) {
-            return null;
-        }
-
-        String dnam = styleToDnam.get(width);
-        if (dnam != null) {
-            return dnam;
-        }
-        FormatWidth fallbackWidth = cache.widthFallback[width.ordinal()];
-        if (fallbackWidth != null) {
-            dnam = styleToDnam.get(fallbackWidth);
-        }
-        return dnam;
+        return LongNameHandler.getUnitDisplayName(getLocale(), unit, formatWidth.unitWidth);
     }
 
     /**
-     * Two MeasureFormats, a and b, are equal if and only if they have the same formatWidth,
-     * locale, and equal number formats.
+     * Two MeasureFormats, a and b, are equal if and only if they have the same formatWidth, locale, and
+     * equal number formats.
+     *
      * @stable ICU 53
      */
     @Override
@@ -613,22 +500,23 @@
         // A very slow but safe implementation.
         return getWidth() == rhs.getWidth()
                 && getLocale().equals(rhs.getLocale())
-                && getNumberFormat().equals(rhs.getNumberFormat());
+                && getNumberFormatInternal().equals(rhs.getNumberFormatInternal());
     }
 
     /**
      * {@inheritDoc}
+     *
      * @stable ICU 53
      */
     @Override
     public final int hashCode() {
         // A very slow but safe implementation.
-        return (getLocale().hashCode() * 31
-                + getNumberFormat().hashCode()) * 31 + getWidth().hashCode();
+        return (getLocale().hashCode() * 31 + getNumberFormatInternal().hashCode()) * 31 + getWidth().hashCode();
     }
 
     /**
      * Get the format width this instance is using.
+     *
      * @stable ICU 53
      */
     public MeasureFormat.FormatWidth getWidth() {
@@ -637,6 +525,7 @@
 
     /**
      * Get the locale of this instance.
+     *
      * @stable ICU 53
      */
     public final ULocale getLocale() {
@@ -645,16 +534,25 @@
 
     /**
      * Get a copy of the number format.
+     *
      * @stable ICU 53
      */
     public NumberFormat getNumberFormat() {
-        return numberFormat.get();
+        return (NumberFormat) numberFormat.clone();
     }
 
     /**
-     * Return a formatter for CurrencyAmount objects in the given
-     * locale.
-     * @param locale desired locale
+     * Get a copy of the number format without cloning. Internal method.
+     */
+    NumberFormat getNumberFormatInternal() {
+        return numberFormat;
+    }
+
+    /**
+     * Return a formatter for CurrencyAmount objects in the given locale.
+     *
+     * @param locale
+     *            desired locale
      * @return a formatter object
      * @stable ICU 3.0
      */
@@ -663,9 +561,10 @@
     }
 
     /**
-     * Return a formatter for CurrencyAmount objects in the given
-     * {@link java.util.Locale}.
-     * @param locale desired {@link java.util.Locale}
+     * Return a formatter for CurrencyAmount objects in the given {@link java.util.Locale}.
+     *
+     * @param locale
+     *            desired {@link java.util.Locale}
      * @return a formatter object
      * @stable ICU 54
      */
@@ -674,8 +573,8 @@
     }
 
     /**
-     * Return a formatter for CurrencyAmount objects in the default
-     * <code>FORMAT</code> locale.
+     * Return a formatter for CurrencyAmount objects in the default <code>FORMAT</code> locale.
+     *
      * @return a formatter object
      * @see Category#FORMAT
      * @stable ICU 3.0
@@ -690,45 +589,65 @@
     }
 
     MeasureFormat withNumberFormat(NumberFormat format) {
-        return new MeasureFormat(
-                getLocale(),
-                this.cache,
+        return new MeasureFormat(getLocale(),
                 this.formatWidth,
-                new ImmutableNumberFormat(format),
+                format,
                 this.rules,
-                this.numericFormatters,
-                this.currencyFormat,
-                this.integerFormat);
+                this.numericFormatters);
+    }
+
+    MeasureFormat(ULocale locale, FormatWidth formatWidth) {
+        this(locale, formatWidth, null, null, null);
     }
 
     private MeasureFormat(
             ULocale locale,
-            MeasureFormatData data,
             FormatWidth formatWidth,
-            ImmutableNumberFormat format,
+            NumberFormat numberFormat,
             PluralRules rules,
-            NumericFormatters formatters,
-            ImmutableNumberFormat currencyFormat,
-            ImmutableNumberFormat integerFormat) {
+            NumericFormatters formatters) {
+        // Needed for getLocale(ULocale.VALID_LOCALE).
         setLocale(locale, locale);
-        this.cache = data;
         this.formatWidth = formatWidth;
-        this.numberFormat = format;
+
+        if (rules == null) {
+            rules = PluralRules.forLocale(locale);
+        }
         this.rules = rules;
+
+        if (numberFormat == null) {
+            numberFormat = NumberFormat.getInstance(locale);
+        } else {
+            numberFormat = (NumberFormat) numberFormat.clone();
+        }
+        this.numberFormat = numberFormat;
+
+        if (formatters == null && formatWidth == FormatWidth.NUMERIC) {
+            formatters = localeToNumericDurationFormatters.get(locale);
+            if (formatters == null) {
+                formatters = loadNumericFormatters(locale);
+                localeToNumericDurationFormatters.put(locale, formatters);
+            }
+        }
         this.numericFormatters = formatters;
-        this.currencyFormat = currencyFormat;
-        this.integerFormat = integerFormat;
+
+        if (!(numberFormat instanceof DecimalFormat)) {
+            throw new IllegalArgumentException();
+        }
+        numberFormatter = ((DecimalFormat) numberFormat).toNumberFormatter()
+                .unitWidth(formatWidth.unitWidth);
     }
 
-    MeasureFormat() {
-        // Make compiler happy by setting final fields to null.
-        this.cache = null;
-        this.formatWidth = null;
-        this.numberFormat = null;
-        this.rules = null;
-        this.numericFormatters = null;
-        this.currencyFormat = null;
-        this.integerFormat = null;
+    MeasureFormat(
+            ULocale locale,
+            FormatWidth formatWidth,
+            NumberFormat numberFormat,
+            PluralRules rules) {
+        this(locale, formatWidth, numberFormat, rules, null);
+        if (formatWidth == FormatWidth.NUMERIC) {
+            throw new IllegalArgumentException(
+                    "The format width 'numeric' is not allowed by this constructor");
+        }
     }
 
     static class NumericFormatters {
@@ -745,488 +664,161 @@
             this.hourMinuteSecond = hourMinuteSecond;
         }
 
-        public DateFormat getHourMinute() { return hourMinute; }
-        public DateFormat getMinuteSecond() { return minuteSecond; }
-        public DateFormat getHourMinuteSecond() { return hourMinuteSecond; }
+        public DateFormat getHourMinute() {
+            return hourMinute;
+        }
+
+        public DateFormat getMinuteSecond() {
+            return minuteSecond;
+        }
+
+        public DateFormat getHourMinuteSecond() {
+            return hourMinuteSecond;
+        }
     }
 
-    private static NumericFormatters loadNumericFormatters(
-            ULocale locale) {
-        ICUResourceBundle r = (ICUResourceBundle)UResourceBundle.
-                getBundleInstance(ICUData.ICU_UNIT_BASE_NAME, locale);
-        return new NumericFormatters(
-                loadNumericDurationFormat(r, "hm"),
+    private static NumericFormatters loadNumericFormatters(ULocale locale) {
+        ICUResourceBundle r = (ICUResourceBundle) UResourceBundle
+                .getBundleInstance(ICUData.ICU_UNIT_BASE_NAME, locale);
+        return new NumericFormatters(loadNumericDurationFormat(r, "hm"),
                 loadNumericDurationFormat(r, "ms"),
                 loadNumericDurationFormat(r, "hms"));
     }
 
-    /**
-     * Sink for enumerating all of the measurement unit display names.
-     * Contains inner sink classes, each one corresponding to a type of resource table.
-     * The outer sink handles the top-level units, unitsNarrow, and unitsShort tables.
-     *
-     * More specific bundles (en_GB) are enumerated before their parents (en_001, en, root):
-     * Only store a value if it is still missing, that is, it has not been overridden.
-     *
-     * C++: Each inner sink class has a reference to the main outer sink.
-     * Java: Use non-static inner classes instead.
-     */
-    private static final class UnitDataSink extends UResource.Sink {
-        void setFormatterIfAbsent(int index, UResource.Value value, int minPlaceholders) {
-            if (patterns == null) {
-                EnumMap<FormatWidth, String[]> styleToPatterns =
-                        cacheData.unitToStyleToPatterns.get(unit);
-                if (styleToPatterns == null) {
-                    styleToPatterns =
-                            new EnumMap<FormatWidth, String[]>(FormatWidth.class);
-                    cacheData.unitToStyleToPatterns.put(unit, styleToPatterns);
-                } else {
-                    patterns = styleToPatterns.get(width);
+    /// BEGIN NUMBER FORMATTER CACHING MACHINERY ///
+
+    static final int NUMBER_FORMATTER_STANDARD = 1;
+    static final int NUMBER_FORMATTER_CURRENCY = 2;
+    static final int NUMBER_FORMATTER_INTEGER = 3;
+
+    static class NumberFormatterCacheEntry {
+        int type;
+        MeasureUnit unit;
+        MeasureUnit perUnit;
+        LocalizedNumberFormatter formatter;
+    }
+
+    // formatter1 is most recently used.
+    private transient NumberFormatterCacheEntry formatter1 = null;
+    private transient NumberFormatterCacheEntry formatter2 = null;
+    private transient NumberFormatterCacheEntry formatter3 = null;
+
+    private synchronized LocalizedNumberFormatter getUnitFormatterFromCache(
+            int type,
+            MeasureUnit unit,
+            MeasureUnit perUnit) {
+        if (formatter1 != null) {
+            if (formatter1.type == type && formatter1.unit == unit && formatter1.perUnit == perUnit) {
+                return formatter1.formatter;
+            }
+            if (formatter2 != null) {
+                if (formatter2.type == type
+                        && formatter2.unit == unit
+                        && formatter2.perUnit == perUnit) {
+                    return formatter2.formatter;
                 }
-                if (patterns == null) {
-                    patterns = new String[MeasureFormatData.PATTERN_COUNT];
-                    styleToPatterns.put(width, patterns);
-                }
-            }
-            if (patterns[index] == null) {
-                patterns[index] = SimpleFormatterImpl.compileToStringMinMaxArguments(
-                        value.getString(), sb, minPlaceholders, 1);
-            }
-        }
-
-        void setDnamIfAbsent(UResource.Value value) {
-            EnumMap<FormatWidth, String> styleToDnam = cacheData.unitToStyleToDnam.get(unit);
-            if (styleToDnam == null) {
-                styleToDnam = new EnumMap<FormatWidth, String>(FormatWidth.class);
-                cacheData.unitToStyleToDnam.put(unit, styleToDnam);
-            }
-            if (styleToDnam.get(width) == null) {
-                styleToDnam.put(width, value.getString());
-            }
-        }
-
-        /**
-         * Consume a display pattern. For example,
-         * unitsShort/duration/hour contains other{"{0} hrs"}.
-         */
-        void consumePattern(UResource.Key key, UResource.Value value) {
-            if (key.contentEquals("dnam")) {
-                // The display name for the unit in the current width.
-                setDnamIfAbsent(value);
-            } else if (key.contentEquals("per")) {
-                // For example, "{0}/h".
-                setFormatterIfAbsent(MeasureFormatData.PER_UNIT_INDEX, value, 1);
-            } else {
-                // The key must be one of the plural form strings. For example:
-                // one{"{0} hr"}
-                // other{"{0} hrs"}
-                setFormatterIfAbsent(StandardPlural.indexFromString(key), value, 0);
-            }
-        }
-
-        /**
-         * Consume a table of per-unit tables. For example,
-         * unitsShort/duration contains tables for duration-unit subtypes day & hour.
-         */
-        void consumeSubtypeTable(UResource.Key key, UResource.Value value) {
-            unit = MeasureUnit.internalGetInstance(type, key.toString());  // never null
-            // Trigger a fresh lookup of the patterns for this unit+width.
-            patterns = null;
-
-            // We no longer handle units like "coordinate" here (which do not have plural variants)
-            if (value.getType() == ICUResourceBundle.TABLE) {
-                // Units that have plural variants
-                UResource.Table patternTableTable = value.getTable();
-                for (int i = 0; patternTableTable.getKeyAndValue(i, key, value); i++) {
-                    consumePattern(key, value);
-                }
-            } else {
-                throw new ICUException("Data for unit '" + unit + "' is in an unknown format");
-            }
-        }
-
-        /**
-         * Consume compound x-per-y display pattern. For example,
-         * unitsShort/compound/per may be "{0}/{1}".
-         */
-        void consumeCompoundPattern(UResource.Key key, UResource.Value value) {
-            if (key.contentEquals("per")) {
-                cacheData.styleToPerPattern.put(width,
-                        SimpleFormatterImpl.compileToStringMinMaxArguments(
-                                value.getString(), sb, 2, 2));
-            }
-        }
-
-        /**
-         * Consume a table of unit type tables. For example,
-         * unitsShort contains tables for area & duration.
-         * It also contains a table for the compound/per pattern.
-         */
-        void consumeUnitTypesTable(UResource.Key key, UResource.Value value) {
-            if (key.contentEquals("currency")) {
-                // Skip.
-            } else if (key.contentEquals("compound")) {
-                if (!cacheData.hasPerFormatter(width)) {
-                    UResource.Table compoundTable = value.getTable();
-                    for (int i = 0; compoundTable.getKeyAndValue(i, key, value); i++) {
-                        consumeCompoundPattern(key, value);
+                if (formatter3 != null) {
+                    if (formatter3.type == type
+                            && formatter3.unit == unit
+                            && formatter3.perUnit == perUnit) {
+                        return formatter3.formatter;
                     }
                 }
-            } else if (key.contentEquals("coordinate")) {
-                // special handling but we need to determine what that is
-            } else {
-                type = key.toString();
-                UResource.Table subtypeTable = value.getTable();
-                for (int i = 0; subtypeTable.getKeyAndValue(i, key, value); i++) {
-                    consumeSubtypeTable(key, value);
-                }
             }
         }
 
-        UnitDataSink(MeasureFormatData outputData) {
-            cacheData = outputData;
+        // No hit; create a new formatter.
+        LocalizedNumberFormatter formatter;
+        if (type == NUMBER_FORMATTER_STANDARD) {
+            formatter = getNumberFormatter().unit(unit).perUnit(perUnit)
+                    .unitWidth(formatWidth.unitWidth);
+        } else if (type == NUMBER_FORMATTER_CURRENCY) {
+            formatter = NumberFormatter.withLocale(getLocale()).unit(unit).perUnit(perUnit)
+                    .unitWidth(formatWidth.currencyWidth);
+        } else {
+            assert type == NUMBER_FORMATTER_INTEGER;
+            formatter = getNumberFormatter().unit(unit).perUnit(perUnit).unitWidth(formatWidth.unitWidth)
+                    .rounding(Rounder.integer().withMode(RoundingMode.DOWN));
         }
-
-        void consumeAlias(UResource.Key key, UResource.Value value) {
-            // Handle aliases like
-            // units:alias{"/LOCALE/unitsShort"}
-            // which should only occur in the root bundle.
-            FormatWidth sourceWidth = widthFromKey(key);
-            if (sourceWidth == null) {
-                // Alias from something we don't care about.
-                return;
-            }
-            FormatWidth targetWidth = widthFromAlias(value);
-            if (targetWidth == null) {
-                // We do not recognize what to fall back to.
-                throw new ICUException("Units data fallback from " + key +
-                        " to unknown " + value.getAliasString());
-            }
-            // Check that we do not fall back to another fallback.
-            if (cacheData.widthFallback[targetWidth.ordinal()] != null) {
-                throw new ICUException("Units data fallback from " + key +
-                        " to " + value.getAliasString() + " which falls back to something else");
-            }
-            cacheData.widthFallback[sourceWidth.ordinal()] = targetWidth;
-        }
-
-        public void consumeTable(UResource.Key key, UResource.Value value) {
-            if ((width = widthFromKey(key)) != null) {
-                UResource.Table unitTypesTable = value.getTable();
-                for (int i = 0; unitTypesTable.getKeyAndValue(i, key, value); i++) {
-                    consumeUnitTypesTable(key, value);
-                }
-            }
-        }
-
-        static FormatWidth widthFromKey(UResource.Key key) {
-            if (key.startsWith("units")) {
-                if (key.length() == 5) {
-                    return FormatWidth.WIDE;
-                } else if (key.regionMatches(5, "Short")) {
-                    return FormatWidth.SHORT;
-                } else if (key.regionMatches(5, "Narrow")) {
-                    return FormatWidth.NARROW;
-                }
-            }
-            return null;
-        }
-
-        static FormatWidth widthFromAlias(UResource.Value value) {
-            String s = value.getAliasString();
-            // For example: "/LOCALE/unitsShort"
-            if (s.startsWith("/LOCALE/units")) {
-                if (s.length() == 13) {
-                    return FormatWidth.WIDE;
-                } else if (s.length() == 18 && s.endsWith("Short")) {
-                    return FormatWidth.SHORT;
-                } else if (s.length() == 19 && s.endsWith("Narrow")) {
-                    return FormatWidth.NARROW;
-                }
-            }
-            return null;
-        }
-
-        @Override
-        public void put(UResource.Key key, UResource.Value value, boolean noFallback) {
-            // Main entry point to sink
-            UResource.Table widthsTable = value.getTable();
-            for (int i = 0; widthsTable.getKeyAndValue(i, key, value); i++) {
-                if (value.getType() == ICUResourceBundle.ALIAS) {
-                    consumeAlias(key, value);
-                } else {
-                    consumeTable(key, value);
-                }
-            }
-        }
-
-        // Output data.
-        MeasureFormatData cacheData;
-
-        // Path to current data.
-        FormatWidth width;
-        String type;
-        MeasureUnit unit;
-
-        // Temporary
-        StringBuilder sb = new StringBuilder();
-        String[] patterns;
+        formatter3 = formatter2;
+        formatter2 = formatter1;
+        formatter1 = new NumberFormatterCacheEntry();
+        formatter1.type = type;
+        formatter1.unit = unit;
+        formatter1.perUnit = perUnit;
+        formatter1.formatter = formatter;
+        return formatter;
     }
 
-    /**
-     * Returns formatting data for all MeasureUnits except for currency ones.
-     */
-    private static MeasureFormatData loadLocaleData(ULocale locale) {
-        ICUResourceBundle resource =
-                (ICUResourceBundle)UResourceBundle.getBundleInstance(ICUData.ICU_UNIT_BASE_NAME, locale);
-        MeasureFormatData cacheData = new MeasureFormatData();
-        UnitDataSink sink = new UnitDataSink(cacheData);
-        resource.getAllItemsWithFallback("", sink);
-        return cacheData;
+    synchronized void clearCache() {
+        formatter1 = null;
+        formatter2 = null;
+        formatter3 = null;
     }
 
-    private static final FormatWidth getRegularWidth(FormatWidth width) {
-        if (width == FormatWidth.NUMERIC) {
-            return FormatWidth.NARROW;
-        }
-        return width;
+    // Can be overridden by subclasses:
+    LocalizedNumberFormatter getNumberFormatter() {
+        return numberFormatter;
     }
 
-    private String getFormatterOrNull(MeasureUnit unit, FormatWidth width, int index) {
-        width = getRegularWidth(width);
-        Map<FormatWidth, String[]> styleToPatterns = cache.unitToStyleToPatterns.get(unit);
-        String[] patterns = styleToPatterns.get(width);
-        if (patterns != null && patterns[index] != null) {
-            return patterns[index];
-        }
-        FormatWidth fallbackWidth = cache.widthFallback[width.ordinal()];
-        if (fallbackWidth != null) {
-            patterns = styleToPatterns.get(fallbackWidth);
-            if (patterns != null && patterns[index] != null) {
-                return patterns[index];
-            }
-        }
-        return null;
-    }
+    /// END NUMBER FORMATTER CACHING MACHINERY ///
 
-    private String getFormatter(MeasureUnit unit, FormatWidth width, int index) {
-        String pattern = getFormatterOrNull(unit, width, index);
-        if (pattern == null) {
-            throw new MissingResourceException(
-                    "no formatting pattern for " + unit + ", width " + width + ", index " + index,
-                    null, null);
-        }
-        return pattern;
-    }
-
-    /**
-     * @internal
-     * @deprecated This API is ICU internal only.
-     */
-    @Deprecated
-    public String getPluralFormatter(MeasureUnit unit, FormatWidth width, int index) {
-        if (index != StandardPlural.OTHER_INDEX) {
-            String pattern = getFormatterOrNull(unit, width, index);
-            if (pattern != null) {
-                return pattern;
-            }
-        }
-        return getFormatter(unit, width, StandardPlural.OTHER_INDEX);
-    }
-
-    private String getPerFormatter(FormatWidth width) {
-        width = getRegularWidth(width);
-        String perPattern = cache.styleToPerPattern.get(width);
-        if (perPattern != null) {
-            return perPattern;
-        }
-        FormatWidth fallbackWidth = cache.widthFallback[width.ordinal()];
-        if (fallbackWidth != null) {
-            perPattern = cache.styleToPerPattern.get(fallbackWidth);
-            if (perPattern != null) {
-                return perPattern;
-            }
-        }
-        throw new MissingResourceException("no x-per-y pattern for width " + width, null, null);
-    }
-
-    private int withPerUnitAndAppend(
-            CharSequence formatted, MeasureUnit perUnit, StringBuilder appendTo) {
-        int[] offsets = new int[1];
-        String perUnitPattern =
-                getFormatterOrNull(perUnit, formatWidth, MeasureFormatData.PER_UNIT_INDEX);
-        if (perUnitPattern != null) {
-            SimpleFormatterImpl.formatAndAppend(perUnitPattern, appendTo, offsets, formatted);
-            return offsets[0];
-        }
-        String perPattern = getPerFormatter(formatWidth);
-        String pattern = getPluralFormatter(perUnit, formatWidth, StandardPlural.ONE.ordinal());
-        String perUnitString = SimpleFormatterImpl.getTextWithNoArguments(pattern).trim();
-        SimpleFormatterImpl.formatAndAppend(
-                perPattern, appendTo, offsets, formatted, perUnitString);
-        return offsets[0];
-    }
-
-    private String formatMeasure(Measure measure, ImmutableNumberFormat nf) {
-        return formatMeasure(
-                measure, nf, new StringBuilder(),
-                DontCareFieldPosition.INSTANCE).toString();
-    }
-
-    private StringBuilder formatMeasure(
-            Measure measure,
-            ImmutableNumberFormat nf,
-            StringBuilder appendTo,
-            FieldPosition fieldPosition) {
-        Number n = measure.getNumber();
+    private FormattedNumber formatMeasure(Measure measure) {
         MeasureUnit unit = measure.getUnit();
         if (unit instanceof Currency) {
-            return appendTo.append(
-                    currencyFormat.format(
-                            new CurrencyAmount(n, (Currency) unit),
-                            new StringBuffer(),
-                            fieldPosition));
-
-        }
-        StringBuffer formattedNumber = new StringBuffer();
-        StandardPlural pluralForm = QuantityFormatter.selectPlural(
-                n, nf.nf, rules, formattedNumber, fieldPosition);
-        String formatter = getPluralFormatter(unit, formatWidth, pluralForm.ordinal());
-        return QuantityFormatter.format(formatter, formattedNumber, appendTo, fieldPosition);
-    }
-
-    /**
-     * Instances contain all MeasureFormat specific data for a particular locale.
-     * This data is cached. It is never copied, but is shared via shared pointers.
-     *
-     * Note: We might change the cache data to have
-     * an array[WIDTH_INDEX_COUNT] or EnumMap<FormatWidth, ...> of
-     * complete sets of unit & per patterns,
-     * to correspond to the resource data and its aliases.
-     */
-    private static final class MeasureFormatData {
-        static final int PER_UNIT_INDEX = StandardPlural.COUNT;
-        static final int PATTERN_COUNT = PER_UNIT_INDEX + 1;
-
-        boolean hasPerFormatter(FormatWidth width) {
-            return styleToPerPattern.containsKey(width);
-        }
-
-        /**
-         * Redirection data from root-bundle, top-level sideways aliases.
-         * - null: initial value, just fall back to root
-         * - FormatWidth.WIDE/SHORT/NARROW: sideways alias for missing data
-         */
-        final FormatWidth widthFallback[] = new FormatWidth[FormatWidth.INDEX_COUNT];
-        /** Measure unit -> format width -> array of patterns ("{0} meters") (plurals + PER_UNIT_INDEX) */
-        final Map<MeasureUnit, EnumMap<FormatWidth, String[]>> unitToStyleToPatterns =
-                new HashMap<MeasureUnit, EnumMap<FormatWidth, String[]>>();
-        final Map<MeasureUnit, EnumMap<FormatWidth, String>> unitToStyleToDnam =
-                new HashMap<MeasureUnit, EnumMap<FormatWidth, String>>();
-        final EnumMap<FormatWidth, String> styleToPerPattern =
-                new EnumMap<FormatWidth, String>(FormatWidth.class);;
-    }
-
-    // Wrapper around NumberFormat that provides immutability and thread-safety.
-    private static final class ImmutableNumberFormat {
-        private NumberFormat nf;
-
-        public ImmutableNumberFormat(NumberFormat nf) {
-            this.nf = (NumberFormat) nf.clone();
-        }
-
-        public synchronized NumberFormat get() {
-            return (NumberFormat) nf.clone();
-        }
-
-        public synchronized StringBuffer format(
-                Number n, StringBuffer buffer, FieldPosition pos) {
-            return nf.format(n, buffer, pos);
-        }
-
-        public synchronized StringBuffer format(
-                CurrencyAmount n, StringBuffer buffer, FieldPosition pos) {
-            return nf.format(n, buffer, pos);
-        }
-
-        @SuppressWarnings("unused")
-        public synchronized String format(Number number) {
-            return nf.format(number);
-        }
-
-        public String getPrefix(boolean positive) {
-            return positive ? ((DecimalFormat)nf).getPositivePrefix() : ((DecimalFormat)nf).getNegativePrefix();
-        }
-        public String getSuffix(boolean positive) {
-            return positive ? ((DecimalFormat)nf).getPositiveSuffix() : ((DecimalFormat)nf).getNegativeSuffix();
+            return getUnitFormatterFromCache(NUMBER_FORMATTER_CURRENCY, unit, null)
+                    .format(measure.getNumber());
+        } else {
+            return getUnitFormatterFromCache(NUMBER_FORMATTER_STANDARD, unit, null)
+                    .format(measure.getNumber());
         }
     }
 
-    static final class PatternData {
-        final String prefix;
-        final String suffix;
-        public PatternData(String pattern) {
-            int pos = pattern.indexOf("{0}");
-            if (pos < 0) {
-                prefix = pattern;
-                suffix = null;
-            } else {
-                prefix = pattern.substring(0,pos);
-                suffix = pattern.substring(pos+3);
-            }
-        }
-        @Override
-        public String toString() {
-            return prefix + "; " + suffix;
-        }
-
+    private FormattedNumber formatMeasureInteger(Measure measure) {
+        return getUnitFormatterFromCache(NUMBER_FORMATTER_INTEGER, measure.getUnit(), null)
+                .format(measure.getNumber());
     }
 
-    Object toTimeUnitProxy() {
-        return new MeasureProxy(getLocale(), formatWidth, numberFormat.get(), TIME_UNIT_FORMAT);
-    }
-
-    Object toCurrencyProxy() {
-        return new MeasureProxy(getLocale(), formatWidth, numberFormat.get(), CURRENCY_FORMAT);
-    }
-
-    private StringBuilder formatMeasuresSlowTrack(
+    private void formatMeasuresSlowTrack(
             ListFormatter listFormatter,
-            StringBuilder appendTo,
+            Appendable appendTo,
             FieldPosition fieldPosition,
             Measure... measures) {
         String[] results = new String[measures.length];
 
         // Zero out our field position so that we can tell when we find our field.
-        FieldPosition fpos = new FieldPosition(
-                fieldPosition.getFieldAttribute(), fieldPosition.getField());
+        FieldPosition fpos = new FieldPosition(fieldPosition.getFieldAttribute(),
+                fieldPosition.getField());
 
         int fieldPositionFoundIndex = -1;
         for (int i = 0; i < measures.length; ++i) {
-            ImmutableNumberFormat nf = (i == measures.length - 1 ? numberFormat : integerFormat);
+            FormattedNumber result;
+            if (i == measures.length - 1) {
+                result = formatMeasure(measures[i]);
+            } else {
+                result = formatMeasureInteger(measures[i]);
+            }
             if (fieldPositionFoundIndex == -1) {
-                results[i] = formatMeasure(measures[i], nf, new StringBuilder(), fpos).toString();
-                if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) {
+                result.populateFieldPosition(fpos);
+                if (fpos.getEndIndex() != 0) {
                     fieldPositionFoundIndex = i;
                 }
-            } else {
-                results[i] = formatMeasure(measures[i], nf);
             }
+            results[i] = result.toString();
         }
-        ListFormatter.FormattedListBuilder builder =
-                listFormatter.format(Arrays.asList(results), fieldPositionFoundIndex);
+        ListFormatter.FormattedListBuilder builder = listFormatter.format(Arrays.asList(results),
+                fieldPositionFoundIndex);
 
         // Fix up FieldPosition indexes if our field is found.
         if (builder.getOffset() != -1) {
-            fieldPosition.setBeginIndex(fpos.getBeginIndex() + builder.getOffset() + appendTo.length());
-            fieldPosition.setEndIndex(fpos.getEndIndex() + builder.getOffset() + appendTo.length());
+            fieldPosition.setBeginIndex(fpos.getBeginIndex() + builder.getOffset());
+            fieldPosition.setEndIndex(fpos.getEndIndex() + builder.getOffset());
         }
-        return appendTo.append(builder.toString());
+        builder.appendTo(appendTo);
     }
 
     // type is one of "hm", "ms" or "hms"
-    private static DateFormat loadNumericDurationFormat(
-            ICUResourceBundle r, String type) {
+    private static DateFormat loadNumericDurationFormat(ICUResourceBundle r, String type) {
         r = r.getWithFallback(String.format("durationUnits/%s", type));
         // We replace 'h' with 'H' because 'h' does not make sense in the context of durations.
         DateFormat result = new SimpleDateFormat(r.getString().replace("h", "H"));
@@ -1263,7 +855,7 @@
 
     // Formats numeric time duration as 5:00:47 or 3:54. In the process, it replaces any null
     // values in hms with 0.
-    private StringBuilder formatNumeric(Number[] hms, StringBuilder appendable) {
+    private void formatNumeric(Number[] hms, Appendable appendable) {
 
         // find the start and end of non-nil values in hms array. We have to know if we
         // have hour-minute; minute-second; or hour-minute-second.
@@ -1282,37 +874,32 @@
         }
         // convert hours, minutes, seconds into milliseconds.
         long millis = (long) (((Math.floor(hms[0].doubleValue()) * 60.0
-                + Math.floor(hms[1].doubleValue())) * 60.0
-                + Math.floor(hms[2].doubleValue())) * 1000.0);
+                + Math.floor(hms[1].doubleValue())) * 60.0 + Math.floor(hms[2].doubleValue())) * 1000.0);
         Date d = new Date(millis);
-        // if hour-minute-second
         if (startIndex == 0 && endIndex == 2) {
-            return formatNumeric(
-                    d,
+            // if hour-minute-second
+            formatNumeric(d,
                     numericFormatters.getHourMinuteSecond(),
                     DateFormat.Field.SECOND,
                     hms[endIndex],
                     appendable);
-        }
-        // if minute-second
-        if (startIndex == 1 && endIndex == 2) {
-            return formatNumeric(
-                    d,
+        } else if (startIndex == 1 && endIndex == 2) {
+            // if minute-second
+            formatNumeric(d,
                     numericFormatters.getMinuteSecond(),
                     DateFormat.Field.SECOND,
                     hms[endIndex],
                     appendable);
-        }
-        // if hour-minute
-        if (startIndex == 0 && endIndex == 1) {
-            return formatNumeric(
-                    d,
+        } else if (startIndex == 0 && endIndex == 1) {
+            // if hour-minute
+            formatNumeric(d,
                     numericFormatters.getHourMinute(),
                     DateFormat.Field.MINUTE,
                     hms[endIndex],
                     appendable);
+        } else {
+            throw new IllegalStateException();
         }
-        throw new IllegalStateException();
     }
 
     // Formats a duration as 5:00:37 or 23:59.
@@ -1324,12 +911,12 @@
     // smallestAmount is 37.3. This smallest field is formatted with this object's
     // NumberFormat instead of formatter.
     // appendTo is where the formatted string is appended.
-    private StringBuilder formatNumeric(
+    private void formatNumeric(
             Date duration,
             DateFormat formatter,
             DateFormat.Field smallestField,
             Number smallestAmount,
-            StringBuilder appendTo) {
+            Appendable appendTo) {
         // Format the smallest amount ahead of time.
         String smallestAmountFormatted;
 
@@ -1338,50 +925,62 @@
         // integer part with the corresponding value from formatting the date. Otherwise
         // when formatting 0 minutes 9 seconds, we may get "00:9" instead of "00:09"
         FieldPosition intFieldPosition = new FieldPosition(NumberFormat.INTEGER_FIELD);
-        smallestAmountFormatted = numberFormat.format(
-                smallestAmount, new StringBuffer(), intFieldPosition).toString();
+        FormattedNumber result = getNumberFormatter().format(smallestAmount);
+        result.populateFieldPosition(intFieldPosition);
+        smallestAmountFormatted = result.toString();
         // Give up if there is no integer field.
         if (intFieldPosition.getBeginIndex() == 0 && intFieldPosition.getEndIndex() == 0) {
             throw new IllegalStateException();
         }
+
         // Format our duration as a date, but keep track of where the smallest field is
         // so that we can use it to replace the integer portion of the smallest value.
+        // #13606: DateFormat is not thread-safe, but MeasureFormat advertises itself as thread-safe.
         FieldPosition smallestFieldPosition = new FieldPosition(smallestField);
-        String draft = formatter.format(
-                duration, new StringBuffer(), smallestFieldPosition).toString();
-
-        // If we find the smallest field
-        if (smallestFieldPosition.getBeginIndex() != 0
-                || smallestFieldPosition.getEndIndex() != 0) {
-            // add everything up to the start of the smallest field in duration.
-            appendTo.append(draft, 0, smallestFieldPosition.getBeginIndex());
-
-            // add everything in the smallest field up to the integer portion
-            appendTo.append(smallestAmountFormatted, 0, intFieldPosition.getBeginIndex());
-
-            // Add the smallest field in formatted duration in lieu of the integer portion
-            // of smallest field
-            appendTo.append(
-                    draft,
-                    smallestFieldPosition.getBeginIndex(),
-                    smallestFieldPosition.getEndIndex());
-
-            // Add the rest of the smallest field
-            appendTo.append(
-                    smallestAmountFormatted,
-                    intFieldPosition.getEndIndex(),
-                    smallestAmountFormatted.length());
-            appendTo.append(draft, smallestFieldPosition.getEndIndex(), draft.length());
-        } else {
-            // As fallback, just use the formatted duration.
-            appendTo.append(draft);
+        String draft;
+        synchronized (formatter) {
+            draft = formatter.format(duration, new StringBuffer(), smallestFieldPosition).toString();
         }
-        return appendTo;
+
+        try {
+            // If we find the smallest field
+            if (smallestFieldPosition.getBeginIndex() != 0 || smallestFieldPosition.getEndIndex() != 0) {
+                // add everything up to the start of the smallest field in duration.
+                appendTo.append(draft, 0, smallestFieldPosition.getBeginIndex());
+
+                // add everything in the smallest field up to the integer portion
+                appendTo.append(smallestAmountFormatted, 0, intFieldPosition.getBeginIndex());
+
+                // Add the smallest field in formatted duration in lieu of the integer portion
+                // of smallest field
+                appendTo.append(draft,
+                        smallestFieldPosition.getBeginIndex(),
+                        smallestFieldPosition.getEndIndex());
+
+                // Add the rest of the smallest field
+                appendTo.append(smallestAmountFormatted,
+                        intFieldPosition.getEndIndex(),
+                        smallestAmountFormatted.length());
+                appendTo.append(draft, smallestFieldPosition.getEndIndex(), draft.length());
+            } else {
+                // As fallback, just use the formatted duration.
+                appendTo.append(draft);
+            }
+        } catch (IOException e) {
+            throw new ICUUncheckedIOException(e);
+        }
+    }
+
+    Object toTimeUnitProxy() {
+        return new MeasureProxy(getLocale(), formatWidth, getNumberFormatInternal(), TIME_UNIT_FORMAT);
+    }
+
+    Object toCurrencyProxy() {
+        return new MeasureProxy(getLocale(), formatWidth, getNumberFormatInternal(), CURRENCY_FORMAT);
     }
 
     private Object writeReplace() throws ObjectStreamException {
-        return new MeasureProxy(
-                getLocale(), formatWidth, numberFormat.get(), MEASURE_FORMAT);
+        return new MeasureProxy(getLocale(), formatWidth, getNumberFormatInternal(), MEASURE_FORMAT);
     }
 
     static class MeasureProxy implements Externalizable {
@@ -1393,11 +992,7 @@
         private int subClass;
         private HashMap<Object, Object> keyValues;
 
-        public MeasureProxy(
-                ULocale locale,
-                FormatWidth width,
-                NumberFormat numberFormat,
-                int subClass) {
+        public MeasureProxy(ULocale locale, FormatWidth width, NumberFormat numberFormat, int subClass) {
             this.locale = locale;
             this.formatWidth = width;
             this.numberFormat = numberFormat;
@@ -1460,7 +1055,7 @@
             case TIME_UNIT_FORMAT:
                 return createTimeUnitFormat();
             case CURRENCY_FORMAT:
-                return new CurrencyFormat(locale);
+                return MeasureFormat.getCurrencyFormat(locale);
             default:
                 throw new InvalidObjectException("Unknown subclass: " + subClass);
             }
@@ -1475,13 +1070,15 @@
         return values[ordinal];
     }
 
-    private static final Map<ULocale, String> localeIdToRangeFormat =
-            new ConcurrentHashMap<ULocale, String>();
+    private static final Map<ULocale, String> localeIdToRangeFormat = new ConcurrentHashMap<ULocale, String>();
 
     /**
      * Return a formatter (compiled SimpleFormatter pattern) for a range, such as "{0}–{1}".
-     * @param forLocale locale to get the format for
-     * @param width the format width
+     *
+     * @param forLocale
+     *            locale to get the format for
+     * @param width
+     *            the format width
      * @return range formatter, such as "{0}–{1}"
      * @internal
      * @deprecated This API is ICU internal only.
@@ -1494,10 +1091,11 @@
         }
         String result = localeIdToRangeFormat.get(forLocale);
         if (result == null) {
-            ICUResourceBundle rb = (ICUResourceBundle)UResourceBundle.
-                    getBundleInstance(ICUData.ICU_BASE_NAME, forLocale);
+            ICUResourceBundle rb = (ICUResourceBundle) UResourceBundle
+                    .getBundleInstance(ICUData.ICU_BASE_NAME, forLocale);
             ULocale realLocale = rb.getULocale();
-            if (!forLocale.equals(realLocale)) { // if the child would inherit, then add a cache entry for it.
+            if (!forLocale.equals(realLocale)) { // if the child would inherit, then add a cache entry
+                                                 // for it.
                 result = localeIdToRangeFormat.get(forLocale);
                 if (result != null) {
                     localeIdToRangeFormat.put(forLocale, result);
@@ -1510,12 +1108,13 @@
 
             String resultString = null;
             try {
-                resultString = rb.getStringWithFallback("NumberElements/" + ns.getName() + "/miscPatterns/range");
-            } catch ( MissingResourceException ex ) {
+                resultString = rb
+                        .getStringWithFallback("NumberElements/" + ns.getName() + "/miscPatterns/range");
+            } catch (MissingResourceException ex) {
                 resultString = rb.getStringWithFallback("NumberElements/latn/patterns/range");
             }
-            result = SimpleFormatterImpl.compileToStringMinMaxArguments(
-                    resultString, new StringBuilder(), 2, 2);
+            result = SimpleFormatterImpl
+                    .compileToStringMinMaxArguments(resultString, new StringBuilder(), 2, 2);
             localeIdToRangeFormat.put(forLocale, result);
             if (!forLocale.equals(realLocale)) {
                 localeIdToRangeFormat.put(realLocale, result);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/NFRule.java b/icu4j/main/classes/core/src/com/ibm/icu/text/NFRule.java
index 018f8ea..cc78cf7 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/NFRule.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/NFRule.java
@@ -903,7 +903,7 @@
      * result is an integer and Double otherwise.  The result is never null.
      */
     public Number doParse(String text, ParsePosition parsePosition, boolean isFractionRule,
-                          double upperBound) {
+                          double upperBound, int nonNumericalExecutedRuleMask) {
 
         // internally we operate on a copy of the string being parsed
         // (because we're going to change it) and use our own ParsePosition
@@ -976,7 +976,7 @@
             pp.setIndex(0);
             double partialResult = matchToDelimiter(workText, start, tempBaseValue,
                                                     ruleText.substring(sub1Pos, sub2Pos), rulePatternFormat,
-                                                    pp, sub1, upperBound).doubleValue();
+                                                    pp, sub1, upperBound, nonNumericalExecutedRuleMask).doubleValue();
 
             // if we got a successful match (or were trying to match a
             // null substitution), pp is now pointing at the first unmatched
@@ -994,7 +994,7 @@
                 // a real result
                 partialResult = matchToDelimiter(workText2, 0, partialResult,
                                                  ruleText.substring(sub2Pos), rulePatternFormat, pp2, sub2,
-                                                 upperBound).doubleValue();
+                                                 upperBound, nonNumericalExecutedRuleMask).doubleValue();
 
                 // if we got a successful match on this second
                 // matchToDelimiter() call, update the high-water mark
@@ -1121,7 +1121,8 @@
      * Double.
      */
     private Number matchToDelimiter(String text, int startPos, double baseVal,
-                                    String delimiter, PluralFormat pluralFormatDelimiter, ParsePosition pp, NFSubstitution sub, double upperBound) {
+                                    String delimiter, PluralFormat pluralFormatDelimiter, ParsePosition pp, NFSubstitution sub,
+                                    double upperBound, int nonNumericalExecutedRuleMask) {
         // if "delimiter" contains real (i.e., non-ignorable) text, search
         // it for "delimiter" beginning at "start".  If that succeeds, then
         // use "sub"'s doParse() method to match the text before the
@@ -1144,7 +1145,7 @@
                 String subText = text.substring(0, dPos);
                 if (subText.length() > 0) {
                     tempResult = sub.doParse(subText, tempPP, baseVal, upperBound,
-                                             formatter.lenientParseEnabled());
+                                             formatter.lenientParseEnabled(), nonNumericalExecutedRuleMask);
 
                     // if the substitution could match all the text up to
                     // where we found "delimiter", then this function has
@@ -1192,7 +1193,7 @@
             Number result = ZERO;
             // try to match the whole string against the substitution
             Number tempResult = sub.doParse(text, tempPP, baseVal, upperBound,
-                    formatter.lenientParseEnabled());
+                    formatter.lenientParseEnabled(), nonNumericalExecutedRuleMask);
             if (tempPP.getIndex() != 0) {
                 // if there's a successful match (or it's a null
                 // substitution), update pp to point to the first
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/NFRuleSet.java b/icu4j/main/classes/core/src/com/ibm/icu/text/NFRuleSet.java
index 30838f5..be20764 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/NFRuleSet.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/NFRuleSet.java
@@ -748,7 +748,7 @@
      * this function returns new Long(0), and the parse position is
      * left unchanged.
      */
-    public Number parse(String text, ParsePosition parsePosition, double upperBound) {
+    public Number parse(String text, ParsePosition parsePosition, double upperBound, int nonNumericalExecutedRuleMask) {
         // try matching each rule in the rule set against the text being
         // parsed.  Whichever one matches the most characters is the one
         // that determines the value we return.
@@ -763,9 +763,13 @@
         }
 
         // Try each of the negative rules, fraction rules, infinity rules and NaN rules
-        for (NFRule fractionRule : nonNumericalRules) {
-            if (fractionRule != null) {
-                tempResult = fractionRule.doParse(text, parsePosition, false, upperBound);
+        for (int nonNumericalRuleIdx = 0; nonNumericalRuleIdx < nonNumericalRules.length; nonNumericalRuleIdx++) {
+            NFRule nonNumericalRule = nonNumericalRules[nonNumericalRuleIdx];
+            if (nonNumericalRule != null && ((nonNumericalExecutedRuleMask >> nonNumericalRuleIdx) & 1) == 0) {
+                // Mark this rule as being executed so that we don't try to execute it again.
+                nonNumericalExecutedRuleMask |= 1 << nonNumericalRuleIdx;
+
+                tempResult = nonNumericalRule.doParse(text, parsePosition, false, upperBound, nonNumericalExecutedRuleMask);
                 if (parsePosition.getIndex() > highWaterMark.getIndex()) {
                     result = tempResult;
                     highWaterMark.setIndex(parsePosition.getIndex());
@@ -792,7 +796,7 @@
                 continue;
             }
 
-            tempResult = rules[i].doParse(text, parsePosition, isFractionRuleSet, upperBound);
+            tempResult = rules[i].doParse(text, parsePosition, isFractionRuleSet, upperBound, nonNumericalExecutedRuleMask);
             if (parsePosition.getIndex() > highWaterMark.getIndex()) {
                 result = tempResult;
                 highWaterMark.setIndex(parsePosition.getIndex());
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/NFSubstitution.java b/icu4j/main/classes/core/src/com/ibm/icu/text/NFSubstitution.java
index 909bbb6..15ca301 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/NFSubstitution.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/NFSubstitution.java
@@ -425,7 +425,7 @@
      * is left unchanged.
      */
     public Number doParse(String text, ParsePosition parsePosition, double baseValue,
-                          double upperBound, boolean lenientParse) {
+                          double upperBound, boolean lenientParse, int nonNumericalExecutedRuleMask) {
         Number tempResult;
 
         // figure out the highest base value a rule can have and match
@@ -443,7 +443,7 @@
         // on), then also try parsing the text using a default-
         // constructed NumberFormat
         if (ruleSet != null) {
-            tempResult = ruleSet.parse(text, parsePosition, upperBound);
+            tempResult = ruleSet.parse(text, parsePosition, upperBound, nonNumericalExecutedRuleMask);
             if (lenientParse && !ruleSet.isFractionSet() && parsePosition.getIndex() == 0) {
                 tempResult = ruleSet.owner.getDecimalFormat().parse(text, parsePosition);
             }
@@ -995,17 +995,17 @@
      */
     @Override
   public Number doParse(String text, ParsePosition parsePosition, double baseValue,
-                        double upperBound, boolean lenientParse) {
+                        double upperBound, boolean lenientParse, int nonNumericalExecutedRuleMask) {
         // if this isn't a >>> substitution, we can just use the
         // inherited parse() routine to do the parsing
         if (ruleToUse == null) {
-            return super.doParse(text, parsePosition, baseValue, upperBound, lenientParse);
+            return super.doParse(text, parsePosition, baseValue, upperBound, lenientParse, nonNumericalExecutedRuleMask);
 
         } else {
             // but if it IS a >>> substitution, we have to do it here: we
             // use the specific rule's doParse() method, and then we have to
             // do some of the other work of NFRuleSet.parse()
-            Number tempResult = ruleToUse.doParse(text, parsePosition, false, upperBound);
+            Number tempResult = ruleToUse.doParse(text, parsePosition, false, upperBound, nonNumericalExecutedRuleMask);
 
             if (parsePosition.getIndex() != 0) {
                 double result = tempResult.doubleValue();
@@ -1300,11 +1300,11 @@
      */
     @Override
   public Number doParse(String text, ParsePosition parsePosition, double baseValue,
-                        double upperBound, boolean lenientParse) {
+                        double upperBound, boolean lenientParse, int nonNumericalExecutedRuleMask) {
         // if we're not in byDigits mode, we can just use the inherited
         // doParse()
         if (!byDigits) {
-            return super.doParse(text, parsePosition, baseValue, 0, lenientParse);
+            return super.doParse(text, parsePosition, baseValue, 0, lenientParse, nonNumericalExecutedRuleMask);
         }
         else {
             // if we ARE in byDigits mode, parse the text one digit at a time
@@ -1320,7 +1320,7 @@
             int leadingZeros = 0;
             while (workText.length() > 0 && workPos.getIndex() != 0) {
                 workPos.setIndex(0);
-                digit = ruleSet.parse(workText, workPos, 10).intValue();
+                digit = ruleSet.parse(workText, workPos, 10, nonNumericalExecutedRuleMask).intValue();
                 if (lenientParse && workPos.getIndex() == 0) {
                     Number n = ruleSet.owner.getDecimalFormat().parse(workText, workPos);
                     if (n != null) {
@@ -1626,7 +1626,7 @@
      */
     @Override
   public Number doParse(String text, ParsePosition parsePosition, double baseValue,
-                        double upperBound, boolean lenientParse) {
+                        double upperBound, boolean lenientParse, int nonNumericalExecutedRuleMask) {
         // we don't have to do anything special to do the parsing here,
         // but we have to turn lenient parsing off-- if we leave it on,
         // it SERIOUSLY messes up the algorithm
@@ -1641,7 +1641,7 @@
 
             while (workText.length() > 0 && workPos.getIndex() != 0) {
                 workPos.setIndex(0);
-                /*digit = */ruleSet.parse(workText, workPos, 1).intValue(); // parse zero or nothing at all
+                /*digit = */ruleSet.parse(workText, workPos, 1, nonNumericalExecutedRuleMask).intValue(); // parse zero or nothing at all
                 if (workPos.getIndex() == 0) {
                     // we failed, either there were no more zeros, or the number was formatted with digits
                     // either way, we're done
@@ -1662,7 +1662,7 @@
         }
 
         // we've parsed off the zeros, now let's parse the rest from our current position
-        Number result =  super.doParse(text, parsePosition, withZeros ? 1 : baseValue, upperBound, false);
+        Number result =  super.doParse(text, parsePosition, withZeros ? 1 : baseValue, upperBound, false, nonNumericalExecutedRuleMask);
 
         if (withZeros) {
             // any base value will do in this case.  is there a way to
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/NumberFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/NumberFormat.java
index e97ca19..63d2a10 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/NumberFormat.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/NumberFormat.java
@@ -25,6 +25,7 @@
 
 import com.ibm.icu.impl.ICUData;
 import com.ibm.icu.impl.ICUResourceBundle;
+import com.ibm.icu.number.NumberFormatter;
 import com.ibm.icu.util.Currency;
 import com.ibm.icu.util.Currency.CurrencyUsage;
 import com.ibm.icu.util.CurrencyAmount;
@@ -35,6 +36,12 @@
 /**
  * {@icuenhanced java.text.NumberFormat}.{@icu _usage_}
  *
+ * <p>
+ * <strong>IMPORTANT:</strong> New users are strongly encouraged to see if
+ * {@link NumberFormatter} fits their use case.  Although not deprecated, this
+ * class, NumberFormat, is only provided for java.text.NumberFormat compatibility.
+ * <hr>
+ *
  * <code>NumberFormat</code> is the abstract base class for all number
  * formats. This class provides the interface for formatting and parsing
  * numbers. <code>NumberFormat</code> also provides methods for determining
@@ -577,6 +584,9 @@
     //============== Locale Stuff =====================
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns the default number format for the current default <code>FORMAT</code> locale.
      * The default format is one of the styles provided by the other
      * factory methods: getNumberInstance, getIntegerInstance,
@@ -591,6 +601,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns the default number format for the specified locale.
      * The default format is one of the styles provided by the other
      * factory methods: getNumberInstance, getCurrencyInstance or getPercentInstance.
@@ -602,6 +615,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * {@icu} Returns the default number format for the specified locale.
      * The default format is one of the styles provided by the other
      * factory methods: getNumberInstance, getCurrencyInstance or getPercentInstance.
@@ -613,6 +629,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * {@icu} Returns a specific style number format for default <code>FORMAT</code> locale.
      * @param style  number format style
      * @see Category#FORMAT
@@ -623,6 +642,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * {@icu} Returns a specific style number format for a specific locale.
      * @param inLocale  the specific locale.
      * @param style     number format style
@@ -634,6 +656,9 @@
 
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a general-purpose number format for the current default <code>FORMAT</code> locale.
      * @see Category#FORMAT
      * @stable ICU 2.0
@@ -643,6 +668,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a general-purpose number format for the specified locale.
      * @stable ICU 2.0
      */
@@ -651,6 +679,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * {@icu} Returns a general-purpose number format for the specified locale.
      * @stable ICU 3.2
      */
@@ -659,6 +690,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns an integer number format for the current default <code>FORMAT</code> locale. The
      * returned number format is configured to round floating point numbers
      * to the nearest integer using IEEE half-even rounding (see {@link
@@ -676,6 +710,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns an integer number format for the specified locale. The
      * returned number format is configured to round floating point numbers
      * to the nearest integer using IEEE half-even rounding (see {@link
@@ -693,6 +730,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * {@icu} Returns an integer number format for the specified locale. The
      * returned number format is configured to round floating point numbers
      * to the nearest integer using IEEE half-even rounding (see {@link
@@ -709,6 +749,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a currency format for the current default <code>FORMAT</code> locale.
      * @return a number format for currency
      * @see Category#FORMAT
@@ -719,6 +762,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a currency format for the specified locale.
      * @return a number format for currency
      * @stable ICU 2.0
@@ -728,6 +774,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * {@icu} Returns a currency format for the specified locale.
      * @return a number format for currency
      * @stable ICU 3.2
@@ -737,6 +786,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a percentage format for the current default <code>FORMAT</code> locale.
      * @return a number format for percents
      * @see Category#FORMAT
@@ -747,6 +799,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a percentage format for the specified locale.
      * @return a number format for percents
      * @stable ICU 2.0
@@ -756,6 +811,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * {@icu} Returns a percentage format for the specified locale.
      * @return a number format for percents
      * @stable ICU 3.2
@@ -765,6 +823,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * {@icu} Returns a scientific format for the current default <code>FORMAT</code> locale.
      * @return a scientific number format
      * @see Category#FORMAT
@@ -775,6 +836,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * {@icu} Returns a scientific format for the specified locale.
      * @return a scientific number format
      * @stable ICU 2.0
@@ -784,6 +848,9 @@
     }
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * {@icu} Returns a scientific format for the specified locale.
      * @return a scientific number format
      * @stable ICU 3.2
@@ -1337,6 +1404,9 @@
 
 
     /**
+     * <strong>NOTE:</strong> New users are strongly encouraged to use
+     * {@link NumberFormatter} instead of NumberFormat.
+     * <hr>
      * Returns a specific style number format for a specific locale.
      * @param desiredLocale  the specific locale.
      * @param choice         number format style
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIDataWrapper.java b/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIDataWrapper.java
index 977ba6f..d881946 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIDataWrapper.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIDataWrapper.java
@@ -9,35 +9,191 @@
 
 package com.ibm.icu.text;
 
+import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
+import java.util.Arrays;
 
 import com.ibm.icu.impl.ICUBinary;
 import com.ibm.icu.impl.ICUBinary.Authenticate;
 import com.ibm.icu.impl.Trie2;
 
 /**
-* <p>Internal class used for Rule Based Break Iterators</p>
+* <p>Internal class used for Rule Based Break Iterators.</p>
 * <p>This class provides access to the compiled break rule data, as
-* it is stored in a .brk file.
+* it is stored in a .brk file. Refer to the file common/rbbidata.h from
+* ICU4C for further details.
+* Not intended for public use; declared public for testing purposes only.
+* @internal
+* @deprecated This API is ICU internal only.
 */
-final class RBBIDataWrapper {
+@Deprecated
+public final class RBBIDataWrapper {
+
+    /**
+     * A RBBI State Transition table, the form of the data used at run time in Java.
+     * These can be created from stored ICU data, or built from rules.
+     * The structure corresponds closely to struct RBBIStateTable in ICU4C.
+     * Not intended for public use; declared public for testing purposes only.
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    static public class RBBIStateTable {
+        /**
+         * Number of states (rows) in this table.
+         * @internal
+         * @deprecated This API is ICU internal only.
+         */
+        @Deprecated
+        public int     fNumStates;
+        /**
+         * Length of a table row in bytes. Note mismatch with table data, which is short[].
+         * @internal
+         * @deprecated This API is ICU internal only.
+         */
+        @Deprecated
+        public int     fRowLen;
+        /**
+         * Option Flags for this state table.
+         * @internal
+         * @deprecated This API is ICU internal only.
+         */
+        @Deprecated
+        public int     fFlags;
+        /**
+         * Option Flags for this state table.
+         * @internal
+         * @deprecated This API is ICU internal only.
+         */
+        @Deprecated
+        public int     fReserved;
+        /**
+         * Linear array of next state values, accessed as short[state, char_class]
+         * @internal
+         * @deprecated This API is ICU internal only.
+         */
+        @Deprecated
+        public short[] fTable;
+
+        RBBIStateTable() {
+        }
+
+        static RBBIStateTable get(ByteBuffer bytes, int length) throws IOException {
+            if (length == 0) {
+                return null;
+            }
+            if (length < 16) {
+                throw new IOException("Invalid RBBI state table length.");
+            }
+            RBBIStateTable This = new RBBIStateTable();
+            This.fNumStates = bytes.getInt();
+            This.fRowLen    = bytes.getInt();
+            This.fFlags     = bytes.getInt();
+            This.fReserved  = bytes.getInt();
+            int lengthOfShorts = length - 16;   // length in bytes.
+            This.fTable     = ICUBinary.getShorts(bytes, lengthOfShorts / 2, lengthOfShorts & 1);
+            return This;
+        }
+
+        int put(DataOutputStream bytes) throws IOException {
+            bytes.writeInt(fNumStates);
+            bytes.writeInt(fRowLen);
+            bytes.writeInt(fFlags);
+            bytes.writeInt(fReserved);
+            int tableLen = fRowLen * fNumStates / 2;  // fRowLen is bytes.
+            for (int i = 0; i < tableLen; i++) {
+                bytes.writeShort(fTable[i]);
+            }
+            int bytesWritten = 16 + fRowLen * fNumStates;   // total bytes written,
+                                                            // including 16 for the header.
+            while (bytesWritten % 8 != 0) {
+                bytes.writeByte(0);
+                ++bytesWritten;
+            }
+            return bytesWritten;
+        }
+
+        /**
+         * {@inheritDoc}
+         * @internal
+         * @deprecated This API is ICU internal only.
+         */
+        @Deprecated
+        @Override
+        public boolean equals (Object other) {
+            if (other == this) {
+                return true;
+            }
+            if (!(other instanceof RBBIStateTable)) {
+                return false;
+            }
+            RBBIStateTable otherST = (RBBIStateTable)other;
+            if (fNumStates != otherST.fNumStates) return false;
+            if (fRowLen    != otherST.fRowLen)    return false;
+            if (fFlags     != otherST.fFlags)     return false;
+            if (fReserved  != otherST.fReserved)  return false;
+            return Arrays.equals(fTable, otherST.fTable);
+        }
+    }
+
+    /**
+     * Equals helper for state tables, including null handling.
+     * Not intended for public use; declared public for testing purposes only.
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    static public boolean equals(RBBIStateTable left, RBBIStateTable right) {
+        if (left == right) {
+            return true;
+        }
+        if (left == null || right == null) {
+            return false;
+        }
+        return left.equals(right);
+    }
+
+
     //
     // These fields are the ready-to-use compiled rule data, as
     //   read from the file.
     //
-    RBBIDataHeader fHeader;
-    short          fFTable[];
-    short          fRTable[];
-    short          fSFTable[];
-    short          fSRTable[];
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public RBBIDataHeader fHeader;
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public RBBIStateTable   fFTable;
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public RBBIStateTable   fRTable;
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public RBBIStateTable   fSFTable;
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public RBBIStateTable   fSRTable;
+
     Trie2          fTrie;
     String         fRuleSource;
     int            fStatusTable[];
 
-    private boolean isBigEndian;
-
     static final int DATA_FORMAT = 0x42726b20;     // "Brk "
     static final int FORMAT_VERSION = 0x04000000;  // 4.0.0.0
 
@@ -78,20 +234,36 @@
     // Index offsets to the fields in a state table row.
     //    Corresponds to struct RBBIStateTableRow in the C version.
     //
-    final static int      ACCEPTING  = 0;
-    final static int      LOOKAHEAD  = 1;
-    final static int      TAGIDX     = 2;
-    final static int      RESERVED   = 3;
-    final static int      NEXTSTATES = 4;
-
-    // Index offsets to header fields of a state table
-    //     struct RBBIStateTable {...   in the C version.
-    //
-            static final int NUMSTATES  = 0;
-            static final int ROWLEN     = 2;
-            static final int FLAGS      = 4;
-    //ivate static final int RESERVED_2 = 6;
-    private static final int ROW_DATA   = 8;
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public final static int      ACCEPTING  = 0;
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public final static int      LOOKAHEAD  = 1;
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public final static int      TAGIDX     = 2;
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public final static int      RESERVED   = 3;
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public final static int      NEXTSTATES = 4;
 
     //  Bit selectors for the "FLAGS" field of the state table header
     //     enum RBBIStateTableFlags in the C version.
@@ -101,13 +273,22 @@
 
     /**
      * Data Header.  A struct-like class with the fields from the RBBI data file header.
+     * Not intended for public use, declared public for testing purposes only.
+     * @internal
+     * @deprecated This API is ICU internal only.
      */
-    final static class RBBIDataHeader {
+    @Deprecated
+    public final static class RBBIDataHeader {
         int         fMagic;         //  == 0xbla0
         byte[]      fFormatVersion; //  For ICU 3.4 and later.
         int         fLength;        //  Total length in bytes of this RBBI Data,
                                        //      including all sections, not just the header.
-        int         fCatCount;      //  Number of character categories.
+        /**
+         * @internal
+         * @deprecated This API is ICU internal only.
+         */
+        @Deprecated
+        public int  fCatCount;      //  Number of character categories.
 
         //
         //  Offsets and sizes of each of the subsections within the RBBI data.
@@ -129,6 +310,11 @@
         int         fStatusTable;    // Offset to the table of rule status values
         int         fStatusTableLen;
 
+        /**
+         * @internal
+         * @deprecated This API is ICU internal only.
+         */
+        @Deprecated
         public RBBIDataHeader() {
             fMagic = 0;
             fFormatVersion = new byte[4];
@@ -139,10 +325,12 @@
     /**
      * RBBI State Table Indexing Function.  Given a state number, return the
      * array index of the start of the state table row for that state.
-     *
+     * @internal
+     * @deprecated This API is ICU internal only.
      */
-    int getRowIndex(int state){
-        return ROW_DATA + state * (fHeader.fCatCount + 4);
+    @Deprecated
+    public int getRowIndex(int state){
+        return state * (fHeader.fCatCount + 4);
     }
 
     RBBIDataWrapper() {
@@ -156,7 +344,6 @@
         RBBIDataWrapper This = new RBBIDataWrapper();
 
         ICUBinary.readHeader(bytes, DATA_FORMAT, IS_ACCEPTABLE);
-        This.isBigEndian = bytes.order() == ByteOrder.BIG_ENDIAN;
 
         // Read in the RBBI data header...
         This.fHeader = new  RBBIDataHeader();
@@ -204,8 +391,7 @@
         ICUBinary.skipBytes(bytes, This.fHeader.fFTable - pos);
         pos = This.fHeader.fFTable;
 
-        This.fFTable = ICUBinary.getShorts(
-                bytes, This.fHeader.fFTableLen / 2, This.fHeader.fFTableLen & 1);
+        This.fFTable = RBBIStateTable.get(bytes, This.fHeader.fFTableLen);
         pos += This.fHeader.fFTableLen;
 
         //
@@ -217,8 +403,7 @@
         pos = This.fHeader.fRTable;
 
         // Create & fill the table itself.
-        This.fRTable = ICUBinary.getShorts(
-                bytes, This.fHeader.fRTableLen / 2, This.fHeader.fRTableLen & 1);
+        This.fRTable = RBBIStateTable.get(bytes, This.fHeader.fRTableLen);
         pos += This.fHeader.fRTableLen;
 
         //
@@ -230,8 +415,7 @@
             pos = This.fHeader.fSFTable;
 
             // Create & fill the table itself.
-            This.fSFTable = ICUBinary.getShorts(
-                    bytes, This.fHeader.fSFTableLen / 2, This.fHeader.fSFTableLen & 1);
+            This.fSFTable = RBBIStateTable.get(bytes, This.fHeader.fSFTableLen);
             pos += This.fHeader.fSFTableLen;
         }
 
@@ -244,8 +428,7 @@
             pos = This.fHeader.fSRTable;
 
             // Create & fill the table itself.
-            This.fSRTable = ICUBinary.getShorts(
-                    bytes, This.fHeader.fSRTableLen / 2, This.fHeader.fSRTableLen & 1);
+            This.fSRTable = RBBIStateTable.get(bytes, This.fHeader.fSRTableLen);
             pos += This.fHeader.fSRTableLen;
         }
 
@@ -312,26 +495,14 @@
     }
 
     ///CLOVER:OFF
-    //  Getters for fields from the state table header
-    //
-    private int getStateTableNumStates(short table[]) {
-        if (isBigEndian) {
-            return (table[NUMSTATES] << 16) | (table[NUMSTATES+1] & 0xffff);
-        } else {
-            return (table[NUMSTATES+1] << 16) | (table[NUMSTATES] & 0xffff);
-        }
-    }
-    ///CLOVER:ON
-
-    int getStateTableFlags(short table[]) {
-        // This works for up to 15 flags bits.
-        return table[isBigEndian ? FLAGS + 1 : FLAGS];
-    }
-
-    ///CLOVER:OFF
     /* Debug function to display the break iterator data. */
-    void dump(java.io.PrintStream out) {
-        if (fFTable.length == 0) {
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
+    public void dump(java.io.PrintStream out) {
+        if (fFTable == null) {
             // There is no table. Fail early for testing purposes.
             throw new NullPointerException();
         }
@@ -354,6 +525,11 @@
 
     ///CLOVER:OFF
     /* Fixed width int-to-string conversion. */
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
     static public String intToString(int n, int width) {
         StringBuilder  dest = new StringBuilder(width);
         dest.append(n);
@@ -366,6 +542,11 @@
 
     ///CLOVER:OFF
     /* Fixed width int-to-string conversion. */
+    /**
+     * @internal
+     * @deprecated This API is ICU internal only.
+     */
+    @Deprecated
     static public String intToHexString(int n, int width) {
         StringBuilder  dest = new StringBuilder(width);
         dest.append(Integer.toHexString(n));
@@ -378,8 +559,8 @@
 
     ///CLOVER:OFF
     /** Dump a state table.  (A full set of RBBI rules has 4 state tables.)  */
-    private void dumpTable(java.io.PrintStream out, short table[]) {
-        if (table == null || table.length == 0)   {
+    private void dumpTable(java.io.PrintStream out, RBBIStateTable table) {
+        if (table == null || table.fTable.length == 0)   {
             out.println("  -- null -- ");
         } else {
             int n;
@@ -393,7 +574,7 @@
                 out.print("-");
             }
             out.println();
-            for (state=0; state< getStateTableNumStates(table); state++) {
+            for (state=0; state < table.fNumStates; state++) {
                 dumpRow(out, table, state);
             }
             out.println();
@@ -407,24 +588,24 @@
      * @param table
      * @param state
      */
-    private void dumpRow(java.io.PrintStream out, short table[], int   state) {
+    private void dumpRow(java.io.PrintStream out, RBBIStateTable table, int   state) {
         StringBuilder dest = new StringBuilder(fHeader.fCatCount*5 + 20);
         dest.append(intToString(state, 4));
         int row = getRowIndex(state);
-        if (table[row+ACCEPTING] != 0) {
-           dest.append(intToString(table[row+ACCEPTING], 5));
+        if (table.fTable[row+ACCEPTING] != 0) {
+           dest.append(intToString(table.fTable[row+ACCEPTING], 5));
         }else {
             dest.append("     ");
         }
-        if (table[row+LOOKAHEAD] != 0) {
-            dest.append(intToString(table[row+LOOKAHEAD], 5));
+        if (table.fTable[row+LOOKAHEAD] != 0) {
+            dest.append(intToString(table.fTable[row+LOOKAHEAD], 5));
         }else {
             dest.append("     ");
         }
-        dest.append(intToString(table[row+TAGIDX], 5));
+        dest.append(intToString(table.fTable[row+TAGIDX], 5));
 
         for (int col=0; col<fHeader.fCatCount; col++) {
-            dest.append(intToString(table[row+NEXTSTATES+col], 5));
+            dest.append(intToString(table.fTable[row+NEXTSTATES+col], 5));
         }
 
         out.println(dest);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIRuleBuilder.java b/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIRuleBuilder.java
index 6236a30..66c87c7 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIRuleBuilder.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIRuleBuilder.java
@@ -28,6 +28,7 @@
 
     String fDebugEnv;              // controls debug trace output
     String fRules;                 // The rule string that we are compiling
+    StringBuilder fStrippedRules;  // The rule string, with comments stripped.
     RBBIRuleScanner fScanner;      // The scanner.
 
 
@@ -142,6 +143,7 @@
         fDebugEnv       = ICUDebug.enabled("rbbi") ?
                             ICUDebug.value("rbbi") : null;
         fRules          = rules;
+        fStrippedRules  = new StringBuilder(rules);
         fUSetNodes      = new ArrayList<RBBINode>();
         fRuleStatusVals = new ArrayList<Integer>();
         fScanner        = new RBBIRuleScanner(this);
@@ -165,8 +167,9 @@
         DataOutputStream dos = new DataOutputStream(os);
         int i;
 
-        //  Remove comments and whitespace from the rules to make it smaller.
-        String strippedRules = RBBIRuleScanner.stripRules(fRules);
+        //  Remove whitespace from the rules to make it smaller.
+        //  The rule parser has already removed comments.
+        String strippedRules = RBBIRuleScanner.stripRules(fStrippedRules.toString());
 
         // Calculate the size of each section in the data in bytes.
         //   Sizes here are padded up to a multiple of 8 for better memory alignment.
@@ -250,13 +253,9 @@
         }
 
         // Write out the actual state tables.
-        short[] tableData;
-        tableData = fForwardTables.exportTable();
-        Assert.assrt(outputPos == header[4]);
-        for (i = 0; i < tableData.length; i++) {
-            dos.writeShort(tableData[i]);
-            outputPos += 2;
-        }
+        RBBIDataWrapper.RBBIStateTable table = fForwardTables.exportTable();
+        assert(outputPos == header[4]);
+        outputPos += table.put(dos);
 
         /* do not write the reverse table
         tableData = fReverseTables.exportTable();
@@ -278,16 +277,13 @@
 
         // Write the safe reverse table.
         // If not present, write the plain reverse table (old style rule compatibility)
-        Assert.assrt(outputPos == header[10]);
+        assert(outputPos == header[10]);
         if (safeRevTableSize > 0) {
-            tableData = fSafeRevTables.exportTable();
+            table = fSafeRevTables.exportTable();
         } else {
-            tableData = fReverseTables.exportTable();
+            table = fReverseTables.exportTable();
         }
-        for (i = 0; i < tableData.length; i++) {
-            dos.writeShort(tableData[i]);
-            outputPos += 2;
-        }
+        outputPos += table.put(dos);
 
         // write out the Trie table
         Assert.assrt(outputPos == header[12]);
@@ -339,10 +335,10 @@
         //
         // UnicodeSet processing.
         //    Munge the Unicode Sets to create a set of character categories.
-        //    Generate the mapping tables (TRIE) from input 32-bit characters to
+        //    Generate the mapping tables (TRIE) from input code points to
         //    the character categories.
         //
-        builder.fSetBuilder.build();
+        builder.fSetBuilder.buildRanges();
 
         //
         //   Generate the DFA state transition table.
@@ -360,10 +356,38 @@
             builder.fForwardTables.printRuleStatusTable();
         }
 
+        builder.optimizeTables();
+        builder.fSetBuilder.buildTrie();
         //
         //   Package up the compiled data, writing it to an output stream
         //      in the serialization format.  This is the same as the ICU4C runtime format.
         //
         builder.flattenData(os);
     }
+
+    static class IntPair {
+        int first = 0;
+        int second = 0;
+        IntPair() {};
+        IntPair(int f, int s) {
+            first = f;
+            second = s;
+        }
+    }
+
+    void optimizeTables() {
+        IntPair duplPair = new IntPair(3, 0);
+        while (fForwardTables.findDuplCharClassFrom(duplPair)) {
+            fSetBuilder.mergeCategories(duplPair.first, duplPair.second);
+            fForwardTables.removeColumn(duplPair.second);
+            fReverseTables.removeColumn(duplPair.second);
+            fSafeFwdTables.removeColumn(duplPair.second);
+            fSafeRevTables.removeColumn(duplPair.second);
+        }
+
+        fForwardTables.removeDuplicateStates();
+        fReverseTables.removeDuplicateStates();
+        fSafeFwdTables.removeDuplicateStates();
+        fSafeRevTables.removeDuplicateStates();
+    }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIRuleScanner.java b/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIRuleScanner.java
index 1fb6133..afdc927 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIRuleScanner.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/RBBIRuleScanner.java
@@ -14,6 +14,7 @@
 import com.ibm.icu.impl.Assert;
 import com.ibm.icu.impl.Utility;
 import com.ibm.icu.lang.UCharacter;
+import com.ibm.icu.lang.UProperty;
 
 /**
   *  This class is part of the Rule Based Break Iterator rule compiler.
@@ -696,17 +697,16 @@
     static String stripRules(String rules) {
         StringBuilder strippedRules = new StringBuilder();
         int rulesLength = rules.length();
-        for (int idx = 0; idx < rulesLength;) {
-            char ch = rules.charAt(idx++);
-            if (ch == '#') {
-                while (idx < rulesLength
-                        && ch != '\r' && ch != '\n' && ch != chNEL) {
-                    ch = rules.charAt(idx++);
-                }
+        boolean skippingSpaces = false;
+
+        for (int idx = 0; idx < rulesLength; idx = rules.offsetByCodePoints(idx, 1)) {
+            int cp = rules.codePointAt(idx);
+            boolean whiteSpace = UCharacter.hasBinaryProperty(cp, UProperty.PATTERN_WHITE_SPACE);
+            if (skippingSpaces && whiteSpace) {
+                continue;
             }
-            if (!UCharacter.isISOControl(ch)) {
-                strippedRules.append(ch);
-            }
+            strippedRules.appendCodePoint(cp);
+            skippingSpaces = whiteSpace;
         }
         return strippedRules.toString();
     }
@@ -800,6 +800,7 @@
                 //  It will be treated as white-space, and serves to break up anything
                 //    that might otherwise incorrectly clump together with a comment in
                 //    the middle (a variable name, for example.)
+                int commentStart = fScanIndex;
                 for (;;) {
                     c.fChar = nextCharLL();
                     if (c.fChar == -1 || // EOF
@@ -811,6 +812,9 @@
                         break;
                     }
                 }
+                for (int i=commentStart; i<fNextIndex-1; ++i) {
+                    fRB.fStrippedRules.setCharAt(i, ' ');
+                }
             }
             if (c.fChar == -1) {
                 return;
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/RBBISetBuilder.java b/icu4j/main/classes/core/src/com/ibm/icu/text/RBBISetBuilder.java
index 44352cb..ada2258 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/RBBISetBuilder.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/RBBISetBuilder.java
@@ -112,7 +112,7 @@
                         }
                     }
                     if (setName.equals("dictionary")) {
-                        this.fNum |= 0x4000;
+                        this.fNum |= DICT_BIT;
                         break;
                     }
                 }
@@ -138,6 +138,8 @@
 
     boolean             fSawBOF;
 
+    static final int    DICT_BIT = 0x4000;
+
 
     //------------------------------------------------------------------------
     //
@@ -156,7 +158,7 @@
     //                          from the Unicode Sets.
     //
     //------------------------------------------------------------------------
-    void build() {
+    void buildRanges() {
         RangeDescriptor rlRange;
 
         if (fRB.fDebugEnv!=null  && fRB.fDebugEnv.indexOf("usets")>=0) {printSets();}
@@ -280,6 +282,15 @@
 
         if (fRB.fDebugEnv!=null  && fRB.fDebugEnv.indexOf("rgroup")>=0) {printRangeGroups();}
         if (fRB.fDebugEnv!=null  && fRB.fDebugEnv.indexOf("esets")>=0) {printSets();}
+    }
+
+
+    /**
+     * Build the Trie table for mapping UChar32 values to the corresponding
+     * range group number.
+     */
+    void buildTrie() {
+        RangeDescriptor rlRange;
 
         fTrie = new Trie2Writable(0,       //   Initial value for all code points.
                                   0);      //   Error value for out-of-range input.
@@ -294,6 +305,24 @@
         }
     }
 
+    /**
+     * Merge two character categories that have been identified as having equivalent behavior.
+     * The ranges belonging to the right category (table column) will be added to the left.
+     */
+    void mergeCategories(int left, int right) {
+        assert(left >= 1);
+        assert(right > left);
+        for (RangeDescriptor rd = fRangeList; rd != null; rd = rd.fNext) {
+            int rangeNum = rd.fNum & ~DICT_BIT;
+            int rangeDict = rd.fNum & DICT_BIT;
+            if (rangeNum == right) {
+                rd.fNum = left | rangeDict;
+            } else if (rangeNum > right) {
+                rd.fNum--;
+            }
+        }
+        --fGroupCount;
+    }
 
     //-----------------------------------------------------------------------------------
     //
@@ -457,7 +486,7 @@
                 if (groupNum<10) {System.out.print(" ");}
                 System.out.print(groupNum + " ");
 
-                if ((rlRange.fNum & 0x4000) != 0) { System.out.print(" <DICT> ");}
+                if ((rlRange.fNum & DICT_BIT) != 0) { System.out.print(" <DICT> ");}
 
                 for (i=0; i<rlRange.fIncludesSets.size(); i++) {
                     RBBINode       usetNode    = rlRange.fIncludesSets.get(i);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/RBBITableBuilder.java b/icu4j/main/classes/core/src/com/ibm/icu/text/RBBITableBuilder.java
index 36d3c4b..2a4d058 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/RBBITableBuilder.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/RBBITableBuilder.java
@@ -10,6 +10,7 @@
 package com.ibm.icu.text;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -20,6 +21,7 @@
 import com.ibm.icu.impl.Assert;
 import com.ibm.icu.lang.UCharacter;
 import com.ibm.icu.lang.UProperty;
+import com.ibm.icu.text.RBBIRuleBuilder.IntPair;
 
 //
 //  class RBBITableBuilder is part of the RBBI rule compiler.
@@ -655,7 +657,7 @@
                         // if sd.fAccepting already had a value other than 0 or -1, leave it be.
 
                        // If the end marker node is from a look-ahead rule, set
-                       //   the fLookAhead field or this state also.
+                       //   the fLookAhead field for this state also.
                        if (endMarker.fLookAheadEnd) {
                         // TODO:  don't change value if already set?
                         // TODO:  allow for more than one active look-ahead rule in engine.
@@ -832,115 +834,214 @@
 
 
 
+       /**
+        *  Find duplicate (redundant) character classes, beginning at the specified
+        *  pair, within this state table. This is an iterator-like function, used to
+        *  identify character classes (state table columns) that can be eliminated.
+        *  @param categories in/out parameter, specifies where to start looking for duplicates,
+        *                and returns the first pair of duplicates found, if any.
+        *  @return true if duplicate char classes were found, false otherwise.
+        *  @internal
+        */
+       boolean findDuplCharClassFrom(RBBIRuleBuilder.IntPair categories) {
+           int numStates = fDStates.size();
+           int numCols = fRB.fSetBuilder.getNumCharCategories();
 
-       //-----------------------------------------------------------------------------
-       //
-       //   getTableSize()    Calculate the size in bytes of the runtime form of this
-       //                     state transition table.
-       //
-       //          Note:  Refer to common/rbbidata.h from ICU4C for the declarations
-       //                 of the structures being matched by this calculation.
-       //
-       //-----------------------------------------------------------------------------
+           int table_base = 0;
+           int table_dupl = 0;
+           for (; categories.first < numCols-1; ++categories.first) {
+               for (categories.second=categories.first+1; categories.second < numCols; ++categories.second) {
+                   for (int state=0; state<numStates; state++) {
+                       RBBIStateDescriptor sd = fDStates.get(state);
+                       table_base = sd.fDtran[categories.first];
+                       table_dupl = sd.fDtran[categories.second];
+                       if (table_base != table_dupl) {
+                           break;
+                       }
+                   }
+                   if (table_base == table_dupl) {
+                       return true;
+                   }
+               }
+           }
+           return false;
+       }
+
+       /**
+        * Remove a column from the state table. Used when two character categories
+        * have been found equivalent, and merged together, to eliminate the unneeded table column.
+        */
+       void removeColumn(int column) {
+           int numStates = fDStates.size();
+           for (int state=0; state<numStates; state++) {
+               RBBIStateDescriptor sd = fDStates.get(state);
+               assert(column < sd.fDtran.length);
+               int[] newArray = Arrays.copyOf(sd.fDtran, sd.fDtran.length - 1);
+               System.arraycopy(sd.fDtran, column+1, newArray, column, newArray.length - column);
+               sd.fDtran = newArray;
+           }
+       }
+
+
+       /**
+        *  Find duplicate (redundant) states, beginning at the specified pair,
+        *  within this state table. This is an iterator-like function, used to
+        *  identify states (state table rows) that can be eliminated.
+        *  @param states in/out parameter, specifies where to start looking for duplicates,
+        *                and returns the first pair of duplicates found, if any.
+        *  @return true if duplicate states were found, false otherwise.
+        *  @internal
+        */
+       boolean findDuplicateState(RBBIRuleBuilder.IntPair states) {
+           int numStates = fDStates.size();
+           int numCols = fRB.fSetBuilder.getNumCharCategories();
+
+           for (; states.first<numStates-1; ++states.first) {
+               RBBIStateDescriptor firstSD = fDStates.get(states.first);
+               for (states.second=states.first+1; states.second<numStates; ++states.second) {
+                   RBBIStateDescriptor duplSD = fDStates.get(states.second);
+                   if (firstSD.fAccepting != duplSD.fAccepting ||
+                           firstSD.fLookAhead != duplSD.fLookAhead ||
+                           firstSD.fTagsIdx   != duplSD.fTagsIdx) {
+                       continue;
+                   }
+                   boolean rowsMatch = true;
+                   for (int col=0; col < numCols; ++col) {
+                       int firstVal = firstSD.fDtran[col];
+                       int duplVal = duplSD.fDtran[col];
+                       if (!((firstVal == duplVal) ||
+                               ((firstVal == states.first || firstVal == states.second) &&
+                                       (duplVal  == states.first || duplVal  == states.second)))) {
+                           rowsMatch = false;
+                           break;
+                       }
+                   }
+                   if (rowsMatch) {
+                       return true;
+                   }
+               }
+           }
+           return false;
+       }
+
+       /**
+        * Remove a duplicate state (row) from the state table. All references to the deleted state are
+        * redirected to "keepState", the first encountered of the duplicated pair of states.
+        * @param keepState The first of the duplicate pair of states, the one to be kept.
+        * @param duplState The second of the duplicate pair, the one to be removed.
+        * @internal
+        */
+       void removeState(int keepState, int duplState) {
+           assert(keepState < duplState);
+           assert(duplState < fDStates.size());
+
+           fDStates.remove(duplState);
+
+           int numStates = fDStates.size();
+           int numCols = fRB.fSetBuilder.getNumCharCategories();
+           for (int state=0; state<numStates; ++state) {
+               RBBIStateDescriptor sd = fDStates.get(state);
+               for (int col=0; col<numCols; col++) {
+                   int existingVal = sd.fDtran[col];
+                   int newVal = existingVal;
+                   if (existingVal == duplState) {
+                       newVal = keepState;
+                   } else if (existingVal > duplState) {
+                       newVal = existingVal - 1;
+                   }
+                   sd.fDtran[col] = newVal;
+               }
+               if (sd.fAccepting == duplState) {
+                   sd.fAccepting = keepState;
+               } else if (sd.fAccepting > duplState) {
+                   sd.fAccepting--;
+               }
+               if (sd.fLookAhead == duplState) {
+                   sd.fLookAhead = keepState;
+               } else if (sd.fLookAhead > duplState) {
+                   sd.fLookAhead--;
+               }
+           }
+       }
+
+
+       /**
+        *  Check for, and remove duplicate states (table rows).
+        *  @internal
+        */
+       void removeDuplicateStates() {
+           IntPair dupls = new IntPair(3, 0);
+           while (findDuplicateState(dupls)) {
+               // System.out.printf("Removing duplicate states (%d, %d)\n", dupls.first, dupls.second);
+               removeState(dupls.first, dupls.second);
+           }
+       }
+
+
+       /**
+        *  Calculate the size in bytes of the serialized form of this state transition table,
+        *  which is identical to the ICU4C runtime form.
+        *  Refer to common/rbbidata.h from ICU4C for the declarations of the structures
+        *  being matched by this calculation.
+        */
        int  getTableSize()  {
-           int    size = 0;
-           int    numRows;
-           int    numCols;
-           int    rowSize;
-
            if (fRB.fTreeRoots[fRootIx] == null) {
                return 0;
            }
-
-           size    = /*sizeof(RBBIStateTable) - 4 */ 16;    // The header, with no rows to the table.
-
-           numRows = fDStates.size();
-           numCols = fRB.fSetBuilder.getNumCharCategories();
-
-           //  Note  The declaration of RBBIStateTableRow is for a table of two columns.
-           //        Therefore we subtract two from numCols when determining
-           //        how much storage to add to a row for the total columns.
-           // rowSize = sizeof(RBBIStateTableRow) + sizeof(uint16_t)*(numCols-2);
-           rowSize = 8 + 2*numCols;
+           int size    = 16;    // The header of 4 ints, with no rows to the table.
+           int numRows = fDStates.size();
+           int numCols = fRB.fSetBuilder.getNumCharCategories();
+           int rowSize = 8 + 2*numCols;
            size   += numRows * rowSize;
-           while (size % 8 > 0) {    // Size must be multiple of 8 bytes in size.
-               size++;
-           }
-
+           size = (size + 7) & ~7;   // round up to a multiple of 8 bytes
            return size;
        }
 
 
 
-       //-----------------------------------------------------------------------------
-       //
-       //   exportTable()    export the state transition table in the ICU4C format.
-       //
-       //                    Most of the table is 16 bit shorts.  This function exports
-       //                    the whole thing as an array of shorts.
-       //
-       //                    The size of the array must be rounded up to a multiple of
-       //                    8 bytes.
-       //
-       //                    See struct RBBIStateTable in ICU4C, common/rbbidata.h
-       //
-       //-----------------------------------------------------------------------------
-
-       short [] exportTable() {
+       /**
+        * Create a RBBIDataWrapper.RBBIStateTable for a newly compiled table.
+        * RBBIDataWrapper.RBBIStateTable is similar to struct RBBIStateTable in ICU4C,
+        * in common/rbbidata.h
+        */
+       RBBIDataWrapper.RBBIStateTable exportTable() {
            int                state;
            int                col;
 
+           RBBIDataWrapper.RBBIStateTable table = new RBBIDataWrapper.RBBIStateTable();
            if (fRB.fTreeRoots[fRootIx] == null) {
-               return new short[0];
+               return table;
            }
 
            Assert.assrt(fRB.fSetBuilder.getNumCharCategories() < 0x7fff &&
                fDStates.size() < 0x7fff);
-
-           int numStates = fDStates.size();
+           table.fNumStates = fDStates.size();
 
            // Size of table size in shorts.
            //  the "4" is the size of struct RBBIStateTableRow, the row header part only.
-           int rowLen = 4 + fRB.fSetBuilder.getNumCharCategories();
-           int tableSize = getTableSize() / 2;
+           int rowLen = 4 + fRB.fSetBuilder.getNumCharCategories();   // Row Length in shorts.
+           int tableSize = (getTableSize() - 16) / 2;       // fTable length in shorts.
+           table.fTable = new short[tableSize];
+           table.fRowLen = rowLen * 2;                      // Row length in bytes.
 
-
-           short [] table = new short[tableSize];
-
-           //
-           // Fill in the header fields.
-           //      Annoying because they really want to be ints, not shorts.
-           //
-           // RBBIStateTable.fNumStates
-           table[RBBIDataWrapper.NUMSTATES]   = (short)(numStates >>> 16);
-           table[RBBIDataWrapper.NUMSTATES+1] = (short)(numStates & 0x0000ffff);
-
-           // RBBIStateTable.fRowLen
-           table[RBBIDataWrapper.ROWLEN]   = (short)(rowLen >>> 16);
-           table[RBBIDataWrapper.ROWLEN+1] = (short)(rowLen & 0x0000ffff);
-
-           // RBBIStateTable.fFlags
-           int flags = 0;
            if (fRB.fLookAheadHardBreak) {
-               flags  |= RBBIDataWrapper.RBBI_LOOKAHEAD_HARD_BREAK;
+               table.fFlags  |= RBBIDataWrapper.RBBI_LOOKAHEAD_HARD_BREAK;
            }
            if (fRB.fSetBuilder.sawBOF()) {
-               flags  |= RBBIDataWrapper.RBBI_BOF_REQUIRED;
+               table.fFlags  |= RBBIDataWrapper.RBBI_BOF_REQUIRED;
            }
-           table[RBBIDataWrapper.FLAGS]   = (short)(flags >>> 16);
-           table[RBBIDataWrapper.FLAGS+1] = (short)(flags & 0x0000ffff);
 
            int numCharCategories = fRB.fSetBuilder.getNumCharCategories();
-           for (state=0; state<numStates; state++) {
+           for (state=0; state<table.fNumStates; state++) {
                RBBIStateDescriptor sd = fDStates.get(state);
-               int                row = 8 + state*rowLen;
+               int row = state*rowLen;
                Assert.assrt (-32768 < sd.fAccepting && sd.fAccepting <= 32767);
                Assert.assrt (-32768 < sd.fLookAhead && sd.fLookAhead <= 32767);
-               table[row + RBBIDataWrapper.ACCEPTING] = (short)sd.fAccepting;
-               table[row + RBBIDataWrapper.LOOKAHEAD] = (short)sd.fLookAhead;
-               table[row + RBBIDataWrapper.TAGIDX]    = (short)sd.fTagsIdx;
+               table.fTable[row + RBBIDataWrapper.ACCEPTING] = (short)sd.fAccepting;
+               table.fTable[row + RBBIDataWrapper.LOOKAHEAD] = (short)sd.fLookAhead;
+               table.fTable[row + RBBIDataWrapper.TAGIDX]    = (short)sd.fTagsIdx;
                for (col=0; col<numCharCategories; col++) {
-                   table[row + RBBIDataWrapper.NEXTSTATES + col] = (short)sd.fDtran[col];
+                   table.fTable[row + RBBIDataWrapper.NEXTSTATES + col] = (short)sd.fDtran[col];
                }
            }
            return table;
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/RuleBasedBreakIterator.java b/icu4j/main/classes/core/src/com/ibm/icu/text/RuleBasedBreakIterator.java
index 425ebdc..74a44d8 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/RuleBasedBreakIterator.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/RuleBasedBreakIterator.java
@@ -216,15 +216,19 @@
     private static final int  RBBI_RUN    = 1;
     private static final int  RBBI_END    = 2;
 
-    /*
+    /**
      * The character iterator through which this BreakIterator accesses the text.
      */
     private CharacterIterator   fText = new java.text.StringCharacterIterator("");
 
     /**
-     * The rule data for this BreakIterator instance. Package private.
+     * The rule data for this BreakIterator instance.
+     * Not intended for public use. Declared public for testing purposes only.
+     * @internal
+     * @deprecated This API is ICU internal only.
      */
-    RBBIDataWrapper             fRData;
+    @Deprecated
+    public RBBIDataWrapper    fRData;
 
     /**
      *  The iteration state - current position, rule status for the current position,
@@ -264,7 +268,7 @@
 
     private DictionaryCache     fDictionaryCache = new DictionaryCache();
 
-    /*
+    /**
      * ICU debug argument name for RBBI
      */
     private static final String RBBI_DEBUG_ARG = "rbbi";
@@ -276,13 +280,6 @@
             && ICUDebug.value(RBBI_DEBUG_ARG).indexOf("trace") >= 0;
 
     /**
-     * What kind of break iterator this is.
-     * Defaulting BreakType to word gives reasonable dictionary behavior for
-     * Break Iterators that are built from rules.
-     */
-    private int fBreakType = KIND_WORD;
-
-    /**
      * The "default" break engine - just skips over ranges of dictionary words,
      * producing no breaks. Should only be used if characters need to be handled
      * by a dictionary but we have no dictionary implementation for them.
@@ -455,7 +452,7 @@
             return first();
         }
 
-        // Move requested offset to a code point start. It might be on a trail surrogate.
+        // Move requested offset to a code point start. It might be between a lead and trail surrogate.
         // Or it may be beyond the end of the text.
         startPos = CISetIndex32(fText, startPos);
         fBreakCache.following(startPos);
@@ -478,7 +475,7 @@
             return first();
         }
 
-        // Move requested offset to a code point start. It might be on a trail surrogate.
+        // Move requested offset to a code point start. It might be between a lead and trail surrogate.
         // int adjustedOffset = CISetIndex32(fText, offset);    // TODO: restore to match ICU4C behavior.
         int adjustedOffset = offset;
         fBreakCache.preceding(adjustedOffset);
@@ -532,7 +529,7 @@
     }
 
     /**
-     * Returns the current iteration position.  Note that UBRK_DONE is never
+     * Returns the current iteration position.  Note that DONE is never
      * returned from this function; if iteration has run to the end of a
      * string, current() will return the length of the string while
      * next() will return BreakIterator.DONE).
@@ -546,8 +543,8 @@
 
 
     /**
-     * Return the status tag from the break rule that determined the most recently
-     * returned break position.  The values appear in the rule source
+     * Return the status tag from the break rule that determined the boundary at
+     * the current iteration position.  The values appear in the rule source
      * within brackets, {123}, for example.  For rules that do not specify a
      * status, a default value of 0 is returned.  If more than one rule applies,
      * the numerically largest of the possible status values is returned.
@@ -561,8 +558,12 @@
      * position from <code>next()</code>, <code>previous()</code>, or
      * any other break iterator functions that returns a boundary position.
      * <p>
-     * @return the status from the break rule that determined the most recently
-     * returned break position.
+     * Note that <code>getRuleStatus()</code> returns the value corresponding to
+     * <code>current()</code> index even after <code>next()</code> has returned DONE.
+     * <p>
+
+     * @return the status from the break rule that determined the boundary
+     * at the current iteration position.
      *
      * @stable ICU 60
      */
@@ -583,8 +584,8 @@
     }
 
     /**
-     * Get the status (tag) values from the break rule(s) that determined the most
-     * recently returned break position.  The values appear in the rule source
+     * Get the status (tag) values from the break rule(s) that determined the boundary
+     * at the current iteration position.  The values appear in the rule source
      * within brackets, {123}, for example.  The default status value for rules
      * that do not explicitly provide one is zero.
      * <p>
@@ -596,8 +597,8 @@
      *  will be thrown.
      *
      * @param fillInArray an array to be filled in with the status values.
-     * @return          The number of rule status values from rules that determined
-     *                  the most recent boundary returned by the break iterator.
+     * @return          The number of rule status values from the rules that determined
+     *                  the boundary at the current iteration position.
      *                  In the event that the array is too small, the return value
      *                  is the total number of status values that were available,
      *                  not the reduced number that were actually returned.
@@ -646,21 +647,7 @@
         this.first();
     }
 
-    /**
-     * package private
-     */
-    void setBreakType(int type) {
-        fBreakType = type;
-    }
-
-    /**
-     * package private
-     */
-    int getBreakType() {
-        return fBreakType;
-    }
-
-    /**
+     /**
      * Control debug, trace and dump options.
      * @internal
      */
@@ -673,7 +660,7 @@
         // We have a dictionary character.
         // Does an already instantiated break engine handle it?
         for (LanguageBreakEngine candidate : fBreakEngines) {
-            if (candidate.handles(c, fBreakType)) {
+            if (candidate.handles(c)) {
                 return candidate;
             }
         }
@@ -683,7 +670,7 @@
             // Check the global list, another break iterator may have instantiated the
             // desired engine.
             for (LanguageBreakEngine candidate : gAllBreakEngines) {
-                if (candidate.handles(c, fBreakType)) {
+                if (candidate.handles(c)) {
                     fBreakEngines.add(candidate);
                     return candidate;
                 }
@@ -713,24 +700,13 @@
                     eng = new KhmerBreakEngine();
                     break;
                 case UScript.HAN:
-                    if (getBreakType() == KIND_WORD) {
-                        eng = new CjkBreakEngine(false);
-                    }
-                    else {
-                        gUnhandledBreakEngine.handleChar(c, getBreakType());
-                        eng = gUnhandledBreakEngine;
-                    }
-                    break;
+                    eng = new CjkBreakEngine(false);
+                     break;
                 case UScript.HANGUL:
-                    if (getBreakType() == KIND_WORD) {
-                        eng = new CjkBreakEngine(true);
-                    } else {
-                        gUnhandledBreakEngine.handleChar(c, getBreakType());
-                        eng = gUnhandledBreakEngine;
-                    }
+                    eng = new CjkBreakEngine(true);
                     break;
                 default:
-                    gUnhandledBreakEngine.handleChar(c, getBreakType());
+                    gUnhandledBreakEngine.handleChar(c);
                     eng = gUnhandledBreakEngine;
                     break;
                 }
@@ -829,7 +805,7 @@
         CharacterIterator text = fText;
         Trie2 trie = fRData.fTrie;
 
-        short[] stateTable  = fRData.fFTable;
+        short[] stateTable  = fRData.fFTable.fTable;
         int initialPosition = fPosition;
         text.setIndex(initialPosition);
         int result          = initialPosition;
@@ -848,7 +824,7 @@
         int state           = START_STATE;
         int row             = fRData.getRowIndex(state);
         short category      = 3;
-        int flagsState      = fRData.getStateTableFlags(stateTable);
+        int flagsState      = fRData.fFTable.fFlags;
         int mode            = RBBI_RUN;
         if ((flagsState & RBBIDataWrapper.RBBI_BOF_REQUIRED) != 0) {
             category = 2;
@@ -1008,7 +984,7 @@
         int            result             = 0;
         int            initialPosition    = fromPosition;
         fLookAheadMatches.reset();
-        short[] stateTable = fRData.fSRTable;
+        short[] stateTable = fRData.fSRTable.fTable;
         CISetIndex32(fText, fromPosition);
         if (fromPosition == fText.getBeginIndex()) {
             return BreakIterator.DONE;
@@ -1023,7 +999,7 @@
         row = fRData.getRowIndex(state);
         category = 3;   // TODO:  obsolete?  from the old start/run mode scheme?
         mode     = RBBI_RUN;
-        if ((fRData.getStateTableFlags(stateTable) & RBBIDataWrapper.RBBI_BOF_REQUIRED) != 0) {
+        if ((fRData.fSRTable.fFlags & RBBIDataWrapper.RBBI_BOF_REQUIRED) != 0) {
             category = 2;
             mode     = RBBI_START;
         }
@@ -1152,7 +1128,7 @@
         return ci.getIndex();
     }
 
-    /* DictionaryCache  stores the boundaries obtained from a run of dictionary characters.
+    /** DictionaryCache  stores the boundaries obtained from a run of dictionary characters.
      *                 Dictionary boundaries are moved first to this cache, then from here
      *                 to the main BreakCache, where they may inter-leave with non-dictionary
      *                 boundaries. The public BreakIterator API always fetches directly
@@ -1306,7 +1282,7 @@
                 // Ask the language object if there are any breaks. It will add them to the cache and
                 // leave the text pointer on the other side of its range, ready to search for the next one.
                 if (lbe != null) {
-                    foundBreakCount += lbe.findBreaks(fText, rangeStart, rangeEnd, fBreakType, fBreaks);
+                    foundBreakCount += lbe.findBreaks(fText, rangeStart, rangeEnd, fBreaks);
                 }
 
                 // Reload the loop variables for the next go-round
@@ -1477,7 +1453,7 @@
         return;
     };
 
-    /*
+    /**
      * Update the state of the public BreakIterator (fBI) to reflect the
      * current state of the break iterator cache (this).
      */
@@ -1735,7 +1711,7 @@
     static final boolean RetainCachePosition = false;
     static final boolean UpdateCachePosition = true;
 
-    /*
+    /**
      * Add the boundary following the current position.
      * The current position can be left as it was, or changed to the newly added boundary,
      * as specified by the update parameter.
@@ -1764,7 +1740,7 @@
     };
 
 
-    /*
+    /**
      * Add the boundary preceding the current position.
      * The current position can be left as it was, or changed to the newly added boundary,
      * as specified by the update parameter.
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/RuleBasedNumberFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/RuleBasedNumberFormat.java
index 05b4498..719fefb 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/RuleBasedNumberFormat.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/RuleBasedNumberFormat.java
@@ -1322,7 +1322,7 @@
 
             // try parsing the string with the rule set.  If it gets past the
             // high-water mark, update the high-water mark and the result
-            tempResult = ruleSets[i].parse(workingText, workingPos, Double.MAX_VALUE);
+            tempResult = ruleSets[i].parse(workingText, workingPos, Double.MAX_VALUE, 0);
             if (workingPos.getIndex() > highWaterMark.getIndex()) {
                 result = tempResult;
                 highWaterMark.setIndex(workingPos.getIndex());
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/ScientificNumberFormatter.java b/icu4j/main/classes/core/src/com/ibm/icu/text/ScientificNumberFormatter.java
index 93bb25f..e501d01 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/ScientificNumberFormatter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/ScientificNumberFormatter.java
@@ -13,7 +13,7 @@
 import java.text.CharacterIterator;
 import java.util.Map;
 
-import com.ibm.icu.impl.number.Parse;
+import com.ibm.icu.impl.number.parse.UnicodeSetStaticCache;
 import com.ibm.icu.lang.UCharacter;
 import com.ibm.icu.util.ULocale;
 
@@ -230,14 +230,14 @@
                     int start = iterator.getRunStart(NumberFormat.Field.EXPONENT_SIGN);
                     int limit = iterator.getRunLimit(NumberFormat.Field.EXPONENT_SIGN);
                     int aChar = char32AtAndAdvance(iterator);
-                    if (Parse.UNISET_MINUS.contains(aChar)) {
+                    if (UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.MINUS_SIGN).contains(aChar)) {
                         append(
                                 iterator,
                                 copyFromOffset,
                                 start,
                                 result);
                         result.append(SUPERSCRIPT_MINUS_SIGN);
-                    } else if (Parse.UNISET_PLUS.contains(aChar)) {
+                    } else if (UnicodeSetStaticCache.get(UnicodeSetStaticCache.Key.PLUS_SIGN).contains(aChar)) {
                         append(
                                 iterator,
                                 copyFromOffset,
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/ThaiBreakEngine.java b/icu4j/main/classes/core/src/com/ibm/icu/text/ThaiBreakEngine.java
index 8471701..07855b1 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/ThaiBreakEngine.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/ThaiBreakEngine.java
@@ -16,7 +16,7 @@
 import com.ibm.icu.lang.UScript;
 
 class ThaiBreakEngine extends DictionaryBreakEngine {
-    
+
     // Constants for ThaiBreakIterator
     // How many words in a row are "good enough"?
     private static final byte THAI_LOOKAHEAD = 3;
@@ -33,14 +33,14 @@
     private static final byte THAI_MIN_WORD = 2;
     // Minimum number of characters for two words
     private static final byte THAI_MIN_WORD_SPAN = THAI_MIN_WORD * 2;
-    
+
     private DictionaryMatcher fDictionary;
     private static UnicodeSet fThaiWordSet;
     private static UnicodeSet fEndWordSet;
     private static UnicodeSet fBeginWordSet;
     private static UnicodeSet fSuffixSet;
     private static UnicodeSet fMarkSet;
-    
+
     static {
         // Initialize UnicodeSets
         fThaiWordSet = new UnicodeSet();
@@ -66,7 +66,7 @@
         fEndWordSet.compact();
         fBeginWordSet.compact();
         fSuffixSet.compact();
-        
+
         // Freeze the static UnicodeSet
         fThaiWordSet.freeze();
         fMarkSet.freeze();
@@ -74,32 +74,32 @@
         fBeginWordSet.freeze();
         fSuffixSet.freeze();
     }
-    
+
     public ThaiBreakEngine() throws IOException {
-        super(BreakIterator.KIND_WORD, BreakIterator.KIND_LINE);
         setCharacters(fThaiWordSet);
         // Initialize dictionary
         fDictionary = DictionaryData.loadDictionaryFor("Thai");
     }
-    
+
+    @Override
     public boolean equals(Object obj) {
         // Normally is a singleton, but it's possible to have duplicates
         //   during initialization. All are equivalent.
         return obj instanceof ThaiBreakEngine;
     }
 
+    @Override
     public int hashCode() {
         return getClass().hashCode();
     }
-    
-    public boolean handles(int c, int breakType) {
-        if (breakType == BreakIterator.KIND_WORD || breakType == BreakIterator.KIND_LINE) {
-            int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
-            return (script == UScript.THAI);
-        }
-        return false;
+
+    @Override
+    public boolean handles(int c) {
+        int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
+        return (script == UScript.THAI);
     }
 
+    @Override
     public int divideUpDictionaryRange(CharacterIterator fIter, int rangeStart, int rangeEnd,
             DequeI foundBreaks) {
 
@@ -112,7 +112,7 @@
         for (int i = 0; i < THAI_LOOKAHEAD; i++) {
             words[i] = new PossibleWord();
         }
-        
+
         int uc;
         fIter.setIndex(rangeStart);
         int current;
@@ -156,7 +156,7 @@
                                 }
                             } while (words[(wordsFound+1)%THAI_LOOKAHEAD].backUp(fIter));
                         }
-                    } 
+                    }
                     while (words[wordsFound%THAI_LOOKAHEAD].backUp(fIter));
                     // foundBest: end of loop
                 }
@@ -174,7 +174,7 @@
                 // no preceding word, or the non-word shares less than the minimum threshold
                 // of characters with a dictionary word, then scan to resynchronize
                 if (words[wordsFound%THAI_LOOKAHEAD].candidates(fIter, fDictionary, rangeEnd) <= 0 &&
-                        (wordLength == 0 || 
+                        (wordLength == 0 ||
                                 words[wordsFound%THAI_LOOKAHEAD].longestPrefix() < THAI_PREFIX_COMBINE_THRESHOLD)) {
                     // Look for a plausible word boundary
                     int remaining = rangeEnd - (current + wordLength);
@@ -224,7 +224,7 @@
 
             // Look ahead for possible suffixes if a dictionary word does not follow.
             // We do this in code rather than using a rule so that the heuristic
-            // resynch continues to function. For example, one of the suffix characters 
+            // resynch continues to function. For example, one of the suffix characters
             // could be a typo in the middle of a word.
             if (fIter.getIndex() < rangeEnd && wordLength > 0) {
                 if (words[wordsFound%THAI_LOOKAHEAD].candidates(fIter, fDictionary, rangeEnd) <= 0 &&
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/TimeUnitFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/TimeUnitFormat.java
index 756ba4d..70a974e 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/TimeUnitFormat.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/TimeUnitFormat.java
@@ -9,7 +9,6 @@
 package com.ibm.icu.text;
 
 import java.io.ObjectStreamException;
-import java.text.FieldPosition;
 import java.text.ParseException;
 import java.text.ParsePosition;
 import java.util.HashMap;
@@ -23,7 +22,7 @@
 import com.ibm.icu.impl.ICUData;
 import com.ibm.icu.impl.ICUResourceBundle;
 import com.ibm.icu.impl.UResource;
-import com.ibm.icu.util.Measure;
+import com.ibm.icu.number.LocalizedNumberFormatter;
 import com.ibm.icu.util.TimeUnit;
 import com.ibm.icu.util.TimeUnitAmount;
 import com.ibm.icu.util.ULocale;
@@ -85,19 +84,12 @@
 
     private static final long serialVersionUID = -3707773153184971529L;
 
-    // These fields are supposed to be the same as the fields in mf. They
-    // are here for serialization backward compatibility and to support parsing.
+    // Unlike MeasureFormat, this class is mutable and allows a new NumberFormat to be set after
+    // initialization. Keep a second copy of NumberFormat and use it instead of the one from the parent.
     private NumberFormat format;
     private ULocale locale;
     private int style;
 
-    // We use this field in lieu of the super class because the super class
-    // is immutable while this class is mutable. The contents of the super class
-    // is an empty shell. Every public method of the super class is overridden to
-    // delegate to this field. Each time this object mutates, it replaces this field with
-    // a new immutable instance.
-    private transient MeasureFormat mf;
-
     private transient Map<TimeUnit, Map<String, Object[]>> timeUnitToCountToPatterns;
     private transient PluralRules pluralRules;
     private transient boolean isReady;
@@ -117,9 +109,7 @@
      */
     @Deprecated
     public TimeUnitFormat() {
-        mf = MeasureFormat.getInstance(ULocale.getDefault(), FormatWidth.WIDE);
-        isReady = false;
-        style = FULL_NAME;
+        this(ULocale.getDefault(), FULL_NAME);
     }
 
     /**
@@ -152,16 +142,12 @@
      */
     @Deprecated
     public TimeUnitFormat(ULocale locale, int style) {
+        super(locale, style == FULL_NAME ? FormatWidth.WIDE : FormatWidth.SHORT);
+        format = super.getNumberFormatInternal();
         if (style < FULL_NAME || style >= TOTAL_STYLES) {
             throw new IllegalArgumentException("style should be either FULL_NAME or ABBREVIATED_NAME style");
         }
-        mf = MeasureFormat.getInstance(
-                locale, style == FULL_NAME ? FormatWidth.WIDE : FormatWidth.SHORT);
         this.style = style;
-
-        // Needed for getLocale(ULocale.VALID_LOCALE)
-        setLocale(locale, locale);
-        this.locale = locale;
         isReady = false;
     }
 
@@ -189,14 +175,8 @@
      */
     @Deprecated
     public TimeUnitFormat setLocale(ULocale locale) {
-        if (locale != this.locale){
-            mf = mf.withLocale(locale);
-
-            // Needed for getLocale(ULocale.VALID_LOCALE)
-            setLocale(locale, locale);
-            this.locale = locale;
-            isReady = false;
-        }
+        setLocale(locale, locale);
+        clearCache();
         return this;
     }
 
@@ -226,28 +206,34 @@
         if (format == null) {
             if (locale == null) {
                 isReady = false;
-                mf = mf.withLocale(ULocale.getDefault());
             } else {
                 this.format = NumberFormat.getNumberInstance(locale);
-                mf = mf.withNumberFormat(this.format);
             }
         } else {
             this.format = format;
-            mf = mf.withNumberFormat(this.format);
         }
+        clearCache();
         return this;
     }
 
-
     /**
-     * Format a TimeUnitAmount.
-     * @see java.text.Format#format(java.lang.Object, java.lang.StringBuffer, java.text.FieldPosition)
+     * {@inheritDoc}
      * @deprecated ICU 53 see {@link MeasureFormat}.
      */
+    @Override
     @Deprecated
-    public StringBuffer format(Object obj, StringBuffer toAppendTo,
-            FieldPosition pos) {
-        return mf.format(obj, toAppendTo, pos);
+    public NumberFormat getNumberFormat() {
+        return (NumberFormat) format.clone();
+    }
+
+    @Override
+    NumberFormat getNumberFormatInternal() {
+        return format;
+    }
+
+    @Override
+    LocalizedNumberFormatter getNumberFormatter() {
+        return ((DecimalFormat)format).toNumberFormatter();
     }
 
     /**
@@ -388,7 +374,7 @@
             } else {
                 beenHere = true;
             }
-            
+
             UResource.Table units = value.getTable();
             for (int i = 0; units.getKeyAndValue(i, key, value); ++i) {
                 String timeUnitName = key.toString();
@@ -569,38 +555,6 @@
     // boilerplate code to make TimeUnitFormat otherwise follow the contract of
     // MeasureFormat
 
-
-    /**
-     * @internal
-     * @deprecated This API is ICU internal only.
-     */
-    @Deprecated
-    @Override
-    public StringBuilder formatMeasures(
-            StringBuilder appendTo, FieldPosition fieldPosition, Measure... measures) {
-        return mf.formatMeasures(appendTo, fieldPosition, measures);
-    }
-
-    /**
-     * @internal
-     * @deprecated This API is ICU internal only.
-     */
-    @Deprecated
-    @Override
-    public MeasureFormat.FormatWidth getWidth() {
-        return mf.getWidth();
-    }
-
-    /**
-     * @internal
-     * @deprecated This API is ICU internal only.
-     */
-    @Deprecated
-    @Override
-    public NumberFormat getNumberFormat() {
-        return mf.getNumberFormat();
-    }
-
     /**
      * @internal
      * @deprecated This API is ICU internal only.
@@ -617,7 +571,7 @@
     // Serialization
 
     private Object writeReplace() throws ObjectStreamException {
-        return mf.toTimeUnitProxy();
+        return super.toTimeUnitProxy();
     }
 
     // Preserve backward serialize backward compatibility.
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/TimeZoneFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/TimeZoneFormat.java
index 3ac0de7..98df5ec 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/TimeZoneFormat.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/TimeZoneFormat.java
@@ -3031,11 +3031,11 @@
             }
         }
 
-        int[] matchLen = new int[] {0};
-        Iterator<String> itr = ZONE_ID_TRIE.get(text, pos.getIndex(), matchLen);
+        TextTrieMap.Output trieOutput = new TextTrieMap.Output();
+        Iterator<String> itr = ZONE_ID_TRIE.get(text, pos.getIndex(), trieOutput);
         if (itr != null) {
             resolvedID = itr.next();
-            pos.setIndex(pos.getIndex() + matchLen[0]);
+            pos.setIndex(pos.getIndex() + trieOutput.matchLength);
         } else {
             // TODO
             // We many need to handle rule based custom zone ID (See ZoneMeta.parseCustomID),
@@ -3074,11 +3074,11 @@
             }
         }
 
-        int[] matchLen = new int[] {0};
-        Iterator<String> itr = SHORT_ZONE_ID_TRIE.get(text, pos.getIndex(), matchLen);
+        TextTrieMap.Output trieOutput = new TextTrieMap.Output();
+        Iterator<String> itr = SHORT_ZONE_ID_TRIE.get(text, pos.getIndex(), trieOutput);
         if (itr != null) {
             resolvedID = itr.next();
-            pos.setIndex(pos.getIndex() + matchLen[0]);
+            pos.setIndex(pos.getIndex() + trieOutput.matchLength);
         } else {
             pos.setErrorIndex(pos.getIndex());
         }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/UnhandledBreakEngine.java b/icu4j/main/classes/core/src/com/ibm/icu/text/UnhandledBreakEngine.java
index 3da1636..fcd876e 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/UnhandledBreakEngine.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/UnhandledBreakEngine.java
@@ -8,17 +8,14 @@
  */
 package com.ibm.icu.text;
 
-import static com.ibm.icu.impl.CharacterIteration.DONE32;
-
 import java.text.CharacterIterator;
-import java.util.concurrent.atomic.AtomicReferenceArray;
 
 import com.ibm.icu.impl.CharacterIteration;
 import com.ibm.icu.lang.UCharacter;
 import com.ibm.icu.lang.UProperty;
 
 final class UnhandledBreakEngine implements LanguageBreakEngine {
-    // TODO: Use two arrays of UnicodeSet, one with all frozen sets, one with unfrozen.
+    // TODO: Use two UnicodeSets, one with all frozen sets, one with unfrozen.
     // in handleChar(), update the unfrozen version, clone, freeze, replace the frozen one.
 
     // Note on concurrency: A single instance of UnhandledBreakEngine is shared across all
@@ -35,49 +32,42 @@
     // on which scripts have been previously seen by handleChar(). (This is not a
     // threading specific issue). Possibly stop on script boundaries?
 
-    final AtomicReferenceArray<UnicodeSet> fHandled = new AtomicReferenceArray<UnicodeSet>(BreakIterator.KIND_TITLE + 1);
+    volatile UnicodeSet fHandled = new UnicodeSet();
     public UnhandledBreakEngine() {
-        for (int i = 0; i < fHandled.length(); i++) {
-            fHandled.set(i, new UnicodeSet());
-        }
     }
 
     @Override
-    public boolean handles(int c, int breakType) {
-        return (breakType >= 0 && breakType < fHandled.length()) &&
-                (fHandled.get(breakType).contains(c));
+    public boolean handles(int c) {
+        return fHandled.contains(c);
     }
 
     @Override
     public int findBreaks(CharacterIterator text, int startPos, int endPos,
-            int breakType, DictionaryBreakEngine.DequeI foundBreaks) {
-        if (breakType >= 0 && breakType < fHandled.length()) {
-            UnicodeSet uniset = fHandled.get(breakType);
-            int c = CharacterIteration.current32(text);
-            while (text.getIndex() < endPos && uniset.contains(c)) {
-                CharacterIteration.next32(text);
-                c = CharacterIteration.current32(text);
-            }
+            DictionaryBreakEngine.DequeI foundBreaks) {
+
+        UnicodeSet uniset = fHandled;
+        int c = CharacterIteration.current32(text);
+        while (text.getIndex() < endPos && uniset.contains(c)) {
+            CharacterIteration.next32(text);
+            c = CharacterIteration.current32(text);
         }
         return 0;
     }
 
     /**
-     * Update the set of unhandled characters for the specified breakType to include
+     * Update the set of unhandled characters to include
      * all that have the same script as c.
      * May be called concurrently with handles() or findBreaks().
      * Must not be called concurrently with itself.
      */
-    public void handleChar(int c, int breakType) {
-        if (breakType >= 0 && breakType < fHandled.length() && c != DONE32) {
-            UnicodeSet originalSet = fHandled.get(breakType);
-            if (!originalSet.contains(c)) {
-                int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
-                UnicodeSet newSet = new UnicodeSet();
-                newSet.applyIntPropertyValue(UProperty.SCRIPT, script);
-                newSet.addAll(originalSet);
-                fHandled.set(breakType, newSet);
-            }
+    public void handleChar(int c) {
+        UnicodeSet originalSet = fHandled;
+        if (!originalSet.contains(c)) {
+            int script = UCharacter.getIntPropertyValue(c, UProperty.SCRIPT);
+            UnicodeSet newSet = new UnicodeSet();
+            newSet.applyIntPropertyValue(UProperty.SCRIPT, script);
+            newSet.addAll(originalSet);
+            fHandled = newSet;
         }
     }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/UnicodeSet.java b/icu4j/main/classes/core/src/com/ibm/icu/text/UnicodeSet.java
index 3270541..14710c8 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/UnicodeSet.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/UnicodeSet.java
@@ -2422,7 +2422,7 @@
         StringBuilder rebuiltPat = new StringBuilder();
         RuleCharacterIterator chars =
                 new RuleCharacterIterator(pattern, symbols, pos);
-        applyPattern(chars, symbols, rebuiltPat, options);
+        applyPattern(chars, symbols, rebuiltPat, options, 0);
         if (chars.inVariable()) {
             syntaxError(chars, "Extra chars in variable value");
         }
@@ -2458,6 +2458,8 @@
             SETMODE2_PROPERTYPAT = 2,
             SETMODE3_PREPARSED = 3;
 
+    private static final int MAX_DEPTH = 100;
+
     /**
      * Parse the pattern from the given RuleCharacterIterator.  The
      * iterator is advanced over the parsed pattern.
@@ -2473,7 +2475,10 @@
      * IGNORE_SPACE, CASE.
      */
     private void applyPattern(RuleCharacterIterator chars, SymbolTable symbols,
-            Appendable rebuiltPat, int options) {
+            Appendable rebuiltPat, int options, int depth) {
+        if (depth > MAX_DEPTH) {
+            syntaxError(chars, "Pattern nested too deeply");
+        }
 
         // Syntax characters: [ ] ^ - & { }
 
@@ -2605,7 +2610,7 @@
                 }
                 switch (setMode) {
                 case SETMODE1_UNICODESET:
-                    nested.applyPattern(chars, symbols, patBuf, options);
+                    nested.applyPattern(chars, symbols, patBuf, options, depth + 1);
                     break;
                 case SETMODE2_PROPERTYPAT:
                     chars.skipIgnored(opts);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/Calendar.java b/icu4j/main/classes/core/src/com/ibm/icu/util/Calendar.java
index 3c8d32f..6c37555 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/util/Calendar.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/util/Calendar.java
@@ -6008,12 +6008,12 @@
 
         int year;
 
-        if (bestField == WEEK_OF_YEAR) {
+        if (bestField == WEEK_OF_YEAR && newerField(YEAR_WOY, YEAR) == YEAR_WOY) {
             // Nota Bene!  It is critical that YEAR_WOY be used as the year here, if it is
             // set.  Otherwise, when WOY is the best field, the year may be wrong at the
             // extreme limits of the year.  If YEAR_WOY is not set then it will fall back.
             // TODO: Should resolveField(YEAR_PRECEDENCE) be brought to bear?
-            year = internalGet(YEAR_WOY, handleGetExtendedYear());
+            year = internalGet(YEAR_WOY);
         } else {
             year = handleGetExtendedYear();
         }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/Currency.java b/icu4j/main/classes/core/src/com/ibm/icu/util/Currency.java
index ef3d5be..a05cebd 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/util/Currency.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/util/Currency.java
@@ -24,7 +24,6 @@
 import java.util.Set;
 
 import com.ibm.icu.impl.CacheBase;
-import com.ibm.icu.impl.CurrencyData.CurrencyDisplayInfo;
 import com.ibm.icu.impl.ICUCache;
 import com.ibm.icu.impl.ICUData;
 import com.ibm.icu.impl.ICUDebug;
@@ -92,15 +91,11 @@
      * Selector for getName() indicating the narrow currency symbol.
      * The narrow currency symbol is similar to the regular currency
      * symbol, but it always takes the shortest form: for example,
-     * "$" instead of "US$".
+     * "$" instead of "US$" for USD in en-CA.
      *
-     * This method assumes that the currency data provider is the ICU4J
-     * built-in data provider. If it is not, an exception is thrown.
-     *
-     * @internal
-     * @deprecated ICU 60: This API is ICU internal only.
+     * @draft ICU 61
+     * @provisional This API might change or be removed in a future release.
      */
-    @Deprecated
     public static final int NARROW_SYMBOL_NAME = 3;
 
     private static final EquivalenceRelation<String> EQUIVALENT_CURRENCY_SYMBOLS =
@@ -546,7 +541,7 @@
      * @stable ICU 3.4
      */
     public String getSymbol(ULocale uloc) {
-        return getName(uloc, SYMBOL_NAME, new boolean[1]);
+        return getName(uloc, SYMBOL_NAME, null);
     }
 
     /**
@@ -568,8 +563,8 @@
      * currency object in the en_US locale is "$".
      * @param locale locale in which to display currency
      * @param nameStyle selector for which kind of name to return.
-     *                  The nameStyle should be either SYMBOL_NAME or
-     *                  LONG_NAME. Otherwise, throw IllegalArgumentException.
+     *                  The nameStyle should be SYMBOL_NAME, NARROW_SYMBOL_NAME,
+     *                  or LONG_NAME. Otherwise, throw IllegalArgumentException.
      * @param isChoiceFormat fill-in; isChoiceFormat[0] is set to true
      * if the returned value is a ChoiceFormat pattern; otherwise it
      * is set to false
@@ -597,13 +592,7 @@
         case SYMBOL_NAME:
             return names.getSymbol(subType);
         case NARROW_SYMBOL_NAME:
-            // CurrencyDisplayNames is the public interface.
-            // CurrencyDisplayInfo is ICU's standard implementation.
-            if (!(names instanceof CurrencyDisplayInfo)) {
-                throw new UnsupportedOperationException(
-                        "Cannot get narrow symbol from custom currency display name provider");
-            }
-            return ((CurrencyDisplayInfo) names).getNarrowSymbol(subType);
+            return names.getNarrowSymbol(subType);
         case LONG_NAME:
             return names.getName(subType);
         default:
@@ -752,13 +741,12 @@
      * @deprecated This API is ICU internal only.
      */
     @Deprecated
-    public static TextTrieMap<CurrencyStringInfo>.ParseState openParseState(
-        ULocale locale, int startingCp, int type) {
+    public static TextTrieMap<CurrencyStringInfo> getParsingTrie(ULocale locale, int type) {
         List<TextTrieMap<CurrencyStringInfo>> currencyTrieVec = getCurrencyTrieVec(locale);
         if (type == Currency.LONG_NAME) {
-            return currencyTrieVec.get(0).openParseState(startingCp);
+            return currencyTrieVec.get(1);
         } else {
-            return currencyTrieVec.get(1).openParseState(startingCp);
+            return currencyTrieVec.get(0);
         }
     }
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/MeasureUnit.java b/icu4j/main/classes/core/src/com/ibm/icu/util/MeasureUnit.java
index b1c3fa6..9aec536 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/util/MeasureUnit.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/util/MeasureUnit.java
@@ -171,7 +171,7 @@
     }
 
     /**
-     * Create a MeasureUnit instance (creates a singleton instance).
+     * Creates a MeasureUnit instance (creates a singleton instance) or returns one from the cache.
      * <p>
      * Normally this method should not be used, since there will be no formatting data
      * available for it, and it may not be returned by getAvailable().
@@ -843,8 +843,7 @@
 
     /**
      * Constant for unit of length: point
-     * @draft ICU 59
-     * @provisional This API might change or be removed in a future release.
+     * @stable ICU 59
      */
     public static final MeasureUnit POINT = MeasureUnit.internalGetInstance("length", "point");
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/SimpleTimeZone.java b/icu4j/main/classes/core/src/com/ibm/icu/util/SimpleTimeZone.java
index f91d80f..94dc822 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/util/SimpleTimeZone.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/util/SimpleTimeZone.java
@@ -540,7 +540,8 @@
      * Sets the amount of time in ms that the clock is advanced during DST.
      * @param millisSavedDuringDST the number of milliseconds the time is
      * advanced with respect to standard time when the daylight savings rules
-     * are in effect. A positive number, typically one hour (3600000).
+     * are in effect. Typically one hour (+3600000). The amount could be negative,
+     * but not 0.
      * @stable ICU 2.0
      */
     public void setDSTSavings(int millisSavedDuringDST) {
@@ -548,7 +549,7 @@
             throw new UnsupportedOperationException("Attempt to modify a frozen SimpleTimeZone instance.");
         }
 
-        if (millisSavedDuringDST <= 0) {
+        if (millisSavedDuringDST == 0) {
             throw new IllegalArgumentException();
         }
         dst = millisSavedDuringDST;
@@ -560,7 +561,8 @@
      * Returns the amount of time in ms that the clock is advanced during DST.
      * @return the number of milliseconds the time is
      * advanced with respect to standard time when the daylight savings rules
-     * are in effect. A positive number, typically one hour (3600000).
+     * are in effect. Typically one hour (3600000). The amount could be negative,
+     * but not 0.
      * @stable ICU 2.0
      */
     @Override
@@ -1015,7 +1017,7 @@
 
         decodeRules();
 
-        if (_dst <= 0) {
+        if (_dst == 0) {
             throw new IllegalArgumentException();
         }
     }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/VersionInfo.java b/icu4j/main/classes/core/src/com/ibm/icu/util/VersionInfo.java
index 25eee54..5e7e68a 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/util/VersionInfo.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/util/VersionInfo.java
@@ -188,7 +188,7 @@
      * @deprecated This API is ICU internal only.
      */
     @Deprecated
-    public static final String ICU_DATA_VERSION_PATH = "60b";
+    public static final String ICU_DATA_VERSION_PATH = "61b";
 
     /**
      * Data version in ICU4J.
@@ -567,8 +567,8 @@
         UNICODE_9_0   = getInstance(9, 0, 0, 0);
         UNICODE_10_0   = getInstance(10, 0, 0, 0);
 
-        ICU_VERSION   = getInstance(60, 2, 0, 0);
-        ICU_DATA_VERSION = getInstance(60, 2, 0, 0);
+        ICU_VERSION   = getInstance(61, 1, 0, 0);
+        ICU_DATA_VERSION = ICU_VERSION;
         UNICODE_VERSION = UNICODE_10_0;
 
         UCOL_RUNTIME_VERSION = getInstance(9);
diff --git a/icu4j/main/shared/build/common.properties b/icu4j/main/shared/build/common.properties
index deb0749..0d4c3d7 100644
--- a/icu4j/main/shared/build/common.properties
+++ b/icu4j/main/shared/build/common.properties
@@ -6,9 +6,9 @@
 #*******************************************************************************
 
 # Version numbers, etc.
-icu4j.spec.version = 60
-icu4j.impl.version = 60.2
-icu4j.data.version = 60
+icu4j.spec.version = 61
+icu4j.impl.version = 61.1
+icu4j.data.version = 61
 default.exec.env = JavaSE-1.6
 
 copyright = \u00A9 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html#License
diff --git a/icu4j/main/shared/data/icudata.jar b/icu4j/main/shared/data/icudata.jar
index 0f2c61e..265f954 100644
--- a/icu4j/main/shared/data/icudata.jar
+++ b/icu4j/main/shared/data/icudata.jar
Binary files differ
diff --git a/icu4j/main/shared/data/icutzdata.jar b/icu4j/main/shared/data/icutzdata.jar
index 0824a80..47702fb 100644
--- a/icu4j/main/shared/data/icutzdata.jar
+++ b/icu4j/main/shared/data/icutzdata.jar
Binary files differ
diff --git a/icu4j/main/shared/data/testdata.jar b/icu4j/main/shared/data/testdata.jar
index 8f55a0e..2d3acc9 100755
--- a/icu4j/main/shared/data/testdata.jar
+++ b/icu4j/main/shared/data/testdata.jar
Binary files differ
diff --git a/icu4j/main/shared/licenses/LICENSE b/icu4j/main/shared/licenses/LICENSE
index c84076c..25b6eb9 100644
--- a/icu4j/main/shared/licenses/LICENSE
+++ b/icu4j/main/shared/licenses/LICENSE
@@ -1,7 +1,7 @@
 COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later)
 
-Copyright © 1991-2017 Unicode, Inc. All rights reserved.
-Distributed under the Terms of Use in http://www.unicode.org/copyright.html
+Copyright © 1991-2018 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of the Unicode data files and any associated documentation
@@ -383,3 +383,32 @@
  #    by ICANN or the IETF Trust on the database or the code.  Any person
  #    making a contribution to the database or code waives all rights to
  #    future claims in that contribution or in the TZ Database.
+
+6. Google double-conversion
+
+Copyright 2006-2011, the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/icu4j/main/tests/collate/src/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java b/icu4j/main/tests/collate/src/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java
index 6cc274a..00e3f58 100644
--- a/icu4j/main/tests/collate/src/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java
+++ b/icu4j/main/tests/collate/src/com/ibm/icu/dev/test/collator/AlphabeticIndexTest.java
@@ -1160,4 +1160,24 @@
         assertEquals("Wrong bucket label", "inflow", index.getInflowLabel());
         assertEquals("Bucket size not 1", 1, inflowBucket.size());
     }
+
+    @Test
+    public void testHasBuckets() {
+        checkHasBuckets(new Locale("am"), UScript.ETHIOPIC);
+        checkHasBuckets(new Locale("haw"), UScript.LATIN);
+        checkHasBuckets(new Locale("hy"), UScript.ARMENIAN);
+        checkHasBuckets(new Locale("vai"), UScript.VAI);
+    }
+
+    private void checkHasBuckets(Locale locale, int script) {
+        AlphabeticIndex.ImmutableIndex index =
+                new AlphabeticIndex<String>(locale).buildImmutableIndex();
+        String loc = locale.toString();
+        assertTrue(loc + " at least 3 buckets", index.getBucketCount() >= 3);
+        AlphabeticIndex.Bucket bucket = index.getBucket(1);
+        assertEquals(loc + " real bucket", AlphabeticIndex.Bucket.LabelType.NORMAL,
+                bucket.getLabelType());
+        assertEquals(loc + " expected script", script,
+                UScript.getScript(bucket.getLabel().codePointAt(0)));
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberformattestspecification.txt b/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberformattestspecification.txt
index 113473a..65dde7a 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberformattestspecification.txt
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberformattestspecification.txt
@@ -13,7 +13,7 @@
 // https://docs.google.com/document/d/1T2P0p953_Lh1pRwo-5CuPVrHlIBa_wcXElG-Hhg_WHM/edit?usp=sharing
 
 test plus sign
-set locale ar
+set locale ar-EG
 set pattern +0;-#
 begin
 format	output	breaks
@@ -441,11 +441,10 @@
 en_US	0	123,456	123
 en_US	1	123.456	123.456
 en_US	0	123.456	123.456
-fr_FR	1	123,456	123.456
-fr_FR	0	123,456	123.456
-// JDK returns 123 here; not sure why.
-fr_FR	1	123.456	123456	K
-fr_FR	0	123.456	123
+it_IT	1	123,456	123.456
+it_IT	0	123,456	123.456
+it_IT	1	123.456	123456
+it_IT	0	123.456	123
 
 test no grouping in pattern with parsing
 set pattern 0
@@ -466,9 +465,8 @@
 1,2345,6789	4
 1,23,45,6789	4	K	2
 1,23,45,6789	4	K	2	2
-// Q only supports minGrouping<=2
 123,456789	6		6	3
-123456789	6	JKQ	6	4
+123456789	6	JK	6	4
 
 test multiplier setters
 set locale en_US
@@ -745,7 +743,7 @@
 (34  25E-1)	-342.5	K
 (34,,25E-1)	-342.5
 // J doesn't allow trailing separators before E but C does
-(34,,25,E-1)	-342.5	J
+(34,,25,E-1)	-342.5	JP
 (34  25 E-1)	-342.5	JK
 (34,,25 E-1)	-342.5	CJK
 // Spaces are not allowed after exponent symbol
@@ -754,6 +752,7 @@
 +3.52EE4	3.52
 +1,234,567.8901	1234567.8901
 +1,23,4567.8901	1234567.8901
+// Fraction grouping is disabled by default
 +1,23,4567.89,01	1234567.89
 +1,23,456.78.9	123456.78
 +12.34,56	12.34
@@ -808,8 +807,8 @@
 // C parses until trailing separators, but sees -1234
 1,234,,,+	1234	JKC
 1,234-	-1234
-// J bails because of trailing separators
-1,234,-	-1234	J
+// J and P bail because of trailing separators
+1,234,-	-1234	JP
 // J bails here too
 1234  -	-1234	J
 
@@ -831,15 +830,14 @@
 // JDK does allow separators in the wrong place and parses as -5347.25
 (53,47.25)	fail	K
 // strict requires prefix or suffix, except in C
-65,347.25	fail	
+65,347.25	fail
 +3.52E4	35200
 (34.8E-3)	-0.0348
 (3425E-1)	-342.5
 // Strict doesn't allow separators in sci notation.
 (63,425)	-63425
-// JDK and S allow separators in sci notation and parses as -342.5
-// C passes
-(63,425E-1)	fail	CKS
+// J does not allow grouping separators in scientific notation.
+(63,425E-1)	-6342.5	J
 // Both prefix and suffix needed for strict.
 // JDK accepts this and parses as -342.5
 (3425E-1	fail	K
@@ -954,12 +952,12 @@
 begin
 parse	output	breaks
 // S is the only implementation that passes these cases.
-// C consumes the '9' as a digit and assumes number is negative
+// C and P consume the '9' as a digit and assumes number is negative
 // J and JDK bail
-6549K	654	CJK
-// C consumes the '9' as a digit and assumes number is negative
+6549K	654	CJKP
+// C and P consume the '9' as a digit and assumes number is negative
 // J and JDK bail
-6549N	-654	CJK
+6549N	-654	CJKP
 
 test really strange prefix
 set locale en
@@ -974,7 +972,7 @@
 set locale en
 set pattern '-'#y
 begin
-parse	output
+parse	output	breaks
 -45y	45
 
 test parse with locale symbols
@@ -1187,17 +1185,17 @@
 USD 53.45	53.45	USD	J
 53.45USD	53.45	USD	CJ
 USD53.45	53.45	USD
-// S fails these because '(' is an incomplete prefix.
-(7.92) USD	-7.92	USD	CJS
-(7.92) GBP	-7.92	GBP	CJS
-(7.926) USD	-7.926	USD	CJS
-(7.926 USD)	-7.926	USD	CJS
+// P fails these because '(' is an incomplete prefix.
+(7.92) USD	-7.92	USD	CJP
+(7.92) GBP	-7.92	GBP	CJP
+(7.926) USD	-7.926	USD	CJP
+(7.926 USD)	-7.926	USD	CJP
 (USD 7.926)	-7.926	USD	J
-USD (7.926)	-7.926	USD	CJS
-USD (7.92)	-7.92	USD	CJS
-(7.92)USD	-7.92	USD	CJS
-USD(7.92)	-7.92	USD	CJS
-(8) USD	-8	USD	CJS
+USD (7.926)	-7.926	USD	CJP
+USD (7.92)	-7.92	USD	CJP
+(7.92)USD	-7.92	USD	CJP
+USD(7.92)	-7.92	USD	CJP
+(8) USD	-8	USD	CJP
 -8 USD	-8	USD	C
 67 USD	67	USD	C
 53.45$	fail	USD
@@ -1223,37 +1221,38 @@
 set pattern \u00a4 0.00;\u00a4 -#
 set locale fa_IR
 begin
-parse	output	outputCurrency
+parse	output	outputCurrency	breaks
 \u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5	1235	IRR
 IRR \u06F1\u06F2\u06F3\u06F5	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR
+// P fails here because this currency name is in the Trie only, but it has the same prefix as the non-Trie currency
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR	P
 IRR 1235	1235	IRR
 \u0631\u06cc\u0627\u0644 1235	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR	P
 
 test parse foreign currency ISO
 set pattern \u00a4\u00a4 0.00;\u00a4\u00a4 -#
 set locale fa_IR
 begin
-parse	output	outputCurrency
+parse	output	outputCurrency	breaks
 \u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5	1235	IRR
 IRR \u06F1\u06F2\u06F3\u06F5	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR	P
 IRR 1235	1235	IRR
 \u0631\u06cc\u0627\u0644 1235	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR	P
 
 test parse foreign currency full
 set pattern \u00a4\u00a4\u00a4 0.00;\u00a4\u00a4\u00a4 -#
 set locale fa_IR
 begin
-parse	output	outputCurrency
+parse	output	outputCurrency	breaks
 \u0631\u06cc\u0627\u0644 \u06F1\u06F2\u06F3\u06F5	1235	IRR
 IRR \u06F1\u06F2\u06F3\u06F5	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 \u06F1\u06F2\u06F3\u06F5	1235	IRR	P
 IRR 1235	1235	IRR
 \u0631\u06cc\u0627\u0644 1235	1235	IRR
-\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR
+\u0631\u06cc\u0627\u0644 \u0627\u06cc\u0631\u0627\u0646 1235	1235	IRR	P
 
 test parse currency with foreign symbols symbol english
 set pattern \u00a4 0.00;\u00a4 (#)
@@ -1288,16 +1287,17 @@
 test parse currency without currency mode
 // Should accept a symbol associated with the currency specified by the API,
 // but should not traverse the full currency data.
+// P always traverses full currency data.
 set locale en_US
 set pattern \u00a4#,##0.00
 begin
 parse	currency	output	breaks
 $52.41	USD	52.41
 USD52.41	USD	52.41	K
-\u20ac52.41	USD	fail
-EUR52.41	USD	fail
-$52.41	EUR	fail
-USD52.41	EUR	fail
+\u20ac52.41	USD	fail	P
+EUR52.41	USD	fail	P
+$52.41	EUR	fail	P
+USD52.41	EUR	fail	P
 \u20ac52.41	EUR	52.41	K
 EUR52.41	EUR	52.41
 
@@ -1307,11 +1307,11 @@
 set lenient 0
 begin
 parse	output	outputCurrency	breaks
-$53.45	53.45	USD
+$53.45	53.45	USD	P
 53.45 USD	53.45	USD
 USD 53.45	fail	USD
 53.45USD	fail	USD
-USD53.45	53.45	USD
+USD53.45	53.45	USD	P
 (7.92) USD	-7.92	USD
 (7.92) EUR	-7.92	EUR
 (7.926) USD	-7.926	USD
@@ -1329,9 +1329,9 @@
 53.45 US Dollars	53.45	USD
 US Dollar 53.45	fail	USD
 53.45 US Dollar	53.45	USD
-US Dollars53.45	53.45	USD
+US Dollars53.45	53.45	USD	P
 53.45US Dollars	fail	USD
-US Dollar53.45	53.45	USD
+US Dollar53.45	53.45	USD	P
 US Dollat53.45	fail	USD
 53.45US Dollar	fail	USD
 US Dollars (53.45)	fail	USD
@@ -1376,13 +1376,15 @@
 set locale en
 set pattern #
 begin
-parse	output	breaks
--123	-123
-- 123	-123	JK
- -123	-123	JK
- - 123	-123	JK
-123-	-123	CJKS
-123 -	-123	CJKS
+pattern	parse	output	breaks
+#	-123	-123
+#	- 123	-123	JK
+#	 -123	-123	JK
+#	 - 123	-123	JK
+#	123-	123
+#	123 -	123
+#;#-	123-	-123
+#;#-	123 -	-123	JK
 
 test parse case sensitive
 set locale en
@@ -1423,8 +1425,8 @@
 1E2147483646	1E2147483646
 1E-2147483649	0
 1E-2147483648	0
-// S returns zero here
-1E-2147483647	1E-2147483647	S
+// P returns zero here
+1E-2147483647	1E-2147483647	P
 1E-2147483646	1E-2147483646
 
 test format push limits
@@ -1439,7 +1441,7 @@
 100	9999999999999.9950000000001	9999999999999.9950000000001	C
 2	9999999999999.9950000000001	10000000000000.00	C
 2	9999999.99499999	9999999.99
-// K doesn't support halfDowm rounding mode?
+// K doesn't support halfDown rounding mode?
 2	9999999.995	9999999.99	K
 2	9999999.99500001	10000000.00
 100	56565656565656565656565656565656565656565656565656565656565656	56565656565656565656565656565656565656565656565656565656565656.00	C
@@ -1453,8 +1455,8 @@
 set pattern #,##0
 begin
 parse	output	breaks
-// K and J return null; S and C return 99
- 9 9	9	CJKS
+// K and J return null; S, C, and P return 99
+ 9 9	9	CJKP
 // K returns null
  9 999	9999	K
 
@@ -1497,7 +1499,7 @@
 56i j‎k 	-56	CJK
 56‎i jk 	-56	CJK
 // S and C get 56 (accepts ' ' gs grouping); J and K get null
-5 6	fail	CS
+5 6	fail	CP
 5‎6	5	JK
 
 test parse spaces in grouping
@@ -1507,9 +1509,9 @@
 set pattern #,##0
 begin
 parse	output	breaks
-// C, J and S get "12" here
-1 2	1	CJS
-1 23	1	CJS
+// C, J, S, and P get "12" here
+1 2	1	CJP
+1 23	1	CJP
 // K gets 1 here; doesn't pick up the grouping separator
 1 234	1234	K
 
@@ -1543,6 +1545,7 @@
 parse	output	breaks
 55%	0.55
 // J and K get null
+// C and P scale by 100 even if the percent sign is not present
 55	0.55	JK
 
 test trailing grouping separators in pattern
@@ -1573,6 +1576,34 @@
 parse	output	breaks
 9223372036854775807%	92233720368547758.07
 
+test sign always shown
+set locale en
+set pattern 0
+set signAlwaysShown 1
+begin
+format	output	breaks
+// C, J and K do not support this feature
+42	+42	CJK
+0	+0	CJK
+-42	-42
+
+test parse strict with plus sign
+set locale en
+set pattern 0
+set signAlwaysShown 1
+begin
+lenient	parse	output	breaks
+1	42	42
+1	-42	-42
+1	+42	42	CJK
+1	0	0
+1	+0	0	CJK
+0	42	fail	CJK
+0	-42	-42
+0	+42	42	CJK
+0	0	fail	CJK
+0	+0	0	CJK
+
 
 
 
diff --git a/android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_64BitBCD.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/impl/number/DecimalQuantity_64BitBCD.java
similarity index 96%
rename from android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_64BitBCD.java
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/impl/number/DecimalQuantity_64BitBCD.java
index 4a8ec7f..54f5cec 100644
--- a/android_icu4j/src/main/tests/android/icu/impl/number/DecimalQuantity_64BitBCD.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/impl/number/DecimalQuantity_64BitBCD.java
@@ -1,13 +1,13 @@
-/* GENERATED SOURCE. DO NOT MODIFY. */
 // © 2017 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
-package android.icu.impl.number;
+package com.ibm.icu.dev.impl.number;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import android.icu.testsharding.MainTestShard;
 
-@MainTestShard
+import com.ibm.icu.impl.number.DecimalQuantity;
+import com.ibm.icu.impl.number.DecimalQuantity_AbstractBCD;
+
 public final class DecimalQuantity_64BitBCD extends DecimalQuantity_AbstractBCD {
 
   /**
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/impl/number/DecimalQuantity_ByteArrayBCD.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/impl/number/DecimalQuantity_ByteArrayBCD.java
similarity index 97%
rename from icu4j/main/tests/core/src/com/ibm/icu/impl/number/DecimalQuantity_ByteArrayBCD.java
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/impl/number/DecimalQuantity_ByteArrayBCD.java
index f019810..7012e84 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/impl/number/DecimalQuantity_ByteArrayBCD.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/impl/number/DecimalQuantity_ByteArrayBCD.java
@@ -1,10 +1,13 @@
 // © 2017 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
-package com.ibm.icu.impl.number;
+package com.ibm.icu.dev.impl.number;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
+import com.ibm.icu.impl.number.DecimalQuantity;
+import com.ibm.icu.impl.number.DecimalQuantity_AbstractBCD;
+
 public final class DecimalQuantity_ByteArrayBCD extends DecimalQuantity_AbstractBCD {
 
   /**
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/impl/number/DecimalQuantity_SimpleStorage.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/impl/number/DecimalQuantity_SimpleStorage.java
similarity index 99%
rename from icu4j/main/tests/core/src/com/ibm/icu/impl/number/DecimalQuantity_SimpleStorage.java
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/impl/number/DecimalQuantity_SimpleStorage.java
index e078020..b910a9c 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/impl/number/DecimalQuantity_SimpleStorage.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/impl/number/DecimalQuantity_SimpleStorage.java
@@ -1,6 +1,6 @@
 // © 2017 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html#License
-package com.ibm.icu.impl.number;
+package com.ibm.icu.dev.impl.number;
 
 import java.math.BigDecimal;
 import java.math.MathContext;
@@ -8,6 +8,7 @@
 import java.text.FieldPosition;
 
 import com.ibm.icu.impl.StandardPlural;
+import com.ibm.icu.impl.number.DecimalQuantity;
 import com.ibm.icu.text.PluralRules;
 import com.ibm.icu.text.PluralRules.Operand;
 import com.ibm.icu.text.UFieldPosition;
@@ -502,6 +503,11 @@
     return (flags & NEGATIVE_FLAG) != 0;
   }
 
+  @Override
+  public int signum() {
+      return isNegative() ? -1 : isZero() ? 0 : 1;
+  }
+
   private void setNegative(boolean isNegative) {
     flags = (flags & (~NEGATIVE_FLAG)) | (isNegative ? NEGATIVE_FLAG : 0);
   }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/bidi/TestCompatibility.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/bidi/TestCompatibility.java
index bce7745..ce9b5f4 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/bidi/TestCompatibility.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/bidi/TestCompatibility.java
@@ -11,7 +11,6 @@
 
 import java.awt.font.NumericShaper;
 import java.awt.font.TextAttribute;
-import java.text.AttributedCharacterIterator;
 import java.text.AttributedString;
 
 import org.junit.Test;
@@ -207,9 +206,8 @@
         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(1), 0, 26);
         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-1), 0, 6);
         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-1), 19, 26);
-        AttributedCharacterIterator aci = as.getIterator();
-        bidi = new Bidi(aci);
-        jbidi = new java.text.Bidi(aci);
+        bidi = new Bidi(as.getIterator());
+        jbidi = new java.text.Bidi(as.getIterator());
         compareBidi(bidi, jbidi);
         String out = bidi.writeReordered(0);
         logln("Output #1 of Bidi(AttributedCharacterIterator): " + out);
@@ -217,17 +215,15 @@
         as = new AttributedString("HEBREW 123 english MOREHEB");
         as.addAttribute(TextAttribute.RUN_DIRECTION, TextAttribute.RUN_DIRECTION_RTL);
         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(0), 0, 26);
-        aci = as.getIterator();
-        bidi = new Bidi(aci);
-        jbidi = new java.text.Bidi(aci);
+        bidi = new Bidi(as.getIterator());
+        jbidi = new java.text.Bidi(as.getIterator());
         compareBidi(bidi, jbidi);
         out = bidi.writeReordered(0);
         logln("Output #2 of Bidi(AttributedCharacterIterator): " + out);
 
         as = new AttributedString("HEBREW 123 english MOREHEB");
-        aci = as.getIterator();
-        bidi = new Bidi(aci);
-        jbidi = new java.text.Bidi(aci);
+        bidi = new Bidi(as.getIterator());
+        jbidi = new java.text.Bidi(as.getIterator());
         compareBidi(bidi, jbidi);
         out = bidi.writeReordered(0);
         logln("Output #3 of Bidi(AttributedCharacterIterator): " + out);
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java
index bc3037a..134d170 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/calendar/CalendarRegressionTest.java
@@ -2525,5 +2525,39 @@
             }
         }
     }
- }
+
+    @Test
+    public void TestIslamicCalOverflow() {
+        String localeID = "ar@calendar=islamic-civil";
+        Calendar cal = Calendar.getInstance(new ULocale(localeID));
+        int maxMonth = cal.getMaximum(Calendar.MONTH);
+        int maxDayOfMonth = cal.getMaximum(Calendar.DATE);
+        int jd, year, month, dayOfMonth;
+        for (jd = 73530872; jd <= 73530876; jd++) { // year 202002, int32_t overflow if jd >= 73530874
+            cal.clear();
+            cal.set(Calendar.JULIAN_DAY, jd);
+            year = cal.get(Calendar.YEAR);
+            month = cal.get(Calendar.MONTH);
+            dayOfMonth = cal.get(Calendar.DATE);
+            if (month > maxMonth || dayOfMonth > maxDayOfMonth) {
+                errln("Error: localeID " + localeID + ", julianDay " + jd + "; got year " + year + "; maxMonth " + maxMonth +
+                        ", got month " + month + "; maxDayOfMonth " + maxDayOfMonth + ", got dayOfMonth " + dayOfMonth);
+            }
+        }
+    }
+
+    @Test
+    public void TestWeekOfYear13548() {
+        int year = 2000;
+
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.YEAR, year);
+        cal.set(Calendar.WEEK_OF_YEAR, 4);
+
+        int resultYear = cal.get(Calendar.YEAR);
+        if (year != resultYear) {
+            errln("Fail: Expected year=" + year + ", actual=" + resultYear);
+        }
+    }
+}
 //eof
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/CompactDecimalFormatTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/CompactDecimalFormatTest.java
index bae5b53..244ab52 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/CompactDecimalFormatTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/CompactDecimalFormatTest.java
@@ -188,9 +188,9 @@
             {new CurrencyAmount(1f, Currency.getInstance("EUR")), "1 €"},
             {new CurrencyAmount(12f, Currency.getInstance("EUR")), "12 €"},
             {new CurrencyAmount(123f, Currency.getInstance("EUR")), "120 €"},
-            {new CurrencyAmount(1234f, Currency.getInstance("EUR")), "1,2 Tsd. €"},
-            {new CurrencyAmount(12345f, Currency.getInstance("EUR")), "12 Tsd. €"},
-            {new CurrencyAmount(123456f, Currency.getInstance("EUR")), "120 Tsd. €"},
+            {new CurrencyAmount(1234f, Currency.getInstance("EUR")), "1200 €"},
+            {new CurrencyAmount(12345f, Currency.getInstance("EUR")), "12.000 €"},
+            {new CurrencyAmount(123456f, Currency.getInstance("EUR")), "120.000 €"},
             {new CurrencyAmount(1234567f, Currency.getInstance("EUR")), "1,2 Mio. €"},
             {new CurrencyAmount(12345678f, Currency.getInstance("EUR")), "12 Mio. €"},
             {new CurrencyAmount(123456789f, Currency.getInstance("EUR")), "120 Mio. €"},
@@ -393,7 +393,7 @@
     @Test
     public void TestArabicLongStyle() {
         NumberFormat cdf =
-                CompactDecimalFormat.getInstance(new Locale("ar"), CompactStyle.LONG);
+                CompactDecimalFormat.getInstance(new Locale("ar-EG"), CompactStyle.LONG);
         assertEquals("Arabic Long", "\u061C-\u0665\u066B\u0663 \u0623\u0644\u0641", cdf.format(-5300));
     }
 
@@ -690,17 +690,17 @@
         assertEquals("CDF should correctly format 43000 in 'ar'", "٤٣ ألف", result);
 
         // Bug #12449
-        cdf = CompactDecimalFormat.getInstance(new ULocale("ar"), CompactDecimalFormat.CompactStyle.SHORT);
+        cdf = CompactDecimalFormat.getInstance(new ULocale("ar-EG"), CompactDecimalFormat.CompactStyle.SHORT);
         cdf.setMaximumSignificantDigits(3);
         result = cdf.format(1234);
-        assertEquals("CDF should correctly format 1234 with 3 significant digits in 'ar'", "١٫٢٣ ألف", result);
+        assertEquals("CDF should correctly format 1234 with 3 significant digits in 'ar-EG'", "١٫٢٣ ألف", result);
 
         // Check currency formatting as well
-        cdf = CompactDecimalFormat.getInstance(new ULocale("ar"), CompactDecimalFormat.CompactStyle.SHORT);
+        cdf = CompactDecimalFormat.getInstance(new ULocale("ar-EG"), CompactDecimalFormat.CompactStyle.SHORT);
         result = cdf.format(new CurrencyAmount(43000f, Currency.getInstance("USD")));
-        assertEquals("CDF should correctly format 43000 with currency in 'ar'", "US$ ٤٣ ألف", result);
+        assertEquals("CDF should correctly format 43000 with currency in 'ar-EG'", "US$ ٤٣ ألف", result);
         result = cdf.format(new CurrencyAmount(-43000f, Currency.getInstance("USD")));
-        assertEquals("CDF should correctly format -43000 with currency in 'ar'", "؜-US$ ٤٣ ألف", result);
+        assertEquals("CDF should correctly format -43000 with currency in 'ar-EG'", "؜-US$ ٤٣ ألف", result);
 
         // Extra locale with different positive/negative formats
         cdf = CompactDecimalFormat.getInstance(new ULocale("fi"), CompactDecimalFormat.CompactStyle.SHORT);
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DataDrivenNumberFormatTestData.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DataDrivenNumberFormatTestData.java
index 167fd0b..3aed2e3 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DataDrivenNumberFormatTestData.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DataDrivenNumberFormatTestData.java
@@ -108,6 +108,7 @@
     public String positiveSuffix = null;
     public String negativePrefix = null;
     public String negativeSuffix = null;
+    public Integer signAlwaysShown = null;
     public String localizedPattern = null;
     public String toPattern = null;
     public String toLocalizedPattern = null;
@@ -213,6 +214,7 @@
         "positiveSuffix",
         "negativePrefix",
         "negativeSuffix",
+        "signAlwaysShown",
         "localizedPattern",
         "toPattern",
         "toLocalizedPattern",
@@ -378,6 +380,10 @@
         negativeSuffix = value;
     }
 
+    public void setSignAlwaysShown(String value) {
+        signAlwaysShown = Integer.valueOf(value);
+    }
+
     public void setLocalizedPattern(String value) {
         localizedPattern = value;
     }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DataDrivenNumberFormatTestUtility.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DataDrivenNumberFormatTestUtility.java
index 0699596..975c595 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DataDrivenNumberFormatTestUtility.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DataDrivenNumberFormatTestUtility.java
@@ -273,7 +273,7 @@
             tuple.setField(name,  Utility.unescape(value));
             return true;
         } catch (Exception e) {
-            showError("No such field: " + name + ", or bad value: " + value);
+            showError("No such field: " + name + ", or bad value: " + value + ": " + e);
             return false;
         }
     }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateFormatTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateFormatTest.java
index ce714e5..205fe4e 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateFormatTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateFormatTest.java
@@ -2067,8 +2067,8 @@
         Date date = new Date(874266720000L);  // Sun Sep 14 21:52:00 CET 1997
         TimeZone tz = TimeZone.getTimeZone("CET");
 
-        DateFormat dfArab = DateFormat.getTimeInstance(DateFormat.SHORT, new ULocale("ar"));
-        DateFormat dfLatn = DateFormat.getTimeInstance(DateFormat.SHORT, new ULocale("ar-u-nu-latn"));
+        DateFormat dfArab = DateFormat.getTimeInstance(DateFormat.SHORT, new ULocale("ar-EG"));
+        DateFormat dfLatn = DateFormat.getTimeInstance(DateFormat.SHORT, new ULocale("ar-EG-u-nu-latn"));
 
         dfArab.setTimeZone(tz);
         dfLatn.setTimeZone(tz);
@@ -3912,7 +3912,8 @@
             df = DateFormat.getPatternInstance("", new Locale("en_US"));
             df = DateFormat.getPatternInstance(null, "", new Locale("en_US"));
         } catch(Exception e) {
-            errln("DateFormat.getPatternInstance is not suppose to return an exception.");
+            errln("DateFormat.getPatternInstance is not suppose to return an exception, got: " + e.toString());
+            //e.printStackTrace();
         }
     }
 
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java
index 8cfa7e6..a19e7e0 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java
@@ -864,7 +864,8 @@
             DateTimePatternGenerator.getInstance();
         } catch(Exception e){
             errln("DateTimePatternGenerator.getInstance() was not suppose to " +
-                    "return an exception.");
+                    "return an exception, got: " + e.toString());
+            //e.printStackTrace();
         }
     }
 
@@ -1626,4 +1627,45 @@
         dtpg.setAppendItemFormat(DateTimePatternGenerator.ERA, "{0}, {1}");
         assertEquals(message, "d-MM-y, G", dtpg.getBestPattern(skeleton));
     }
+
+    private final class FieldDisplayNameData {
+        public String       locale;
+        public int          field;
+        public DateTimePatternGenerator.DisplayWidth width;
+        public String       expected;
+        // Simple constructor
+        public FieldDisplayNameData(String locale, int field, DateTimePatternGenerator.DisplayWidth width, String expected) {
+            this.locale   = locale;
+            this.field    = field;
+            this.width    = width;
+            this.expected = expected;
+        }
+    }
+    @Test
+    public void TestGetFieldDisplayNames() {
+        final FieldDisplayNameData[] testNamesData = {
+                new FieldDisplayNameData( "de",    DateTimePatternGenerator.QUARTER,              DateTimePatternGenerator.DisplayWidth.WIDE,        "Quartal" ),
+                new FieldDisplayNameData( "de",    DateTimePatternGenerator.QUARTER,              DateTimePatternGenerator.DisplayWidth.ABBREVIATED, "Quart." ),
+                new FieldDisplayNameData( "de",    DateTimePatternGenerator.QUARTER,              DateTimePatternGenerator.DisplayWidth.NARROW,      "Q" ),
+                new FieldDisplayNameData( "en",    DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.WIDE,        "weekday of the month" ),
+                new FieldDisplayNameData( "en",    DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.ABBREVIATED, "wkday. of mo." ),
+                new FieldDisplayNameData( "en",    DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.NARROW,      "wkday. of mo." ),
+                new FieldDisplayNameData( "en_GB", DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.WIDE,        "weekday of the month" ),
+                new FieldDisplayNameData( "en_GB", DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.ABBREVIATED, "wkday of mo" ),
+                new FieldDisplayNameData( "en_GB", DateTimePatternGenerator.DAY_OF_WEEK_IN_MONTH, DateTimePatternGenerator.DisplayWidth.NARROW,      "wkday of mo" ),
+                new FieldDisplayNameData( "it",    DateTimePatternGenerator.SECOND,               DateTimePatternGenerator.DisplayWidth.WIDE,        "secondo" ),
+                new FieldDisplayNameData( "it",    DateTimePatternGenerator.SECOND,               DateTimePatternGenerator.DisplayWidth.ABBREVIATED, "s" ),
+                new FieldDisplayNameData( "it",    DateTimePatternGenerator.SECOND,               DateTimePatternGenerator.DisplayWidth.NARROW,      "s" ),
+        };
+
+        for (int i = 0; i < testNamesData.length; ++i) {
+            ULocale uloc = new ULocale(testNamesData[i].locale);
+            DateTimePatternGenerator dtpgen = DateTimePatternGenerator.getInstance(uloc);
+            String getName = dtpgen.getFieldDisplayName(testNamesData[i].field, testNamesData[i].width);
+            if (getName.compareTo(testNamesData[i].expected) != 0) {
+                errln("Locale " + testNamesData[i].locale + ", field " + testNamesData[i].field +
+                        ", width " + testNamesData[i].width + ", expected " + testNamesData[i].expected + ", got " + getName);
+            }
+        }
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/IntlTestDecimalFormatSymbols.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/IntlTestDecimalFormatSymbols.java
index 1f89eb7..724247a 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/IntlTestDecimalFormatSymbols.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/IntlTestDecimalFormatSymbols.java
@@ -311,6 +311,36 @@
             errln("ERROR: Char digits should be Latin digits");
         }
 
+        // Check on copy
+        DecimalFormatSymbols copy = (DecimalFormatSymbols) symbols.clone();
+        if (!Arrays.equals(copy.getDigitStrings(), osmanyaDigitStrings)) {
+            errln("ERROR: Osmanya digits (supplementary) should be set");
+        }
+        if (Character.codePointAt(osmanyaDigitStrings[0], 0) != copy.getCodePointZero()) {
+            errln("ERROR: Code point zero be Osmanya code point zero");
+        }
+        if (defZero != copy.getZeroDigit()) {
+            errln("ERROR: Zero digit should be 0");
+        }
+        if (!Arrays.equals(copy.getDigits(), defDigits)) {
+            errln("ERROR: Char digits should be Latin digits");
+        }
+
+        // Check on resource bundle
+        DecimalFormatSymbols fromData = DecimalFormatSymbols.getInstance(new ULocale("en@numbers=osma"));
+        if (!Arrays.equals(fromData.getDigitStrings(), osmanyaDigitStrings)) {
+            errln("ERROR: Osmanya digits (supplementary) should be set");
+        }
+        if (Character.codePointAt(osmanyaDigitStrings[0], 0) != fromData.getCodePointZero()) {
+            errln("ERROR: Code point zero be Osmanya code point zero");
+        }
+        if (defZero != fromData.getZeroDigit()) {
+            errln("ERROR: Zero digit should be 0");
+        }
+        if (!Arrays.equals(fromData.getDigits(), defDigits)) {
+            errln("ERROR: Char digits should be Latin digits");
+        }
+
         symbols.setDigitStrings(differentDigitStrings);
         if (!Arrays.equals(symbols.getDigitStrings(), differentDigitStrings)) {
             errln("ERROR: Different digits should be set");
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java
index c2143e7..2523297 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java
@@ -16,6 +16,7 @@
 import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.text.FieldPosition;
+import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -42,6 +43,7 @@
 import com.ibm.icu.text.MeasureFormat.FormatWidth;
 import com.ibm.icu.text.NumberFormat;
 import com.ibm.icu.util.Currency;
+import com.ibm.icu.util.CurrencyAmount;
 import com.ibm.icu.util.Measure;
 import com.ibm.icu.util.MeasureUnit;
 import com.ibm.icu.util.NoUnit;
@@ -1488,7 +1490,7 @@
                 {ULocale.ENGLISH, FormatWidth.SHORT, "2 mi, 1 ft, 2.3 in"},
                 {ULocale.ENGLISH, FormatWidth.NARROW, "2mi 1\u2032 2.3\u2033"},
                 {russia, FormatWidth.WIDE,   "2 \u043C\u0438\u043B\u0438 1 \u0444\u0443\u0442 2,3 \u0434\u044E\u0439\u043C\u0430"},
-                {russia, FormatWidth.SHORT,  "2 \u043C\u0438\u043B\u0438 1 \u0444\u0443\u0442 2,3 \u0434\u044E\u0439\u043C."},
+                {russia, FormatWidth.SHORT,  "2 \u043C\u0438\u043B\u0438 1 \u0444\u0442 2,3 \u0434\u044E\u0439\u043C."},
                 {russia, FormatWidth.NARROW, "2 \u043C\u0438\u043B\u044C 1 \u0444\u0442 2,3 \u0434\u044E\u0439\u043C\u0430"},
    };
         for (Object[] row : data) {
@@ -1676,9 +1678,11 @@
         assertEquals("numeric currency", "$2.00", mf.format(USD_2));
 
         mf = MeasureFormat.getInstance(ULocale.JAPAN, FormatWidth.WIDE);
-        assertEquals("Wide currency", "-1.00 \u7C73\u30C9\u30EB", mf.format(USD_NEG_1));
-        assertEquals("Wide currency", "1.00 \u7C73\u30C9\u30EB", mf.format(USD_1));
-        assertEquals("Wide currency", "2.00 \u7C73\u30C9\u30EB", mf.format(USD_2));
+        // Locale jp does NOT put a space between the number and the currency long name:
+        // https://unicode.org/cldr/trac/browser/tags/release-32-0-1/common/main/ja.xml?rev=13805#L7046
+        assertEquals("Wide currency", "-1.00\u7C73\u30C9\u30EB", mf.format(USD_NEG_1));
+        assertEquals("Wide currency", "1.00\u7C73\u30C9\u30EB", mf.format(USD_1));
+        assertEquals("Wide currency", "2.00\u7C73\u30C9\u30EB", mf.format(USD_2));
 
         Measure CAD_1 = new Measure(1.0, Currency.getInstance("CAD"));
         mf = MeasureFormat.getInstance(ULocale.CANADA, FormatWidth.SHORT);
@@ -1912,7 +1916,7 @@
                         new Measure(5.3, MeasureUnit.INCH)));
         assertEquals("getLocale", ULocale.ENGLISH, mf.getLocale());
         assertEquals("getNumberFormat", ULocale.ENGLISH, mf.getNumberFormat().getLocale(ULocale.VALID_LOCALE));
-        assertEquals("getWidth", MeasureFormat.FormatWidth.WIDE, mf.getWidth());
+        assertEquals("getWidth", MeasureFormat.FormatWidth.DEFAULT_CURRENCY, mf.getWidth());
     }
 
     @Test
@@ -1924,6 +1928,15 @@
     }
 
     @Test
+    public void testCurrencyFormatParseIsoCode() throws ParseException {
+        MeasureFormat mf = MeasureFormat.getCurrencyFormat(ULocale.ENGLISH);
+        CurrencyAmount result = (CurrencyAmount) mf.parseObject("GTQ 34.56");
+        assertEquals("Parse should succeed", result.getNumber().doubleValue(), 34.56, 0.0);
+        assertEquals("Should parse ISO code GTQ even though the currency is USD",
+                "GTQ", result.getCurrency().getCurrencyCode());
+    }
+
+    @Test
     public void testDoubleZero() {
         ULocale en = new ULocale("en");
         NumberFormat nf = NumberFormat.getInstance(en);
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitThreadTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitThreadTest.java
index e86ed12..6869734 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitThreadTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitThreadTest.java
@@ -8,7 +8,10 @@
 import org.junit.runners.JUnit4;
 
 import com.ibm.icu.dev.test.TestFmwk;
+import com.ibm.icu.impl.DontCareFieldPosition;
+import com.ibm.icu.text.MeasureFormat;
 import com.ibm.icu.util.Currency;
+import com.ibm.icu.util.Measure;
 import com.ibm.icu.util.MeasureUnit;
 import com.ibm.icu.util.ULocale;
 
@@ -30,5 +33,64 @@
         Currency.getInstance(ULocale.ENGLISH);
         try {thread.join();} catch(InterruptedException e) {};
     }
-}
 
+    static class NumericMeasureThread extends Thread {
+        final MeasureFormat mf;
+        final Measure[] arg;
+        final String expected;
+        volatile boolean running = true;
+        AssertionError error;
+
+        NumericMeasureThread(Measure[] arg, String expected) {
+            this.mf = MeasureFormat.getInstance(ULocale.ENGLISH, MeasureFormat.FormatWidth.NUMERIC);
+            this.arg = arg;
+            this.expected = expected;
+            this.error = null;
+        }
+
+        @Override
+        public void run() {
+            while (running) {
+                try {
+                    StringBuilder sb = new StringBuilder();
+                    mf.formatMeasures(sb, DontCareFieldPosition.INSTANCE, arg);
+                    org.junit.Assert.assertEquals(expected, sb.toString());
+                } catch (AssertionError e) {
+                    error = e;
+                    break;
+                }
+            }
+        }
+    }
+
+    // Race in formatMeasures with width NUMERIC:
+    // http://bugs.icu-project.org/trac/ticket/13606
+    @Test
+    public void NumericRaceTest() throws InterruptedException {
+        NumericMeasureThread t1 = new NumericMeasureThread(new Measure[] {
+          new Measure(3, MeasureUnit.MINUTE),
+          new Measure(4, MeasureUnit.SECOND)
+        }, "3:04");
+        NumericMeasureThread t2 = new NumericMeasureThread(new Measure[] {
+          new Measure(5, MeasureUnit.MINUTE),
+          new Measure(6, MeasureUnit.SECOND)
+        }, "5:06");
+        t1.start();
+        t2.start();
+        Thread.sleep(5);
+        t1.running = false;
+        t2.running = false;
+        t1.join();
+        t2.join();
+        if (t1.error != null) {
+            AssertionError error = new AssertionError("Failure in thread 1");
+            error.initCause(t1.error);
+            throw error;
+        }
+        if (t2.error != null) {
+            AssertionError error = new AssertionError("Failure in thread 2");
+            error.initCause(t2.error);
+            throw error;
+        }
+    }
+}
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatDataDrivenTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatDataDrivenTest.java
index b72cc6f..204d73d 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatDataDrivenTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatDataDrivenTest.java
@@ -4,7 +4,6 @@
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.text.ParseException;
 import java.text.ParsePosition;
 
 import org.junit.Test;
@@ -12,10 +11,10 @@
 import com.ibm.icu.dev.test.TestUtil;
 import com.ibm.icu.impl.number.DecimalFormatProperties;
 import com.ibm.icu.impl.number.Padder.PadPosition;
-import com.ibm.icu.impl.number.Parse;
-import com.ibm.icu.impl.number.Parse.ParseMode;
 import com.ibm.icu.impl.number.PatternStringParser;
 import com.ibm.icu.impl.number.PatternStringUtils;
+import com.ibm.icu.impl.number.parse.NumberParserImpl;
+import com.ibm.icu.impl.number.parse.NumberParserImpl.ParseMode;
 import com.ibm.icu.number.LocalizedNumberFormatter;
 import com.ibm.icu.number.NumberFormatter;
 import com.ibm.icu.text.DecimalFormat;
@@ -232,6 +231,9 @@
           if (tuple.negativeSuffix != null) {
             fmt.setNegativeSuffix(tuple.negativeSuffix);
           }
+          if (tuple.signAlwaysShown != null) {
+            // Not supported.
+          }
           if (tuple.localizedPattern != null) {
             fmt.applyLocalizedPattern(tuple.localizedPattern);
           }
@@ -415,6 +417,9 @@
           if (tuple.negativeSuffix != null) {
             fmt.setNegativeSuffix(tuple.negativeSuffix);
           }
+          if (tuple.signAlwaysShown != null) {
+            // Not supported.
+          }
           if (tuple.localizedPattern != null) {
             fmt.applyLocalizedPattern(tuple.localizedPattern);
           }
@@ -519,6 +524,9 @@
     if (tuple.negativeSuffix != null) {
       properties.setNegativeSuffix(tuple.negativeSuffix);
     }
+    if (tuple.signAlwaysShown != null) {
+      properties.setSignAlwaysShown(tuple.signAlwaysShown != 0);
+    }
     if (tuple.localizedPattern != null) {
       DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(tuple.locale);
       String converted = PatternStringUtils.convertLocalized(tuple.localizedPattern, symbols, false);
@@ -581,10 +589,104 @@
         }
       };
 
+      /**
+       * Parsing, but no other features.
+       */
+      private DataDrivenNumberFormatTestUtility.CodeUnderTest ICU61_Parsing =
+          new DataDrivenNumberFormatTestUtility.CodeUnderTest() {
+
+            @Override
+            public Character Id() {
+              return 'P';
+            }
+
+            @Override
+            public String parse(DataDrivenNumberFormatTestData tuple) {
+                String pattern = (tuple.pattern == null) ? "0" : tuple.pattern;
+                DecimalFormatProperties properties;
+                ParsePosition ppos = new ParsePosition(0);
+                Number actual;
+                try {
+                    properties = PatternStringParser.parseToProperties(pattern,
+                            tuple.currency != null ? PatternStringParser.IGNORE_ROUNDING_ALWAYS
+                                    : PatternStringParser.IGNORE_ROUNDING_NEVER);
+                    propertiesFromTuple(tuple, properties);
+                    actual = NumberParserImpl.parseStatic(tuple.parse,
+                            ppos,
+                            properties,
+                            DecimalFormatSymbols.getInstance(tuple.locale));
+                } catch (IllegalArgumentException e) {
+                    return "parse exception: " + e.getMessage();
+                }
+                if (actual == null && ppos.getIndex() != 0) {
+                    throw new AssertionError("Error: value is null but parse position is not zero");
+                }
+                if (ppos.getIndex() == 0) {
+                    return "Parse failed; got " + actual + ", but expected " + tuple.output;
+                }
+                if (tuple.output.equals("NaN")) {
+                    if (!Double.isNaN(actual.doubleValue())) {
+                        return "Expected NaN, but got: " + actual;
+                    }
+                    return null;
+                } else if (tuple.output.equals("Inf")) {
+                    if (!Double.isInfinite(actual.doubleValue()) || Double.compare(actual.doubleValue(), 0.0) < 0) {
+                        return "Expected Inf, but got: " + actual;
+                    }
+                    return null;
+                } else if (tuple.output.equals("-Inf")) {
+                    if (!Double.isInfinite(actual.doubleValue()) || Double.compare(actual.doubleValue(), 0.0) > 0) {
+                        return "Expected -Inf, but got: " + actual;
+                    }
+                    return null;
+                } else if (tuple.output.equals("fail")) {
+                    return null;
+                } else if (new BigDecimal(tuple.output).compareTo(new BigDecimal(actual.toString())) != 0) {
+                    return "Expected: " + tuple.output + ", got: " + actual;
+                } else {
+                    return null;
+                }
+            }
+
+            @Override
+            public String parseCurrency(DataDrivenNumberFormatTestData tuple) {
+                String pattern = (tuple.pattern == null) ? "0" : tuple.pattern;
+                DecimalFormatProperties properties;
+                ParsePosition ppos = new ParsePosition(0);
+                CurrencyAmount actual;
+                try {
+                    properties = PatternStringParser.parseToProperties(
+                            pattern,
+                            tuple.currency != null ? PatternStringParser.IGNORE_ROUNDING_ALWAYS
+                                    : PatternStringParser.IGNORE_ROUNDING_NEVER);
+                    propertiesFromTuple(tuple, properties);
+                    actual = NumberParserImpl.parseStaticCurrency(tuple.parse,
+                            ppos,
+                            properties,
+                            DecimalFormatSymbols.getInstance(tuple.locale));
+                } catch (IllegalArgumentException e) {
+                    e.printStackTrace();
+                    return "parse exception: " + e.getMessage();
+                }
+                if (ppos.getIndex() == 0 || actual.getCurrency().getCurrencyCode().equals("XXX")) {
+                    return "Parse failed; got " + actual + ", but expected " + tuple.output;
+                }
+                BigDecimal expectedNumber = new BigDecimal(tuple.output);
+                if (expectedNumber.compareTo(new BigDecimal(actual.getNumber().toString())) != 0) {
+                    return "Wrong number: Expected: " + expectedNumber + ", got: " + actual;
+                }
+                String expectedCurrency = tuple.outputCurrency;
+                if (!expectedCurrency.equals(actual.getCurrency().toString())) {
+                    return "Wrong currency: Expected: " + expectedCurrency + ", got: " + actual;
+                }
+                return null;
+            }
+      };
+
     /**
      * All features except formatting.
      */
-    private DataDrivenNumberFormatTestUtility.CodeUnderTest ICU60_Other =
+    private DataDrivenNumberFormatTestUtility.CodeUnderTest ICU59_Other =
             new DataDrivenNumberFormatTestUtility.CodeUnderTest() {
 
         @Override
@@ -641,98 +743,6 @@
         }
 
         /**
-         * Runs a single parse test. On success, returns null. On failure, returns the error. This implementation just
-         * returns null. Subclasses should override.
-         *
-         * @param tuple
-         *            contains the parameters of the format test.
-         */
-        @Override
-        public String parse(DataDrivenNumberFormatTestData tuple) {
-            String pattern = (tuple.pattern == null) ? "0" : tuple.pattern;
-            DecimalFormatProperties properties;
-            ParsePosition ppos = new ParsePosition(0);
-            Number actual;
-            try {
-                properties = PatternStringParser.parseToProperties(
-                        pattern,
-                        tuple.currency != null ? PatternStringParser.IGNORE_ROUNDING_ALWAYS
-                                : PatternStringParser.IGNORE_ROUNDING_NEVER);
-                propertiesFromTuple(tuple, properties);
-                actual = Parse.parse(tuple.parse, ppos, properties, DecimalFormatSymbols.getInstance(tuple.locale));
-            } catch (IllegalArgumentException e) {
-                return "parse exception: " + e.getMessage();
-            }
-            if (actual == null && ppos.getIndex() != 0) {
-                throw new AssertionError("Error: value is null but parse position is not zero");
-            }
-            if (ppos.getIndex() == 0) {
-                return "Parse failed; got " + actual + ", but expected " + tuple.output;
-            }
-            if (tuple.output.equals("NaN")) {
-                if (!Double.isNaN(actual.doubleValue())) {
-                    return "Expected NaN, but got: " + actual;
-                }
-                return null;
-            } else if (tuple.output.equals("Inf")) {
-                if (!Double.isInfinite(actual.doubleValue()) || Double.compare(actual.doubleValue(), 0.0) < 0) {
-                    return "Expected Inf, but got: " + actual;
-                }
-                return null;
-            } else if (tuple.output.equals("-Inf")) {
-                if (!Double.isInfinite(actual.doubleValue()) || Double.compare(actual.doubleValue(), 0.0) > 0) {
-                    return "Expected -Inf, but got: " + actual;
-                }
-                return null;
-            } else if (tuple.output.equals("fail")) {
-                return null;
-            } else if (new BigDecimal(tuple.output).compareTo(new BigDecimal(actual.toString())) != 0) {
-                return "Expected: " + tuple.output + ", got: " + actual;
-            } else {
-                return null;
-            }
-        }
-
-        /**
-         * Runs a single parse currency test. On success, returns null. On failure, returns the error. This
-         * implementation just returns null. Subclasses should override.
-         *
-         * @param tuple
-         *            contains the parameters of the format test.
-         */
-        @Override
-        public String parseCurrency(DataDrivenNumberFormatTestData tuple) {
-            String pattern = (tuple.pattern == null) ? "0" : tuple.pattern;
-            DecimalFormatProperties properties;
-            ParsePosition ppos = new ParsePosition(0);
-            CurrencyAmount actual;
-            try {
-                properties = PatternStringParser.parseToProperties(
-                        pattern,
-                        tuple.currency != null ? PatternStringParser.IGNORE_ROUNDING_ALWAYS
-                                : PatternStringParser.IGNORE_ROUNDING_NEVER);
-                propertiesFromTuple(tuple, properties);
-                actual = Parse
-                        .parseCurrency(tuple.parse, ppos, properties, DecimalFormatSymbols.getInstance(tuple.locale));
-            } catch (ParseException e) {
-                e.printStackTrace();
-                return "parse exception: " + e.getMessage();
-            }
-            if (ppos.getIndex() == 0 || actual.getCurrency().getCurrencyCode().equals("XXX")) {
-                return "Parse failed; got " + actual + ", but expected " + tuple.output;
-            }
-            BigDecimal expectedNumber = new BigDecimal(tuple.output);
-            if (expectedNumber.compareTo(new BigDecimal(actual.getNumber().toString())) != 0) {
-                return "Wrong number: Expected: " + expectedNumber + ", got: " + actual;
-            }
-            String expectedCurrency = tuple.outputCurrency;
-            if (!expectedCurrency.equals(actual.getCurrency().toString())) {
-                return "Wrong currency: Expected: " + expectedCurrency + ", got: " + actual;
-            }
-            return null;
-        }
-
-        /**
          * Runs a single select test. On success, returns null. On failure, returns the error. This implementation just
          * returns null. Subclasses should override.
          *
@@ -779,8 +789,14 @@
   }
 
   @Test
+  public void TestDataDrivenICULatest_Parsing() {
+    DataDrivenNumberFormatTestUtility.runFormatSuiteIncludingKnownFailures(
+        "numberformattestspecification.txt", ICU61_Parsing);
+  }
+
+  @Test
   public void TestDataDrivenICULatest_Other() {
     DataDrivenNumberFormatTestUtility.runFormatSuiteIncludingKnownFailures(
-        "numberformattestspecification.txt", ICU60_Other);
+        "numberformattestspecification.txt", ICU59_Other);
   }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTest.java
index 595ba1d..e3f690f 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTest.java
@@ -35,6 +35,7 @@
 import java.util.Random;
 import java.util.Set;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -436,8 +437,8 @@
                 {"$ 124 ", "5", "-1"},
                 {"$\u00A0124 ", "5", "-1"},
                 {" $ 124 ", "6", "-1"},
-                {"124$", "3", "-1"},
-                {"124 $", "3", "-1"},
+                {"124$", "4", "-1"},
+                {"124 $", "5", "-1"},
                 {"$124\u200A", "4", "-1"},
                 {"$\u200A124", "5", "-1"},
         };
@@ -474,10 +475,11 @@
                 {"123, ", 3, -1},
                 {"123,,", 3, -1},
                 {"123,, ", 3, -1},
+                {"123,,456", 3, -1},
                 {"123 ,", 3, -1},
                 {"123, ", 3, -1},
                 {"123, 456", 3, -1},
-                {"123  456", 0, 8} // TODO: Does this behavior make sense?
+                {"123  456", 3, -1}
         };
         DecimalFormat df = new DecimalFormat("#,###");
         df.setParseStrict(true);
@@ -783,12 +785,12 @@
     public void TestMiscCurrencyParsing() {
         String[][] DATA = {
                 // each has: string to be parsed, parsed position, error position
-                {"1.00 ", "4", "-1", "0", "5"},
-                {"1.00 UAE dirha", "4", "-1", "0", "14"},
-                {"1.00 us dollar", "4", "-1", "14", "-1"},
-                {"1.00 US DOLLAR", "4", "-1", "14", "-1"},
-                {"1.00 usd", "4", "-1", "8", "-1"},
-                {"1.00 USD", "4", "-1", "8", "-1"},
+                {"1.00 ", "4", "-1", "0", "4"},
+                {"1.00 UAE dirha", "4", "-1", "0", "4"},
+                {"1.00 us dollar", "14", "-1", "14", "-1"},
+                {"1.00 US DOLLAR", "14", "-1", "14", "-1"},
+                {"1.00 usd", "8", "-1", "8", "-1"},
+                {"1.00 USD", "8", "-1", "8", "-1"},
         };
         ULocale locale = new ULocale("en_US");
         for (int i=0; i<DATA.length; ++i) {
@@ -829,18 +831,14 @@
             private final String localeString;
             private final String descrip;
             private final String currStr;
-            private final int    numExpectPos;
-            private final int    numExpectVal;
             private final int    curExpectPos;
             private final int    curExpectVal;
             private final String curExpectCurr;
 
-            ParseCurrencyItem(String locStr, String desc, String curr, int numExPos, int numExVal, int curExPos, int curExVal, String curExCurr) {
+            ParseCurrencyItem(String locStr, String desc, String curr, int curExPos, int curExVal, String curExCurr) {
                 localeString  = locStr;
                 descrip       = desc;
                 currStr       = curr;
-                numExpectPos  = numExPos;
-                numExpectVal  = numExVal;
                 curExpectPos  = curExPos;
                 curExpectVal  = curExVal;
                 curExpectCurr = curExCurr;
@@ -848,8 +846,6 @@
             public String getLocaleString()  { return localeString; }
             public String getDescrip()       { return descrip; }
             public String getCurrStr()       { return currStr; }
-            public int    getNumExpectPos()  { return numExpectPos; }
-            public int    getNumExpectVal()  { return numExpectVal; }
             public int    getCurExpectPos()  { return curExpectPos; }
             public int    getCurExpectVal()  { return curExpectVal; }
             public String getCurExpectCurr() { return curExpectCurr; }
@@ -857,27 +853,27 @@
         // Note: In cases where the number occurs before the currency sign, non-currency mode will parse the number
         // and stop when it reaches the currency symbol.
         final ParseCurrencyItem[] parseCurrencyItems = {
-                new ParseCurrencyItem( "en_US", "dollars2", "$2.00",            5,  2,  5,  2,  "USD" ),
-                new ParseCurrencyItem( "en_US", "dollars4", "$4",               2,  4,  2,  4,  "USD" ),
-                new ParseCurrencyItem( "en_US", "dollars9", "9\u00A0$",         1,  9,  3,  9,  "USD" ),
-                new ParseCurrencyItem( "en_US", "pounds3",  "\u00A33.00",       0,  0,  5,  3,  "GBP" ),
-                new ParseCurrencyItem( "en_US", "pounds5",  "\u00A35",          0,  0,  2,  5,  "GBP" ),
-                new ParseCurrencyItem( "en_US", "pounds7",  "7\u00A0\u00A3",    1,  7,  3,  7,  "GBP" ),
-                new ParseCurrencyItem( "en_US", "euros8",   "\u20AC8",          0,  0,  2,  8,  "EUR" ),
+                new ParseCurrencyItem( "en_US", "dollars2", "$2.00",            5,  2,  "USD" ),
+                new ParseCurrencyItem( "en_US", "dollars4", "$4",               2,  4,  "USD" ),
+                new ParseCurrencyItem( "en_US", "dollars9", "9\u00A0$",         3,  9,  "USD" ),
+                new ParseCurrencyItem( "en_US", "pounds3",  "\u00A33.00",       5,  3,  "GBP" ),
+                new ParseCurrencyItem( "en_US", "pounds5",  "\u00A35",          2,  5,  "GBP" ),
+                new ParseCurrencyItem( "en_US", "pounds7",  "7\u00A0\u00A3",    3,  7,  "GBP" ),
+                new ParseCurrencyItem( "en_US", "euros8",   "\u20AC8",          2,  8,  "EUR" ),
 
-                new ParseCurrencyItem( "en_GB", "pounds3",  "\u00A33.00",       5,  3,  5,  3,  "GBP" ),
-                new ParseCurrencyItem( "en_GB", "pounds5",  "\u00A35",          2,  5,  2,  5,  "GBP" ),
-                new ParseCurrencyItem( "en_GB", "pounds7",  "7\u00A0\u00A3",    1,  7,  3,  7,  "GBP" ),
-                new ParseCurrencyItem( "en_GB", "euros4",   "4,00\u00A0\u20AC", 4,400,  6,400,  "EUR" ),
-                new ParseCurrencyItem( "en_GB", "euros6",   "6\u00A0\u20AC",    1,  6,  3,  6,  "EUR" ),
-                new ParseCurrencyItem( "en_GB", "euros8",   "\u20AC8",          0,  0,  2,  8,  "EUR" ),
-                new ParseCurrencyItem( "en_GB", "dollars4", "US$4",             0,  0,  4,  4,  "USD" ),
+                new ParseCurrencyItem( "en_GB", "pounds3",  "\u00A33.00",       5,  3,  "GBP" ),
+                new ParseCurrencyItem( "en_GB", "pounds5",  "\u00A35",          2,  5,  "GBP" ),
+                new ParseCurrencyItem( "en_GB", "pounds7",  "7\u00A0\u00A3",    3,  7,  "GBP" ),
+                new ParseCurrencyItem( "en_GB", "euros4",   "4,00\u00A0\u20AC", 6,400,  "EUR" ),
+                new ParseCurrencyItem( "en_GB", "euros6",   "6\u00A0\u20AC",    3,  6,  "EUR" ),
+                new ParseCurrencyItem( "en_GB", "euros8",   "\u20AC8",          2,  8,  "EUR" ),
+                new ParseCurrencyItem( "en_GB", "dollars4", "US$4",             4,  4,  "USD" ),
 
-                new ParseCurrencyItem( "fr_FR", "euros4",   "4,00\u00A0\u20AC", 6,  4,  6,  4,  "EUR" ),
-                new ParseCurrencyItem( "fr_FR", "euros6",   "6\u00A0\u20AC",    3,  6,  3,  6,  "EUR" ),
-                new ParseCurrencyItem( "fr_FR", "euros8",   "\u20AC8",          0,  0,  2,  8,  "EUR" ),
-                new ParseCurrencyItem( "fr_FR", "dollars2", "$2.00",            0,  0,  0,  0,  ""    ),
-                new ParseCurrencyItem( "fr_FR", "dollars4", "$4",               0,  0,  0,  0,  ""    ),
+                new ParseCurrencyItem( "fr_FR", "euros4",   "4,00\u00A0\u20AC", 6,  4,  "EUR" ),
+                new ParseCurrencyItem( "fr_FR", "euros6",   "6\u00A0\u20AC",    3,  6,  "EUR" ),
+                new ParseCurrencyItem( "fr_FR", "euros8",   "\u20AC8",          2,  8,  "EUR" ),
+                new ParseCurrencyItem( "fr_FR", "dollars2", "$2.00",            0,  0,  ""    ),
+                new ParseCurrencyItem( "fr_FR", "dollars4", "$4",               0,  0,  ""    ),
         };
         for (ParseCurrencyItem item: parseCurrencyItems) {
             String localeString = item.getLocaleString();
@@ -893,14 +889,14 @@
             ParsePosition parsePos = new ParsePosition(0);
 
             Number numVal = fmt.parse(currStr, parsePos);
-            if ( parsePos.getIndex() != item.getNumExpectPos() || (numVal != null && numVal.intValue() != item.getNumExpectVal()) ) {
+            if ( parsePos.getIndex() != item.getCurExpectPos() || (numVal != null && numVal.intValue() != item.getCurExpectVal()) ) {
                 if (numVal != null) {
                     errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() +
-                            ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() +
+                            ", expect pos/val " + item.getCurExpectPos() + "/" + item.getCurExpectVal() +
                             ", get " + parsePos.getIndex() + "/" + numVal.intValue() );
                 } else {
                     errln("NumberFormat.getCurrencyInstance parse " + localeString + "/" + item.getDescrip() +
-                            ", expect pos/val " + item.getNumExpectPos() + "/" + item.getNumExpectVal() +
+                            ", expect pos/val " + item.getCurExpectPos() + "/" + item.getCurExpectVal() +
                             ", get " + parsePos.getIndex() + "/(NULL)" );
                 }
             }
@@ -928,7 +924,7 @@
         DecimalFormat df = new DecimalFormat("#,##0.00 ¤¤");
         ParsePosition ppos = new ParsePosition(0);
         df.parseCurrency("1.00 us denmark", ppos);
-        assertEquals("Expected to fail on 'us denmark' string", 9, ppos.getErrorIndex());
+        assertEquals("Expected to fail on 'us denmark' string", 4, ppos.getErrorIndex());
     }
 
     @Test
@@ -2806,6 +2802,7 @@
                 "0.0",         // single zero before decimal followed by digit is not leading
                 "0. ",         // same as above before period (or decimal) is not leading
                 "0.100,5",     // comma stops parse of decimal (no grouping)
+                "0.100,,5",    // two commas also stops parse
                 ".00",         // leading decimal is ok, even with zeros
                 "1234567",     // group separators are not required
                 "12345, ",     // comma not followed by digit is not a group separator, but end of number
@@ -2826,7 +2823,6 @@
                 ",1",        // leading group separator before digit
                 ",.02",      // leading group separator before decimal
                 "1,.02",     // group separator before decimal
-                "1,,200",    // multiple group separators
                 "1,45",      // wrong number of digits in primary group
                 "1,45 that", // wrong number of digits in primary group
                 "1,45.34",   // wrong number of digits in primary group
@@ -2961,9 +2957,8 @@
         for (int i = 0; i < defaultNonLong.length; i++) {
             try {
                 Number n = nf.parse(defaultNonLong[i]);
-                // For backwards compatibility with this test, BigDecimal is checked.
-                if ((n instanceof Long) || (n instanceof BigDecimal)) {
-                    errln("FAIL: parse returned a Long or a BigDecimal");
+                if (n instanceof Long) {
+                    errln("FAIL: parse returned a Long");
                 }
             } catch (ParseException e) {
                 errln("parse of '" + defaultNonLong[i] + "' threw exception: " + e);
@@ -4301,7 +4296,8 @@
                 result = parser.parse(value2ParseWithDecimal).doubleValue();
                 if(!hasDecimalPoint){
                     TestFmwk.errln("Parsing " + value2ParseWithDecimal + " should NOT have succeeded with " + testPattern[i] +
-                            " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired());
+                            " and isDecimalPointMatchRequired set to: " + parser.isDecimalPatternMatchRequired() +
+                            " (got: " + result + ")");
                 }
             } catch (ParseException e) {
                     // OK, should fail
@@ -4781,13 +4777,12 @@
         fmt.applyPattern("@@@E0");
         expect2(fmt, 1230000, "(1).(2)(3)E(6)");
 
-        // Grouping and decimal with multiple code points are not supported during parsing.
+        // Grouping and decimal with multiple code points (supported in parsing since ICU 61)
         symbols.setDecimalSeparatorString("~~");
         symbols.setGroupingSeparatorString("^^");
         fmt.setDecimalFormatSymbols(symbols);
         fmt.applyPattern("#,##0.0#");
-        assertEquals("Custom decimal and grouping separator string with multiple characters",
-                "(1)^^(2)(3)(4)^^(5)(6)(7)~~(8)(9)", fmt.format(1234567.89));
+        expect2(fmt, 1234567.89, "(1)^^(2)(3)(4)^^(5)(6)(7)~~(8)(9)");
 
         // Digits starting at U+1D7CE MATHEMATICAL BOLD DIGIT ZERO
         // These are all single code points, so parsing will work.
@@ -4884,7 +4879,9 @@
         df = new DecimalFormat("0%");
         assertEquals("Default division", 0.12001, df.parse("12.001%").doubleValue());
         df.setMathContext(fourDigits);
-        assertEquals("Division with fourDigits", 0.12, df.parse("12.001%").doubleValue());
+        // NOTE: Since ICU 61, division no longer occurs with percentage parsing.
+        // assertEquals("Division with fourDigits", 0.12, df.parse("12.001%").doubleValue());
+        assertEquals("Division with fourDigits", 0.12001, df.parse("12.001%").doubleValue());
         df.setMathContext(unlimitedCeiling);
         assertEquals("Division with unlimitedCeiling", 0.12001, df.parse("12.001%").doubleValue());
 
@@ -4894,11 +4891,13 @@
         String hugeNumberString = "9876543212345678987654321234567898765432123456789"; // 49 digits
         BigInteger huge34Digits = new BigInteger("9876543143209876985185182338271622000000");
         BigInteger huge4Digits = new BigInteger("9877000000000000000000000000000000000000");
-        assertEquals("Default extreme division", huge34Digits, df.parse(hugeNumberString));
+        BigInteger actual34Digits = ((BigDecimal) df.parse(hugeNumberString)).toBigIntegerExact();
+        assertEquals("Default extreme division", huge34Digits, actual34Digits);
         df.setMathContext(fourDigits);
-        assertEquals("Extreme division with fourDigits", huge4Digits, df.parse(hugeNumberString));
-        df.setMathContext(unlimitedCeiling);
+        BigInteger actual4Digits = ((BigDecimal) df.parse(hugeNumberString)).toBigIntegerExact();
+        assertEquals("Extreme division with fourDigits", huge4Digits, actual4Digits);
         try {
+            df.setMathContext(unlimitedCeiling);
             df.parse(hugeNumberString);
             fail("Extreme division with unlimitedCeiling should throw ArithmeticException");
         } catch (ArithmeticException e) {
@@ -5072,7 +5071,10 @@
     }
 
     @Test
+    @Ignore
     public void Test11686() {
+        // Only passes with slow mode.
+        // TODO: Re-enable this test with slow mode.
         DecimalFormat df = new DecimalFormat();
         df.setPositiveSuffix("0K");
         df.setNegativeSuffix("0N");
@@ -5329,6 +5331,50 @@
     }
 
     @Test
+    public void Test13453_AffixContent() {
+        DecimalFormat df = (DecimalFormat) DecimalFormat.getScientificInstance();
+        assertEquals("Scientific should NOT be included", "", df.getPositiveSuffix());
+
+        df = CompactDecimalFormat.getInstance(ULocale.ENGLISH, CompactDecimalFormat.CompactStyle.SHORT);
+        assertEquals("Compact should NOT be included", "", df.getPositiveSuffix());
+
+        df = (DecimalFormat) DecimalFormat.getInstance(NumberFormat.ISOCURRENCYSTYLE);
+        df.setCurrency(Currency.getInstance("GBP"));
+        assertEquals("ISO currency SHOULD be included", "GBP", df.getPositivePrefix());
+
+        df = (DecimalFormat) DecimalFormat.getInstance(NumberFormat.PLURALCURRENCYSTYLE);
+        df.setCurrency(Currency.getInstance("GBP"));
+        assertEquals("Plural name SHOULD be included", " British pounds", df.getPositiveSuffix());
+    }
+
+    @Test
+    public void Test11035_FormatCurrencyAmount() {
+        double amount = 12345.67;
+        String expected = "12,345$67 ​";
+        Currency cur = Currency.getInstance("PTE");
+
+        // Test three ways to set currency via API
+
+        ULocale loc1 = new ULocale("pt_PT");
+        NumberFormat fmt1 = NumberFormat.getCurrencyInstance(loc1);
+        fmt1.setCurrency(cur);
+        String actualSetCurrency = fmt1.format(amount);
+
+        ULocale loc2 = new ULocale("pt_PT@currency=PTE");
+        NumberFormat fmt2 = NumberFormat.getCurrencyInstance(loc2);
+        String actualLocaleString = fmt2.format(amount);
+
+        ULocale loc3 = new ULocale("pt_PT");
+        NumberFormat fmt3 = NumberFormat.getCurrencyInstance(loc3);
+        CurrencyAmount curAmt = new CurrencyAmount(amount, cur);
+        String actualCurrencyAmount = fmt3.format(curAmt);
+
+        assertEquals("Custom Currency Pattern, Set Currency", expected, actualSetCurrency);
+        assertEquals("Custom Currency Pattern, Locale String", expected, actualCurrencyAmount);
+        assertEquals("Custom Currency Pattern, CurrencyAmount", expected, actualLocaleString);
+    }
+
+    @Test
     public void testPercentZero() {
         DecimalFormat df = (DecimalFormat) NumberFormat.getPercentInstance();
         String actual = df.format(0);
@@ -5472,7 +5518,8 @@
         ParsePosition ppos = new ParsePosition(0);
         Number n1 = df.parse(str, ppos);
         Number n2 = df.parse(str, ppos);
-        assertEquals("Should parse 12 and -5", 7, n1.intValue() + n2.intValue());
+        assertEquals("Should parse 12 and -5", 12, n1.intValue());
+        assertEquals("Should parse 12 and -5", -5, n2.intValue());
     }
 
     @Test
@@ -5495,7 +5542,9 @@
         assertEquals("Quote should be escapable in padding syntax", "a''12b", result);
     }
 
+    // TODO: Investigate this test and re-enable if appropriate.
     @Test
+    @Ignore
     public void testParseAmbiguousAffixes() {
         BigDecimal positive = new BigDecimal("0.0567");
         BigDecimal negative = new BigDecimal("-0.0567");
@@ -5537,7 +5586,7 @@
         assertEquals("Should consume the trailing bidi since it is in the symbol", 5, ppos.getIndex());
         ppos.setIndex(0);
         result = df.parse("-42a\u200E ", ppos);
-        assertEquals("Should parse as percent", new BigDecimal("-0.42"), result);
+        assertEquals("Should parse as percent", -0.42, result.doubleValue());
         assertEquals("Should not consume the trailing bidi or whitespace", 4, ppos.getIndex());
 
         // A few more cases based on the docstring:
@@ -5644,88 +5693,6 @@
     }
 
     @Test
-    public void testParseGroupingMode() {
-        ULocale[] locales = {         // GROUPING   DECIMAL
-                new ULocale("en-US"), // comma      period
-                new ULocale("fr-FR"), // space      comma
-                new ULocale("de-CH"), // apostrophe period
-                new ULocale("es-PY")  // period     comma
-        };
-        String[] inputs = {
-                "12,345.67",
-                "12 345,67",
-                "12'345.67",
-                "12.345,67",
-                "12,345",
-                "12 345",
-                "12'345",
-                "12.345"
-        };
-        BigDecimal[] outputs = {
-                new BigDecimal("12345.67"),
-                new BigDecimal("12345.67"),
-                new BigDecimal("12345.67"),
-                new BigDecimal("12345.67"),
-                new BigDecimal("12345"),
-                new BigDecimal("12345"),
-                new BigDecimal("12345"),
-                new BigDecimal("12345")
-        };
-        int[][] expecteds = {
-                // 0 => works in neither default nor restricted
-                // 1 => works in default but not restricted
-                // 2 => works in restricted but not default (should not happen)
-                // 3 => works in both default and restricted
-                //
-                // C=comma, P=period, S=space, A=apostrophe
-                // C+P    S+C    A+P    P+C    C-only  S-only   A-only   P-only
-                {  3,     0,     1,     0,     3,      1,       1,       0  }, // => en-US
-                {  0,     3,     0,     1,     0,      3,       3,       1  }, // => fr-FR
-                {  1,     0,     3,     0,     1,      3,       3,       0  }, // => de-CH
-                {  0,     1,     0,     3,     0,      1,       1,       3  }  // => es-PY
-        };
-
-        for (int i=0; i<locales.length; i++) {
-            ULocale loc = locales[i];
-            DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(loc);
-            df.setParseBigDecimal(true);
-            for (int j=0; j<inputs.length; j++) {
-                String input = inputs[j];
-                BigDecimal output = outputs[j];
-                int expected = expecteds[i][j];
-
-                // TODO(sffc): Uncomment after ICU 60 API proposal
-                //df.setParseGroupingMode(null);
-                //assertEquals("Getter should return null", null, df.getParseGroupingMode());
-                ParsePosition ppos = new ParsePosition(0);
-                Number result = df.parse(input, ppos);
-                boolean actualNull = output.equals(result) && (ppos.getIndex() == input.length());
-                assertEquals("Locale " + loc + ", string \"" + input + "\", DEFAULT, "
-                        + "actual result: " + result + " (ppos: " + ppos.getIndex() + ")",
-                        (expected & 1) != 0, actualNull);
-
-                // TODO(sffc): Uncomment after ICU 60 API proposal
-                //df.setParseGroupingMode(GroupingMode.DEFAULT);
-                //assertEquals("Getter should return new value", GroupingMode.DEFAULT, df.getParseGroupingMode());
-                //ppos = new ParsePosition(0);
-                //result = df.parse(input, ppos);
-                //boolean actualDefault = output.equals(result) && (ppos.getIndex() == input.length());
-                //assertEquals("Result from null should be the same as DEFAULT", actualNull, actualDefault);
-
-                // TODO(sffc): Uncomment after ICU 60 API proposal
-                //df.setParseGroupingMode(GroupingMode.RESTRICTED);
-                //assertEquals("Getter should return new value", GroupingMode.RESTRICTED, df.getParseGroupingMode());
-                //ppos = new ParsePosition(0);
-                //result = df.parse(input, ppos);
-                //boolean actualRestricted = output.equals(result) && (ppos.getIndex() == input.length());
-                //assertEquals("Locale " + loc + ", string \"" + input + "\", RESTRICTED, "
-                //        + "actual result: " + result + " (ppos: " + ppos.getIndex() + ")",
-                //        (expected & 2) != 0, actualRestricted);
-            }
-        }
-    }
-
-    @Test
     public void testParseNoExponent() throws ParseException {
         DecimalFormat df = new DecimalFormat();
         assertEquals("Parse no exponent has wrong default", false, df.getParseNoExponent());
@@ -5933,4 +5900,76 @@
         // expect(currencyFormat, 0.08, "CA$0.1");  // ICU 58 and down
         expect(currencyFormat, 0.08, "CA$0.10");  // ICU 59 and up
     }
+
+    @Test
+    public void testParsePositionIncrease() {
+        String input = "123\n456\n$789";
+        ParsePosition ppos = new ParsePosition(0);
+        DecimalFormat df = new DecimalFormat();
+        df.parse(input, ppos);
+        assertEquals("Should stop after first entry", 3, ppos.getIndex());
+        ppos.setIndex(ppos.getIndex() + 1);
+        df.parse(input, ppos);
+        assertEquals("Should stop after second entry", 7, ppos.getIndex());
+        ppos.setIndex(ppos.getIndex() + 1);
+        df.parseCurrency(input, ppos); // test parseCurrency API as well
+        assertEquals("Should stop after third entry", 12, ppos.getIndex());
+    }
+
+    @Test
+    public void testTrailingMinusSign() {
+        String input = "52-";
+        DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(ULocale.ENGLISH);
+        ParsePosition ppos = new ParsePosition(0);
+        Number result = df.parse(input, ppos);
+        assertEquals("Trailing sign should NOT be accepted after the number in English by default",
+                52.0,
+                result.doubleValue(),
+                0.0);
+        df.applyPattern("#;#-");
+        ppos.setIndex(0);
+        result = df.parse(input, ppos);
+        assertEquals("Trailing sign SHOULD be accepted if there is one in the pattern",
+                -52.0,
+                result.doubleValue(),
+                0.0);
+    }
+
+    @Test
+    public void test13684_FrenchPercentParsing() {
+        NumberFormat numberFormat = NumberFormat.getPercentInstance(ULocale.FRENCH);
+        numberFormat.setParseStrict(true);
+        ParsePosition ppos = new ParsePosition(0);
+        Number percentage = numberFormat.parse("8\u00A0%", ppos);
+        assertEquals("Should parse successfully", 0.08, percentage.doubleValue());
+        assertEquals("Should consume whole string", 3, ppos.getIndex());
+    }
+
+    @Test
+    public void testParsePercentRegression() {
+        DecimalFormat df1 = (DecimalFormat) NumberFormat.getInstance(ULocale.ENGLISH);
+        DecimalFormat df2 = (DecimalFormat) NumberFormat.getPercentInstance(ULocale.ENGLISH);
+        df1.setParseStrict(false);
+        df2.setParseStrict(false);
+
+        {
+            ParsePosition ppos = new ParsePosition(0);
+            Number result = df1.parse("50%", ppos);
+            assertEquals("df1 should accept a number but not the percent sign", 2, ppos.getIndex());
+            assertEquals("df1 should return the number as 50", 50.0, result.doubleValue());
+        }
+        {
+            ParsePosition ppos = new ParsePosition(0);
+            Number result = df2.parse("50%", ppos);
+            assertEquals("df2 should accept the percent sign", 3, ppos.getIndex());
+            assertEquals("df2 should return the number as 0.5", 0.5, result.doubleValue());
+        }
+        {
+            ParsePosition ppos = new ParsePosition(0);
+            Number result = df2.parse("50", ppos);
+            assertEquals("df2 should return the number as 0.5 even though the percent sign is missing",
+                    0.5,
+                    result.doubleValue());
+        }
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTestCases.txt b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTestCases.txt
index 14b5219..18cb765 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTestCases.txt
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTestCases.txt
@@ -109,7 +109,7 @@
 p: -              "1,234,56" 1.234
 p: -              "1。234、56" 1234.56
 
-loc= "ar"
+loc= "ar-EG"
 p: -              "1234٫56" 1234.56
 p: -              "1234،56" 1234.56
 p: -              "1234،56" 1234.56
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRangesTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRangesTest.java
index 5f8b81f..8b05de3 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRangesTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRangesTest.java
@@ -10,6 +10,7 @@
 
 import java.util.Arrays;
 
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -72,6 +73,8 @@
         }
     }
 
+    // TODO: Re-enable this test when #12454 is fixed.
+    @Ignore("http://bugs.icu-project.org/trac/ticket/12454")
     @Test
     public void TestFormatting() {
         Object[][] tests = {
@@ -108,7 +111,9 @@
             MeasureFormat mf = MeasureFormat.getInstance(locale, width);
             Object actual;
             try {
-                actual = mf.formatMeasureRange(new Measure(low, unit), new Measure(high, unit));
+                // TODO: Fix this when range formatting is added again.
+                // To let the code compile, the following line does list formatting.
+                actual = mf.formatMeasures(new Measure(low, unit), new Measure(high, unit));
             } catch (Exception e) {
                 actual = e.getClass();
             }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java
index 5f4a010..64d9138 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/PluralRulesTest.java
@@ -994,7 +994,7 @@
             "pt_PT; one: @integer 1; other: @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …",
             "da; one: @integer 1; other: @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …",
             "is; one: @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …; other: @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …",
-            "mk; one: @integer 1, 11, 21, 31, 41, 51, 61, 71, 101, 1001, …; other: @integer 0, 2~10, 12~17, 100, 1000, 10000, 100000, 1000000, …",
+            "mk; one: @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …; other: @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …",
             "fil,tl; one: @integer 0~3, 5, 7, 8, 10~13, 15, 17, 18, 20, 21, 100, 1000, 10000, 100000, 1000000, …; other: @integer 4, 6, 9, 14, 16, 19, 24, 26, 104, 1004, …",
 
             // [zero, one, other]
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RBNFParseTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RBNFParseTest.java
index dfdf022..daf1219 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RBNFParseTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/RBNFParseTest.java
@@ -8,6 +8,7 @@
  */
 package com.ibm.icu.dev.test.format;
 
+import java.text.ParseException;
 import java.util.Locale;
 
 import org.junit.Test;
@@ -161,4 +162,22 @@
         logln("rbnf_fr:" + rbnf_en.getDefaultRuleSetName());
         parseList(rbnf_en, rbnf_fr, lists);
     }
+
+    @Test
+    public void TestBadParse() {
+        RuleBasedNumberFormat rbnf = new RuleBasedNumberFormat(Locale.JAPAN, RuleBasedNumberFormat.SPELLOUT);
+        String[] testData = {
+                "・・・・・・・・・・・・・・・・・・・・・・・・",
+        };
+
+        for (String testString : testData) {
+            try {
+                rbnf.parse(testString);
+                errln("Unexpected success: " + testString);
+            }
+            catch (ParseException e) {
+                // success!
+            }
+        }
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/impl/StringSegmentTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/impl/StringSegmentTest.java
new file mode 100644
index 0000000..3434f64
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/impl/StringSegmentTest.java
@@ -0,0 +1,101 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.dev.test.impl;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import com.ibm.icu.impl.StringSegment;
+
+/**
+ * @author sffc
+ *
+ */
+public class StringSegmentTest {
+    static final String SAMPLE_STRING = "📻 radio 📻";
+
+    @Test
+    public void testOffset() {
+        StringSegment segment = new StringSegment(SAMPLE_STRING, false);
+        assertEquals(0, segment.getOffset());
+        segment.adjustOffsetByCodePoint();
+        assertEquals(2, segment.getOffset());
+        segment.adjustOffset(1);
+        assertEquals(3, segment.getOffset());
+        segment.adjustOffset(2);
+        assertEquals(5, segment.getOffset());
+        segment.setOffset(4);
+        assertEquals(4, segment.getOffset());
+    }
+
+    @Test
+    public void testLength() {
+        StringSegment segment = new StringSegment(SAMPLE_STRING, false);
+        assertEquals(11, segment.length());
+        segment.adjustOffset(3);
+        assertEquals(8, segment.length());
+        segment.setLength(4);
+        assertEquals(4, segment.length());
+        segment.setOffset(5);
+        assertEquals(2, segment.length());
+        segment.resetLength();
+        assertEquals(6, segment.length());
+    }
+
+    @Test
+    public void testCharAt() {
+        StringSegment segment = new StringSegment(SAMPLE_STRING, false);
+        assertCharSequenceEquals(SAMPLE_STRING, segment);
+        segment.adjustOffset(3);
+        assertCharSequenceEquals("radio 📻", segment);
+        segment.setLength(5);
+        assertCharSequenceEquals("radio", segment);
+    }
+
+    @Test
+    public void testGetCodePoint() {
+        StringSegment segment = new StringSegment(SAMPLE_STRING, false);
+        assertEquals(0x1F4FB, segment.getCodePoint());
+        segment.setLength(1);
+        assertEquals(0xD83D, segment.getCodePoint());
+        segment.resetLength();
+        segment.adjustOffset(1);
+        assertEquals(0xDCFB, segment.getCodePoint());
+        segment.adjustOffset(1);
+        assertEquals(0x20, segment.getCodePoint());
+    }
+
+    @Test
+    public void testCommonPrefixLength() {
+        StringSegment segment = new StringSegment(SAMPLE_STRING, true);
+        assertEquals(11, segment.getCommonPrefixLength(SAMPLE_STRING));
+        assertEquals(4, segment.getCommonPrefixLength("📻 r"));
+        assertEquals(3, segment.getCommonPrefixLength("📻 x"));
+        assertEquals(0, segment.getCommonPrefixLength("x"));
+        assertEquals(0, segment.getCommonPrefixLength(""));
+        segment.adjustOffset(3);
+        assertEquals(5, segment.getCommonPrefixLength("raDio"));
+        assertEquals(5, segment.getCommonPrefixLength("radio"));
+        assertEquals(2, segment.getCommonPrefixLength("rafio"));
+        assertEquals(0, segment.getCommonPrefixLength("fadio"));
+        assertEquals(0, segment.getCommonPrefixLength(""));
+        assertEquals(5, segment.getCaseSensitivePrefixLength("radio"));
+        assertEquals(2, segment.getCaseSensitivePrefixLength("raDio"));
+        segment.setLength(3);
+        assertEquals(3, segment.getCommonPrefixLength("radio"));
+        assertEquals(2, segment.getCommonPrefixLength("rafio"));
+        assertEquals(0, segment.getCommonPrefixLength("fadio"));
+        assertEquals(0, segment.getCommonPrefixLength(""));
+        segment.resetLength();
+        segment.setOffset(11); // end of string
+        assertEquals(0, segment.getCommonPrefixLength("foo"));
+    }
+
+    private static void assertCharSequenceEquals(CharSequence a, CharSequence b) {
+        assertEquals(a.length(), b.length());
+        for (int i = 0; i < a.length(); i++) {
+            assertEquals(a.charAt(i), b.charAt(i));
+        }
+    }
+}
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/lang/UCharacterCaseTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/lang/UCharacterCaseTest.java
index 09e4e2e..320b188 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/lang/UCharacterCaseTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/lang/UCharacterCaseTest.java
@@ -192,6 +192,28 @@
         }
     }
 
+    @Test
+    public void TestInvalidCodePointFolding() {
+        int[] invalidCodePoints = {
+                0xD800, // lead surrogate
+                0xDFFF, // trail surrogate
+                0xFDD0, // noncharacter
+                0xFFFF, // noncharacter
+                0x110000, // out of range
+                -1 // negative
+        };
+        for (int cp : invalidCodePoints) {
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, true));
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, false));
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, UCharacter.FOLD_CASE_DEFAULT));
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I));
+        }
+    }
+
     /**
      * Testing the strings case mapping methods
      */
@@ -458,19 +480,17 @@
                 }
             }
             else {
-                if (!SPECIAL_DATA_[j + 1].equals(
-                     UCharacter.toLowerCase(str))) {
+                String lower = UCharacter.toLowerCase(str);
+                if (!SPECIAL_DATA_[j + 1].equals(lower)) {
                     errln("error lowercasing special characters " +
                         hex(str) + " expected " + SPECIAL_DATA_[j + 1] +
-                        " but got " +
-                        hex(UCharacter.toLowerCase(locale, str)));
+                        " but got " + hex(lower));
                 }
-                if (!SPECIAL_DATA_[j + 2].equals(
-                     UCharacter.toUpperCase(locale, str))) {
+                String upper = UCharacter.toUpperCase(str);
+                if (!SPECIAL_DATA_[j + 2].equals(upper)) {
                     errln("error uppercasing special characters " +
                         hex(str) + " expected " + SPECIAL_DATA_[j + 2] +
-                        " but got " +
-                        hex(UCharacter.toUpperCase(locale, str)));
+                        " but got " + hex(upper));
                 }
             }
         }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/lang/UnicodeSetTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/lang/UnicodeSetTest.java
index 5ebaa91..ecb6767 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/lang/UnicodeSetTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/lang/UnicodeSetTest.java
@@ -2773,4 +2773,23 @@
         } catch (IllegalArgumentException expected) {
         }
     }
+
+    @Test
+    public void TestDeepPattern() {
+        // Nested ranges are parsed via recursion which can use a lot of stack space.
+        // After a reasonable limit, we should get an error.
+        final int DEPTH = 20000;
+        StringBuilder pattern = new StringBuilder();
+        StringBuilder suffix = new StringBuilder();
+        for (int i = 0; i < DEPTH; ++i) {
+            pattern.append("[a");
+            suffix.append(']');
+        }
+        pattern.append(suffix);
+        try {
+            new UnicodeSet(pattern.toString());
+            fail("[a[a[a...1000s...]]] did not throw an exception");
+        } catch(RuntimeException expected) {
+        }
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/AffixUtilsTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/AffixUtilsTest.java
index fe77028..6696daa 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/AffixUtilsTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/AffixUtilsTest.java
@@ -10,217 +10,235 @@
 import com.ibm.icu.impl.number.AffixUtils;
 import com.ibm.icu.impl.number.AffixUtils.SymbolProvider;
 import com.ibm.icu.impl.number.NumberStringBuilder;
+import com.ibm.icu.text.UnicodeSet;
 
 public class AffixUtilsTest {
 
-    private static final SymbolProvider DEFAULT_SYMBOL_PROVIDER =
-        new SymbolProvider() {
-          @Override
-          public CharSequence getSymbol(int type) {
+    private static final SymbolProvider DEFAULT_SYMBOL_PROVIDER = new SymbolProvider() {
+        @Override
+        public CharSequence getSymbol(int type) {
             // Use interesting symbols where possible. The symbols are from ar_SA but are hard-coded
             // here to make the test independent of locale data changes.
             switch (type) {
-              case AffixUtils.TYPE_MINUS_SIGN:
+            case AffixUtils.TYPE_MINUS_SIGN:
                 return "−";
-              case AffixUtils.TYPE_PLUS_SIGN:
+            case AffixUtils.TYPE_PLUS_SIGN:
                 return "\u061C+";
-              case AffixUtils.TYPE_PERCENT:
+            case AffixUtils.TYPE_PERCENT:
                 return "٪\u061C";
-              case AffixUtils.TYPE_PERMILLE:
+            case AffixUtils.TYPE_PERMILLE:
                 return "؉";
-              case AffixUtils.TYPE_CURRENCY_SINGLE:
+            case AffixUtils.TYPE_CURRENCY_SINGLE:
                 return "$";
-              case AffixUtils.TYPE_CURRENCY_DOUBLE:
+            case AffixUtils.TYPE_CURRENCY_DOUBLE:
                 return "XXX";
-              case AffixUtils.TYPE_CURRENCY_TRIPLE:
+            case AffixUtils.TYPE_CURRENCY_TRIPLE:
                 return "long name";
-              case AffixUtils.TYPE_CURRENCY_QUAD:
+            case AffixUtils.TYPE_CURRENCY_QUAD:
                 return "\uFFFD";
-              case AffixUtils.TYPE_CURRENCY_QUINT:
+            case AffixUtils.TYPE_CURRENCY_QUINT:
                 return "@";
-              case AffixUtils.TYPE_CURRENCY_OVERFLOW:
+            case AffixUtils.TYPE_CURRENCY_OVERFLOW:
                 return "\uFFFD";
-              default:
+            default:
                 throw new AssertionError();
             }
-          }
+        }
+    };
+
+    @Test
+    public void testEscape() {
+        Object[][] cases = {
+                { "", "" },
+                { "abc", "abc" },
+                { "-", "'-'" },
+                { "-!", "'-'!" },
+                { "−", "−" },
+                { "---", "'---'" },
+                { "-%-", "'-%-'" },
+                { "'", "''" },
+                { "-'", "'-'''" },
+                { "-'-", "'-''-'" },
+                { "a-'-", "a'-''-'" } };
+
+        StringBuilder sb = new StringBuilder();
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            String expected = (String) cas[1];
+            sb.setLength(0);
+            AffixUtils.escape(input, sb);
+            assertEquals(expected, sb.toString());
+        }
+    }
+
+    @Test
+    public void testUnescape() {
+        Object[][] cases = {
+                { "", false, 0, "" },
+                { "abc", false, 3, "abc" },
+                { "📺", false, 1, "📺" },
+                { "-", false, 1, "−" },
+                { "-!", false, 2, "−!" },
+                { "+", false, 1, "\u061C+" },
+                { "+!", false, 2, "\u061C+!" },
+                { "‰", false, 1, "؉" },
+                { "‰!", false, 2, "؉!" },
+                { "-x", false, 2, "−x" },
+                { "'-'x", false, 2, "-x" },
+                { "'--''-'-x", false, 6, "--'-−x" },
+                { "''", false, 1, "'" },
+                { "''''", false, 2, "''" },
+                { "''''''", false, 3, "'''" },
+                { "''x''", false, 3, "'x'" },
+                { "¤", true, 1, "$" },
+                { "¤¤", true, 2, "XXX" },
+                { "¤¤¤", true, 3, "long name" },
+                { "¤¤¤¤", true, 4, "\uFFFD" },
+                { "¤¤¤¤¤", true, 5, "@" },
+                { "¤¤¤¤¤¤", true, 6, "\uFFFD" },
+                { "¤¤¤a¤¤¤¤", true, 8, "long namea\uFFFD" },
+                { "a¤¤¤¤b¤¤¤¤¤c", true, 12, "a\uFFFDb@c" },
+                { "¤!", true, 2, "$!" },
+                { "¤¤!", true, 3, "XXX!" },
+                { "¤¤¤!", true, 4, "long name!" },
+                { "-¤¤", true, 3, "−XXX" },
+                { "¤¤-", true, 3, "XXX−" },
+                { "'¤'", false, 1, "¤" },
+                { "%", false, 1, "٪\u061C" },
+                { "'%'", false, 1, "%" },
+                { "¤'-'%", true, 3, "$-٪\u061C" },
+                { "#0#@#*#;#", false, 9, "#0#@#*#;#" } };
+
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            boolean curr = (Boolean) cas[1];
+            int length = (Integer) cas[2];
+            String output = (String) cas[3];
+
+            assertEquals("Currency on <" + input + ">", curr, AffixUtils.hasCurrencySymbols(input));
+            assertEquals("Length on <" + input + ">", length, AffixUtils.estimateLength(input));
+
+            String actual = unescapeWithDefaults(input);
+            assertEquals("Output on <" + input + ">", output, actual);
+
+            int ulength = AffixUtils.unescapedCount(input, true, DEFAULT_SYMBOL_PROVIDER);
+            assertEquals("Unescaped length on <" + input + ">", output.length(), ulength);
+
+            int ucpcount = AffixUtils.unescapedCount(input, false, DEFAULT_SYMBOL_PROVIDER);
+            assertEquals("Unescaped length on <" + input + ">",
+                    output.codePointCount(0, output.length()),
+                    ucpcount);
+        }
+    }
+
+    @Test
+    public void testContainsReplaceType() {
+        Object[][] cases = {
+                { "", false, "" },
+                { "-", true, "+" },
+                { "-a", true, "+a" },
+                { "a-", true, "a+" },
+                { "a-b", true, "a+b" },
+                { "--", true, "++" },
+                { "x", false, "x" } };
+
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            boolean hasMinusSign = (Boolean) cas[1];
+            String output = (String) cas[2];
+
+            assertEquals("Contains on input " + input,
+                    hasMinusSign,
+                    AffixUtils.containsType(input, AffixUtils.TYPE_MINUS_SIGN));
+            assertEquals("Replace on input" + input,
+                    output,
+                    AffixUtils.replaceType(input, AffixUtils.TYPE_MINUS_SIGN, '+'));
+        }
+    }
+
+    @Test
+    public void testInvalid() {
+        String[] invalidExamples = { "'", "x'", "'x", "'x''", "''x'" };
+
+        for (String str : invalidExamples) {
+            try {
+                AffixUtils.hasCurrencySymbols(str);
+                fail("No exception was thrown on an invalid string");
+            } catch (IllegalArgumentException e) {
+                // OK
+            }
+            try {
+                AffixUtils.estimateLength(str);
+                fail("No exception was thrown on an invalid string");
+            } catch (IllegalArgumentException e) {
+                // OK
+            }
+            try {
+                unescapeWithDefaults(str);
+                fail("No exception was thrown on an invalid string");
+            } catch (IllegalArgumentException e) {
+                // OK
+            }
+        }
+    }
+
+    @Test
+    public void testUnescapeWithSymbolProvider() {
+        String[][] cases = {
+                { "", "" },
+                { "-", "1" },
+                { "'-'", "-" },
+                { "- + % ‰ ¤ ¤¤ ¤¤¤ ¤¤¤¤ ¤¤¤¤¤", "1 2 3 4 5 6 7 8 9" },
+                { "'¤¤¤¤¤¤'", "¤¤¤¤¤¤" },
+                { "¤¤¤¤¤¤", "\uFFFD" } };
+
+        SymbolProvider provider = new SymbolProvider() {
+            @Override
+            public CharSequence getSymbol(int type) {
+                return Integer.toString(Math.abs(type));
+            }
         };
 
-  @Test
-  public void testEscape() {
-    Object[][] cases = {
-      {"", ""},
-      {"abc", "abc"},
-      {"-", "'-'"},
-      {"-!", "'-'!"},
-      {"−", "−"},
-      {"---", "'---'"},
-      {"-%-", "'-%-'"},
-      {"'", "''"},
-      {"-'", "'-'''"},
-      {"-'-", "'-''-'"},
-      {"a-'-", "a'-''-'"}
-    };
+        NumberStringBuilder sb = new NumberStringBuilder();
+        for (String[] cas : cases) {
+            String input = cas[0];
+            String expected = cas[1];
+            sb.clear();
+            AffixUtils.unescape(input, sb, 0, provider);
+            assertEquals("With symbol provider on <" + input + ">", expected, sb.toString());
+        }
 
-    StringBuilder sb = new StringBuilder();
-    for (Object[] cas : cases) {
-      String input = (String) cas[0];
-      String expected = (String) cas[1];
-      sb.setLength(0);
-      AffixUtils.escape(input, sb);
-      assertEquals(expected, sb.toString());
-    }
-  }
-
-  @Test
-  public void testUnescape() {
-    Object[][] cases = {
-      {"", false, 0, ""},
-      {"abc", false, 3, "abc"},
-      {"-", false, 1, "−"},
-      {"-!", false, 2, "−!"},
-      {"+", false, 1, "\u061C+"},
-      {"+!", false, 2, "\u061C+!"},
-      {"‰", false, 1, "؉"},
-      {"‰!", false, 2, "؉!"},
-      {"-x", false, 2, "−x"},
-      {"'-'x", false, 2, "-x"},
-      {"'--''-'-x", false, 6, "--'-−x"},
-      {"''", false, 1, "'"},
-      {"''''", false, 2, "''"},
-      {"''''''", false, 3, "'''"},
-      {"''x''", false, 3, "'x'"},
-      {"¤", true, 1, "$"},
-      {"¤¤", true, 2, "XXX"},
-      {"¤¤¤", true, 3, "long name"},
-      {"¤¤¤¤", true, 4, "\uFFFD"},
-      {"¤¤¤¤¤", true, 5, "@"},
-      {"¤¤¤¤¤¤", true, 6, "\uFFFD"},
-      {"¤¤¤a¤¤¤¤", true, 8, "long namea\uFFFD"},
-      {"a¤¤¤¤b¤¤¤¤¤c", true, 12, "a\uFFFDb@c"},
-      {"¤!", true, 2, "$!"},
-      {"¤¤!", true, 3, "XXX!"},
-      {"¤¤¤!", true, 4, "long name!"},
-      {"-¤¤", true, 3, "−XXX"},
-      {"¤¤-", true, 3, "XXX−"},
-      {"'¤'", false, 1, "¤"},
-      {"%", false, 1, "٪\u061C"},
-      {"'%'", false, 1, "%"},
-      {"¤'-'%", true, 3, "$-٪\u061C"},
-      {"#0#@#*#;#", false, 9, "#0#@#*#;#"}
-    };
-
-    for (Object[] cas : cases) {
-      String input = (String) cas[0];
-      boolean curr = (Boolean) cas[1];
-      int length = (Integer) cas[2];
-      String output = (String) cas[3];
-
-      assertEquals(
-          "Currency on <" + input + ">", curr, AffixUtils.hasCurrencySymbols(input));
-      assertEquals("Length on <" + input + ">", length, AffixUtils.estimateLength(input));
-
-      String actual = unescapeWithDefaults(input);
-      assertEquals("Output on <" + input + ">", output, actual);
-
-      int ulength = AffixUtils.unescapedCodePointCount(input, DEFAULT_SYMBOL_PROVIDER);
-      assertEquals("Unescaped length on <" + input + ">", output.length(), ulength);
-    }
-  }
-
-  @Test
-  public void testContainsReplaceType() {
-    Object[][] cases = {
-      {"", false, ""},
-      {"-", true, "+"},
-      {"-a", true, "+a"},
-      {"a-", true, "a+"},
-      {"a-b", true, "a+b"},
-      {"--", true, "++"},
-      {"x", false, "x"}
-    };
-
-    for (Object[] cas : cases) {
-      String input = (String) cas[0];
-      boolean hasMinusSign = (Boolean) cas[1];
-      String output = (String) cas[2];
-
-      assertEquals(
-          "Contains on input " + input,
-          hasMinusSign,
-          AffixUtils.containsType(input, AffixUtils.TYPE_MINUS_SIGN));
-      assertEquals(
-          "Replace on input" + input,
-          output,
-          AffixUtils.replaceType(input, AffixUtils.TYPE_MINUS_SIGN, '+'));
-    }
-  }
-
-  @Test
-  public void testInvalid() {
-    String[] invalidExamples = {"'", "x'", "'x", "'x''", "''x'"};
-
-    for (String str : invalidExamples) {
-      try {
-        AffixUtils.hasCurrencySymbols(str);
-        fail("No exception was thrown on an invalid string");
-      } catch (IllegalArgumentException e) {
-        // OK
-      }
-      try {
-        AffixUtils.estimateLength(str);
-        fail("No exception was thrown on an invalid string");
-      } catch (IllegalArgumentException e) {
-        // OK
-      }
-      try {
-        unescapeWithDefaults(str);
-        fail("No exception was thrown on an invalid string");
-      } catch (IllegalArgumentException e) {
-        // OK
-      }
-    }
-  }
-
-  @Test
-  public void testUnescapeWithSymbolProvider() {
-    String[][] cases = {
-      {"", ""},
-      {"-", "1"},
-      {"'-'", "-"},
-      {"- + % ‰ ¤ ¤¤ ¤¤¤ ¤¤¤¤ ¤¤¤¤¤", "1 2 3 4 5 6 7 8 9"},
-      {"'¤¤¤¤¤¤'", "¤¤¤¤¤¤"},
-      {"¤¤¤¤¤¤", "\uFFFD"}
-    };
-
-    SymbolProvider provider =
-        new SymbolProvider() {
-          @Override
-          public CharSequence getSymbol(int type) {
-            return Integer.toString(Math.abs(type));
-          }
-        };
-
-    NumberStringBuilder sb = new NumberStringBuilder();
-    for (String[] cas : cases) {
-      String input = cas[0];
-      String expected = cas[1];
-      sb.clear();
-      AffixUtils.unescape(input, sb, 0, provider);
-      assertEquals("With symbol provider on <" + input + ">", expected, sb.toString());
+        // Test insertion position
+        sb.clear();
+        sb.append("abcdefg", null);
+        AffixUtils.unescape("-+%", sb, 4, provider);
+        assertEquals("Symbol provider into middle", "abcd123efg", sb.toString());
     }
 
-    // Test insertion position
-    sb.clear();
-    sb.append("abcdefg", null);
-    AffixUtils.unescape("-+%", sb, 4, provider);
-    assertEquals("Symbol provider into middle", "abcd123efg", sb.toString());
-  }
+    @Test
+    public void testWithoutSymbolsOrIgnorables() {
+        Object[][] cases = {
+                { "", true },
+                { "-", true },
+                { " ", true },
+                { "'-'", false },
+                { " a + b ", false },
+                { "-a+b%c‰d¤e¤¤f¤¤¤g¤¤¤¤h¤¤¤¤¤i", false }, };
 
-  private static String unescapeWithDefaults(String input) {
-    NumberStringBuilder nsb = new NumberStringBuilder();
-    int length = AffixUtils.unescape(input, nsb, 0, DEFAULT_SYMBOL_PROVIDER);
-    assertEquals("Return value of unescape", nsb.length(), length);
-    return nsb.toString();
-  }
+        UnicodeSet ignorables = new UnicodeSet("[:whitespace:]");
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            boolean expected = (Boolean) cas[1];
+            assertEquals("Contains only symbols and ignorables: " + input,
+                    expected,
+                    AffixUtils.containsOnlySymbolsAndIgnorables(input, ignorables));
+        }
+    }
+
+    private static String unescapeWithDefaults(String input) {
+        NumberStringBuilder nsb = new NumberStringBuilder();
+        int length = AffixUtils.unescape(input, nsb, 0, DEFAULT_SYMBOL_PROVIDER);
+        assertEquals("Return value of unescape", nsb.length(), length);
+        return nsb.toString();
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/DecimalQuantityTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/DecimalQuantityTest.java
index 786ea1a..2e8c2ad 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/DecimalQuantityTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/DecimalQuantityTest.java
@@ -3,6 +3,7 @@
 package com.ibm.icu.dev.test.number;
 
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.math.MathContext;
 import java.math.RoundingMode;
 import java.text.ParseException;
@@ -15,13 +16,13 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
+import com.ibm.icu.dev.impl.number.DecimalQuantity_64BitBCD;
+import com.ibm.icu.dev.impl.number.DecimalQuantity_ByteArrayBCD;
+import com.ibm.icu.dev.impl.number.DecimalQuantity_SimpleStorage;
 import com.ibm.icu.dev.test.TestFmwk;
 import com.ibm.icu.impl.number.DecimalFormatProperties;
 import com.ibm.icu.impl.number.DecimalQuantity;
-import com.ibm.icu.impl.number.DecimalQuantity_64BitBCD;
-import com.ibm.icu.impl.number.DecimalQuantity_ByteArrayBCD;
 import com.ibm.icu.impl.number.DecimalQuantity_DualStorageBCD;
-import com.ibm.icu.impl.number.DecimalQuantity_SimpleStorage;
 import com.ibm.icu.number.LocalizedNumberFormatter;
 import com.ibm.icu.number.NumberFormatter;
 import com.ibm.icu.text.CompactDecimalFormat.CompactStyle;
@@ -31,490 +32,556 @@
 @RunWith(JUnit4.class)
 public class DecimalQuantityTest extends TestFmwk {
 
-  @Ignore
-  @Test
-  public void testBehavior() throws ParseException {
+    @Ignore
+    @Test
+    public void testBehavior() throws ParseException {
 
-    // Make a list of several formatters to test the behavior of DecimalQuantity.
-    List<LocalizedNumberFormatter> formats = new ArrayList<LocalizedNumberFormatter>();
+        // Make a list of several formatters to test the behavior of DecimalQuantity.
+        List<LocalizedNumberFormatter> formats = new ArrayList<LocalizedNumberFormatter>();
 
-    DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
 
-    DecimalFormatProperties properties = new DecimalFormatProperties();
-    formats.add(NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
+        DecimalFormatProperties properties = new DecimalFormatProperties();
+        formats.add(
+                NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
 
-    properties =
-        new DecimalFormatProperties()
-            .setMinimumSignificantDigits(3)
-            .setMaximumSignificantDigits(3)
-            .setCompactStyle(CompactStyle.LONG);
-    formats.add(NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
+        properties = new DecimalFormatProperties().setMinimumSignificantDigits(3)
+                .setMaximumSignificantDigits(3).setCompactStyle(CompactStyle.LONG);
+        formats.add(
+                NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
 
-    properties =
-        new DecimalFormatProperties()
-            .setMinimumExponentDigits(1)
-            .setMaximumIntegerDigits(3)
-            .setMaximumFractionDigits(1);
-    formats.add(NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
+        properties = new DecimalFormatProperties().setMinimumExponentDigits(1).setMaximumIntegerDigits(3)
+                .setMaximumFractionDigits(1);
+        formats.add(
+                NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
 
-    properties = new DecimalFormatProperties().setRoundingIncrement(new BigDecimal("0.5"));
-    formats.add(NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
+        properties = new DecimalFormatProperties().setRoundingIncrement(new BigDecimal("0.5"));
+        formats.add(
+                NumberFormatter.fromDecimalFormat(properties, symbols, null).locale(ULocale.ENGLISH));
 
-    String[] cases = {
-      "1.0",
-      "2.01",
-      "1234.56",
-      "3000.0",
-      "0.00026418",
-      "0.01789261",
-      "468160.0",
-      "999000.0",
-      "999900.0",
-      "999990.0",
-      "0.0",
-      "12345678901.0",
-      "-5193.48",
-    };
+        String[] cases = {
+                "1.0",
+                "2.01",
+                "1234.56",
+                "3000.0",
+                "0.00026418",
+                "0.01789261",
+                "468160.0",
+                "999000.0",
+                "999900.0",
+                "999990.0",
+                "0.0",
+                "12345678901.0",
+                "-5193.48", };
 
-    String[] hardCases = {
-      "9999999999999900.0",
-      "789000000000000000000000.0",
-      "789123123567853156372158.0",
-      "987654321987654321987654321987654321987654311987654321.0",
-    };
+        String[] hardCases = {
+                "9999999999999900.0",
+                "789000000000000000000000.0",
+                "789123123567853156372158.0",
+                "987654321987654321987654321987654321987654311987654321.0", };
 
-    String[] doubleCases = {
-      "512.0000000000017",
-      "4095.9999999999977",
-      "4095.999999999998",
-      "4095.9999999999986",
-      "4095.999999999999",
-      "4095.9999999999995",
-      "4096.000000000001",
-      "4096.000000000002",
-      "4096.000000000003",
-      "4096.000000000004",
-      "4096.000000000005",
-      "4096.0000000000055",
-      "4096.000000000006",
-      "4096.000000000007",
-    };
+        String[] doubleCases = {
+                "512.0000000000017",
+                "4095.9999999999977",
+                "4095.999999999998",
+                "4095.9999999999986",
+                "4095.999999999999",
+                "4095.9999999999995",
+                "4096.000000000001",
+                "4096.000000000002",
+                "4096.000000000003",
+                "4096.000000000004",
+                "4096.000000000005",
+                "4096.0000000000055",
+                "4096.000000000006",
+                "4096.000000000007", };
 
-    int i = 0;
-    for (String str : cases) {
-      testDecimalQuantity(i++, str, formats, 0);
+        int i = 0;
+        for (String str : cases) {
+            testDecimalQuantity(i++, str, formats, 0);
+        }
+
+        i = 0;
+        for (String str : hardCases) {
+            testDecimalQuantity(i++, str, formats, 1);
+        }
+
+        i = 0;
+        for (String str : doubleCases) {
+            testDecimalQuantity(i++, str, formats, 2);
+        }
     }
 
-    i = 0;
-    for (String str : hardCases) {
-      testDecimalQuantity(i++, str, formats, 1);
+    static void testDecimalQuantity(
+            int t,
+            String str,
+            List<LocalizedNumberFormatter> formats,
+            int mode) {
+        if (mode == 2) {
+            assertEquals("Double is not valid", Double.toString(Double.parseDouble(str)), str);
+        }
+
+        List<DecimalQuantity> qs = new ArrayList<DecimalQuantity>();
+        BigDecimal d = new BigDecimal(str);
+        qs.add(new DecimalQuantity_SimpleStorage(d));
+        if (mode == 0)
+            qs.add(new DecimalQuantity_64BitBCD(d));
+        qs.add(new DecimalQuantity_ByteArrayBCD(d));
+        qs.add(new DecimalQuantity_DualStorageBCD(d));
+
+        if (new BigDecimal(Double.toString(d.doubleValue())).compareTo(d) == 0) {
+            double dv = d.doubleValue();
+            qs.add(new DecimalQuantity_SimpleStorage(dv));
+            if (mode == 0)
+                qs.add(new DecimalQuantity_64BitBCD(dv));
+            qs.add(new DecimalQuantity_ByteArrayBCD(dv));
+            qs.add(new DecimalQuantity_DualStorageBCD(dv));
+        }
+
+        if (new BigDecimal(Long.toString(d.longValue())).compareTo(d) == 0) {
+            double lv = d.longValue();
+            qs.add(new DecimalQuantity_SimpleStorage(lv));
+            if (mode == 0)
+                qs.add(new DecimalQuantity_64BitBCD(lv));
+            qs.add(new DecimalQuantity_ByteArrayBCD(lv));
+            qs.add(new DecimalQuantity_DualStorageBCD(lv));
+        }
+
+        testDecimalQuantityExpectedOutput(qs.get(0), str);
+
+        if (qs.size() == 1) {
+            return;
+        }
+
+        for (int i = 1; i < qs.size(); i++) {
+            DecimalQuantity q0 = qs.get(0);
+            DecimalQuantity q1 = qs.get(i);
+            testDecimalQuantityExpectedOutput(q1, str);
+            testDecimalQuantityRounding(q0, q1);
+            testDecimalQuantityRoundingInterval(q0, q1);
+            testDecimalQuantityMath(q0, q1);
+            testDecimalQuantityWithFormats(q0, q1, formats);
+        }
     }
 
-    i = 0;
-    for (String str : doubleCases) {
-      testDecimalQuantity(i++, str, formats, 2);
-    }
-  }
-
-  static void testDecimalQuantity(int t, String str, List<LocalizedNumberFormatter> formats, int mode) {
-    if (mode == 2) {
-      assertEquals("Double is not valid", Double.toString(Double.parseDouble(str)), str);
+    private static void testDecimalQuantityExpectedOutput(DecimalQuantity rq, String expected) {
+        DecimalQuantity q0 = rq.createCopy();
+        // Force an accurate double
+        q0.roundToInfinity();
+        q0.setIntegerLength(1, Integer.MAX_VALUE);
+        q0.setFractionLength(1, Integer.MAX_VALUE);
+        String actual = q0.toPlainString();
+        assertEquals("Unexpected output from simple string conversion (" + q0 + ")", expected, actual);
     }
 
-    List<DecimalQuantity> qs = new ArrayList<DecimalQuantity>();
-    BigDecimal d = new BigDecimal(str);
-    qs.add(new DecimalQuantity_SimpleStorage(d));
-    if (mode == 0) qs.add(new DecimalQuantity_64BitBCD(d));
-    qs.add(new DecimalQuantity_ByteArrayBCD(d));
-    qs.add(new DecimalQuantity_DualStorageBCD(d));
+    private static final MathContext MATH_CONTEXT_HALF_EVEN = new MathContext(0, RoundingMode.HALF_EVEN);
+    private static final MathContext MATH_CONTEXT_CEILING = new MathContext(0, RoundingMode.CEILING);
+    @SuppressWarnings("unused")
+    private static final MathContext MATH_CONTEXT_FLOOR = new MathContext(0, RoundingMode.FLOOR);
+    private static final MathContext MATH_CONTEXT_PRECISION = new MathContext(3, RoundingMode.HALF_UP);
 
-    if (new BigDecimal(Double.toString(d.doubleValue())).compareTo(d) == 0) {
-      double dv = d.doubleValue();
-      qs.add(new DecimalQuantity_SimpleStorage(dv));
-      if (mode == 0) qs.add(new DecimalQuantity_64BitBCD(dv));
-      qs.add(new DecimalQuantity_ByteArrayBCD(dv));
-      qs.add(new DecimalQuantity_DualStorageBCD(dv));
+    private static void testDecimalQuantityRounding(DecimalQuantity rq0, DecimalQuantity rq1) {
+        DecimalQuantity q0 = rq0.createCopy();
+        DecimalQuantity q1 = rq1.createCopy();
+        q0.roundToMagnitude(-1, MATH_CONTEXT_HALF_EVEN);
+        q1.roundToMagnitude(-1, MATH_CONTEXT_HALF_EVEN);
+        testDecimalQuantityBehavior(q0, q1);
+
+        q0 = rq0.createCopy();
+        q1 = rq1.createCopy();
+        q0.roundToMagnitude(-1, MATH_CONTEXT_CEILING);
+        q1.roundToMagnitude(-1, MATH_CONTEXT_CEILING);
+        testDecimalQuantityBehavior(q0, q1);
+
+        q0 = rq0.createCopy();
+        q1 = rq1.createCopy();
+        q0.roundToMagnitude(-1, MATH_CONTEXT_PRECISION);
+        q1.roundToMagnitude(-1, MATH_CONTEXT_PRECISION);
+        testDecimalQuantityBehavior(q0, q1);
     }
 
-    if (new BigDecimal(Long.toString(d.longValue())).compareTo(d) == 0) {
-      double lv = d.longValue();
-      qs.add(new DecimalQuantity_SimpleStorage(lv));
-      if (mode == 0) qs.add(new DecimalQuantity_64BitBCD(lv));
-      qs.add(new DecimalQuantity_ByteArrayBCD(lv));
-      qs.add(new DecimalQuantity_DualStorageBCD(lv));
+    private static void testDecimalQuantityRoundingInterval(DecimalQuantity rq0, DecimalQuantity rq1) {
+        DecimalQuantity q0 = rq0.createCopy();
+        DecimalQuantity q1 = rq1.createCopy();
+        q0.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_HALF_EVEN);
+        q1.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_HALF_EVEN);
+        testDecimalQuantityBehavior(q0, q1);
+
+        q0 = rq0.createCopy();
+        q1 = rq1.createCopy();
+        q0.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_CEILING);
+        q1.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_CEILING);
+        testDecimalQuantityBehavior(q0, q1);
     }
 
-    testDecimalQuantityExpectedOutput(qs.get(0), str);
+    private static void testDecimalQuantityMath(DecimalQuantity rq0, DecimalQuantity rq1) {
+        DecimalQuantity q0 = rq0.createCopy();
+        DecimalQuantity q1 = rq1.createCopy();
+        q0.adjustMagnitude(-3);
+        q1.adjustMagnitude(-3);
+        testDecimalQuantityBehavior(q0, q1);
 
-    if (qs.size() == 1) {
-      return;
+        q0 = rq0.createCopy();
+        q1 = rq1.createCopy();
+        q0.multiplyBy(new BigDecimal("3.14159"));
+        q1.multiplyBy(new BigDecimal("3.14159"));
+        testDecimalQuantityBehavior(q0, q1);
     }
 
-    for (int i = 1; i < qs.size(); i++) {
-      DecimalQuantity q0 = qs.get(0);
-      DecimalQuantity q1 = qs.get(i);
-      testDecimalQuantityExpectedOutput(q1, str);
-      testDecimalQuantityRounding(q0, q1);
-      testDecimalQuantityRoundingInterval(q0, q1);
-      testDecimalQuantityMath(q0, q1);
-      testDecimalQuantityWithFormats(q0, q1, formats);
-    }
-  }
-
-  private static void testDecimalQuantityExpectedOutput(DecimalQuantity rq, String expected) {
-    DecimalQuantity q0 = rq.createCopy();
-    // Force an accurate double
-    q0.roundToInfinity();
-    q0.setIntegerLength(1, Integer.MAX_VALUE);
-    q0.setFractionLength(1, Integer.MAX_VALUE);
-    String actual = q0.toPlainString();
-    assertEquals("Unexpected output from simple string conversion (" + q0 + ")", expected, actual);
-  }
-
-  private static final MathContext MATH_CONTEXT_HALF_EVEN =
-      new MathContext(0, RoundingMode.HALF_EVEN);
-  private static final MathContext MATH_CONTEXT_CEILING = new MathContext(0, RoundingMode.CEILING);
-  private static final MathContext MATH_CONTEXT_PRECISION =
-      new MathContext(3, RoundingMode.HALF_UP);
-
-  private static void testDecimalQuantityRounding(DecimalQuantity rq0, DecimalQuantity rq1) {
-    DecimalQuantity q0 = rq0.createCopy();
-    DecimalQuantity q1 = rq1.createCopy();
-    q0.roundToMagnitude(-1, MATH_CONTEXT_HALF_EVEN);
-    q1.roundToMagnitude(-1, MATH_CONTEXT_HALF_EVEN);
-    testDecimalQuantityBehavior(q0, q1);
-
-    q0 = rq0.createCopy();
-    q1 = rq1.createCopy();
-    q0.roundToMagnitude(-1, MATH_CONTEXT_CEILING);
-    q1.roundToMagnitude(-1, MATH_CONTEXT_CEILING);
-    testDecimalQuantityBehavior(q0, q1);
-
-    q0 = rq0.createCopy();
-    q1 = rq1.createCopy();
-    q0.roundToMagnitude(-1, MATH_CONTEXT_PRECISION);
-    q1.roundToMagnitude(-1, MATH_CONTEXT_PRECISION);
-    testDecimalQuantityBehavior(q0, q1);
-  }
-
-  private static void testDecimalQuantityRoundingInterval(DecimalQuantity rq0, DecimalQuantity rq1) {
-    DecimalQuantity q0 = rq0.createCopy();
-    DecimalQuantity q1 = rq1.createCopy();
-    q0.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_HALF_EVEN);
-    q1.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_HALF_EVEN);
-    testDecimalQuantityBehavior(q0, q1);
-
-    q0 = rq0.createCopy();
-    q1 = rq1.createCopy();
-    q0.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_CEILING);
-    q1.roundToIncrement(new BigDecimal("0.05"), MATH_CONTEXT_CEILING);
-    testDecimalQuantityBehavior(q0, q1);
-  }
-
-  private static void testDecimalQuantityMath(DecimalQuantity rq0, DecimalQuantity rq1) {
-    DecimalQuantity q0 = rq0.createCopy();
-    DecimalQuantity q1 = rq1.createCopy();
-    q0.adjustMagnitude(-3);
-    q1.adjustMagnitude(-3);
-    testDecimalQuantityBehavior(q0, q1);
-
-    q0 = rq0.createCopy();
-    q1 = rq1.createCopy();
-    q0.multiplyBy(new BigDecimal("3.14159"));
-    q1.multiplyBy(new BigDecimal("3.14159"));
-    testDecimalQuantityBehavior(q0, q1);
-  }
-
-  private static void testDecimalQuantityWithFormats(
-      DecimalQuantity rq0, DecimalQuantity rq1, List<LocalizedNumberFormatter> formats) {
-    for (LocalizedNumberFormatter format : formats) {
-      DecimalQuantity q0 = rq0.createCopy();
-      DecimalQuantity q1 = rq1.createCopy();
-      String s1 = format.format(q0).toString();
-      String s2 = format.format(q1).toString();
-      assertEquals("Different output from formatter (" + q0 + ", " + q1 + ")", s1, s2);
-    }
-  }
-
-  private static void testDecimalQuantityBehavior(DecimalQuantity rq0, DecimalQuantity rq1) {
-    DecimalQuantity q0 = rq0.createCopy();
-    DecimalQuantity q1 = rq1.createCopy();
-
-    assertEquals("Different sign (" + q0 + ", " + q1 + ")", q0.isNegative(), q1.isNegative());
-
-    assertEquals(
-        "Different fingerprint (" + q0 + ", " + q1 + ")",
-        q0.getPositionFingerprint(),
-        q1.getPositionFingerprint());
-
-    assertDoubleEquals(
-        "Different double values (" + q0 + ", " + q1 + ")", q0.toDouble(), q1.toDouble());
-
-    assertBigDecimalEquals(
-        "Different BigDecimal values (" + q0 + ", " + q1 + ")",
-        q0.toBigDecimal(),
-        q1.toBigDecimal());
-
-    q0.roundToInfinity();
-    q1.roundToInfinity();
-
-    assertEquals(
-        "Different lower display magnitude",
-        q0.getLowerDisplayMagnitude(),
-        q1.getLowerDisplayMagnitude());
-    assertEquals(
-        "Different upper display magnitude",
-        q0.getUpperDisplayMagnitude(),
-        q1.getUpperDisplayMagnitude());
-
-    for (int m = q0.getUpperDisplayMagnitude(); m >= q0.getLowerDisplayMagnitude(); m--) {
-      assertEquals(
-          "Different digit at magnitude " + m + " (" + q0 + ", " + q1 + ")",
-          q0.getDigit(m),
-          q1.getDigit(m));
+    private static void testDecimalQuantityWithFormats(
+            DecimalQuantity rq0,
+            DecimalQuantity rq1,
+            List<LocalizedNumberFormatter> formats) {
+        for (LocalizedNumberFormatter format : formats) {
+            DecimalQuantity q0 = rq0.createCopy();
+            DecimalQuantity q1 = rq1.createCopy();
+            String s1 = format.format(q0).toString();
+            String s2 = format.format(q1).toString();
+            assertEquals("Different output from formatter (" + q0 + ", " + q1 + ")", s1, s2);
+        }
     }
 
-    if (rq0 instanceof DecimalQuantity_DualStorageBCD) {
-      String message = ((DecimalQuantity_DualStorageBCD) rq0).checkHealth();
-      if (message != null) errln(message);
-    }
-    if (rq1 instanceof DecimalQuantity_DualStorageBCD) {
-      String message = ((DecimalQuantity_DualStorageBCD) rq1).checkHealth();
-      if (message != null) errln(message);
-    }
-  }
+    private static void testDecimalQuantityBehavior(DecimalQuantity rq0, DecimalQuantity rq1) {
+        DecimalQuantity q0 = rq0.createCopy();
+        DecimalQuantity q1 = rq1.createCopy();
 
-  @Test
-  public void testSwitchStorage() {
-    DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
+        assertEquals("Different sign (" + q0 + ", " + q1 + ")", q0.isNegative(), q1.isNegative());
 
-    fq.setToLong(1234123412341234L);
-    assertFalse("Should not be using byte array", fq.isUsingBytes());
-    assertEquals("Failed on initialize", "1234123412341234E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    // Long -> Bytes
-    fq.appendDigit((byte) 5, 0, true);
-    assertTrue("Should be using byte array", fq.isUsingBytes());
-    assertEquals("Failed on multiply", "12341234123412345E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    // Bytes -> Long
-    fq.roundToMagnitude(5, MATH_CONTEXT_HALF_EVEN);
-    assertFalse("Should not be using byte array", fq.isUsingBytes());
-    assertEquals("Failed on round", "123412341234E5", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-  }
+        assertEquals("Different fingerprint (" + q0 + ", " + q1 + ")",
+                q0.getPositionFingerprint(),
+                q1.getPositionFingerprint());
 
-  @Test
-  public void testAppend() {
-    DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
-    fq.appendDigit((byte) 1, 0, true);
-    assertEquals("Failed on append", "1E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 2, 0, true);
-    assertEquals("Failed on append", "12E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 3, 1, true);
-    assertEquals("Failed on append", "1203E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 0, 1, true);
-    assertEquals("Failed on append", "1203E2", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 4, 0, true);
-    assertEquals("Failed on append", "1203004E0", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 0, 0, true);
-    assertEquals("Failed on append", "1203004E1", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 5, 0, false);
-    assertEquals("Failed on append", "120300405E-1", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 6, 0, false);
-    assertEquals("Failed on append", "1203004056E-2", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    fq.appendDigit((byte) 7, 3, false);
-    assertEquals("Failed on append", "12030040560007E-6", fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-    StringBuilder baseExpected = new StringBuilder("12030040560007");
-    for (int i = 0; i < 10; i++) {
-      fq.appendDigit((byte) 8, 0, false);
-      baseExpected.append('8');
-      StringBuilder expected = new StringBuilder(baseExpected);
-      expected.append("E");
-      expected.append(-7 - i);
-      assertEquals("Failed on append", expected.toString(), fq.toNumberString());
-      assertNull("Failed health check", fq.checkHealth());
-    }
-    fq.appendDigit((byte) 9, 2, false);
-    baseExpected.append("009");
-    StringBuilder expected = new StringBuilder(baseExpected);
-    expected.append('E');
-    expected.append("-19");
-    assertEquals("Failed on append", expected.toString(), fq.toNumberString());
-    assertNull("Failed health check", fq.checkHealth());
-  }
+        assertDoubleEquals("Different double values (" + q0 + ", " + q1 + ")",
+                q0.toDouble(),
+                q1.toDouble());
 
-  @Ignore
-  @Test
-  public void testConvertToAccurateDouble() {
-    // based on https://github.com/google/double-conversion/issues/28
-    double[] hardDoubles = {
-      1651087494906221570.0,
-      -5074790912492772E-327,
-      83602530019752571E-327,
-      2.207817077636718750000000000000,
-      1.818351745605468750000000000000,
-      3.941719055175781250000000000000,
-      3.738609313964843750000000000000,
-      3.967735290527343750000000000000,
-      1.328025817871093750000000000000,
-      3.920967102050781250000000000000,
-      1.015235900878906250000000000000,
-      1.335227966308593750000000000000,
-      1.344520568847656250000000000000,
-      2.879127502441406250000000000000,
-      3.695838928222656250000000000000,
-      1.845344543457031250000000000000,
-      3.793952941894531250000000000000,
-      3.211402893066406250000000000000,
-      2.565971374511718750000000000000,
-      0.965156555175781250000000000000,
-      2.700004577636718750000000000000,
-      0.767097473144531250000000000000,
-      1.780448913574218750000000000000,
-      2.624839782714843750000000000000,
-      1.305290222167968750000000000000,
-      3.834922790527343750000000000000,
-    };
+        assertBigDecimalEquals("Different BigDecimal values (" + q0 + ", " + q1 + ")",
+                q0.toBigDecimal(),
+                q1.toBigDecimal());
 
-    double[] integerDoubles = {
-      51423,
-      51423e10,
-      4.503599627370496E15,
-      6.789512076111555E15,
-      9.007199254740991E15,
-      9.007199254740992E15
-    };
+        q0.roundToInfinity();
+        q1.roundToInfinity();
 
-    for (double d : hardDoubles) {
-      checkDoubleBehavior(d, true, "");
+        assertEquals("Different lower display magnitude",
+                q0.getLowerDisplayMagnitude(),
+                q1.getLowerDisplayMagnitude());
+        assertEquals("Different upper display magnitude",
+                q0.getUpperDisplayMagnitude(),
+                q1.getUpperDisplayMagnitude());
+
+        for (int m = q0.getUpperDisplayMagnitude(); m >= q0.getLowerDisplayMagnitude(); m--) {
+            assertEquals("Different digit at magnitude " + m + " (" + q0 + ", " + q1 + ")",
+                    q0.getDigit(m),
+                    q1.getDigit(m));
+        }
+
+        if (rq0 instanceof DecimalQuantity_DualStorageBCD) {
+            String message = ((DecimalQuantity_DualStorageBCD) rq0).checkHealth();
+            if (message != null)
+                errln(message);
+        }
+        if (rq1 instanceof DecimalQuantity_DualStorageBCD) {
+            String message = ((DecimalQuantity_DualStorageBCD) rq1).checkHealth();
+            if (message != null)
+                errln(message);
+        }
     }
 
-    for (double d : integerDoubles) {
-      checkDoubleBehavior(d, false, "");
+    @Test
+    public void testSwitchStorage() {
+        DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
+
+        fq.setToLong(1234123412341234L);
+        assertFalse("Should not be using byte array", fq.isUsingBytes());
+        assertEquals("Failed on initialize", "1234123412341234E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        // Long -> Bytes
+        fq.appendDigit((byte) 5, 0, true);
+        assertTrue("Should be using byte array", fq.isUsingBytes());
+        assertEquals("Failed on multiply", "12341234123412345E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        // Bytes -> Long
+        fq.roundToMagnitude(5, MATH_CONTEXT_HALF_EVEN);
+        assertFalse("Should not be using byte array", fq.isUsingBytes());
+        assertEquals("Failed on round", "123412341234E5", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
     }
 
-    assertEquals("NaN check failed", Double.NaN, new DecimalQuantity_DualStorageBCD(Double.NaN).toDouble());
-    assertEquals(
-        "Inf check failed",
-        Double.POSITIVE_INFINITY,
-        new DecimalQuantity_DualStorageBCD(Double.POSITIVE_INFINITY).toDouble());
-    assertEquals(
-        "-Inf check failed",
-        Double.NEGATIVE_INFINITY,
-        new DecimalQuantity_DualStorageBCD(Double.NEGATIVE_INFINITY).toDouble());
-
-    // Generate random doubles
-    String alert = "UNEXPECTED FAILURE: PLEASE REPORT THIS MESSAGE TO THE ICU TEAM: ";
-    Random rnd = new Random();
-    for (int i = 0; i < 10000; i++) {
-      double d = Double.longBitsToDouble(rnd.nextLong());
-      if (Double.isNaN(d) || Double.isInfinite(d)) continue;
-      checkDoubleBehavior(d, false, alert);
+    @Test
+    public void testAppend() {
+        DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
+        fq.appendDigit((byte) 1, 0, true);
+        assertEquals("Failed on append", "1E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 2, 0, true);
+        assertEquals("Failed on append", "12E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 3, 1, true);
+        assertEquals("Failed on append", "1203E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 0, 1, true);
+        assertEquals("Failed on append", "1203E2", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 4, 0, true);
+        assertEquals("Failed on append", "1203004E0", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 0, 0, true);
+        assertEquals("Failed on append", "1203004E1", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 5, 0, false);
+        assertEquals("Failed on append", "120300405E-1", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 6, 0, false);
+        assertEquals("Failed on append", "1203004056E-2", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        fq.appendDigit((byte) 7, 3, false);
+        assertEquals("Failed on append", "12030040560007E-6", fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
+        StringBuilder baseExpected = new StringBuilder("12030040560007");
+        for (int i = 0; i < 10; i++) {
+            fq.appendDigit((byte) 8, 0, false);
+            baseExpected.append('8');
+            StringBuilder expected = new StringBuilder(baseExpected);
+            expected.append("E");
+            expected.append(-7 - i);
+            assertEquals("Failed on append", expected.toString(), fq.toNumberString());
+            assertNull("Failed health check", fq.checkHealth());
+        }
+        fq.appendDigit((byte) 9, 2, false);
+        baseExpected.append("009");
+        StringBuilder expected = new StringBuilder(baseExpected);
+        expected.append('E');
+        expected.append("-19");
+        assertEquals("Failed on append", expected.toString(), fq.toNumberString());
+        assertNull("Failed health check", fq.checkHealth());
     }
-  }
 
-  private static void checkDoubleBehavior(double d, boolean explicitRequired, String alert) {
-    DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD(d);
-    if (explicitRequired) {
-      assertTrue(alert + "Should be using approximate double", !fq.explicitExactDouble);
+    @Ignore
+    @Test
+    public void testConvertToAccurateDouble() {
+        // based on https://github.com/google/double-conversion/issues/28
+        double[] hardDoubles = {
+                1651087494906221570.0,
+                -5074790912492772E-327,
+                83602530019752571E-327,
+                2.207817077636718750000000000000,
+                1.818351745605468750000000000000,
+                3.941719055175781250000000000000,
+                3.738609313964843750000000000000,
+                3.967735290527343750000000000000,
+                1.328025817871093750000000000000,
+                3.920967102050781250000000000000,
+                1.015235900878906250000000000000,
+                1.335227966308593750000000000000,
+                1.344520568847656250000000000000,
+                2.879127502441406250000000000000,
+                3.695838928222656250000000000000,
+                1.845344543457031250000000000000,
+                3.793952941894531250000000000000,
+                3.211402893066406250000000000000,
+                2.565971374511718750000000000000,
+                0.965156555175781250000000000000,
+                2.700004577636718750000000000000,
+                0.767097473144531250000000000000,
+                1.780448913574218750000000000000,
+                2.624839782714843750000000000000,
+                1.305290222167968750000000000000,
+                3.834922790527343750000000000000, };
+
+        double[] integerDoubles = {
+                51423,
+                51423e10,
+                4.503599627370496E15,
+                6.789512076111555E15,
+                9.007199254740991E15,
+                9.007199254740992E15 };
+
+        for (double d : hardDoubles) {
+            checkDoubleBehavior(d, true, "");
+        }
+
+        for (double d : integerDoubles) {
+            checkDoubleBehavior(d, false, "");
+        }
+
+        assertEquals("NaN check failed",
+                Double.NaN,
+                new DecimalQuantity_DualStorageBCD(Double.NaN).toDouble());
+        assertEquals("Inf check failed",
+                Double.POSITIVE_INFINITY,
+                new DecimalQuantity_DualStorageBCD(Double.POSITIVE_INFINITY).toDouble());
+        assertEquals("-Inf check failed",
+                Double.NEGATIVE_INFINITY,
+                new DecimalQuantity_DualStorageBCD(Double.NEGATIVE_INFINITY).toDouble());
+
+        // Generate random doubles
+        String alert = "UNEXPECTED FAILURE: PLEASE REPORT THIS MESSAGE TO THE ICU TEAM: ";
+        Random rnd = new Random();
+        for (int i = 0; i < 10000; i++) {
+            double d = Double.longBitsToDouble(rnd.nextLong());
+            if (Double.isNaN(d) || Double.isInfinite(d))
+                continue;
+            checkDoubleBehavior(d, false, alert);
+        }
     }
-    assertEquals(alert + "Initial construction from hard double", d, fq.toDouble());
-    fq.roundToInfinity();
-    if (explicitRequired) {
-      assertTrue(alert + "Should not be using approximate double", fq.explicitExactDouble);
+
+    private static void checkDoubleBehavior(double d, boolean explicitRequired, String alert) {
+        DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD(d);
+        if (explicitRequired) {
+            assertTrue(alert + "Should be using approximate double", !fq.explicitExactDouble);
+        }
+        assertEquals(alert + "Initial construction from hard double", d, fq.toDouble());
+        fq.roundToInfinity();
+        if (explicitRequired) {
+            assertTrue(alert + "Should not be using approximate double", fq.explicitExactDouble);
+        }
+        assertDoubleEquals(alert + "After conversion to exact BCD (double)", d, fq.toDouble());
+        assertBigDecimalEquals(alert + "After conversion to exact BCD (BigDecimal)",
+                new BigDecimal(Double.toString(d)),
+                fq.toBigDecimal());
     }
-    assertDoubleEquals(alert + "After conversion to exact BCD (double)", d, fq.toDouble());
-    assertBigDecimalEquals(
-        alert + "After conversion to exact BCD (BigDecimal)",
-        new BigDecimal(Double.toString(d)),
-        fq.toBigDecimal());
-  }
 
-  @Test
-  public void testUseApproximateDoubleWhenAble() {
-    Object[][] cases = {
-      {1.2345678, 1, MATH_CONTEXT_HALF_EVEN, false},
-      {1.2345678, 7, MATH_CONTEXT_HALF_EVEN, false},
-      {1.2345678, 12, MATH_CONTEXT_HALF_EVEN, false},
-      {1.2345678, 13, MATH_CONTEXT_HALF_EVEN, true},
-      {1.235, 1, MATH_CONTEXT_HALF_EVEN, false},
-      {1.235, 2, MATH_CONTEXT_HALF_EVEN, true},
-      {1.235, 3, MATH_CONTEXT_HALF_EVEN, false},
-      {1.000000000000001, 0, MATH_CONTEXT_HALF_EVEN, false},
-      {1.000000000000001, 0, MATH_CONTEXT_CEILING, true},
-      {1.235, 1, MATH_CONTEXT_CEILING, false},
-      {1.235, 2, MATH_CONTEXT_CEILING, false},
-      {1.235, 3, MATH_CONTEXT_CEILING, true}
-    };
+    @Test
+    public void testUseApproximateDoubleWhenAble() {
+        Object[][] cases = {
+                { 1.2345678, 1, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.2345678, 7, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.2345678, 12, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.2345678, 13, MATH_CONTEXT_HALF_EVEN, true },
+                { 1.235, 1, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.235, 2, MATH_CONTEXT_HALF_EVEN, true },
+                { 1.235, 3, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.000000000000001, 0, MATH_CONTEXT_HALF_EVEN, false },
+                { 1.000000000000001, 0, MATH_CONTEXT_CEILING, true },
+                { 1.235, 1, MATH_CONTEXT_CEILING, false },
+                { 1.235, 2, MATH_CONTEXT_CEILING, false },
+                { 1.235, 3, MATH_CONTEXT_CEILING, true } };
 
-    for (Object[] cas : cases) {
-      double d = (Double) cas[0];
-      int maxFrac = (Integer) cas[1];
-      MathContext mc = (MathContext) cas[2];
-      boolean usesExact = (Boolean) cas[3];
+        for (Object[] cas : cases) {
+            double d = (Double) cas[0];
+            int maxFrac = (Integer) cas[1];
+            MathContext mc = (MathContext) cas[2];
+            boolean usesExact = (Boolean) cas[3];
 
-      DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD(d);
-      assertTrue("Should be using approximate double", !fq.explicitExactDouble);
-      fq.roundToMagnitude(-maxFrac, mc);
-      assertEquals(
-          "Using approximate double after rounding: " + d + " maxFrac=" + maxFrac + " " + mc,
-          usesExact,
-          fq.explicitExactDouble);
+            DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD(d);
+            assertTrue("Should be using approximate double", !fq.explicitExactDouble);
+            fq.roundToMagnitude(-maxFrac, mc);
+            assertEquals(
+                    "Using approximate double after rounding: " + d + " maxFrac=" + maxFrac + " " + mc,
+                    usesExact,
+                    fq.explicitExactDouble);
+        }
     }
-  }
 
-  @Test
-  public void testDecimalQuantityBehaviorStandalone() {
-      DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
-      assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 0E0>");
-      fq.setToInt(51423);
-      assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 51423E0>");
-      fq.adjustMagnitude(-3);
-      assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 51423E-3>");
-      fq.setToLong(999999999999000L);
-      assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 999999999999E3>");
-      fq.setIntegerLength(2, 5);
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:0:-999 long 999999999999E3>");
-      fq.setFractionLength(3, 6);
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 999999999999E3>");
-      fq.setToDouble(987.654321);
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987654321E-6>");
-      fq.roundToInfinity();
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987654321E-6>");
-      fq.roundToIncrement(new BigDecimal("0.005"), MATH_CONTEXT_HALF_EVEN);
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987655E-3>");
-      fq.roundToMagnitude(-2, MATH_CONTEXT_HALF_EVEN);
-      assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 98766E-2>");
-  }
+    @Test
+    public void testDecimalQuantityBehaviorStandalone() {
+        DecimalQuantity_DualStorageBCD fq = new DecimalQuantity_DualStorageBCD();
+        assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 0E0>");
+        fq.setToInt(51423);
+        assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 51423E0>");
+        fq.adjustMagnitude(-3);
+        assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 51423E-3>");
+        fq.setToLong(999999999999000L);
+        assertToStringAndHealth(fq, "<DecimalQuantity 999:0:0:-999 long 999999999999E3>");
+        fq.setIntegerLength(2, 5);
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:0:-999 long 999999999999E3>");
+        fq.setFractionLength(3, 6);
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 999999999999E3>");
+        fq.setToDouble(987.654321);
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987654321E-6>");
+        fq.roundToInfinity();
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987654321E-6>");
+        fq.roundToIncrement(new BigDecimal("0.005"), MATH_CONTEXT_HALF_EVEN);
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 987655E-3>");
+        fq.roundToMagnitude(-2, MATH_CONTEXT_HALF_EVEN);
+        assertToStringAndHealth(fq, "<DecimalQuantity 5:2:-3:-6 long 98766E-2>");
+    }
 
-  static void assertDoubleEquals(String message, double d1, double d2) {
-    boolean equal = (Math.abs(d1 - d2) < 1e-6) || (Math.abs((d1 - d2) / d1) < 1e-6);
-    handleAssert(equal, message, d1, d2, null, false);
-  }
+    @Test
+    public void testFitsInLong() {
+        DecimalQuantity_DualStorageBCD quantity = new DecimalQuantity_DualStorageBCD();
+        quantity.setToInt(0);
+        assertTrue("Zero should fit", quantity.fitsInLong());
+        quantity.setToInt(42);
+        assertTrue("Small int should fit", quantity.fitsInLong());
+        quantity.setToDouble(0.1);
+        assertFalse("Fraction should not fit", quantity.fitsInLong());
+        quantity.setToDouble(42.1);
+        assertFalse("Fraction should not fit", quantity.fitsInLong());
+        quantity.setToLong(1000000);
+        assertTrue("Large low-precision int should fit", quantity.fitsInLong());
+        quantity.setToLong(1000000000000000000L);
+        assertTrue("10^19 should fit", quantity.fitsInLong());
+        quantity.setToLong(1234567890123456789L);
+        assertTrue("A number between 10^19 and max long should fit", quantity.fitsInLong());
+        quantity.setToLong(1234567890000000000L);
+        assertTrue("A number with trailing zeros less than max long should fit", quantity.fitsInLong());
+        quantity.setToLong(9223372026854775808L);
+        assertTrue("A number less than max long but with similar digits should fit",
+                quantity.fitsInLong());
+        quantity.setToLong(9223372036854775806L);
+        assertTrue("One less than max long should fit", quantity.fitsInLong());
+        quantity.setToLong(9223372036854775807L);
+        assertTrue("Max long should fit", quantity.fitsInLong());
+        quantity.setToBigInteger(new BigInteger("9223372036854775808"));
+        assertFalse("One greater than max long long should not fit", quantity.fitsInLong());
+        quantity.setToBigInteger(new BigInteger("9223372046854775806"));
+        assertFalse("A number between max long and 10^20 should not fit", quantity.fitsInLong());
+        quantity.setToBigInteger(new BigInteger("9223372046800000000"));
+        assertFalse("A large 10^19 number with trailing zeros should not fit", quantity.fitsInLong());
+        quantity.setToBigInteger(new BigInteger("10000000000000000000"));
+        assertFalse("10^20 should not fit", quantity.fitsInLong());
+    }
 
-  static void assertBigDecimalEquals(String message, String d1, BigDecimal d2) {
-    assertBigDecimalEquals(message, new BigDecimal(d1), d2);
-  }
+    @Test
+    public void testHardDoubleConversion() {
+        // This test is somewhat duplicated from previous tests, but it is needed
+        // for ICU4C compatibility.
+        Object[][] cases = {
+                { 512.0000000000017, "512.0000000000017" },
+                { 4095.9999999999977, "4095.9999999999977" },
+                { 4095.999999999998, "4095.999999999998" },
+                { 4095.9999999999986, "4095.9999999999986" },
+                { 4095.999999999999, "4095.999999999999" },
+                { 4095.9999999999995, "4095.9999999999995" },
+                { 4096.000000000001, "4096.000000000001" },
+                { 4096.000000000002, "4096.000000000002" },
+                { 4096.000000000003, "4096.000000000003" },
+                { 4096.000000000004, "4096.000000000004" },
+                { 4096.000000000005, "4096.000000000005" },
+                { 4096.0000000000055, "4096.0000000000055" },
+                { 4096.000000000006, "4096.000000000006" },
+                { 4096.000000000007, "4096.000000000007" } };
 
-  static void assertBigDecimalEquals(String message, BigDecimal d1, BigDecimal d2) {
-    boolean equal = d1.compareTo(d2) == 0;
-    handleAssert(equal, message, d1, d2, null, false);
-  }
+        for (Object[] cas : cases) {
+            double input = (Double) cas[0];
+            String expectedOutput = (String) cas[1];
 
-  static void assertToStringAndHealth(DecimalQuantity_DualStorageBCD fq, String expected) {
-      String actual = fq.toString();
-      assertEquals("DecimalQuantity toString", expected, actual);
-      String health = fq.checkHealth();
-      assertNull("DecimalQuantity health", health);
-  }
+            DecimalQuantity q = new DecimalQuantity_DualStorageBCD(input);
+            q.roundToInfinity();
+            String actualOutput = q.toPlainString();
+            assertEquals("", expectedOutput, actualOutput);
+        }
+    }
+
+    static void assertDoubleEquals(String message, double d1, double d2) {
+        boolean equal = (Math.abs(d1 - d2) < 1e-6) || (Math.abs((d1 - d2) / d1) < 1e-6);
+        handleAssert(equal, message, d1, d2, null, false);
+    }
+
+    static void assertBigDecimalEquals(String message, String d1, BigDecimal d2) {
+        assertBigDecimalEquals(message, new BigDecimal(d1), d2);
+    }
+
+    static void assertBigDecimalEquals(String message, BigDecimal d1, BigDecimal d2) {
+        boolean equal = d1.compareTo(d2) == 0;
+        handleAssert(equal, message, d1, d2, null, false);
+    }
+
+    static void assertToStringAndHealth(DecimalQuantity_DualStorageBCD fq, String expected) {
+        String actual = fq.toString();
+        assertEquals("DecimalQuantity toString", expected, actual);
+        String health = fq.checkHealth();
+        assertNull("DecimalQuantity health", health);
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/ModifierTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/ModifierTest.java
index 6af4ea1..fee90da 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/ModifierTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/ModifierTest.java
@@ -31,12 +31,12 @@
     public void testConstantMultiFieldModifier() {
         NumberStringBuilder prefix = new NumberStringBuilder();
         NumberStringBuilder suffix = new NumberStringBuilder();
-        Modifier mod1 = new ConstantMultiFieldModifier(prefix, suffix, true);
+        Modifier mod1 = new ConstantMultiFieldModifier(prefix, suffix, false, true);
         assertModifierEquals(mod1, 0, true, "|", "n");
 
         prefix.append("a📻", NumberFormat.Field.PERCENT);
         suffix.append("b", NumberFormat.Field.CURRENCY);
-        Modifier mod2 = new ConstantMultiFieldModifier(prefix, suffix, true);
+        Modifier mod2 = new ConstantMultiFieldModifier(prefix, suffix, false, true);
         assertModifierEquals(mod2, 3, true, "a📻|b", "%%%n$");
 
         // Make sure the first modifier is still the same (that it stayed constant)
@@ -46,11 +46,20 @@
     @Test
     public void testSimpleModifier() {
         String[] patterns = { "{0}", "X{0}Y", "XX{0}YYY", "{0}YY", "XX📺XX{0}" };
-        Object[][] outputs = { { "", 0, 0 }, { "a📻bcde", 0, 0 }, { "a📻bcde", 4, 4 }, { "a📻bcde", 3, 5 } };
+        Object[][] outputs = {
+                { "", 0, 0 },
+                { "a📻bcde", 0, 0 },
+                { "a📻bcde", 4, 4 },
+                { "a📻bcde", 3, 5 } };
         int[] prefixLens = { 0, 1, 2, 0, 6 };
-        String[][] expectedCharFields = { { "|", "n" }, { "X|Y", "%n%" }, { "XX|YYY", "%%n%%%" }, { "|YY", "n%%" },
+        String[][] expectedCharFields = {
+                { "|", "n" },
+                { "X|Y", "%n%" },
+                { "XX|YYY", "%%n%%%" },
+                { "|YY", "n%%" },
                 { "XX📺XX|", "%%%%%%n" } };
-        String[][] expecteds = { { "", "XY", "XXYYY", "YY", "XX📺XX" },
+        String[][] expecteds = {
+                { "", "XY", "XXYYY", "YY", "XX📺XX" },
                 { "a📻bcde", "XYa📻bcde", "XXYYYa📻bcde", "YYa📻bcde", "XX📺XXa📻bcde" },
                 { "a📻bcde", "a📻bXYcde", "a📻bXXYYYcde", "a📻bYYcde", "a📻bXX📺XXcde" },
                 { "a📻bcde", "a📻XbcYde", "a📻XXbcYYYde", "a📻bcYYde", "a📻XX📺XXbcde" } };
@@ -59,7 +68,11 @@
             String compiledPattern = SimpleFormatterImpl
                     .compileToStringMinMaxArguments(pattern, new StringBuilder(), 1, 1);
             Modifier mod = new SimpleModifier(compiledPattern, NumberFormat.Field.PERCENT, false);
-            assertModifierEquals(mod, prefixLens[i], false, expectedCharFields[i][0], expectedCharFields[i][1]);
+            assertModifierEquals(mod,
+                    prefixLens[i],
+                    false,
+                    expectedCharFields[i][0],
+                    expectedCharFields[i][1]);
 
             // Test strange insertion positions
             for (int j = 0; j < outputs.length; j++) {
@@ -78,11 +91,11 @@
         DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
         NumberStringBuilder prefix = new NumberStringBuilder();
         NumberStringBuilder suffix = new NumberStringBuilder();
-        Modifier mod1 = new CurrencySpacingEnabledModifier(prefix, suffix, true, symbols);
+        Modifier mod1 = new CurrencySpacingEnabledModifier(prefix, suffix, false, true, symbols);
         assertModifierEquals(mod1, 0, true, "|", "n");
 
         prefix.append("USD", NumberFormat.Field.CURRENCY);
-        Modifier mod2 = new CurrencySpacingEnabledModifier(prefix, suffix, true, symbols);
+        Modifier mod2 = new CurrencySpacingEnabledModifier(prefix, suffix, false, true, symbols);
         assertModifierEquals(mod2, 3, true, "USD|", "$$$n");
 
         // Test the default currency spacing rules
@@ -99,9 +112,11 @@
 
         // Test custom patterns
         // The following line means that the last char of the number should be a | (rather than a digit)
-        symbols.setPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH, true, "[|]");
+        symbols.setPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH,
+                true,
+                "[|]");
         suffix.append("XYZ", NumberFormat.Field.CURRENCY);
-        Modifier mod3 = new CurrencySpacingEnabledModifier(prefix, suffix, true, symbols);
+        Modifier mod3 = new CurrencySpacingEnabledModifier(prefix, suffix, false, true, symbols);
         assertModifierEquals(mod3, 3, true, "USD|\u00A0XYZ", "$$$nn$$$");
     }
 
@@ -112,18 +127,18 @@
         // If this test starts failing, please update the method #getUnicodeSet() in
         // BOTH CurrencySpacingEnabledModifier.java AND in C++.
         DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(new ULocale("en-US"));
-        assertEquals(
-                "[:^S:]",
-                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH, true));
-        assertEquals(
-                "[:^S:]",
-                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH, false));
-        assertEquals(
-                "[:digit:]",
-                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH, true));
-        assertEquals(
-                "[:digit:]",
-                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH, false));
+        assertEquals("[:^S:]",
+                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH,
+                        true));
+        assertEquals("[:^S:]",
+                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH,
+                        false));
+        assertEquals("[:digit:]",
+                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH,
+                        true));
+        assertEquals("[:digit:]",
+                dfs.getPatternForCurrencySpacing(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH,
+                        false));
     }
 
     private void assertModifierEquals(
@@ -134,7 +149,12 @@
             String expectedFields) {
         NumberStringBuilder sb = new NumberStringBuilder();
         sb.appendCodePoint('|', null);
-        assertModifierEquals(mod, sb, expectedPrefixLength, expectedStrong, expectedChars, expectedFields);
+        assertModifierEquals(mod,
+                sb,
+                expectedPrefixLength,
+                expectedStrong,
+                expectedChars,
+                expectedFields);
     }
 
     private void assertModifierEquals(
@@ -150,8 +170,10 @@
         assertEquals("Strong on " + sb, expectedStrong, mod.isStrong());
         if (!(mod instanceof CurrencySpacingEnabledModifier)) {
             assertEquals("Code point count equals actual code point count",
-                    sb.codePointCount() - oldCount, mod.getCodePointCount());
+                    sb.codePointCount() - oldCount,
+                    mod.getCodePointCount());
         }
-        assertEquals("<NumberStringBuilder [" + expectedChars + "] [" + expectedFields + "]>", sb.toDebugString());
+        assertEquals("<NumberStringBuilder [" + expectedChars + "] [" + expectedFields + "]>",
+                sb.toDebugString());
     }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/MutablePatternModifierTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/MutablePatternModifierTest.java
index 80f44ad..7f70a55 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/MutablePatternModifierTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/MutablePatternModifierTest.java
@@ -27,19 +27,24 @@
         MutablePatternModifier mod = new MutablePatternModifier(false);
         mod.setPatternInfo(PatternStringParser.parseToPatternInfo("a0b"));
         mod.setPatternAttributes(SignDisplay.AUTO, false);
-        mod.setSymbols(
-                DecimalFormatSymbols.getInstance(ULocale.ENGLISH),
+        mod.setSymbols(DecimalFormatSymbols.getInstance(ULocale.ENGLISH),
                 Currency.getInstance("USD"),
                 UnitWidth.SHORT,
                 null);
 
-        mod.setNumberProperties(false, null);
+        mod.setNumberProperties(1, null);
         assertEquals("a", getPrefix(mod));
         assertEquals("b", getSuffix(mod));
         mod.setPatternAttributes(SignDisplay.ALWAYS, false);
         assertEquals("+a", getPrefix(mod));
         assertEquals("b", getSuffix(mod));
-        mod.setNumberProperties(true, null);
+        mod.setNumberProperties(0, null);
+        assertEquals("+a", getPrefix(mod));
+        assertEquals("b", getSuffix(mod));
+        mod.setPatternAttributes(SignDisplay.EXCEPT_ZERO, false);
+        assertEquals("a", getPrefix(mod));
+        assertEquals("b", getSuffix(mod));
+        mod.setNumberProperties(-1, null);
         assertEquals("-a", getPrefix(mod));
         assertEquals("b", getSuffix(mod));
         mod.setPatternAttributes(SignDisplay.NEVER, false);
@@ -48,13 +53,19 @@
 
         mod.setPatternInfo(PatternStringParser.parseToPatternInfo("a0b;c-0d"));
         mod.setPatternAttributes(SignDisplay.AUTO, false);
-        mod.setNumberProperties(false, null);
+        mod.setNumberProperties(1, null);
         assertEquals("a", getPrefix(mod));
         assertEquals("b", getSuffix(mod));
         mod.setPatternAttributes(SignDisplay.ALWAYS, false);
         assertEquals("c+", getPrefix(mod));
         assertEquals("d", getSuffix(mod));
-        mod.setNumberProperties(true, null);
+        mod.setNumberProperties(0, null);
+        assertEquals("c+", getPrefix(mod));
+        assertEquals("d", getSuffix(mod));
+        mod.setPatternAttributes(SignDisplay.EXCEPT_ZERO, false);
+        assertEquals("a", getPrefix(mod));
+        assertEquals("b", getSuffix(mod));
+        mod.setNumberProperties(-1, null);
         assertEquals("c-", getPrefix(mod));
         assertEquals("d", getSuffix(mod));
         mod.setPatternAttributes(SignDisplay.NEVER, false);
@@ -92,6 +103,32 @@
         assertFalse(nsb1 + " vs. " + nsb3, nsb1.contentEquals(nsb3));
     }
 
+    @Test
+    public void patternWithNoPlaceholder() {
+        MutablePatternModifier mod = new MutablePatternModifier(false);
+        mod.setPatternInfo(PatternStringParser.parseToPatternInfo("abc"));
+        mod.setPatternAttributes(SignDisplay.AUTO, false);
+        mod.setSymbols(DecimalFormatSymbols.getInstance(ULocale.ENGLISH),
+                Currency.getInstance("USD"),
+                UnitWidth.SHORT,
+                null);
+        mod.setNumberProperties(1, null);
+
+        // Unsafe Code Path
+        NumberStringBuilder nsb = new NumberStringBuilder();
+        nsb.append("x123y", null);
+        mod.apply(nsb, 1, 4);
+        assertEquals("Unsafe Path", "xabcy", nsb.toString());
+
+        // Safe Code Path
+        nsb.clear();
+        nsb.append("x123y", null);
+        MicroProps micros = new MicroProps(false);
+        mod.createImmutable().applyToMicros(micros, new DecimalQuantity_DualStorageBCD());
+        micros.modMiddle.apply(nsb, 1, 4);
+        assertEquals("Safe Path", "xabcy", nsb.toString());
+    }
+
     private static String getPrefix(MutablePatternModifier mod) {
         NumberStringBuilder nsb = new NumberStringBuilder();
         mod.apply(nsb, 0, 0);
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java
index cb843a8..5c63d65 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java
@@ -4,27 +4,38 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
 
 import org.junit.Ignore;
 import org.junit.Test;
 
+import com.ibm.icu.impl.number.Grouper;
+import com.ibm.icu.impl.number.MacroProps;
 import com.ibm.icu.impl.number.Padder;
 import com.ibm.icu.impl.number.Padder.PadPosition;
 import com.ibm.icu.impl.number.PatternStringParser;
-import com.ibm.icu.number.FormattedNumber;
-import com.ibm.icu.number.Grouper;
+import com.ibm.icu.number.CompactNotation;
+import com.ibm.icu.number.FractionRounder;
 import com.ibm.icu.number.IntegerWidth;
 import com.ibm.icu.number.LocalizedNumberFormatter;
 import com.ibm.icu.number.Notation;
 import com.ibm.icu.number.NumberFormatter;
 import com.ibm.icu.number.NumberFormatter.DecimalSeparatorDisplay;
+import com.ibm.icu.number.NumberFormatter.GroupingStrategy;
 import com.ibm.icu.number.NumberFormatter.SignDisplay;
 import com.ibm.icu.number.NumberFormatter.UnitWidth;
 import com.ibm.icu.number.Rounder;
+import com.ibm.icu.number.ScientificNotation;
 import com.ibm.icu.number.UnlocalizedNumberFormatter;
 import com.ibm.icu.text.DecimalFormatSymbols;
 import com.ibm.icu.text.NumberingSystem;
@@ -42,6 +53,8 @@
     private static final Currency GBP = Currency.getInstance("GBP");
     private static final Currency CZK = Currency.getInstance("CZK");
     private static final Currency CAD = Currency.getInstance("CAD");
+    private static final Currency ESP = Currency.getInstance("ESP");
+    private static final Currency PTE = Currency.getInstance("PTE");
 
     @Test
     public void notationSimple() {
@@ -345,6 +358,19 @@
                 ULocale.ENGLISH,
                 9990000,
                 "10M");
+
+        Map<String, Map<String, String>> compactCustomData = new HashMap<String, Map<String, String>>();
+        Map<String, String> entry = new HashMap<String, String>();
+        entry.put("one", "Kun");
+        entry.put("other", "0KK");
+        compactCustomData.put("1000", entry);
+        assertFormatSingle(
+                "Compact Somali No Figure",
+                "",
+                NumberFormatter.with().notation(CompactNotation.forCustomData(compactCustomData)),
+                ULocale.ENGLISH,
+                1000,
+                "Kun");
     }
 
     @Test
@@ -464,6 +490,73 @@
                 ULocale.forLanguageTag("es-US"),
                 5.43,
                 "5.43 °F");
+
+        assertFormatSingle(
+                "MeasureUnit form without {0} in CLDR pattern",
+                "",
+                NumberFormatter.with().unit(MeasureUnit.KELVIN).unitWidth(UnitWidth.FULL_NAME),
+                ULocale.forLanguageTag("es-MX"),
+                1,
+                "kelvin");
+
+        assertFormatSingle(
+                "MeasureUnit form without {0} in CLDR pattern and wide base form",
+                "",
+                NumberFormatter.with()
+                    .rounding(Rounder.fixedFraction(20))
+                    .unit(MeasureUnit.KELVIN)
+                    .unitWidth(UnitWidth.FULL_NAME),
+                ULocale.forLanguageTag("es-MX"),
+                1,
+                "kelvin");
+    }
+
+    @Test
+    public void unitCompoundMeasure() {
+        assertFormatDescending(
+                "Meters Per Second Short (unit that simplifies)",
+                "",
+                NumberFormatter.with().unit(MeasureUnit.METER).perUnit(MeasureUnit.SECOND),
+                ULocale.ENGLISH,
+                "87,650 m/s",
+                "8,765 m/s",
+                "876.5 m/s",
+                "87.65 m/s",
+                "8.765 m/s",
+                "0.8765 m/s",
+                "0.08765 m/s",
+                "0.008765 m/s",
+                "0 m/s");
+
+        assertFormatDescending(
+                "Pounds Per Square Mile Short (secondary unit has per-format)",
+                "",
+                NumberFormatter.with().unit(MeasureUnit.POUND).perUnit(MeasureUnit.SQUARE_MILE),
+                ULocale.ENGLISH,
+                "87,650 lb/mi²",
+                "8,765 lb/mi²",
+                "876.5 lb/mi²",
+                "87.65 lb/mi²",
+                "8.765 lb/mi²",
+                "0.8765 lb/mi²",
+                "0.08765 lb/mi²",
+                "0.008765 lb/mi²",
+                "0 lb/mi²");
+
+        assertFormatDescending(
+                "Joules Per Furlong Short (unit with no simplifications or special patterns)",
+                "",
+                NumberFormatter.with().unit(MeasureUnit.JOULE).perUnit(MeasureUnit.FURLONG),
+                ULocale.ENGLISH,
+                "87,650 J/fur",
+                "8,765 J/fur",
+                "876.5 J/fur",
+                "87.65 J/fur",
+                "8.765 J/fur",
+                "0.8765 J/fur",
+                "0.08765 J/fur",
+                "0.008765 J/fur",
+                "0 J/fur");
     }
 
     @Test
@@ -569,9 +662,59 @@
                 "Currency Difference between Narrow and Short (Short Version)",
                 "",
                 NumberFormatter.with().unit(USD).unitWidth(UnitWidth.SHORT),
-                ULocale.forLanguageTag("en_CA"),
+                ULocale.forLanguageTag("en-CA"),
                 5.43,
-                "US$ 5.43");
+                "US$5.43");
+
+        assertFormatSingle(
+                "Currency-dependent format (Control)",
+                "",
+                NumberFormatter.with().unit(USD).unitWidth(UnitWidth.SHORT),
+                ULocale.forLanguageTag("ca"),
+                444444.55,
+                "444.444,55 USD");
+
+        assertFormatSingle(
+                "Currency-dependent format (Test)",
+                "",
+                NumberFormatter.with().unit(ESP).unitWidth(UnitWidth.SHORT),
+                ULocale.forLanguageTag("ca"),
+                444444.55,
+                "₧ 444.445");
+
+        assertFormatSingle(
+                "Currency-dependent symbols (Control)",
+                "",
+                NumberFormatter.with().unit(USD).unitWidth(UnitWidth.SHORT),
+                ULocale.forLanguageTag("pt-PT"),
+                444444.55,
+                "444 444,55 US$");
+
+        // NOTE: This is a bit of a hack on CLDR's part. They set the currency symbol to U+200B (zero-
+        // width space), and they set the decimal separator to the $ symbol.
+        assertFormatSingle(
+                "Currency-dependent symbols (Test)",
+                "",
+                NumberFormatter.with().unit(PTE).unitWidth(UnitWidth.SHORT),
+                ULocale.forLanguageTag("pt-PT"),
+                444444.55,
+                "444,444$55 \u200B");
+
+        assertFormatSingle(
+                "Currency-dependent symbols (Test)",
+                "",
+                NumberFormatter.with().unit(PTE).unitWidth(UnitWidth.NARROW),
+                ULocale.forLanguageTag("pt-PT"),
+                444444.55,
+                "444,444$55 PTE");
+
+        assertFormatSingle(
+                "Currency-dependent symbols (Test)",
+                "",
+                NumberFormatter.with().unit(PTE).unitWidth(UnitWidth.ISO_CODE),
+                ULocale.forLanguageTag("pt-PT"),
+                444444.55,
+                "444,444$55 PTE");
     }
 
     @Test
@@ -813,6 +956,22 @@
                 "0.09",
                 "0.01",
                 "0.00");
+
+        assertFormatSingle(
+                "FracSig with trailing zeros A",
+                "",
+                NumberFormatter.with().rounding(Rounder.fixedFraction(2).withMinDigits(3)),
+                ULocale.ENGLISH,
+                0.1,
+                "0.10");
+
+        assertFormatSingle(
+                "FracSig with trailing zeros B",
+                "",
+                NumberFormatter.with().rounding(Rounder.fixedFraction(2).withMinDigits(3)),
+                ULocale.ENGLISH,
+                0.0999999,
+                "0.10");
     }
 
     @Test
@@ -944,7 +1103,7 @@
         assertFormatDescendingBig(
                 "Western Grouping",
                 "grouping=defaults",
-                NumberFormatter.with().grouping(Grouper.defaults()),
+                NumberFormatter.with().grouping(GroupingStrategy.AUTO),
                 ULocale.ENGLISH,
                 "87,650,000",
                 "8,765,000",
@@ -959,7 +1118,7 @@
         assertFormatDescendingBig(
                 "Indic Grouping",
                 "grouping=defaults",
-                NumberFormatter.with().grouping(Grouper.defaults()),
+                NumberFormatter.with().grouping(GroupingStrategy.AUTO),
                 new ULocale("en-IN"),
                 "8,76,50,000",
                 "87,65,000",
@@ -974,7 +1133,7 @@
         assertFormatDescendingBig(
                 "Western Grouping, Min 2",
                 "grouping=min2",
-                NumberFormatter.with().grouping(Grouper.minTwoDigits()),
+                NumberFormatter.with().grouping(GroupingStrategy.MIN2),
                 ULocale.ENGLISH,
                 "87,650,000",
                 "8,765,000",
@@ -989,7 +1148,7 @@
         assertFormatDescendingBig(
                 "Indic Grouping, Min 2",
                 "grouping=min2",
-                NumberFormatter.with().grouping(Grouper.minTwoDigits()),
+                NumberFormatter.with().grouping(GroupingStrategy.MIN2),
                 new ULocale("en-IN"),
                 "8,76,50,000",
                 "87,65,000",
@@ -1004,7 +1163,7 @@
         assertFormatDescendingBig(
                 "No Grouping",
                 "grouping=none",
-                NumberFormatter.with().grouping(Grouper.none()),
+                NumberFormatter.with().grouping(GroupingStrategy.OFF),
                 new ULocale("en-IN"),
                 "87650000",
                 "8765000",
@@ -1015,6 +1174,117 @@
                 "87.65",
                 "8.765",
                 "0");
+
+        assertFormatDescendingBig(
+                "Indic locale with THOUSANDS grouping",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.THOUSANDS),
+                new ULocale("en-IN"),
+                "87,650,000",
+                "8,765,000",
+                "876,500",
+                "87,650",
+                "8,765",
+                "876.5",
+                "87.65",
+                "8.765",
+                "0");
+
+        // NOTE: Hungarian is interesting because it has minimumGroupingDigits=4 in locale data
+        // If this test breaks due to data changes, find another locale that has minimumGroupingDigits.
+        assertFormatDescendingBig(
+                "Hungarian Grouping",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.AUTO),
+                new ULocale("hu"),
+                "87 650 000",
+                "8 765 000",
+                "876500",
+                "87650",
+                "8765",
+                "876,5",
+                "87,65",
+                "8,765",
+                "0");
+
+        assertFormatDescendingBig(
+                "Hungarian Grouping, Min 2",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.MIN2),
+                new ULocale("hu"),
+                "87 650 000",
+                "8 765 000",
+                "876500",
+                "87650",
+                "8765",
+                "876,5",
+                "87,65",
+                "8,765",
+                "0");
+
+        assertFormatDescendingBig(
+                "Hungarian Grouping, Always",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.ON_ALIGNED),
+                new ULocale("hu"),
+                "87 650 000",
+                "8 765 000",
+                "876 500",
+                "87 650",
+                "8 765",
+                "876,5",
+                "87,65",
+                "8,765",
+                "0");
+
+        // NOTE: Bulgarian is interesting because it has no grouping in the default currency format.
+        // If this test breaks due to data changes, find another locale that has no default grouping.
+        assertFormatDescendingBig(
+                "Bulgarian Currency Grouping",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.AUTO).unit(USD),
+                new ULocale("bg"),
+                "87650000,00 щ.д.",
+                "8765000,00 щ.д.",
+                "876500,00 щ.д.",
+                "87650,00 щ.д.",
+                "8765,00 щ.д.",
+                "876,50 щ.д.",
+                "87,65 щ.д.",
+                "8,76 щ.д.",
+                "0,00 щ.д.");
+
+        assertFormatDescendingBig(
+                "Bulgarian Currency Grouping, Always",
+                "",
+                NumberFormatter.with().grouping(GroupingStrategy.ON_ALIGNED).unit(USD),
+                new ULocale("bg"),
+                "87 650 000,00 щ.д.",
+                "8 765 000,00 щ.д.",
+                "876 500,00 щ.д.",
+                "87 650,00 щ.д.",
+                "8 765,00 щ.д.",
+                "876,50 щ.д.",
+                "87,65 щ.д.",
+                "8,76 щ.д.",
+                "0,00 щ.д.");
+
+        MacroProps macros = new MacroProps();
+        macros.grouping = Grouper.getInstance((short) 4, (short) 1, (short) 3);
+        assertFormatDescendingBig(
+                "Custom Grouping via Internal API",
+                "",
+                NumberFormatter.with().macros(macros),
+                ULocale.ENGLISH,
+                "8,7,6,5,0000",
+                "8,7,6,5000",
+                "876500",
+                "87650",
+                "8765",
+                "876.5",
+                "87.65",
+                "8.765",
+                "0");
     }
 
     @Test
@@ -1309,10 +1579,10 @@
                 "US$ 12,345.67");
 
         assertFormatSingle(
-                "Currency symbol should follow number in ar with NS arab",
+                "Currency symbol should follow number in ar-EG with NS arab",
                 "",
                 NumberFormatter.with().unit(USD),
-                new ULocale("ar"),
+                new ULocale("ar-EG"),
                 12345.67,
                 "١٢٬٣٤٥٫٦٧ US$");
 
@@ -1324,6 +1594,22 @@
                 12345.67,
                 "١٢٬٣٤٥٫٦٧ US$");
 
+        assertFormatSingle(
+                "NumberingSystem in API should win over @numbers keyword",
+                "",
+                NumberFormatter.with().symbols(NumberingSystem.LATIN).unit(USD),
+                new ULocale("ar@numbers=arab"),
+                12345.67,
+                "US$ 12,345.67");
+
+        assertEquals("NumberingSystem in API should win over @numbers keyword in reverse order",
+                "US$ 12,345.67",
+                NumberFormatter.withLocale(new ULocale("ar@numbers=arab"))
+                    .symbols(NumberingSystem.LATIN)
+                    .unit(USD)
+                    .format(12345.67)
+                    .toString());
+
         DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(new ULocale("de-CH"));
         UnlocalizedNumberFormatter f = NumberFormatter.with().symbols(symbols);
         symbols.setGroupingSeparatorString("!");
@@ -1386,6 +1672,14 @@
                 "-444,444");
 
         assertFormatSingle(
+                "Sign Auto Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.AUTO),
+                ULocale.ENGLISH,
+                0,
+                "0");
+
+        assertFormatSingle(
                 "Sign Always Positive",
                 "sign=ALWAYS",
                 NumberFormatter.with().sign(SignDisplay.ALWAYS),
@@ -1402,6 +1696,14 @@
                 "-444,444");
 
         assertFormatSingle(
+                "Sign Always Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.ALWAYS),
+                ULocale.ENGLISH,
+                0,
+                "+0");
+
+        assertFormatSingle(
                 "Sign Never Positive",
                 "sign=NEVER",
                 NumberFormatter.with().sign(SignDisplay.NEVER),
@@ -1418,6 +1720,14 @@
                 "444,444");
 
         assertFormatSingle(
+                "Sign Never Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.NEVER),
+                ULocale.ENGLISH,
+                0,
+                "0");
+
+        assertFormatSingle(
                 "Sign Accounting Positive",
                 "$USD sign=ACCOUNTING",
                 NumberFormatter.with().sign(SignDisplay.ACCOUNTING).unit(USD),
@@ -1434,6 +1744,14 @@
                 "($444,444.00)");
 
         assertFormatSingle(
+                "Sign Accounting Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.ACCOUNTING).unit(USD),
+                ULocale.ENGLISH,
+                0,
+                "$0.00");
+
+        assertFormatSingle(
                 "Sign Accounting-Always Positive",
                 "$USD sign=ACCOUNTING_ALWAYS",
                 NumberFormatter.with().sign(SignDisplay.ACCOUNTING_ALWAYS).unit(USD),
@@ -1450,6 +1768,62 @@
                 "($444,444.00)");
 
         assertFormatSingle(
+                "Sign Accounting-Always Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.ACCOUNTING_ALWAYS).unit(USD),
+                ULocale.ENGLISH,
+                0,
+                "+$0.00");
+
+        assertFormatSingle(
+                "Sign Except-Zero Positive",
+                "",
+                NumberFormatter.with().sign(SignDisplay.EXCEPT_ZERO),
+                ULocale.ENGLISH,
+                444444,
+                "+444,444");
+
+        assertFormatSingle(
+                "Sign Except-Zero Negative",
+                "",
+                NumberFormatter.with().sign(SignDisplay.EXCEPT_ZERO),
+                ULocale.ENGLISH,
+                -444444,
+                "-444,444");
+
+        assertFormatSingle(
+                "Sign Except-Zero Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.EXCEPT_ZERO),
+                ULocale.ENGLISH,
+                0,
+                "0");
+
+        assertFormatSingle(
+                "Sign Accounting-Except-Zero Positive",
+                "$USD sign=ACCOUNTING_ALWAYS",
+                NumberFormatter.with().sign(SignDisplay.ACCOUNTING_EXCEPT_ZERO).unit(USD),
+                ULocale.ENGLISH,
+                444444,
+                "+$444,444.00");
+
+        assertFormatSingle(
+                "Sign Accounting-Except-Zero Negative",
+                "$USD sign=ACCOUNTING_ALWAYS",
+                NumberFormatter.with().sign(SignDisplay.ACCOUNTING_EXCEPT_ZERO).unit(USD),
+                ULocale.ENGLISH,
+                -444444,
+                "($444,444.00)");
+
+        assertFormatSingle(
+                "Sign Accounting-Except-Zero Zero",
+                "",
+                NumberFormatter.with().sign(SignDisplay.ACCOUNTING_EXCEPT_ZERO).unit(USD),
+                ULocale.ENGLISH,
+                0,
+                "$0.00");
+
+        assertFormatSingle(
                 "Sign Accounting Negative Hidden",
                 "$USD unit-width=HIDDEN sign=ACCOUNTING",
                 NumberFormatter.with().sign(SignDisplay.ACCOUNTING).unit(USD).unitWidth(UnitWidth.HIDDEN),
@@ -1501,29 +1875,6 @@
     }
 
     @Test
-    public void getPrefixSuffix() {
-        Object[][] cases = {
-                { NumberFormatter.withLocale(ULocale.ENGLISH).unit(GBP).unitWidth(UnitWidth.ISO_CODE), "GBP", "",
-                        "-GBP", "" },
-                { NumberFormatter.withLocale(ULocale.ENGLISH).unit(GBP).unitWidth(UnitWidth.FULL_NAME), "",
-                        " British pounds", "-", " British pounds" } };
-
-        for (Object[] cas : cases) {
-            LocalizedNumberFormatter f = (LocalizedNumberFormatter) cas[0];
-            String posPrefix = (String) cas[1];
-            String posSuffix = (String) cas[2];
-            String negPrefix = (String) cas[3];
-            String negSuffix = (String) cas[4];
-            FormattedNumber positive = f.format(1);
-            FormattedNumber negative = f.format(-1);
-            assertEquals(posPrefix, positive.getPrefix());
-            assertEquals(posSuffix, positive.getSuffix());
-            assertEquals(negPrefix, negative.getPrefix());
-            assertEquals(negSuffix, negative.getSuffix());
-        }
-    }
-
-    @Test
     public void plurals() {
         // TODO: Expand this test.
 
@@ -1544,6 +1895,119 @@
                 "1.00 US dollars");
     }
 
+    @Test
+    public void validRanges() throws NoSuchMethodException, IllegalAccessException {
+        Method[] methodsWithOneArgument = new Method[] { Rounder.class.getDeclaredMethod("fixedFraction", Integer.TYPE),
+                Rounder.class.getDeclaredMethod("minFraction", Integer.TYPE),
+                Rounder.class.getDeclaredMethod("maxFraction", Integer.TYPE),
+                Rounder.class.getDeclaredMethod("fixedDigits", Integer.TYPE),
+                Rounder.class.getDeclaredMethod("minDigits", Integer.TYPE),
+                Rounder.class.getDeclaredMethod("maxDigits", Integer.TYPE),
+                FractionRounder.class.getDeclaredMethod("withMinDigits", Integer.TYPE),
+                FractionRounder.class.getDeclaredMethod("withMaxDigits", Integer.TYPE),
+                ScientificNotation.class.getDeclaredMethod("withMinExponentDigits", Integer.TYPE),
+                IntegerWidth.class.getDeclaredMethod("zeroFillTo", Integer.TYPE),
+                IntegerWidth.class.getDeclaredMethod("truncateAt", Integer.TYPE), };
+        Method[] methodsWithTwoArguments = new Method[] {
+                Rounder.class.getDeclaredMethod("minMaxFraction", Integer.TYPE, Integer.TYPE),
+                Rounder.class.getDeclaredMethod("minMaxDigits", Integer.TYPE, Integer.TYPE), };
+
+        final int EXPECTED_MAX_INT_FRAC_SIG = 999;
+        final String expectedSubstring0 = "between 0 and 999 (inclusive)";
+        final String expectedSubstring1 = "between 1 and 999 (inclusive)";
+        final String expectedSubstringN1 = "between -1 and 999 (inclusive)";
+
+        // We require that the upper bounds all be 999 inclusive.
+        // The lower bound may be either -1, 0, or 1.
+        Set<String> methodsWithLowerBound1 = new HashSet();
+        methodsWithLowerBound1.add("fixedDigits");
+        methodsWithLowerBound1.add("minDigits");
+        methodsWithLowerBound1.add("maxDigits");
+        methodsWithLowerBound1.add("minMaxDigits");
+        methodsWithLowerBound1.add("withMinDigits");
+        methodsWithLowerBound1.add("withMaxDigits");
+        methodsWithLowerBound1.add("withMinExponentDigits");
+        // Methods with lower bound 0:
+        // fixedFraction
+        // minFraction
+        // maxFraction
+        // minMaxFraction
+        // zeroFillTo
+        Set<String> methodsWithLowerBoundN1 = new HashSet();
+        methodsWithLowerBoundN1.add("truncateAt");
+
+        // Some of the methods require an object to be called upon.
+        Map<String, Object> targets = new HashMap<String, Object>();
+        targets.put("withMinDigits", Rounder.integer());
+        targets.put("withMaxDigits", Rounder.integer());
+        targets.put("withMinExponentDigits", Notation.scientific());
+        targets.put("truncateAt", IntegerWidth.zeroFillTo(0));
+
+        for (int argument = -2; argument <= EXPECTED_MAX_INT_FRAC_SIG + 2; argument++) {
+            for (Method method : methodsWithOneArgument) {
+                String message = "i = " + argument + "; method = " + method.getName();
+                int lowerBound = methodsWithLowerBound1.contains(method.getName()) ? 1
+                        : methodsWithLowerBoundN1.contains(method.getName()) ? -1 : 0;
+                String expectedSubstring = lowerBound == 0 ? expectedSubstring0
+                        : lowerBound == 1 ? expectedSubstring1 : expectedSubstringN1;
+                Object target = targets.get(method.getName());
+                try {
+                    method.invoke(target, argument);
+                    assertTrue(message, argument >= lowerBound && argument <= EXPECTED_MAX_INT_FRAC_SIG);
+                } catch (InvocationTargetException e) {
+                    assertTrue(message, argument < lowerBound || argument > EXPECTED_MAX_INT_FRAC_SIG);
+                    // Ensure the exception message contains the expected substring
+                    String actualMessage = e.getCause().getMessage();
+                    assertNotEquals(message + ": " + actualMessage, -1, actualMessage.indexOf(expectedSubstring));
+                }
+            }
+            for (Method method : methodsWithTwoArguments) {
+                String message = "i = " + argument + "; method = " + method.getName();
+                int lowerBound = methodsWithLowerBound1.contains(method.getName()) ? 1
+                        : methodsWithLowerBoundN1.contains(method.getName()) ? -1 : 0;
+                String expectedSubstring = lowerBound == 0 ? expectedSubstring0 : expectedSubstring1;
+                Object target = targets.get(method.getName());
+                // Check range on the first argument
+                try {
+                    // Pass EXPECTED_MAX_INT_FRAC_SIG as the second argument so arg1 <= arg2 in expected cases
+                    method.invoke(target, argument, EXPECTED_MAX_INT_FRAC_SIG);
+                    assertTrue(message, argument >= lowerBound && argument <= EXPECTED_MAX_INT_FRAC_SIG);
+                } catch (InvocationTargetException e) {
+                    assertTrue(message, argument < lowerBound || argument > EXPECTED_MAX_INT_FRAC_SIG);
+                    // Ensure the exception message contains the expected substring
+                    String actualMessage = e.getCause().getMessage();
+                    assertNotEquals(message + ": " + actualMessage, -1, actualMessage.indexOf(expectedSubstring));
+                }
+                // Check range on the second argument
+                try {
+                    // Pass lowerBound as the first argument so arg1 <= arg2 in expected cases
+                    method.invoke(target, lowerBound, argument);
+                    assertTrue(message, argument >= lowerBound && argument <= EXPECTED_MAX_INT_FRAC_SIG);
+                } catch (InvocationTargetException e) {
+                    assertTrue(message, argument < lowerBound || argument > EXPECTED_MAX_INT_FRAC_SIG);
+                    // Ensure the exception message contains the expected substring
+                    String actualMessage = e.getCause().getMessage();
+                    assertNotEquals(message + ": " + actualMessage, -1, actualMessage.indexOf(expectedSubstring));
+                }
+                // Check that first argument must be less than or equal to second argument
+                try {
+                    method.invoke(target, argument, argument - 1);
+                    org.junit.Assert.fail();
+                } catch (InvocationTargetException e) {
+                    // Pass
+                }
+            }
+        }
+
+        // Check first argument less than or equal to second argument on IntegerWidth
+        try {
+            IntegerWidth.zeroFillTo(4).truncateAt(2);
+            org.junit.Assert.fail();
+        } catch (IllegalArgumentException e) {
+            // Pass
+        }
+    }
+
     private static void assertFormatDescending(
             String message,
             String skeleton,
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberParserTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberParserTest.java
new file mode 100644
index 0000000..04b3d7c
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberParserTest.java
@@ -0,0 +1,254 @@
+// © 2017 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.dev.test.number;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.ibm.icu.impl.StringSegment;
+import com.ibm.icu.impl.number.DecimalFormatProperties;
+import com.ibm.icu.impl.number.parse.IgnorablesMatcher;
+import com.ibm.icu.impl.number.parse.MinusSignMatcher;
+import com.ibm.icu.impl.number.parse.NumberParserImpl;
+import com.ibm.icu.impl.number.parse.ParsedNumber;
+import com.ibm.icu.impl.number.parse.ParsingUtils;
+import com.ibm.icu.impl.number.parse.PercentMatcher;
+import com.ibm.icu.impl.number.parse.PlusSignMatcher;
+import com.ibm.icu.impl.number.parse.SeriesMatcher;
+import com.ibm.icu.impl.number.parse.UnicodeSetStaticCache;
+import com.ibm.icu.impl.number.parse.UnicodeSetStaticCache.Key;
+import com.ibm.icu.text.DecimalFormatSymbols;
+import com.ibm.icu.util.ULocale;
+
+/**
+ * @author sffc
+ *
+ */
+public class NumberParserTest {
+    @Test
+    public void testBasic() {
+        Object[][] cases = new Object[][] {
+                // Fields:
+                // a) Flags:
+                // --- Bit 0x01 => Test greedy implementation
+                // --- Bit 0x02 => Test slow implementation
+                // --- Bit 0x04 => Test strict grouping separators
+                // b) Input string
+                // c) Pattern
+                // d) Expected chars consumed
+                // e) Expected double result
+                { 3, "51423", "0", 5, 51423. },
+                { 3, "51423x", "0", 5, 51423. },
+                { 3, " 51423", "0", 6, 51423. },
+                { 3, "51423 ", "0", 5, 51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯", "0", 10, 51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯x", "0", 10, 51423. },
+                { 3, " 𝟱𝟭𝟰𝟮𝟯", "0", 11, 51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯 ", "0", 10, 51423. },
+                { 7, "𝟱𝟭,𝟰𝟮𝟯", "#,##,##0", 11, 51423. },
+                { 7, "𝟳,𝟴𝟵,𝟱𝟭,𝟰𝟮𝟯", "#,##,##0", 19, 78951423. },
+                { 7, "𝟳𝟴,𝟵𝟱𝟭.𝟰𝟮𝟯", "#,##,##0", 18, 78951.423 },
+                { 7, "𝟳𝟴,𝟬𝟬𝟬", "#,##,##0", 11, 78000. },
+                { 7, "𝟳𝟴,𝟬𝟬𝟬.𝟬𝟬𝟬", "#,##,##0", 18, 78000. },
+                { 7, "𝟳𝟴,𝟬𝟬𝟬.𝟬𝟮𝟯", "#,##,##0", 18, 78000.023 },
+                { 7, "𝟳𝟴.𝟬𝟬𝟬.𝟬𝟮𝟯", "#,##,##0", 11, 78. },
+                { 3, "-𝟱𝟭𝟰𝟮𝟯", "0", 11, -51423. },
+                { 3, "-𝟱𝟭𝟰𝟮𝟯-", "0", 11, -51423. },
+                { 3, "a51423US dollars", "a0¤¤¤", 16, 51423. },
+                { 3, "a 51423 US dollars", "a0¤¤¤", 18, 51423. },
+                { 3, "514.23 USD", "0", 10, 514.23 },
+                { 3, "514.23 GBP", "0", 10, 514.23 },
+                { 3, "a 𝟱𝟭𝟰𝟮𝟯 b", "a0b", 14, 51423. },
+                { 3, "-a 𝟱𝟭𝟰𝟮𝟯 b", "a0b", 15, -51423. },
+                { 3, "a -𝟱𝟭𝟰𝟮𝟯 b", "a0b", 15, -51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯", "[0];(0)", 10, 51423. },
+                { 3, "[𝟱𝟭𝟰𝟮𝟯", "[0];(0)", 11, 51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯]", "[0];(0)", 11, 51423. },
+                { 3, "[𝟱𝟭𝟰𝟮𝟯]", "[0];(0)", 12, 51423. },
+                { 3, "(𝟱𝟭𝟰𝟮𝟯", "[0];(0)", 11, -51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯)", "[0];(0)", 11, -51423. },
+                { 3, "(𝟱𝟭𝟰𝟮𝟯)", "[0];(0)", 12, -51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯", "{0};{0}", 10, 51423. },
+                { 3, "{𝟱𝟭𝟰𝟮𝟯", "{0};{0}", 11, 51423. },
+                { 3, "𝟱𝟭𝟰𝟮𝟯}", "{0};{0}", 11, 51423. },
+                { 3, "{𝟱𝟭𝟰𝟮𝟯}", "{0};{0}", 12, 51423. },
+                { 1, "a40b", "a0'0b'", 3, 40. }, // greedy code path thinks "40" is the number
+                { 2, "a40b", "a0'0b'", 4, 4. }, // slow code path finds the suffix "0b"
+                { 3, "𝟱.𝟭𝟰𝟮E𝟯", "0", 12, 5142. },
+                { 3, "𝟱.𝟭𝟰𝟮E-𝟯", "0", 13, 0.005142 },
+                { 3, "𝟱.𝟭𝟰𝟮e-𝟯", "0", 13, 0.005142 },
+                { 7, "5,142.50 Canadian dollars", "#,##,##0", 25, 5142.5 },
+                { 3, "a$ b5", "a ¤ b0", 5, 5.0 },
+                { 3, "📺1.23", "📺0;📻0", 6, 1.23 },
+                { 3, "📻1.23", "📺0;📻0", 6, -1.23 },
+                { 3, ".00", "0", 3, 0.0 },
+                { 3, "                              0", "a0", 31, 0.0 }, // should not hang
+                { 3, "0", "0", 1, 0.0 } };
+
+        for (Object[] cas : cases) {
+            int flags = (Integer) cas[0];
+            String input = (String) cas[1];
+            String pattern = (String) cas[2];
+            int expectedCharsConsumed = (Integer) cas[3];
+            double resultDouble = (Double) cas[4];
+            NumberParserImpl parser = NumberParserImpl
+                    .createParserFromPattern(ULocale.ENGLISH, pattern, false);
+            String message = "Input <" + input + "> Parser " + parser;
+
+            if (0 != (flags & 0x01)) {
+                // Test greedy code path
+                ParsedNumber resultObject = new ParsedNumber();
+                parser.parse(input, true, resultObject);
+                assertNotNull("Greedy Parse failed: " + message, resultObject.quantity);
+                assertEquals("Greedy Parse failed: " + message,
+                        expectedCharsConsumed,
+                        resultObject.charEnd);
+                assertEquals("Greedy Parse failed: " + message,
+                        resultDouble,
+                        resultObject.getNumber().doubleValue(),
+                        0.0);
+            }
+
+            if (0 != (flags & 0x02)) {
+                // Test slow code path
+                ParsedNumber resultObject = new ParsedNumber();
+                parser.parse(input, false, resultObject);
+                assertNotNull("Non-Greedy Parse failed: " + message, resultObject.quantity);
+                assertEquals("Non-Greedy Parse failed: " + message,
+                        expectedCharsConsumed,
+                        resultObject.charEnd);
+                assertEquals("Non-Greedy Parse failed: " + message,
+                        resultDouble,
+                        resultObject.getNumber().doubleValue(),
+                        0.0);
+            }
+
+            if (0 != (flags & 0x04)) {
+                // Test with strict separators
+                parser = NumberParserImpl.createParserFromPattern(ULocale.ENGLISH, pattern, true);
+                ParsedNumber resultObject = new ParsedNumber();
+                parser.parse(input, true, resultObject);
+                assertNotNull("Strict Parse failed: " + message, resultObject.quantity);
+                assertEquals("Strict Parse failed: " + message,
+                        expectedCharsConsumed,
+                        resultObject.charEnd);
+                assertEquals("Strict Parse failed: " + message,
+                        resultDouble,
+                        resultObject.getNumber().doubleValue(),
+                        0.0);
+            }
+        }
+    }
+
+    @Test
+    public void testLocaleFi() {
+        // This case is interesting because locale fi has NaN starting with 'e', the same as scientific
+        NumberParserImpl parser = NumberParserImpl
+                .createParserFromPattern(new ULocale("fi"), "0", false);
+
+        ParsedNumber resultObject = new ParsedNumber();
+        parser.parse("epäluku", false, resultObject);
+        assertTrue(resultObject.success());
+        assertEquals(Double.NaN, resultObject.getNumber().doubleValue(), 0.0);
+
+        resultObject = new ParsedNumber();
+        parser.parse("1,2e3", false, resultObject);
+        assertTrue(resultObject.success());
+        assertEquals(1200.0, resultObject.getNumber().doubleValue(), 0.0);
+    }
+
+    @Test
+    public void testSeriesMatcher() {
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
+        SeriesMatcher series = new SeriesMatcher();
+        series.addMatcher(PlusSignMatcher.getInstance(symbols, false));
+        series.addMatcher(MinusSignMatcher.getInstance(symbols, false));
+        series.addMatcher(IgnorablesMatcher.DEFAULT);
+        series.addMatcher(PercentMatcher.getInstance(symbols));
+        series.addMatcher(IgnorablesMatcher.DEFAULT);
+        series.freeze();
+
+        assertEquals(UnicodeSetStaticCache.get(Key.PLUS_SIGN), series.getLeadCodePoints());
+
+        Object[][] cases = new Object[][] {
+                { "", 0, true },
+                { " ", 0, false },
+                { "$", 0, false },
+                { "+", 0, true },
+                { " +", 0, false },
+                { "+-", 0, true },
+                { "+ -", 0, false },
+                { "+-  ", 0, true },
+                { "+-  $", 0, false },
+                { "+-%", 3, true },
+                { "  +-  %  ", 0, false },
+                { "+-  %  ", 7, true },
+                { "+-%$", 3, false } };
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            int expectedOffset = (Integer) cas[1];
+            boolean expectedMaybeMore = (Boolean) cas[2];
+
+            StringSegment segment = new StringSegment(input, false);
+            ParsedNumber result = new ParsedNumber();
+            boolean actualMaybeMore = series.match(segment, result);
+            int actualOffset = segment.getOffset();
+
+            assertEquals("'" + input + "'", expectedOffset, actualOffset);
+            assertEquals("'" + input + "'", expectedMaybeMore, actualMaybeMore);
+        }
+    }
+
+    @Test
+    public void testGroupingDisabled() {
+        DecimalFormatProperties properties = new DecimalFormatProperties();
+        properties.setGroupingSize(0);
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
+        NumberParserImpl parser = NumberParserImpl
+                .createParserFromProperties(properties, symbols, false, true);
+        ParsedNumber result = new ParsedNumber();
+        parser.parse("12,345.678", true, result);
+        assertEquals("Should not parse with grouping separator",
+                12.0,
+                result.getNumber().doubleValue(),
+                0.0);
+    }
+
+    @Test
+    public void testCaseFolding() {
+        Object[][] cases = new Object[][] {
+                // pattern, input string, case sensitive chars, case insensitive chars
+                { "0", "JP¥3456", 7, 7 },
+                { "0", "jp¥3456", 0, 0 }, // not to be accepted, even in case insensitive mode
+                { "A0", "A5", 2, 2 },
+                { "A0", "a5", 0, 2 },
+                { "0", "NaN", 3, 3 },
+                { "0", "nan", 0, 3 } };
+        for (Object[] cas : cases) {
+            String patternString = (String) cas[0];
+            String inputString = (String) cas[1];
+            int expectedCaseSensitiveChars = (Integer) cas[2];
+            int expectedCaseFoldingChars = (Integer) cas[3];
+
+            NumberParserImpl caseSensitiveParser = NumberParserImpl
+                    .removeMeWhenMerged(ULocale.ENGLISH, patternString, ParsingUtils.PARSE_FLAG_OPTIMIZE);
+            ParsedNumber result = new ParsedNumber();
+            caseSensitiveParser.parse(inputString, true, result);
+            assertEquals("Case-Sensitive: " + inputString + " on " + patternString,
+                    expectedCaseSensitiveChars,
+                    result.charEnd);
+
+            NumberParserImpl caseFoldingParser = NumberParserImpl.removeMeWhenMerged(ULocale.ENGLISH,
+                    patternString,
+                    ParsingUtils.PARSE_FLAG_IGNORE_CASE | ParsingUtils.PARSE_FLAG_OPTIMIZE);
+            result = new ParsedNumber();
+            caseFoldingParser.parse(inputString, true, result);
+            assertEquals("Folded: " + inputString + " on " + patternString,
+                    expectedCaseFoldingChars,
+                    result.charEnd);
+        }
+    }
+}
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberStringBuilderTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberStringBuilderTest.java
index 8d9814c..6b7e0a2 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberStringBuilderTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberStringBuilderTest.java
@@ -17,208 +17,251 @@
 
 /** @author sffc */
 public class NumberStringBuilderTest {
-  private static final String[] EXAMPLE_STRINGS = {
-    "",
-    "xyz",
-    "The quick brown fox jumps over the lazy dog",
-    "😁",
-    "mixed 😇 and ASCII",
-    "with combining characters like 🇦🇧🇨🇩",
-    "A very very very very very very very very very very long string to force heap"
-  };
+    private static final String[] EXAMPLE_STRINGS = {
+            "",
+            "xyz",
+            "The quick brown fox jumps over the lazy dog",
+            "😁",
+            "mixed 😇 and ASCII",
+            "with combining characters like 🇦🇧🇨🇩",
+            "A very very very very very very very very very very long string to force heap" };
 
-  @Test
-  public void testInsertAppendCharSequence() {
+    @Test
+    public void testInsertAppendCharSequence() {
 
-    StringBuilder sb1 = new StringBuilder();
-    NumberStringBuilder sb2 = new NumberStringBuilder();
-    for (String str : EXAMPLE_STRINGS) {
-      NumberStringBuilder sb3 = new NumberStringBuilder();
-      sb1.append(str);
-      sb2.append(str, null);
-      sb3.append(str, null);
-      assertCharSequenceEquals(sb1, sb2);
-      assertCharSequenceEquals(sb3, str);
+        StringBuilder sb1 = new StringBuilder();
+        NumberStringBuilder sb2 = new NumberStringBuilder();
+        for (String str : EXAMPLE_STRINGS) {
+            NumberStringBuilder sb3 = new NumberStringBuilder();
+            sb1.append(str);
+            sb2.append(str, null);
+            sb3.append(str, null);
+            assertCharSequenceEquals(sb1, sb2);
+            assertCharSequenceEquals(sb3, str);
 
-      StringBuilder sb4 = new StringBuilder();
-      NumberStringBuilder sb5 = new NumberStringBuilder();
-      sb4.append("😇");
-      sb4.append(str);
-      sb4.append("xx");
-      sb5.append("😇xx", null);
-      sb5.insert(2, str, null);
-      assertCharSequenceEquals(sb4, sb5);
+            StringBuilder sb4 = new StringBuilder();
+            NumberStringBuilder sb5 = new NumberStringBuilder();
+            sb4.append("😇");
+            sb4.append(str);
+            sb4.append("xx");
+            sb5.append("😇xx", null);
+            sb5.insert(2, str, null);
+            assertCharSequenceEquals(sb4, sb5);
 
-      int start = Math.min(1, str.length());
-      int end = Math.min(10, str.length());
-      sb4.insert(3, str, start, end);
-      sb5.insert(3, str, start, end, null);
-      assertCharSequenceEquals(sb4, sb5);
+            int start = Math.min(1, str.length());
+            int end = Math.min(10, str.length());
+            sb4.insert(3, str, start, end);
+            sb5.insert(3, str, start, end, null);
+            assertCharSequenceEquals(sb4, sb5);
 
-      sb4.append(str.toCharArray());
-      sb5.append(str.toCharArray(), null);
-      assertCharSequenceEquals(sb4, sb5);
+            sb4.append(str.toCharArray());
+            sb5.append(str.toCharArray(), null);
+            assertCharSequenceEquals(sb4, sb5);
 
-      sb4.insert(4, str.toCharArray());
-      sb5.insert(4, str.toCharArray(), null);
-      assertCharSequenceEquals(sb4, sb5);
+            sb4.insert(4, str.toCharArray());
+            sb5.insert(4, str.toCharArray(), null);
+            assertCharSequenceEquals(sb4, sb5);
 
-      sb4.append(sb4.toString());
-      sb5.append(new NumberStringBuilder(sb5));
-      assertCharSequenceEquals(sb4, sb5);
-    }
-  }
-
-  @Test
-  public void testInsertAppendCodePoint() {
-    int[] cases = {0, 1, 60, 127, 128, 0x7fff, 0x8000, 0xffff, 0x10000, 0x1f000, 0x10ffff};
-
-    StringBuilder sb1 = new StringBuilder();
-    NumberStringBuilder sb2 = new NumberStringBuilder();
-    for (int cas : cases) {
-      NumberStringBuilder sb3 = new NumberStringBuilder();
-      sb1.appendCodePoint(cas);
-      sb2.appendCodePoint(cas, null);
-      sb3.appendCodePoint(cas, null);
-      assertCharSequenceEquals(sb1, sb2);
-      assertEquals(Character.codePointAt(sb3, 0), cas);
-
-      StringBuilder sb4 = new StringBuilder();
-      NumberStringBuilder sb5 = new NumberStringBuilder();
-      sb4.append("😇");
-      sb4.appendCodePoint(cas); // Java StringBuilder has no insertCodePoint()
-      sb4.append("xx");
-      sb5.append("😇xx", null);
-      sb5.insertCodePoint(2, cas, null);
-      assertCharSequenceEquals(sb4, sb5);
-    }
-  }
-
-  @Test
-  public void testCopy() {
-    for (String str : EXAMPLE_STRINGS) {
-      NumberStringBuilder sb1 = new NumberStringBuilder();
-      sb1.append(str, null);
-      NumberStringBuilder sb2 = new NumberStringBuilder(sb1);
-      assertCharSequenceEquals(sb1, sb2);
-      assertTrue(sb1.contentEquals(sb2));
-
-      sb1.append("12345", null);
-      assertNotEquals(sb1.length(), sb2.length());
-      assertFalse(sb1.contentEquals(sb2));
-    }
-  }
-
-  @Test
-  public void testFields() {
-    for (String str : EXAMPLE_STRINGS) {
-      NumberStringBuilder sb = new NumberStringBuilder();
-      sb.append(str, null);
-      sb.append(str, NumberFormat.Field.CURRENCY);
-      Field[] fields = sb.toFieldArray();
-      assertEquals(str.length() * 2, fields.length);
-      for (int i = 0; i < str.length(); i++) {
-        assertEquals(null, fields[i]);
-        assertEquals(null, sb.fieldAt(i));
-        assertEquals(NumberFormat.Field.CURRENCY, fields[i + str.length()]);
-        assertEquals(NumberFormat.Field.CURRENCY, sb.fieldAt(i + str.length()));
-      }
-
-      // Very basic FieldPosition test. More robust tests happen in NumberFormatTest.
-      // Let NumberFormatTest also take care of AttributedCharacterIterator material.
-      FieldPosition fp = new FieldPosition(NumberFormat.Field.CURRENCY);
-      sb.populateFieldPosition(fp, 0);
-      assertEquals(str.length(), fp.getBeginIndex());
-      assertEquals(str.length() * 2, fp.getEndIndex());
-
-      if (str.length() > 0) {
-        sb.insertCodePoint(2, 100, NumberFormat.Field.INTEGER);
-        fields = sb.toFieldArray();
-        assertEquals(str.length() * 2 + 1, fields.length);
-        assertEquals(fields[2], NumberFormat.Field.INTEGER);
-      }
-
-      sb.append(new NumberStringBuilder(sb));
-      sb.append(sb.toCharArray(), sb.toFieldArray());
-      int numNull = 0;
-      int numCurr = 0;
-      int numInt = 0;
-      Field[] oldFields = fields;
-      fields = sb.toFieldArray();
-      for (int i = 0; i < sb.length(); i++) {
-        assertEquals(oldFields[i % oldFields.length], fields[i]);
-        if (fields[i] == null) {
-          numNull++;
-        } else if (fields[i] == NumberFormat.Field.CURRENCY) {
-          numCurr++;
-        } else if (fields[i] == NumberFormat.Field.INTEGER) {
-          numInt++;
-        } else {
-          throw new AssertionError("Encountered unknown field in " + str);
+            sb4.append(sb4.toString());
+            sb5.append(new NumberStringBuilder(sb5));
+            assertCharSequenceEquals(sb4, sb5);
         }
-      }
-      assertEquals(str.length() * 4, numNull);
-      assertEquals(numNull, numCurr);
-      assertEquals(str.length() > 0 ? 4 : 0, numInt);
-
-      NumberStringBuilder sb2 = new NumberStringBuilder();
-      sb2.append(sb);
-      assertTrue(sb.contentEquals(sb2));
-      assertTrue(sb.contentEquals(sb2.toCharArray(), sb2.toFieldArray()));
-
-      sb2.insertCodePoint(0, 50, NumberFormat.Field.FRACTION);
-      assertTrue(!sb.contentEquals(sb2));
-      assertTrue(!sb.contentEquals(sb2.toCharArray(), sb2.toFieldArray()));
-    }
-  }
-
-  @Test
-  public void testUnlimitedCapacity() {
-    NumberStringBuilder builder = new NumberStringBuilder();
-    // The builder should never fail upon repeated appends.
-    for (int i = 0; i < 1000; i++) {
-      assertEquals(builder.length(), i);
-      builder.appendCodePoint('x', null);
-      assertEquals(builder.length(), i + 1);
-    }
-  }
-
-  @Test
-  public void testCodePoints() {
-      NumberStringBuilder nsb = new NumberStringBuilder();
-      assertEquals("First is -1 on empty string", -1, nsb.getFirstCodePoint());
-      assertEquals("Last is -1 on empty string", -1, nsb.getLastCodePoint());
-      assertEquals("Length is 0 on empty string", 0, nsb.codePointCount());
-
-      nsb.append("q", null);
-      assertEquals("First is q", 'q', nsb.getFirstCodePoint());
-      assertEquals("Last is q", 'q', nsb.getLastCodePoint());
-      assertEquals("0th is q", 'q', nsb.codePointAt(0));
-      assertEquals("Before 1st is q", 'q', nsb.codePointBefore(1));
-      assertEquals("Code point count is 1", 1, nsb.codePointCount());
-
-      // 🚀 is two char16s
-      nsb.append("🚀", null);
-      assertEquals("First is still q", 'q', nsb.getFirstCodePoint());
-      assertEquals("Last is space ship", 128640, nsb.getLastCodePoint());
-      assertEquals("1st is space ship", 128640, nsb.codePointAt(1));
-      assertEquals("Before 1st is q", 'q', nsb.codePointBefore(1));
-      assertEquals("Before 3rd is space ship", 128640, nsb.codePointBefore(3));
-      assertEquals("Code point count is 2", 2, nsb.codePointCount());
-  }
-
-  private static void assertCharSequenceEquals(CharSequence a, CharSequence b) {
-    assertEquals(a.toString(), b.toString());
-
-    assertEquals(a.length(), b.length());
-    for (int i = 0; i < a.length(); i++) {
-      assertEquals(a.charAt(i), b.charAt(i));
     }
 
-    int start = Math.min(2, a.length());
-    int end = Math.min(12, a.length());
-    if (start != end) {
-      assertCharSequenceEquals(a.subSequence(start, end), b.subSequence(start, end));
+    @Test
+    public void testSplice() {
+        Object[][] cases = {
+                { "", 0, 0 },
+                { "abc", 0, 0 },
+                { "abc", 1, 1 },
+                { "abc", 1, 2 },
+                { "abc", 0, 2 },
+                { "abc", 0, 3 },
+                { "lorem ipsum dolor sit amet", 8, 8 },
+                { "lorem ipsum dolor sit amet", 8, 11 }, // 3 chars, equal to replacement "xyz"
+                { "lorem ipsum dolor sit amet", 8, 18 } }; // 10 chars, larger than several replacements
+
+        StringBuilder sb1 = new StringBuilder();
+        NumberStringBuilder sb2 = new NumberStringBuilder();
+        for (Object[] cas : cases) {
+            String input = (String) cas[0];
+            int startThis = (Integer) cas[1];
+            int endThis = (Integer) cas[2];
+            for (String replacement : EXAMPLE_STRINGS) {
+                // Test replacement with full string
+                sb1.setLength(0);
+                sb1.append(input);
+                sb1.replace(startThis, endThis, replacement);
+                sb2.clear();
+                sb2.append(input, null);
+                sb2.splice(startThis, endThis, replacement, 0, replacement.length(), null);
+                assertCharSequenceEquals(sb1, sb2);
+
+                // Test replacement with partial string
+                if (replacement.length() <= 2) {
+                    continue;
+                }
+                sb1.setLength(0);
+                sb1.append(input);
+                sb1.replace(startThis, endThis, replacement.substring(1, 3));
+                sb2.clear();
+                sb2.append(input, null);
+                sb2.splice(startThis, endThis, replacement, 1, 3, null);
+                assertCharSequenceEquals(sb1, sb2);
+            }
+        }
     }
-  }
+
+    @Test
+    public void testInsertAppendCodePoint() {
+        int[] cases = { 0, 1, 60, 127, 128, 0x7fff, 0x8000, 0xffff, 0x10000, 0x1f000, 0x10ffff };
+
+        StringBuilder sb1 = new StringBuilder();
+        NumberStringBuilder sb2 = new NumberStringBuilder();
+        for (int cas : cases) {
+            NumberStringBuilder sb3 = new NumberStringBuilder();
+            sb1.appendCodePoint(cas);
+            sb2.appendCodePoint(cas, null);
+            sb3.appendCodePoint(cas, null);
+            assertCharSequenceEquals(sb1, sb2);
+            assertEquals(Character.codePointAt(sb3, 0), cas);
+
+            StringBuilder sb4 = new StringBuilder();
+            NumberStringBuilder sb5 = new NumberStringBuilder();
+            sb4.append("😇");
+            sb4.appendCodePoint(cas); // Java StringBuilder has no insertCodePoint()
+            sb4.append("xx");
+            sb5.append("😇xx", null);
+            sb5.insertCodePoint(2, cas, null);
+            assertCharSequenceEquals(sb4, sb5);
+        }
+    }
+
+    @Test
+    public void testCopy() {
+        for (String str : EXAMPLE_STRINGS) {
+            NumberStringBuilder sb1 = new NumberStringBuilder();
+            sb1.append(str, null);
+            NumberStringBuilder sb2 = new NumberStringBuilder(sb1);
+            assertCharSequenceEquals(sb1, sb2);
+            assertTrue(sb1.contentEquals(sb2));
+
+            sb1.append("12345", null);
+            assertNotEquals(sb1.length(), sb2.length());
+            assertFalse(sb1.contentEquals(sb2));
+        }
+    }
+
+    @Test
+    public void testFields() {
+        for (String str : EXAMPLE_STRINGS) {
+            NumberStringBuilder sb = new NumberStringBuilder();
+            sb.append(str, null);
+            sb.append(str, NumberFormat.Field.CURRENCY);
+            Field[] fields = sb.toFieldArray();
+            assertEquals(str.length() * 2, fields.length);
+            for (int i = 0; i < str.length(); i++) {
+                assertEquals(null, fields[i]);
+                assertEquals(null, sb.fieldAt(i));
+                assertEquals(NumberFormat.Field.CURRENCY, fields[i + str.length()]);
+                assertEquals(NumberFormat.Field.CURRENCY, sb.fieldAt(i + str.length()));
+            }
+
+            // Very basic FieldPosition test. More robust tests happen in NumberFormatTest.
+            // Let NumberFormatTest also take care of AttributedCharacterIterator material.
+            FieldPosition fp = new FieldPosition(NumberFormat.Field.CURRENCY);
+            sb.populateFieldPosition(fp, 0);
+            assertEquals(str.length(), fp.getBeginIndex());
+            assertEquals(str.length() * 2, fp.getEndIndex());
+
+            if (str.length() > 0) {
+                sb.insertCodePoint(2, 100, NumberFormat.Field.INTEGER);
+                fields = sb.toFieldArray();
+                assertEquals(str.length() * 2 + 1, fields.length);
+                assertEquals(fields[2], NumberFormat.Field.INTEGER);
+            }
+
+            sb.append(new NumberStringBuilder(sb));
+            sb.append(sb.toCharArray(), sb.toFieldArray());
+            int numNull = 0;
+            int numCurr = 0;
+            int numInt = 0;
+            Field[] oldFields = fields;
+            fields = sb.toFieldArray();
+            for (int i = 0; i < sb.length(); i++) {
+                assertEquals(oldFields[i % oldFields.length], fields[i]);
+                if (fields[i] == null) {
+                    numNull++;
+                } else if (fields[i] == NumberFormat.Field.CURRENCY) {
+                    numCurr++;
+                } else if (fields[i] == NumberFormat.Field.INTEGER) {
+                    numInt++;
+                } else {
+                    throw new AssertionError("Encountered unknown field in " + str);
+                }
+            }
+            assertEquals(str.length() * 4, numNull);
+            assertEquals(numNull, numCurr);
+            assertEquals(str.length() > 0 ? 4 : 0, numInt);
+
+            NumberStringBuilder sb2 = new NumberStringBuilder();
+            sb2.append(sb);
+            assertTrue(sb.contentEquals(sb2));
+            assertTrue(sb.contentEquals(sb2.toCharArray(), sb2.toFieldArray()));
+
+            sb2.insertCodePoint(0, 50, NumberFormat.Field.FRACTION);
+            assertTrue(!sb.contentEquals(sb2));
+            assertTrue(!sb.contentEquals(sb2.toCharArray(), sb2.toFieldArray()));
+        }
+    }
+
+    @Test
+    public void testUnlimitedCapacity() {
+        NumberStringBuilder builder = new NumberStringBuilder();
+        // The builder should never fail upon repeated appends.
+        for (int i = 0; i < 1000; i++) {
+            assertEquals(builder.length(), i);
+            builder.appendCodePoint('x', null);
+            assertEquals(builder.length(), i + 1);
+        }
+    }
+
+    @Test
+    public void testCodePoints() {
+        NumberStringBuilder nsb = new NumberStringBuilder();
+        assertEquals("First is -1 on empty string", -1, nsb.getFirstCodePoint());
+        assertEquals("Last is -1 on empty string", -1, nsb.getLastCodePoint());
+        assertEquals("Length is 0 on empty string", 0, nsb.codePointCount());
+
+        nsb.append("q", null);
+        assertEquals("First is q", 'q', nsb.getFirstCodePoint());
+        assertEquals("Last is q", 'q', nsb.getLastCodePoint());
+        assertEquals("0th is q", 'q', nsb.codePointAt(0));
+        assertEquals("Before 1st is q", 'q', nsb.codePointBefore(1));
+        assertEquals("Code point count is 1", 1, nsb.codePointCount());
+
+        // 🚀 is two char16s
+        nsb.append("🚀", null);
+        assertEquals("First is still q", 'q', nsb.getFirstCodePoint());
+        assertEquals("Last is space ship", 128640, nsb.getLastCodePoint());
+        assertEquals("1st is space ship", 128640, nsb.codePointAt(1));
+        assertEquals("Before 1st is q", 'q', nsb.codePointBefore(1));
+        assertEquals("Before 3rd is space ship", 128640, nsb.codePointBefore(3));
+        assertEquals("Code point count is 2", 2, nsb.codePointCount());
+    }
+
+    private static void assertCharSequenceEquals(CharSequence a, CharSequence b) {
+        assertEquals(a.toString(), b.toString());
+
+        assertEquals(a.length(), b.length());
+        for (int i = 0; i < a.length(); i++) {
+            assertEquals(a.charAt(i), b.charAt(i));
+        }
+
+        int start = Math.min(2, a.length());
+        int end = Math.min(12, a.length());
+        if (start != end) {
+            assertCharSequenceEquals(a.subSequence(start, end), b.subSequence(start, end));
+        }
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PatternStringTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PatternStringTest.java
index b097983..93afd75 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PatternStringTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PatternStringTest.java
@@ -16,104 +16,113 @@
 /** @author sffc */
 public class PatternStringTest {
 
-  @Test
-  public void testLocalized() {
-    DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
-    symbols.setDecimalSeparatorString("a");
-    symbols.setPercentString("b");
-    symbols.setMinusSignString(".");
-    symbols.setPlusSignString("'");
+    @Test
+    public void testLocalized() {
+        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(ULocale.ENGLISH);
+        symbols.setDecimalSeparatorString("a");
+        symbols.setPercentString("b");
+        symbols.setMinusSignString(".");
+        symbols.setPlusSignString("'");
 
-    String standard = "+-abcb''a''#,##0.0%'a%'";
-    String localized = "’.'ab'c'b''a'''#,##0a0b'a%'";
-    String toStandard = "+-'ab'c'b''a'''#,##0.0%'a%'";
+        String standard = "+-abcb''a''#,##0.0%'a%'";
+        String localized = "’.'ab'c'b''a'''#,##0a0b'a%'";
+        String toStandard = "+-'ab'c'b''a'''#,##0.0%'a%'";
 
-    assertEquals(localized, PatternStringUtils.convertLocalized(standard, symbols, true));
-    assertEquals(toStandard, PatternStringUtils.convertLocalized(localized, symbols, false));
-  }
-
-  @Test
-  public void testToPatternSimple() {
-    String[][] cases = {
-      {"#", "0"},
-      {"0", "0"},
-      {"#0", "0"},
-      {"###", "0"},
-      {"0.##", "0.##"},
-      {"0.00", "0.00"},
-      {"0.00#", "0.00#"},
-      {"#E0", "#E0"},
-      {"0E0", "0E0"},
-      {"#00E00", "#00E00"},
-      {"#,##0", "#,##0"},
-      {"#;#", "0;0"},
-      {"#;-#", "0"}, // ignore a negative prefix pattern of '-' since that is the default
-      {"**##0", "**##0"},
-      {"*'x'##0", "*x##0"},
-      {"a''b0", "a''b0"},
-      {"*''##0", "*''##0"},
-      {"*📺##0", "*'📺'##0"},
-      {"*'நி'##0", "*'நி'##0"},
-    };
-
-    for (String[] cas : cases) {
-      String input = cas[0];
-      String output = cas[1];
-
-      DecimalFormatProperties properties = PatternStringParser.parseToProperties(input);
-      String actual = PatternStringUtils.propertiesToPatternString(properties);
-      assertEquals(
-          "Failed on input pattern '" + input + "', properties " + properties, output, actual);
+        assertEquals(localized, PatternStringUtils.convertLocalized(standard, symbols, true));
+        assertEquals(toStandard, PatternStringUtils.convertLocalized(localized, symbols, false));
     }
-  }
 
-  @Test
-  public void testToPatternWithProperties() {
-    Object[][] cases = {
-      {new DecimalFormatProperties().setPositivePrefix("abc"), "abc#"},
-      {new DecimalFormatProperties().setPositiveSuffix("abc"), "#abc"},
-      {new DecimalFormatProperties().setPositivePrefixPattern("abc"), "abc#"},
-      {new DecimalFormatProperties().setPositiveSuffixPattern("abc"), "#abc"},
-      {new DecimalFormatProperties().setNegativePrefix("abc"), "#;abc#"},
-      {new DecimalFormatProperties().setNegativeSuffix("abc"), "#;#abc"},
-      {new DecimalFormatProperties().setNegativePrefixPattern("abc"), "#;abc#"},
-      {new DecimalFormatProperties().setNegativeSuffixPattern("abc"), "#;#abc"},
-      {new DecimalFormatProperties().setPositivePrefix("+"), "'+'#"},
-      {new DecimalFormatProperties().setPositivePrefixPattern("+"), "+#"},
-      {new DecimalFormatProperties().setPositivePrefix("+'"), "'+'''#"},
-      {new DecimalFormatProperties().setPositivePrefix("'+"), "'''+'#"},
-      {new DecimalFormatProperties().setPositivePrefix("'"), "''#"},
-      {new DecimalFormatProperties().setPositivePrefixPattern("+''"), "+''#"},
-    };
+    @Test
+    public void testToPatternSimple() {
+        String[][] cases = {
+                { "#", "0" },
+                { "0", "0" },
+                { "#0", "0" },
+                { "###", "0" },
+                { "0.##", "0.##" },
+                { "0.00", "0.00" },
+                { "0.00#", "0.00#" },
+                { "#E0", "#E0" },
+                { "0E0", "0E0" },
+                { "#00E00", "#00E00" },
+                { "#,##0", "#,##0" },
+                { "#;#", "0;0" },
+                { "#;-#", "0" }, // ignore a negative prefix pattern of '-' since that is the default
+                { "**##0", "**##0" },
+                { "*'x'##0", "*x##0" },
+                { "a''b0", "a''b0" },
+                { "*''##0", "*''##0" },
+                { "*📺##0", "*'📺'##0" },
+                { "*'நி'##0", "*'நி'##0" }, };
 
-    for (Object[] cas : cases) {
-      DecimalFormatProperties input = (DecimalFormatProperties) cas[0];
-      String output = (String) cas[1];
+        for (String[] cas : cases) {
+            String input = cas[0];
+            String output = cas[1];
 
-      String actual = PatternStringUtils.propertiesToPatternString(input);
-      assertEquals("Failed on input properties " + input, output, actual);
+            DecimalFormatProperties properties = PatternStringParser.parseToProperties(input);
+            String actual = PatternStringUtils.propertiesToPatternString(properties);
+            assertEquals("Failed on input pattern '" + input + "', properties " + properties,
+                    output,
+                    actual);
+        }
     }
-  }
 
-  @Test
-  public void testExceptionOnInvalid() {
-    String[] invalidPatterns = {
-      "#.#.#", "0#", "0#.", ".#0", "0#.#0", "@0", "0@", "0,", "0,,", "0,,0", "0,,0,", "#,##0E0"
-    };
+    @Test
+    public void testToPatternWithProperties() {
+        Object[][] cases = {
+                { new DecimalFormatProperties().setPositivePrefix("abc"), "abc#" },
+                { new DecimalFormatProperties().setPositiveSuffix("abc"), "#abc" },
+                { new DecimalFormatProperties().setPositivePrefixPattern("abc"), "abc#" },
+                { new DecimalFormatProperties().setPositiveSuffixPattern("abc"), "#abc" },
+                { new DecimalFormatProperties().setNegativePrefix("abc"), "#;abc#" },
+                { new DecimalFormatProperties().setNegativeSuffix("abc"), "#;#abc" },
+                { new DecimalFormatProperties().setNegativePrefixPattern("abc"), "#;abc#" },
+                { new DecimalFormatProperties().setNegativeSuffixPattern("abc"), "#;#abc" },
+                { new DecimalFormatProperties().setPositivePrefix("+"), "'+'#" },
+                { new DecimalFormatProperties().setPositivePrefixPattern("+"), "+#" },
+                { new DecimalFormatProperties().setPositivePrefix("+'"), "'+'''#" },
+                { new DecimalFormatProperties().setPositivePrefix("'+"), "'''+'#" },
+                { new DecimalFormatProperties().setPositivePrefix("'"), "''#" },
+                { new DecimalFormatProperties().setPositivePrefixPattern("+''"), "+''#" }, };
 
-    for (String pattern : invalidPatterns) {
-      try {
-        PatternStringParser.parseToProperties(pattern);
-        fail("Didn't throw IllegalArgumentException when parsing pattern: " + pattern);
-      } catch (IllegalArgumentException e) {
-      }
+        for (Object[] cas : cases) {
+            DecimalFormatProperties input = (DecimalFormatProperties) cas[0];
+            String output = (String) cas[1];
+
+            String actual = PatternStringUtils.propertiesToPatternString(input);
+            assertEquals("Failed on input properties " + input, output, actual);
+        }
     }
-  }
 
-  @Test
-  public void testBug13117() {
-    DecimalFormatProperties expected = PatternStringParser.parseToProperties("0");
-    DecimalFormatProperties actual = PatternStringParser.parseToProperties("0;");
-    assertEquals("Should not consume negative subpattern", expected, actual);
-  }
+    @Test
+    public void testExceptionOnInvalid() {
+        String[] invalidPatterns = {
+                "#.#.#",
+                "0#",
+                "0#.",
+                ".#0",
+                "0#.#0",
+                "@0",
+                "0@",
+                "0,",
+                "0,,",
+                "0,,0",
+                "0,,0,",
+                "#,##0E0" };
+
+        for (String pattern : invalidPatterns) {
+            try {
+                PatternStringParser.parseToProperties(pattern);
+                fail("Didn't throw IllegalArgumentException when parsing pattern: " + pattern);
+            } catch (IllegalArgumentException e) {
+            }
+        }
+    }
+
+    @Test
+    public void testBug13117() {
+        DecimalFormatProperties expected = PatternStringParser.parseToProperties("0");
+        DecimalFormatProperties actual = PatternStringParser.parseToProperties("0;");
+        assertEquals("Should not consume negative subpattern", expected, actual);
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PropertiesTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PropertiesTest.java
index a93b767..bb557cc 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PropertiesTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PropertiesTest.java
@@ -31,9 +31,8 @@
 import com.ibm.icu.dev.test.serializable.SerializableTestUtility;
 import com.ibm.icu.impl.number.DecimalFormatProperties;
 import com.ibm.icu.impl.number.Padder.PadPosition;
-import com.ibm.icu.impl.number.Parse.GroupingMode;
-import com.ibm.icu.impl.number.Parse.ParseMode;
 import com.ibm.icu.impl.number.PatternStringParser;
+import com.ibm.icu.impl.number.parse.NumberParserImpl.ParseMode;
 import com.ibm.icu.text.CompactDecimalFormat.CompactStyle;
 import com.ibm.icu.text.CurrencyPluralInfo;
 import com.ibm.icu.text.MeasureFormat.FormatWidth;
@@ -45,322 +44,335 @@
 
 public class PropertiesTest {
 
-  @Test
-  public void testBasicEquals() {
-    DecimalFormatProperties p1 = new DecimalFormatProperties();
-    DecimalFormatProperties p2 = new DecimalFormatProperties();
-    assertEquals(p1, p2);
+    @Test
+    public void testBasicEquals() {
+        DecimalFormatProperties p1 = new DecimalFormatProperties();
+        DecimalFormatProperties p2 = new DecimalFormatProperties();
+        assertEquals(p1, p2);
 
-    p1.setPositivePrefix("abc");
-    assertNotEquals(p1, p2);
-    p2.setPositivePrefix("xyz");
-    assertNotEquals(p1, p2);
-    p1.setPositivePrefix("xyz");
-    assertEquals(p1, p2);
-  }
+        p1.setPositivePrefix("abc");
+        assertNotEquals(p1, p2);
+        p2.setPositivePrefix("xyz");
+        assertNotEquals(p1, p2);
+        p1.setPositivePrefix("xyz");
+        assertEquals(p1, p2);
+    }
 
-  @Test
-  public void testFieldCoverage() {
-    DecimalFormatProperties p0 = new DecimalFormatProperties();
-    DecimalFormatProperties p1 = new DecimalFormatProperties();
-    DecimalFormatProperties p2 = new DecimalFormatProperties();
-    DecimalFormatProperties p3 = new DecimalFormatProperties();
-    DecimalFormatProperties p4 = new DecimalFormatProperties();
+    @Test
+    public void testFieldCoverage() {
+        DecimalFormatProperties p0 = new DecimalFormatProperties();
+        DecimalFormatProperties p1 = new DecimalFormatProperties();
+        DecimalFormatProperties p2 = new DecimalFormatProperties();
+        DecimalFormatProperties p3 = new DecimalFormatProperties();
+        DecimalFormatProperties p4 = new DecimalFormatProperties();
 
-    Set<Integer> hashCodes = new HashSet<Integer>();
-    Field[] fields = DecimalFormatProperties.class.getDeclaredFields();
-    for (Field field : fields) {
-      if (Modifier.isStatic(field.getModifiers())) {
-        continue;
-      }
+        Set<Integer> hashCodes = new HashSet<Integer>();
+        Field[] fields = DecimalFormatProperties.class.getDeclaredFields();
+        for (Field field : fields) {
+            if (Modifier.isStatic(field.getModifiers())) {
+                continue;
+            }
 
-      // Check for getters and setters
-      String fieldNamePascalCase =
-          Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
-      String getterName = "get" + fieldNamePascalCase;
-      String setterName = "set" + fieldNamePascalCase;
-      Method getter, setter;
-      try {
-        getter = DecimalFormatProperties.class.getMethod(getterName);
-        assertEquals(
-            "Getter does not return correct type", field.getType(), getter.getReturnType());
-      } catch (NoSuchMethodException e) {
-        fail("Could not find method " + getterName + " for field " + field);
-        continue;
-      } catch (SecurityException e) {
-        fail("Could not access method " + getterName + " for field " + field);
-        continue;
-      }
-      try {
-        setter = DecimalFormatProperties.class.getMethod(setterName, field.getType());
-        assertEquals(
-            "Method " + setterName + " does not return correct type",
-            DecimalFormatProperties.class,
-            setter.getReturnType());
-      } catch (NoSuchMethodException e) {
-        fail("Could not find method " + setterName + " for field " + field);
-        continue;
-      } catch (SecurityException e) {
-        fail("Could not access method " + setterName + " for field " + field);
-        continue;
-      }
+            // Check for getters and setters
+            String fieldNamePascalCase = Character.toUpperCase(field.getName().charAt(0))
+                    + field.getName().substring(1);
+            String getterName = "get" + fieldNamePascalCase;
+            String setterName = "set" + fieldNamePascalCase;
+            Method getter, setter;
+            try {
+                getter = DecimalFormatProperties.class.getMethod(getterName);
+                assertEquals("Getter does not return correct type",
+                        field.getType(),
+                        getter.getReturnType());
+            } catch (NoSuchMethodException e) {
+                fail("Could not find method " + getterName + " for field " + field);
+                continue;
+            } catch (SecurityException e) {
+                fail("Could not access method " + getterName + " for field " + field);
+                continue;
+            }
+            try {
+                setter = DecimalFormatProperties.class.getMethod(setterName, field.getType());
+                assertEquals("Method " + setterName + " does not return correct type",
+                        DecimalFormatProperties.class,
+                        setter.getReturnType());
+            } catch (NoSuchMethodException e) {
+                fail("Could not find method " + setterName + " for field " + field);
+                continue;
+            } catch (SecurityException e) {
+                fail("Could not access method " + setterName + " for field " + field);
+                continue;
+            }
 
-      // Check for parameter name equality.
-      // The parameter name is not always available, depending on compiler settings.
-      // TODO: Enable in Java 8
-      /*
-      Parameter param = setter.getParameters()[0];
-      if (!param.getName().subSequence(0, 3).equals("arg")) {
-        assertEquals("Parameter name should equal field name", field.getName(), param.getName());
-      }
-      */
+            // Check for parameter name equality.
+            // The parameter name is not always available, depending on compiler settings.
+            // TODO: Enable in Java 8
+            /*
+             * Parameter param = setter.getParameters()[0]; if (!param.getName().subSequence(0,
+             * 3).equals("arg")) { assertEquals("Parameter name should equal field name",
+             * field.getName(), param.getName()); }
+             */
 
-      try {
-        // Check for default value (should be null for objects)
-        if (field.getType() != Integer.TYPE && field.getType() != Boolean.TYPE) {
-          Object default0 = getter.invoke(p0);
-          assertEquals("Field " + field + " has non-null default value:", null, default0);
+            try {
+                // Check for default value (should be null for objects)
+                if (field.getType() != Integer.TYPE && field.getType() != Boolean.TYPE) {
+                    Object default0 = getter.invoke(p0);
+                    assertEquals("Field " + field + " has non-null default value:", null, default0);
+                }
+
+                // Check for getter, equals, and hash code behavior
+                Object val0 = getSampleValueForType(field.getType(), 0);
+                Object val1 = getSampleValueForType(field.getType(), 1);
+                Object val2 = getSampleValueForType(field.getType(), 2);
+                assertNotEquals(val0, val1);
+                setter.invoke(p1, val0);
+                setter.invoke(p2, val0);
+                assertEquals(p1, p2);
+                assertEquals(p1.hashCode(), p2.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(p2));
+                assertEquals(getter.invoke(p1), val0);
+                assertNotEquals(getter.invoke(p1), val1);
+                hashCodes.add(p1.hashCode());
+                setter.invoke(p1, val1);
+                assertNotEquals("Field " + field + " is missing from equals()", p1, p2);
+                assertNotEquals(getter.invoke(p1), getter.invoke(p2));
+                assertNotEquals(getter.invoke(p1), val0);
+                assertEquals(getter.invoke(p1), val1);
+                setter.invoke(p1, val0);
+                assertEquals("Field " + field + " setter might have side effects", p1, p2);
+                assertEquals(p1.hashCode(), p2.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(p2));
+                setter.invoke(p1, val1);
+                setter.invoke(p2, val1);
+                assertEquals(p1, p2);
+                assertEquals(p1.hashCode(), p2.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(p2));
+                setter.invoke(p1, val2);
+                setter.invoke(p1, val1);
+                assertEquals("Field " + field + " setter might have side effects", p1, p2);
+                assertEquals(p1.hashCode(), p2.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(p2));
+                hashCodes.add(p1.hashCode());
+
+                // Check for clone behavior
+                DecimalFormatProperties copy = p1.clone();
+                assertEquals("Field " + field + " did not get copied in clone", p1, copy);
+                assertEquals(p1.hashCode(), copy.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(copy));
+
+                // Check for copyFrom behavior
+                setter.invoke(p1, val0);
+                assertNotEquals(p1, p2);
+                assertNotEquals(getter.invoke(p1), getter.invoke(p2));
+                p2.copyFrom(p1);
+                assertEquals("Field " + field + " is missing from copyFrom()", p1, p2);
+                assertEquals(p1.hashCode(), p2.hashCode());
+                assertEquals(getter.invoke(p1), getter.invoke(p2));
+
+                // Load values into p3 and p4 for clear() behavior test
+                setter.invoke(p3, getSampleValueForType(field.getType(), 3));
+                hashCodes.add(p3.hashCode());
+                setter.invoke(p4, getSampleValueForType(field.getType(), 4));
+                hashCodes.add(p4.hashCode());
+            } catch (IllegalAccessException e) {
+                fail("Could not access method for field " + field);
+            } catch (IllegalArgumentException e) {
+                fail("Could call method for field " + field);
+            } catch (InvocationTargetException e) {
+                fail("Could invoke method on target for field " + field);
+            }
         }
 
-        // Check for getter, equals, and hash code behavior
-        Object val0 = getSampleValueForType(field.getType(), 0);
-        Object val1 = getSampleValueForType(field.getType(), 1);
-        Object val2 = getSampleValueForType(field.getType(), 2);
-        assertNotEquals(val0, val1);
-        setter.invoke(p1, val0);
-        setter.invoke(p2, val0);
-        assertEquals(p1, p2);
-        assertEquals(p1.hashCode(), p2.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(p2));
-        assertEquals(getter.invoke(p1), val0);
-        assertNotEquals(getter.invoke(p1), val1);
-        hashCodes.add(p1.hashCode());
-        setter.invoke(p1, val1);
-        assertNotEquals("Field " + field + " is missing from equals()", p1, p2);
-        assertNotEquals(getter.invoke(p1), getter.invoke(p2));
-        assertNotEquals(getter.invoke(p1), val0);
-        assertEquals(getter.invoke(p1), val1);
-        setter.invoke(p1, val0);
-        assertEquals("Field " + field + " setter might have side effects", p1, p2);
-        assertEquals(p1.hashCode(), p2.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(p2));
-        setter.invoke(p1, val1);
-        setter.invoke(p2, val1);
-        assertEquals(p1, p2);
-        assertEquals(p1.hashCode(), p2.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(p2));
-        setter.invoke(p1, val2);
-        setter.invoke(p1, val1);
-        assertEquals("Field " + field + " setter might have side effects", p1, p2);
-        assertEquals(p1.hashCode(), p2.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(p2));
-        hashCodes.add(p1.hashCode());
+        // Check for clear() behavior
+        assertNotEquals(p3, p4);
+        p3.clear();
+        p4.clear();
+        assertEquals("A field is missing from the clear() function", p3, p4);
 
-        // Check for clone behavior
-        DecimalFormatProperties copy = p1.clone();
-        assertEquals("Field " + field + " did not get copied in clone", p1, copy);
-        assertEquals(p1.hashCode(), copy.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(copy));
-
-        // Check for copyFrom behavior
-        setter.invoke(p1, val0);
-        assertNotEquals(p1, p2);
-        assertNotEquals(getter.invoke(p1), getter.invoke(p2));
-        p2.copyFrom(p1);
-        assertEquals("Field " + field + " is missing from copyFrom()", p1, p2);
-        assertEquals(p1.hashCode(), p2.hashCode());
-        assertEquals(getter.invoke(p1), getter.invoke(p2));
-
-        // Load values into p3 and p4 for clear() behavior test
-        setter.invoke(p3, getSampleValueForType(field.getType(), 3));
-        hashCodes.add(p3.hashCode());
-        setter.invoke(p4, getSampleValueForType(field.getType(), 4));
-        hashCodes.add(p4.hashCode());
-      } catch (IllegalAccessException e) {
-        fail("Could not access method for field " + field);
-      } catch (IllegalArgumentException e) {
-        fail("Could call method for field " + field);
-      } catch (InvocationTargetException e) {
-        fail("Could invoke method on target for field " + field);
-      }
+        // A good hashCode() implementation should produce very few collisions. We added at most
+        // 4*fields.length codes to the set. We'll say the implementation is good if we had at least
+        // fields.length unique values.
+        // TODO: Should the requirement be stronger than this?
+        assertTrue(
+                "Too many hash code collisions: " + hashCodes.size() + " out of " + (fields.length * 4),
+                hashCodes.size() >= fields.length);
     }
 
-    // Check for clear() behavior
-    assertNotEquals(p3, p4);
-    p3.clear();
-    p4.clear();
-    assertEquals("A field is missing from the clear() function", p3, p4);
+    /**
+     * Creates a valid sample instance of the given type. Used to simulate getters and setters.
+     *
+     * @param type
+     *            The type to generate.
+     * @param seed
+     *            An integer seed, guaranteed to be positive. The same seed should generate two instances
+     *            that are equal. A different seed should in general generate two instances that are not
+     *            equal; this might not always be possible, such as with booleans or enums where there
+     *            are limited possible values.
+     * @return An instance of the specified type.
+     */
+    Object getSampleValueForType(Class<?> type, int seed) {
+        if (type == Integer.TYPE) {
+            return seed * 1000001;
 
-    // A good hashCode() implementation should produce very few collisions.  We added at most
-    // 4*fields.length codes to the set.  We'll say the implementation is good if we had at least
-    // fields.length unique values.
-    // TODO: Should the requirement be stronger than this?
-    assertTrue(
-        "Too many hash code collisions: " + hashCodes.size() + " out of " + (fields.length * 4),
-        hashCodes.size() >= fields.length);
-  }
+        } else if (type == Boolean.TYPE) {
+            return (seed % 2) == 0;
 
-  /**
-   * Creates a valid sample instance of the given type. Used to simulate getters and setters.
-   *
-   * @param type The type to generate.
-   * @param seed An integer seed, guaranteed to be positive. The same seed should generate two
-   *     instances that are equal. A different seed should in general generate two instances that
-   *     are not equal; this might not always be possible, such as with booleans or enums where
-   *     there are limited possible values.
-   * @return An instance of the specified type.
-   */
-  Object getSampleValueForType(Class<?> type, int seed) {
-    if (type == Integer.TYPE) {
-      return seed * 1000001;
+        } else if (type == BigDecimal.class) {
+            if (seed == 0)
+                return null;
+            return new BigDecimal(seed * 1000002);
 
-    } else if (type == Boolean.TYPE) {
-      return (seed % 2) == 0;
+        } else if (type == String.class) {
+            if (seed == 0)
+                return null;
+            return BigInteger.valueOf(seed * 1000003).toString(32);
 
-    } else if (type == BigDecimal.class) {
-      if (seed == 0) return null;
-      return new BigDecimal(seed * 1000002);
+        } else if (type == CompactStyle.class) {
+            if (seed == 0)
+                return null;
+            CompactStyle[] values = CompactStyle.values();
+            return values[seed % values.length];
 
-    } else if (type == String.class) {
-      if (seed == 0) return null;
-      return BigInteger.valueOf(seed * 1000003).toString(32);
+        } else if (type == Currency.class) {
+            if (seed == 0)
+                return null;
+            Object[] currencies = Currency.getAvailableCurrencies().toArray();
+            return currencies[seed % currencies.length];
 
-    } else if (type == CompactStyle.class) {
-      if (seed == 0) return null;
-      CompactStyle[] values = CompactStyle.values();
-      return values[seed % values.length];
+        } else if (type == CurrencyPluralInfo.class) {
+            if (seed == 0)
+                return null;
+            ULocale[] locales = ULocale.getAvailableLocales();
+            return CurrencyPluralInfo.getInstance(locales[seed % locales.length]);
 
-    } else if (type == Currency.class) {
-      if (seed == 0) return null;
-      Object[] currencies = Currency.getAvailableCurrencies().toArray();
-      return currencies[seed % currencies.length];
+        } else if (type == CurrencyUsage.class) {
+            if (seed == 0)
+                return null;
+            CurrencyUsage[] values = CurrencyUsage.values();
+            return values[seed % values.length];
 
-    } else if (type == CurrencyPluralInfo.class) {
-      if (seed == 0) return null;
-      ULocale[] locales = ULocale.getAvailableLocales();
-      return CurrencyPluralInfo.getInstance(locales[seed % locales.length]);
+        } else if (type == FormatWidth.class) {
+            if (seed == 0)
+                return null;
+            FormatWidth[] values = FormatWidth.values();
+            return values[seed % values.length];
 
-    } else if (type == CurrencyUsage.class) {
-      if (seed == 0) return null;
-      CurrencyUsage[] values = CurrencyUsage.values();
-      return values[seed % values.length];
+        } else if (type == Map.class) {
+            // Map<String,Map<String,String>> for compactCustomData property
+            if (seed == 0)
+                return null;
+            Map<String, Map<String, String>> outer = new HashMap<String, Map<String, String>>();
+            Map<String, String> inner = new HashMap<String, String>();
+            inner.put("one", "0 thousand");
+            StringBuilder magnitudeKey = new StringBuilder();
+            magnitudeKey.append("1000");
+            for (int i = 0; i < seed % 9; i++) {
+                magnitudeKey.append("0");
+            }
+            outer.put(magnitudeKey.toString(), inner);
+            return outer;
 
-    } else if (type == GroupingMode.class) {
-      if (seed == 0) return null;
-      GroupingMode[] values = GroupingMode.values();
-      return values[seed % values.length];
+        } else if (type == MathContext.class) {
+            if (seed == 0)
+                return null;
+            RoundingMode[] modes = RoundingMode.values();
+            return new MathContext(seed, modes[seed % modes.length]);
 
-    } else if (type == FormatWidth.class) {
-      if (seed == 0) return null;
-      FormatWidth[] values = FormatWidth.values();
-      return values[seed % values.length];
+        } else if (type == MeasureUnit.class) {
+            if (seed == 0)
+                return null;
+            Object[] units = MeasureUnit.getAvailable().toArray();
+            return units[seed % units.length];
 
-    } else if (type == Map.class) {
-      // Map<String,Map<String,String>> for compactCustomData property
-      if (seed == 0) return null;
-      Map<String, Map<String, String>> outer = new HashMap<String, Map<String, String>>();
-      Map<String, String> inner = new HashMap<String, String>();
-      inner.put("one", "0 thousand");
-      StringBuilder magnitudeKey = new StringBuilder();
-      magnitudeKey.append("1000");
-      for (int i = 0; i < seed % 9; i++) {
-        magnitudeKey.append("0");
-      }
-      outer.put(magnitudeKey.toString(), inner);
-      return outer;
+        } else if (type == PadPosition.class) {
+            if (seed == 0)
+                return null;
+            PadPosition[] values = PadPosition.values();
+            return values[seed % values.length];
 
-    } else if (type == MathContext.class) {
-      if (seed == 0) return null;
-      RoundingMode[] modes = RoundingMode.values();
-      return new MathContext(seed, modes[seed % modes.length]);
+        } else if (type == ParseMode.class) {
+            if (seed == 0)
+                return null;
+            ParseMode[] values = ParseMode.values();
+            return values[seed % values.length];
 
-    } else if (type == MeasureUnit.class) {
-      if (seed == 0) return null;
-      Object[] units = MeasureUnit.getAvailable().toArray();
-      return units[seed % units.length];
+        } else if (type == PluralRules.class) {
+            if (seed == 0)
+                return null;
+            ULocale[] locales = PluralRules.getAvailableULocales();
+            return PluralRules.forLocale(locales[seed % locales.length]);
 
-    } else if (type == PadPosition.class) {
-      if (seed == 0) return null;
-      PadPosition[] values = PadPosition.values();
-      return values[seed % values.length];
+        } else if (type == RoundingMode.class) {
+            if (seed == 0)
+                return null;
+            RoundingMode[] values = RoundingMode.values();
+            return values[seed % values.length];
 
-    } else if (type == ParseMode.class) {
-      if (seed == 0) return null;
-      ParseMode[] values = ParseMode.values();
-      return values[seed % values.length];
-
-    } else if (type == PluralRules.class) {
-      if (seed == 0) return null;
-      ULocale[] locales = PluralRules.getAvailableULocales();
-      return PluralRules.forLocale(locales[seed % locales.length]);
-
-    } else if (type == RoundingMode.class) {
-      if (seed == 0) return null;
-      RoundingMode[] values = RoundingMode.values();
-      return values[seed % values.length];
-
-    } else {
-      fail("Don't know how to handle type " + type + ". Please add it to getSampleValueForType().");
-      return null;
-    }
-  }
-
-  @Test
-  public void TestBasicSerializationRoundTrip() throws IOException, ClassNotFoundException {
-    DecimalFormatProperties props0 = new DecimalFormatProperties();
-
-    // Write values to some of the fields
-    PatternStringParser.parseToExistingProperties("A-**####,#00.00#b¤", props0);
-
-    // Write to byte stream
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    ObjectOutputStream oos = new ObjectOutputStream(baos);
-    oos.writeObject(props0);
-    oos.flush();
-    baos.close();
-    byte[] bytes = baos.toByteArray();
-
-    // Read from byte stream
-    ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
-    Object obj = ois.readObject();
-    ois.close();
-    DecimalFormatProperties props1 = (DecimalFormatProperties) obj;
-
-    // Test equality
-    assertEquals("Did not round-trip through serialization", props0, props1);
-  }
-
-  /** Handler for serialization compatibility test suite. */
-  public static class PropertiesHandler implements SerializableTestUtility.Handler {
-
-    @Override
-    public Object[] getTestObjects() {
-      return new Object[] {
-        new DecimalFormatProperties(),
-        PatternStringParser.parseToProperties("x#,##0.00%"),
-        new DecimalFormatProperties().setCompactStyle(CompactStyle.LONG).setMinimumExponentDigits(2)
-      };
+        } else {
+            fail("Don't know how to handle type "
+                    + type
+                    + ". Please add it to getSampleValueForType().");
+            return null;
+        }
     }
 
-    @Override
-    public boolean hasSameBehavior(Object a, Object b) {
-      return a.equals(b);
-    }
-  }
+    @Test
+    public void TestBasicSerializationRoundTrip() throws IOException, ClassNotFoundException {
+        DecimalFormatProperties props0 = new DecimalFormatProperties();
 
-  /** Handler for the ICU 59 class named "Properties" before it was renamed to "DecimalFormatProperties". */
-  public static class ICU59PropertiesHandler implements SerializableTestUtility.Handler {
+        // Write values to some of the fields
+        PatternStringParser.parseToExistingProperties("A-**####,#00.00#b¤", props0);
 
-    @Override
-    public Object[] getTestObjects() {
-      return new Object[] {
-        new com.ibm.icu.impl.number.Properties()
-      };
+        // Write to byte stream
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(props0);
+        oos.flush();
+        baos.close();
+        byte[] bytes = baos.toByteArray();
+
+        // Read from byte stream
+        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
+        Object obj = ois.readObject();
+        ois.close();
+        DecimalFormatProperties props1 = (DecimalFormatProperties) obj;
+
+        // Test equality
+        assertEquals("Did not round-trip through serialization", props0, props1);
     }
 
-    @Override
-    public boolean hasSameBehavior(Object a, Object b) {
-      return true;
+    /** Handler for serialization compatibility test suite. */
+    public static class PropertiesHandler implements SerializableTestUtility.Handler {
+
+        @Override
+        public Object[] getTestObjects() {
+            return new Object[] {
+                    new DecimalFormatProperties(),
+                    PatternStringParser.parseToProperties("x#,##0.00%"),
+                    new DecimalFormatProperties().setCompactStyle(CompactStyle.LONG)
+                            .setMinimumExponentDigits(2) };
+        }
+
+        @Override
+        public boolean hasSameBehavior(Object a, Object b) {
+            return a.equals(b);
+        }
     }
-  }
+
+    /**
+     * Handler for the ICU 59 class named "Properties" before it was renamed to
+     * "DecimalFormatProperties".
+     */
+    public static class ICU59PropertiesHandler implements SerializableTestUtility.Handler {
+
+        @Override
+        public Object[] getTestObjects() {
+            return new Object[] { new com.ibm.icu.impl.number.Properties() };
+        }
+
+        @Override
+        public boolean hasSameBehavior(Object a, Object b) {
+            return true;
+        }
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/UnicodeSetStaticCacheTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/UnicodeSetStaticCacheTest.java
new file mode 100644
index 0000000..97283a1
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/UnicodeSetStaticCacheTest.java
@@ -0,0 +1,89 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.dev.test.number;
+
+import static com.ibm.icu.impl.number.parse.UnicodeSetStaticCache.get;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.ibm.icu.impl.number.parse.UnicodeSetStaticCache.Key;
+import com.ibm.icu.lang.UCharacter;
+import com.ibm.icu.text.DecimalFormatSymbols;
+import com.ibm.icu.text.UnicodeSet;
+import com.ibm.icu.util.ULocale;
+
+/**
+ * @author sffc
+ *
+ */
+public class UnicodeSetStaticCacheTest {
+
+    @Test
+    public void testSetCoverage() {
+        // Lenient comma/period should be supersets of strict comma/period;
+        // it also makes the coverage logic cheaper.
+        assertTrue("COMMA should be superset of STRICT_COMMA",
+                get(Key.COMMA).containsAll(get(Key.STRICT_COMMA)));
+        assertTrue("PERIOD should be superset of STRICT_PERIOD",
+                get(Key.PERIOD).containsAll(get(Key.STRICT_PERIOD)));
+
+        UnicodeSet decimals = get(Key.STRICT_COMMA).cloneAsThawed().addAll(get(Key.STRICT_PERIOD))
+                .freeze();
+        UnicodeSet grouping = decimals.cloneAsThawed().addAll(get(Key.OTHER_GROUPING_SEPARATORS))
+                .freeze();
+        UnicodeSet plusSign = get(Key.PLUS_SIGN);
+        UnicodeSet minusSign = get(Key.MINUS_SIGN);
+        UnicodeSet percent = get(Key.PERCENT_SIGN);
+        UnicodeSet permille = get(Key.PERMILLE_SIGN);
+        UnicodeSet infinity = get(Key.INFINITY);
+        UnicodeSet nanLead = get(Key.NAN_LEAD);
+        UnicodeSet scientificLead = get(Key.SCIENTIFIC_LEAD);
+
+        for (ULocale locale : ULocale.getAvailableLocales()) {
+            DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(locale);
+
+            assertInSet(locale, decimals, dfs.getDecimalSeparatorString());
+            assertInSet(locale, grouping, dfs.getGroupingSeparatorString());
+            assertInSet(locale, plusSign, dfs.getPlusSignString());
+            assertInSet(locale, minusSign, dfs.getMinusSignString());
+            assertInSet(locale, percent, dfs.getPercentString());
+            assertInSet(locale, permille, dfs.getPerMillString());
+            assertInSet(locale, infinity, dfs.getInfinity());
+            assertInSet(locale, nanLead, dfs.getNaN().codePointAt(0));
+            assertInSet(locale, nanLead, UCharacter.foldCase(dfs.getNaN(), true).codePointAt(0));
+            assertInSet(locale,
+                    scientificLead,
+                    UCharacter.foldCase(dfs.getExponentSeparator(), true).codePointAt(0));
+        }
+    }
+
+    @Test
+    public void testFrozen() {
+        for (Key key : Key.values()) {
+            assertTrue(get(key).isFrozen());
+        }
+    }
+
+    static void assertInSet(ULocale locale, UnicodeSet set, String str) {
+        if (str.codePointCount(0, str.length()) != 1) {
+            // Ignore locale strings with more than one code point (usually a bidi mark)
+            return;
+        }
+        assertInSet(locale, set, str.codePointAt(0));
+    }
+
+    static void assertInSet(ULocale locale, UnicodeSet set, int cp) {
+        // If this test case fails, add the specified code point to the corresponding set in
+        // UnicodeSetStaticCache.java
+        assertTrue(
+                locale
+                        + " U+"
+                        + Integer.toHexString(cp)
+                        + " ("
+                        + UCharacter.toString(cp)
+                        + ") should be in "
+                        + set,
+                set.contains(cp));
+    }
+}
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/BreakIteratorTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/BreakIteratorTest.java
index 37319a1..bd29e7c 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/BreakIteratorTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/BreakIteratorTest.java
@@ -9,11 +9,8 @@
 package com.ibm.icu.dev.test.rbbi;
 
 import java.text.StringCharacterIterator;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Locale;
 
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -23,190 +20,19 @@
 import com.ibm.icu.text.FilteredBreakIteratorBuilder;
 import com.ibm.icu.util.ULocale;
 
-@SuppressWarnings("unused")
 @RunWith(JUnit4.class)
 public class BreakIteratorTest extends TestFmwk
 {
-    private BreakIterator characterBreak;
-    private BreakIterator wordBreak;
-    private BreakIterator lineBreak;
-    private BreakIterator sentenceBreak;
-    private BreakIterator titleBreak;
-
     public BreakIteratorTest()
     {
 
     }
 
-    @Before
-    public void init(){
-        characterBreak = BreakIterator.getCharacterInstance();
-        wordBreak = BreakIterator.getWordInstance();
-        lineBreak = BreakIterator.getLineInstance();
-        //logln("Creating sentence iterator...");
-        sentenceBreak = BreakIterator.getSentenceInstance();
-        //logln("Finished creating sentence iterator...");
-        titleBreak = BreakIterator.getTitleInstance();
-    }
+
     //=========================================================================
     // general test subroutines
     //=========================================================================
 
-    private List<String> _testFirstAndNext(BreakIterator bi, String text) {
-        int p = bi.first();
-        int lastP = p;
-        List<String> result = new ArrayList<String>();
-
-        if (p != 0)
-            errln("first() returned " + p + " instead of 0");
-        while (p != BreakIterator.DONE) {
-            p = bi.next();
-            if (p != BreakIterator.DONE) {
-                if (p <= lastP)
-                    errln("next() failed to move forward: next() on position "
-                                    + lastP + " yielded " + p);
-
-                result.add(text.substring(lastP, p));
-            }
-            else {
-                if (lastP != text.length())
-                    errln("next() returned DONE prematurely: offset was "
-                                    + lastP + " instead of " + text.length());
-            }
-            lastP = p;
-        }
-        return result;
-    }
-
-    private List<String> _testLastAndPrevious(BreakIterator bi, String text) {
-        int p = bi.last();
-        int lastP = p;
-        List<String> result = new ArrayList<String>();
-
-        if (p != text.length())
-            errln("last() returned " + p + " instead of " + text.length());
-        while (p != BreakIterator.DONE) {
-            p = bi.previous();
-            if (p != BreakIterator.DONE) {
-                if (p >= lastP)
-                    errln("previous() failed to move backward: previous() on position "
-                                    + lastP + " yielded " + p);
-
-                result.add(0, text.substring(p, lastP));
-            }
-            else {
-                if (lastP != 0)
-                    errln("previous() returned DONE prematurely: offset was "
-                                    + lastP + " instead of 0");
-            }
-            lastP = p;
-        }
-        return result;
-    }
-
-    private void compareFragmentLists(String f1Name, String f2Name, List<String> f1, List<String> f2) {
-        int p1 = 0;
-        int p2 = 0;
-        String s1;
-        String s2;
-        int t1 = 0;
-        int t2 = 0;
-
-        while (p1 < f1.size() && p2 < f2.size()) {
-            s1 = f1.get(p1);
-            s2 = f2.get(p2);
-            t1 += s1.length();
-            t2 += s2.length();
-
-            if (s1.equals(s2)) {
-                debugLogln("   >" + s1 + "<");
-                ++p1;
-                ++p2;
-            }
-            else {
-                int tempT1 = t1;
-                int tempT2 = t2;
-                int tempP1 = p1;
-                int tempP2 = p2;
-
-                while (tempT1 != tempT2 && tempP1 < f1.size() && tempP2 < f2.size()) {
-                    while (tempT1 < tempT2 && tempP1 < f1.size()) {
-                        tempT1 += (f1.get(tempP1)).length();
-                        ++tempP1;
-                    }
-                    while (tempT2 < tempT1 && tempP2 < f2.size()) {
-                        tempT2 += (f2.get(tempP2)).length();
-                        ++tempP2;
-                    }
-                }
-                logln("*** " + f1Name + " has:");
-                while (p1 <= tempP1 && p1 < f1.size()) {
-                    s1 = f1.get(p1);
-                    t1 += s1.length();
-                    debugLogln(" *** >" + s1 + "<");
-                    ++p1;
-                }
-                logln("***** " + f2Name + " has:");
-                while (p2 <= tempP2 && p2 < f2.size()) {
-                    s2 = f2.get(p2);
-                    t2 += s2.length();
-                    debugLogln(" ***** >" + s2 + "<");
-                    ++p2;
-                }
-                errln("Discrepancy between " + f1Name + " and " + f2Name);
-            }
-        }
-    }
-
-    private void _testFollowing(BreakIterator bi, String text, int[] boundaries) {
-        logln("testFollowing():");
-        int p = 2;
-        for (int i = 0; i <= text.length(); i++) {
-            if (i == boundaries[p])
-                ++p;
-
-            int b = bi.following(i);
-            logln("bi.following(" + i + ") -> " + b);
-            if (b != boundaries[p])
-                errln("Wrong result from following() for " + i + ": expected " + boundaries[p]
-                                + ", got " + b);
-        }
-    }
-
-    private void _testPreceding(BreakIterator bi, String text, int[] boundaries) {
-        logln("testPreceding():");
-        int p = 0;
-        for (int i = 0; i <= text.length(); i++) {
-            int b = bi.preceding(i);
-            logln("bi.preceding(" + i + ") -> " + b);
-            if (b != boundaries[p])
-                errln("Wrong result from preceding() for " + i + ": expected " + boundaries[p]
-                                + ", got " + b);
-
-            if (i == boundaries[p + 1])
-                ++p;
-        }
-    }
-
-    private void _testIsBoundary(BreakIterator bi, String text, int[] boundaries) {
-        logln("testIsBoundary():");
-        int p = 1;
-        boolean isB;
-        for (int i = 0; i <= text.length(); i++) {
-            isB = bi.isBoundary(i);
-            logln("bi.isBoundary(" + i + ") -> " + isB);
-
-            if (i == boundaries[p]) {
-                if (!isB)
-                    errln("Wrong result from isBoundary() for " + i + ": expected true, got false");
-                ++p;
-            }
-            else {
-                if (isB)
-                    errln("Wrong result from isBoundary() for " + i + ": expected false, got true");
-            }
-        }
-    }
 
     private void doOtherInvariantTest(BreakIterator tb, String testChars)
     {
@@ -362,43 +188,7 @@
             errln("Didn't get break at end of string.");
     }
 
-    // The Following two tests are ported from ICU4C 1.8.1 [Richard/GCL]
-    /**
-     * Port From:   ICU4C v1.8.1 : textbounds : IntlTestTextBoundary
-     * Source File: $ICU4CRoot/source/test/intltest/ittxtbd.cpp
-     **/
-    /**
-     * test methods preceding, following and isBoundary
-     **/
-    @Test
-    public void TestPreceding() {
-        String words3 = "aaa bbb ccc";
-        BreakIterator e = BreakIterator.getWordInstance(Locale.getDefault());
-        e.setText( words3 );
-        e.first();
-        int p1 = e.next();
-        int p2 = e.next();
-        int p3 = e.next();
-        int p4 = e.next();
-
-        int f = e.following(p2+1);
-        int p = e.preceding(p2+1);
-        if (f!=p3)
-            errln("IntlTestTextBoundary::TestPreceding: f!=p3");
-        if (p!=p2)
-            errln("IntlTestTextBoundary::TestPreceding: p!=p2");
-
-        if (p1+1!=p2)
-            errln("IntlTestTextBoundary::TestPreceding: p1+1!=p2");
-
-        if (p3+1!=p4)
-            errln("IntlTestTextBoundary::TestPreceding: p3+1!=p4");
-
-        if (!e.isBoundary(p2) || e.isBoundary(p2+1) || !e.isBoundary(p3))
-        {
-            errln("IntlTestTextBoundary::TestPreceding: isBoundary err");
-        }
-    }
+    // The Following test is ported from ICU4C 1.8.1 [Richard/GCL]
 
     /**
      * Ticket#5615
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/RBBITest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/RBBITest.java
index 1696e34..5d598aa 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/RBBITest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/RBBITest.java
@@ -19,6 +19,7 @@
 import java.text.CharacterIterator;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -26,6 +27,7 @@
 
 import com.ibm.icu.dev.test.TestFmwk;
 import com.ibm.icu.text.BreakIterator;
+import com.ibm.icu.text.RBBIDataWrapper;
 import com.ibm.icu.text.RuleBasedBreakIterator;
 import com.ibm.icu.util.ULocale;
 
@@ -548,4 +550,111 @@
         assertEquals("", t1.fExpectedBoundaries, t1.fBoundaries);
         assertEquals("", t2.fExpectedBoundaries, t2.fBoundaries);
     }
+
+    @Test
+    public void TestBug12677() {
+        // Check that stripping of comments from rules for getRules() is not confused by
+        // the presence of '#' characters in the rules that do not introduce comments.
+        String rules = "!!forward; \n"
+                     + "$x = [ab#];  # a set with a # literal. \n"
+                     + " # .;        # a comment that looks sort of like a rule.   \n"
+                     + " '#' '?';    # a rule with a quoted #   \n";
+
+        RuleBasedBreakIterator bi  = new RuleBasedBreakIterator(rules);
+        String rtRules = bi.toString();        // getRules() in C++
+        assertEquals("Break Iterator rule stripping test", "!!forward; $x = [ab#]; '#' '?'; ",  rtRules);
+    }
+
+    @Test
+    public void TestTableRedundancies() {
+        RuleBasedBreakIterator bi = (RuleBasedBreakIterator)BreakIterator.getLineInstance(Locale.ENGLISH);
+        String rules = bi.toString();
+        bi = new RuleBasedBreakIterator(rules);
+        // Build a break iterator from source rules.
+        // Want to check the rule builder in Java, not the pre-built rules that are imported from ICU4C.
+        RBBIDataWrapper dw = bi.fRData;
+        RBBIDataWrapper.RBBIStateTable fwtbl = dw.fFTable;
+        int numCharClasses = dw.fHeader.fCatCount;
+
+        // Check for duplicate columns (character categories)
+        List<String> columns = new ArrayList<String>();
+        for (int column=0; column<numCharClasses; column++) {
+            StringBuilder s = new StringBuilder();
+            for (int r = 1; r < fwtbl.fNumStates; r++) {
+                int row = dw.getRowIndex(r);
+                short tableVal = fwtbl.fTable[row + RBBIDataWrapper.NEXTSTATES + column];
+                s.append((char)tableVal);
+            }
+            columns.add(s.toString());
+        }
+        // Ignore column (char class) 0 while checking; it's special, and may have duplicates.
+        for (int c1=1; c1<numCharClasses; c1++) {
+            for (int c2 = c1+1; c2 < numCharClasses; c2++) {
+                assertFalse(String.format("Duplicate columns (%d, %d)", c1, c2), columns.get(c1).equals(columns.get(c2)));
+                // if (columns.get(c1).equals(columns.get(c2))) {
+                //    System.out.printf("Duplicate columns (%d, %d)\n", c1, c2);
+                // }
+            }
+        }
+
+        // Check for duplicate states.
+        List<String> rows = new ArrayList<String>();
+        for (int r=0; r<fwtbl.fNumStates; r++) {
+            StringBuilder s = new StringBuilder();
+            int row = dw.getRowIndex(r);
+            assertTrue("Accepting < -1", fwtbl.fTable[row + RBBIDataWrapper.ACCEPTING] >= -1);
+            s.append(fwtbl.fTable[row + RBBIDataWrapper.ACCEPTING]);
+            s.append(fwtbl.fTable[row + RBBIDataWrapper.LOOKAHEAD]);
+            s.append(fwtbl.fTable[row + RBBIDataWrapper.TAGIDX]);
+            for (int column=0; column<numCharClasses; column++) {
+                short tableVal = fwtbl.fTable[row + RBBIDataWrapper.NEXTSTATES + column];
+                s.append((char)tableVal);
+            }
+            rows.add(s.toString());
+        }
+
+        for (int r1=0; r1 < fwtbl.fNumStates; r1++) {
+            for (int r2= r1+1; r2 < fwtbl.fNumStates; r2++) {
+                assertFalse(String.format("Duplicate states (%d, %d)", r1, r2), rows.get(r1).equals(rows.get(r2)));
+                // if (rows.get(r1).equals(rows.get(r2))) {
+                //     System.out.printf("Duplicate states (%d, %d)\n", r1, r2);
+                // }
+            }
+        }
+    }
+
+    @Test
+    public void TestBug13447() {
+        // Bug 13447: verify that getRuleStatus() returns the value corresponding to current(),
+        //  even after next() has returned DONE.
+       RuleBasedBreakIterator bi =
+                (RuleBasedBreakIterator)BreakIterator.getWordInstance(Locale.ENGLISH);
+        bi.setText("1234");
+        assertEquals("", BreakIterator.WORD_NONE, bi.getRuleStatus());
+        assertEquals("", 4, bi.next());
+        assertEquals("", BreakIterator.WORD_NUMBER, bi.getRuleStatus());
+        assertEquals("", BreakIterator.DONE, bi.next());
+        assertEquals("", 4, bi.current());
+        assertEquals("", BreakIterator.WORD_NUMBER, bi.getRuleStatus());
+    }
+
+    @Test
+    public void TestTableRebuild() {
+        // Test to verify that rebuilding the state tables from rule source for the standard
+        // break iterator types yields the same tables as are imported from ICU4C as part of the default data.
+        List<RuleBasedBreakIterator> breakIterators = new ArrayList<RuleBasedBreakIterator>();
+        breakIterators.add((RuleBasedBreakIterator)BreakIterator.getCharacterInstance(Locale.ENGLISH));
+        breakIterators.add((RuleBasedBreakIterator)BreakIterator.getWordInstance(Locale.ENGLISH));
+        breakIterators.add((RuleBasedBreakIterator)BreakIterator.getSentenceInstance(Locale.ENGLISH));
+        breakIterators.add((RuleBasedBreakIterator)BreakIterator.getLineInstance(Locale.ENGLISH));
+
+        for (RuleBasedBreakIterator bi: breakIterators) {
+            String rules = bi.toString();
+            RuleBasedBreakIterator bi2 = new RuleBasedBreakIterator(rules);
+            assertTrue("Forward Table",      RBBIDataWrapper.equals(bi.fRData.fFTable, bi2.fRData.fFTable));
+            assertTrue("Reverse Table",      RBBIDataWrapper.equals(bi.fRData.fRTable, bi2.fRData.fRTable));
+            assertTrue("Safe Forward Table", RBBIDataWrapper.equals(bi.fRData.fSFTable, bi2.fRData.fSFTable));
+            assertTrue("SafeForward Table",  RBBIDataWrapper.equals(bi.fRData.fSRTable, bi2.fRData.fSRTable));
+        }
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/rbbitst.txt b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/rbbitst.txt
index 1450a98..761b3e0 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/rbbitst.txt
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/rbbi/rbbitst.txt
@@ -38,19 +38,8 @@
 
 
 #   Temp debugging tests
-<locale en>
-<word>
-<data><0>コンピューター<400>は<400>、<0>本質<400>的<400>に<400>は<400>数字<400>しか<400>扱う<400>こと<400>が<400>でき<400>ま<400>せん<400>。<0>\
-コンピューター<400>は<400>、<0>文字<400>や<400>記号<400>など<400>の<400>それぞれに<400>番号<400>を<400>割り振る<400>こと<400>によって<400>扱える<400>\
-よう<400>にし<400>ます<400>。<0>ユニ<400>コード<400>が<400>出来る<400>まで<400>は<400>、<0>これらの<400>番号<400>を<400>割り振る<400>仕組み<400>が<400>\
-何<400>百<400>種類<400>も<400>存在<400>しま<400>した<400>。<0>どの<400>一つ<400>を<400>とっても<400>、<0>十分<400>な<400>文字<400>を<400>含<400>\
-んで<400>は<400>いま<400>せん<400>で<400>した<400>。<0>例えば<400>、<0>欧州<400>連合<400>一つ<400>を<400>見<400>て<400>も<400>、<0>その<400>\
-すべて<400>の<400>言語<400>を<400>カバー<400>する<400>ため<400>に<400>は<400>、<0>いくつか<400>の<400>異なる<400>符号<400>化<400>の<400>仕組み<400>\
-が<400>必要<400>で<400>した<400>。<0>英語<400>の<400>よう<400>な<400>一つ<400>の<400>言語<400>に<400>限<400>って<400>も<400>、<0>一つ<400>だけ<400>\
-の<400>符号<400>化<400>の<400>仕組み<400>では<400>、<0>一般<400>的<400>に<400>使<400>われる<400>すべて<400>の<400>文字<400>、<0>句読点<400>、<0>\
-。<0></data>
+#
 
-#<data><0>コンピューター<400>は<400>、<0>本質<400>的<400>に<400>は<400>数字<400>しか<400>扱う<400>こと<400>が<400>でき<400>ま<400>せん<400>。<0>\
 
 ## FILTERED BREAK TESTS
 
@@ -330,6 +319,15 @@
 <data>•\U00011700<200>ロ<400>から<400>売却<400>完了<400>時<400>の<400>時価<400>が<400>提示<400>さ<400>れ<400>て<400>いる<400></data>
 
 #
+# Ticket #13549
+#   CjiBreakEngine::divideUpDictionaryRange: assertion failure.
+#
+<locale en>
+<word>
+<data>•\U00020029<400>\u3300<400>\U0002C400<400></data>
+<data>•\uFAD7<400>\u331B<400>\u87DF<400>\u006D<200>\uFFFD•</data>
+
+#
 # What Is Unicode in Japanese
 # From http://unicode.org/standard/translations/japanese.html
 
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.IllegalIcuArgumentException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.IllegalIcuArgumentException.dat
deleted file mode 100644
index 7992773..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.IllegalIcuArgumentException.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.InvalidFormatException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.InvalidFormatException.dat
deleted file mode 100644
index 2a36979..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.InvalidFormatException.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.RelativeDateFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.RelativeDateFormat.dat
deleted file mode 100644
index d989501..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.RelativeDateFormat.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.locale.LocaleSyntaxException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.locale.LocaleSyntaxException.dat
deleted file mode 100644
index aaa3774..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.locale.LocaleSyntaxException.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ArabicShapingException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ArabicShapingException.dat
deleted file mode 100644
index 8c6fabd..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ArabicShapingException.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ChineseDateFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ChineseDateFormat.dat
deleted file mode 100644
index 8161488..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ChineseDateFormat.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ChineseDateFormatSymbols.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ChineseDateFormatSymbols.dat
deleted file mode 100644
index ecaf871..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ChineseDateFormatSymbols.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.CurrencyPluralInfo.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.CurrencyPluralInfo.dat
deleted file mode 100644
index ad74641..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.CurrencyPluralInfo.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateFormat.dat
deleted file mode 100644
index cc7f431..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateFormat.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateFormatSymbols.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateFormatSymbols.dat
deleted file mode 100644
index ecdad79..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateFormatSymbols.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateIntervalFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateIntervalFormat.dat
deleted file mode 100644
index a21cd88..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateIntervalFormat.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DecimalFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DecimalFormat.dat
deleted file mode 100644
index edbb58e..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DecimalFormat.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DecimalFormatSymbols.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DecimalFormatSymbols.dat
deleted file mode 100644
index 1491b56..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DecimalFormatSymbols.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.MeasureFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.MeasureFormat.dat
deleted file mode 100644
index a83fac3..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.MeasureFormat.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.NumberFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.NumberFormat.dat
deleted file mode 100644
index ecbdbaa..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.NumberFormat.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.PluralFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.PluralFormat.dat
deleted file mode 100644
index 9311a78..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.PluralFormat.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.SimpleDateFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.SimpleDateFormat.dat
deleted file mode 100644
index e7d32d7..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.SimpleDateFormat.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.StringPrepParseException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.StringPrepParseException.dat
deleted file mode 100644
index 925ee49..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.StringPrepParseException.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.TimeUnitFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.TimeUnitFormat.dat
deleted file mode 100644
index 13fcf70..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.TimeUnitFormat.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.BuddhistCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.BuddhistCalendar.dat
deleted file mode 100644
index cd0a599..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.BuddhistCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.Calendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.Calendar.dat
deleted file mode 100644
index a2ccc26..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.Calendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ChineseCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ChineseCalendar.dat
deleted file mode 100644
index fe4e26e..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ChineseCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.CopticCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.CopticCalendar.dat
deleted file mode 100644
index 83fa46a..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.CopticCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.DangiCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.DangiCalendar.dat
deleted file mode 100644
index d45ec90..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.DangiCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.EthiopicCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.EthiopicCalendar.dat
deleted file mode 100644
index f913f40..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.EthiopicCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.GregorianCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.GregorianCalendar.dat
deleted file mode 100644
index bd76132..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.GregorianCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ICUCloneNotSupportedException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ICUCloneNotSupportedException.dat
deleted file mode 100644
index 531cf8e..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ICUCloneNotSupportedException.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ICUException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ICUException.dat
deleted file mode 100644
index b849606..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ICUException.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ICUUncheckedIOException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ICUUncheckedIOException.dat
deleted file mode 100644
index d513fb9..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ICUUncheckedIOException.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.IllformedLocaleException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.IllformedLocaleException.dat
deleted file mode 100644
index d51c022..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.IllformedLocaleException.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.IndianCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.IndianCalendar.dat
deleted file mode 100644
index 9cb1367..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.IndianCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.JapaneseCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.JapaneseCalendar.dat
deleted file mode 100644
index 315766c..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.JapaneseCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.PersianCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.PersianCalendar.dat
deleted file mode 100644
index c24c050..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.PersianCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TaiwanCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TaiwanCalendar.dat
deleted file mode 100644
index 2c2c3d3..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TaiwanCalendar.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.UResourceTypeMismatchException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.UResourceTypeMismatchException.dat
deleted file mode 100644
index acbe568..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.UResourceTypeMismatchException.dat
+++ /dev/null
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.DateNumberFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.DateNumberFormat.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.DateNumberFormat.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.DateNumberFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.IllegalIcuArgumentException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.IllegalIcuArgumentException.dat
new file mode 100644
index 0000000..9002e80
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.IllegalIcuArgumentException.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.InvalidFormatException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.InvalidFormatException.dat
new file mode 100644
index 0000000..c7b33a0
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.InvalidFormatException.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.JavaTimeZone.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.JavaTimeZone.dat
similarity index 78%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.JavaTimeZone.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.JavaTimeZone.dat
index f3e44f0..254b50d 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.JavaTimeZone.dat
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.JavaTimeZone.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.OlsonTimeZone.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.OlsonTimeZone.dat
similarity index 92%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.OlsonTimeZone.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.OlsonTimeZone.dat
index e639773..6d4fd1c 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.OlsonTimeZone.dat
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.OlsonTimeZone.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.RelativeDateFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.RelativeDateFormat.dat
new file mode 100644
index 0000000..0443b74
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.RelativeDateFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.TZDBTimeZoneNames.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.TZDBTimeZoneNames.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.TZDBTimeZoneNames.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.TZDBTimeZoneNames.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.TimeZoneAdapter.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.TimeZoneAdapter.dat
similarity index 92%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.TimeZoneAdapter.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.TimeZoneAdapter.dat
index b28af99..93a59c8 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.TimeZoneAdapter.dat
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.TimeZoneAdapter.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.TimeZoneGenericNames.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.TimeZoneGenericNames.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.TimeZoneGenericNames.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.TimeZoneGenericNames.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.TimeZoneNamesImpl.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.TimeZoneNamesImpl.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.TimeZoneNamesImpl.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.TimeZoneNamesImpl.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.duration.BasicDurationFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.duration.BasicDurationFormat.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.impl.duration.BasicDurationFormat.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.duration.BasicDurationFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.locale.LocaleSyntaxException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.locale.LocaleSyntaxException.dat
new file mode 100644
index 0000000..cb20076
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.locale.LocaleSyntaxException.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.Currency.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.number.CustomSymbolCurrency.dat
similarity index 100%
copy from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.Currency.dat
copy to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.number.CustomSymbolCurrency.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.number.DecimalFormatProperties.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.number.DecimalFormatProperties.dat
new file mode 100644
index 0000000..72bb5f0
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.number.DecimalFormatProperties.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.number.Properties.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.number.Properties.dat
new file mode 100644
index 0000000..b5775ac
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.impl.number.Properties.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.math.BigDecimal.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.math.BigDecimal.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.math.BigDecimal.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.math.BigDecimal.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.math.MathContext.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.math.MathContext.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.math.MathContext.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.math.MathContext.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ArabicShapingException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ArabicShapingException.dat
new file mode 100644
index 0000000..f5fe682
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ArabicShapingException.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ChineseDateFormat$Field.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ChineseDateFormat$Field.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.ChineseDateFormat$Field.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ChineseDateFormat$Field.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ChineseDateFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ChineseDateFormat.dat
new file mode 100644
index 0000000..27b0b71
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ChineseDateFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ChineseDateFormatSymbols.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ChineseDateFormatSymbols.dat
new file mode 100644
index 0000000..893a021
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.ChineseDateFormatSymbols.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.CompactDecimalFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.CompactDecimalFormat.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.CompactDecimalFormat.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.CompactDecimalFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.CurrencyPluralInfo.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.CurrencyPluralInfo.dat
new file mode 100644
index 0000000..e35372c
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.CurrencyPluralInfo.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateFormat$Field.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateFormat$Field.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateFormat$Field.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateFormat$Field.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateFormat.dat
new file mode 100644
index 0000000..b5b3b58
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateFormatSymbols.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateFormatSymbols.dat
new file mode 100644
index 0000000..b5abea0
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateFormatSymbols.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateIntervalFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateIntervalFormat.dat
new file mode 100644
index 0000000..3002e6c
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateIntervalFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateIntervalInfo$PatternInfo.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateIntervalInfo$PatternInfo.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateIntervalInfo$PatternInfo.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateIntervalInfo$PatternInfo.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateIntervalInfo.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateIntervalInfo.dat
similarity index 71%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateIntervalInfo.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateIntervalInfo.dat
index b75cfcb..4d99cc6 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.DateIntervalInfo.dat
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DateIntervalInfo.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DecimalFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DecimalFormat.dat
new file mode 100644
index 0000000..13a5d40
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DecimalFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DecimalFormatSymbols.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DecimalFormatSymbols.dat
new file mode 100644
index 0000000..a7067a9
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.DecimalFormatSymbols.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.MeasureFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.MeasureFormat.dat
new file mode 100644
index 0000000..5733608
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.MeasureFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.MessageFormat$Field.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.MessageFormat$Field.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.MessageFormat$Field.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.MessageFormat$Field.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.MessageFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.MessageFormat.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.MessageFormat.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.MessageFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.NumberFormat$Field.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.NumberFormat$Field.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.NumberFormat$Field.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.NumberFormat$Field.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.NumberFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.NumberFormat.dat
new file mode 100644
index 0000000..aa6a344
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.NumberFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.PluralFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.PluralFormat.dat
new file mode 100644
index 0000000..6fbc975
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.PluralFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.PluralRules.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.PluralRules.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.PluralRules.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.PluralRules.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.RuleBasedNumberFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.RuleBasedNumberFormat.dat
similarity index 96%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.RuleBasedNumberFormat.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.RuleBasedNumberFormat.dat
index 205cff4..64c471e 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.RuleBasedNumberFormat.dat
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.RuleBasedNumberFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.SelectFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.SelectFormat.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.SelectFormat.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.SelectFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.SimpleDateFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.SimpleDateFormat.dat
new file mode 100644
index 0000000..70eed2d
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.SimpleDateFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.StringPrepParseException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.StringPrepParseException.dat
new file mode 100644
index 0000000..a414e54
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.StringPrepParseException.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.TimeUnitFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.TimeUnitFormat.dat
new file mode 100644
index 0000000..4a94483
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.TimeUnitFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.TimeZoneFormat.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.TimeZoneFormat.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.text.TimeZoneFormat.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.text.TimeZoneFormat.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.AnnualTimeZoneRule.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.AnnualTimeZoneRule.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.AnnualTimeZoneRule.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.AnnualTimeZoneRule.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.BuddhistCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.BuddhistCalendar.dat
new file mode 100644
index 0000000..d8fbc3d
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.BuddhistCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.Calendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.Calendar.dat
new file mode 100644
index 0000000..2dd5bf6
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.Calendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ChineseCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ChineseCalendar.dat
new file mode 100644
index 0000000..31158a7
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ChineseCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.CopticCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.CopticCalendar.dat
new file mode 100644
index 0000000..eab2011
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.CopticCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.Currency.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.Currency.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.Currency.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.Currency.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.DangiCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.DangiCalendar.dat
new file mode 100644
index 0000000..a4676fd
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.DangiCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.DateInterval.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.DateInterval.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.DateInterval.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.DateInterval.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.DateTimeRule.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.DateTimeRule.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.DateTimeRule.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.DateTimeRule.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.EthiopicCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.EthiopicCalendar.dat
new file mode 100644
index 0000000..782436d
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.EthiopicCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.GregorianCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.GregorianCalendar.dat
new file mode 100644
index 0000000..bbb52c3
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.GregorianCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.HebrewCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.HebrewCalendar.dat
similarity index 61%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.HebrewCalendar.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.HebrewCalendar.dat
index be2a09f..ec28c9e 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.HebrewCalendar.dat
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.HebrewCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ICUCloneNotSupportedException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ICUCloneNotSupportedException.dat
new file mode 100644
index 0000000..d71e9b2
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ICUCloneNotSupportedException.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ICUException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ICUException.dat
new file mode 100644
index 0000000..9121975
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ICUException.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ICUUncheckedIOException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ICUUncheckedIOException.dat
new file mode 100644
index 0000000..837018d
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ICUUncheckedIOException.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.IllformedLocaleException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.IllformedLocaleException.dat
new file mode 100644
index 0000000..ceff74a
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.IllformedLocaleException.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.IndianCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.IndianCalendar.dat
new file mode 100644
index 0000000..8ee4d85
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.IndianCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.InitialTimeZoneRule.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.InitialTimeZoneRule.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.InitialTimeZoneRule.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.InitialTimeZoneRule.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.IslamicCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.IslamicCalendar.dat
similarity index 63%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.IslamicCalendar.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.IslamicCalendar.dat
index 2ad20df..c6f7258 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.IslamicCalendar.dat
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.IslamicCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.JapaneseCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.JapaneseCalendar.dat
new file mode 100644
index 0000000..0b6f802
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.JapaneseCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.MeasureUnit.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.MeasureUnit.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.MeasureUnit.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.MeasureUnit.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TimeUnit.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.NoUnit.dat
similarity index 100%
copy from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TimeUnit.dat
copy to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.NoUnit.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.PersianCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.PersianCalendar.dat
new file mode 100644
index 0000000..7593a4e
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.PersianCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.RuleBasedTimeZone.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.RuleBasedTimeZone.dat
similarity index 69%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.RuleBasedTimeZone.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.RuleBasedTimeZone.dat
index 285f405..698b470 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.RuleBasedTimeZone.dat
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.RuleBasedTimeZone.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.SimpleTimeZone.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.SimpleTimeZone.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.SimpleTimeZone.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.SimpleTimeZone.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.TaiwanCalendar.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.TaiwanCalendar.dat
new file mode 100644
index 0000000..25a66a8
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.TaiwanCalendar.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TimeArrayTimeZoneRule.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.TimeArrayTimeZoneRule.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TimeArrayTimeZoneRule.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.TimeArrayTimeZoneRule.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TimeUnit.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.TimeUnit.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TimeUnit.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.TimeUnit.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TimeZone.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.TimeZone.dat
similarity index 87%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TimeZone.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.TimeZone.dat
index 5d69e24..b944d59 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.TimeZone.dat
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.TimeZone.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ULocale.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ULocale.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.ULocale.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.ULocale.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.UResourceTypeMismatchException.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.UResourceTypeMismatchException.dat
new file mode 100644
index 0000000..1dc7747
--- /dev/null
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.UResourceTypeMismatchException.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.VTimeZone.dat b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.VTimeZone.dat
similarity index 100%
rename from icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_56.1/com.ibm.icu.util.VTimeZone.dat
rename to icu4j/main/tests/core/src/com/ibm/icu/dev/test/serializable/data/ICU_61.1/com.ibm.icu.util.VTimeZone.dat
Binary files differ
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/timezone/TimeZoneRegressionTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/timezone/TimeZoneRegressionTest.java
index d143340..4f18c38 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/timezone/TimeZoneRegressionTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/timezone/TimeZoneRegressionTest.java
@@ -394,10 +394,10 @@
         int[] DATA = {
             1, GOOD,
             0, BAD,
-            -1, BAD,
+            -1, GOOD,   // #13566 updates SimpleTimeZone to support negative DST saving amount
             60*60*1000, GOOD,
-            Integer.MIN_VALUE, BAD,
-            // Integer.MAX_VALUE, ?, // no upper limit on DST savings at this time
+            Integer.MAX_VALUE, GOOD,    // no upper limit on DST savings at this time
+            Integer.MIN_VALUE, GOOD,    // no lower limit as well
         };
         for (int i=0; i<DATA.length; i+=2) {
             int savings = DATA[i];
@@ -1224,6 +1224,48 @@
             }
         }
     }
+
+    @Test
+    public void TestNegativeDaylightSaving() {
+        int stdOff = 1 * 60*60*1000;    // Standard offset UTC+1
+        int save = -1 * 60*60*1000;     // DST saving amount -1 hour
+        SimpleTimeZone stzDublin = new SimpleTimeZone(
+                1*60*60*1000, "Dublin-2018a",
+                Calendar.OCTOBER, -1, -Calendar.SUNDAY, 2*60*60*1000,
+                Calendar.MARCH, -1, -Calendar.SUNDAY, 1*60*60*1000,
+                save);
+        if (save != stzDublin.getDSTSavings()) {
+            errln("FAIL: DST saving is not " + save);
+        }
+
+        GregorianCalendar cal = new GregorianCalendar(TimeZone.GMT_ZONE);
+        Date testDate;
+        int[] offsets = new int[2];
+
+        cal.set(2018, Calendar.JANUARY, 15, 0, 0, 0);
+        testDate = cal.getTime();
+        if (!stzDublin.inDaylightTime(testDate)) {
+            errln("FAIL: The test date (Jan 15) must be in DST.");
+        }
+        stzDublin.getOffset(testDate.getTime(), false, offsets);
+        if (offsets[0] != stdOff || offsets[1] != save) {
+            errln("FAIL: Expected [stdoff=" + stdOff + ",save=" + save
+                    + "] on the test date (Jan 15), actual[stdoff=" + offsets[0]
+                    + ",save=" + offsets[1] + "]");
+        }
+
+        cal.set(2018, Calendar.JULY, 15, 0, 0, 0);
+        testDate = cal.getTime();
+        if (stzDublin.inDaylightTime(testDate)) {
+            errln("FAIL: The test date (Jul 15) must not be in DST.");
+        }
+        stzDublin.getOffset(testDate.getTime(), false, offsets);
+        if (offsets[0] != stdOff || offsets[1] != 0) {
+            errln("FAIL: Expected [stdoff=" + stdOff + ",save=" + 0
+                    + "] on the test date (Jul 15), actual[stdoff=" + offsets[0]
+                    + ",save=" + offsets[1] + "]");
+        }
+    }
 }
 
 //eof
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/timezone/TimeZoneTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/timezone/TimeZoneTest.java
index 767ac57..4e4c2ac 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/timezone/TimeZoneTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/timezone/TimeZoneTest.java
@@ -28,6 +28,7 @@
 
 import com.ibm.icu.dev.test.TestFmwk;
 import com.ibm.icu.impl.ICUData;
+import com.ibm.icu.impl.TimeZoneAdapter;
 import com.ibm.icu.text.SimpleDateFormat;
 import com.ibm.icu.util.BasicTimeZone;
 import com.ibm.icu.util.Calendar;
@@ -2316,6 +2317,19 @@
                     data[2], id);
         }
     }
+
+    @Test
+    public void TestTimeZoneAdapterEquals() {
+        String idChicago = "America/Chicago";
+        TimeZone icuChicago = TimeZone.getTimeZone(idChicago);
+        TimeZone icuChicago2 = TimeZone.getTimeZone(idChicago);
+        java.util.TimeZone icuChicagoWrapped = TimeZoneAdapter.wrap(icuChicago);
+        java.util.TimeZone icuChicagoWrapped2 = TimeZoneAdapter.wrap(icuChicago2);
+
+        assertFalse("Compare TimeZone and TimeZoneAdapter", icuChicago.equals(icuChicagoWrapped));
+        assertFalse("Compare TimeZoneAdapter with TimeZone", icuChicagoWrapped.equals(icuChicago));
+        assertTrue("Compare two TimeZoneAdapters", icuChicagoWrapped.equals(icuChicagoWrapped2));
+    }
 }
 
 //eof
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/CurrencyTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/CurrencyTest.java
index 9e4347f..8a96666 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/CurrencyTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/CurrencyTest.java
@@ -190,17 +190,54 @@
         // Do a basic check of getName()
         // USD { "US$", "US Dollar"            } // 04/04/1792-
         ULocale en = ULocale.ENGLISH;
+        ULocale en_CA = ULocale.forLanguageTag("en-CA");
+        ULocale en_US = ULocale.forLanguageTag("en-US");
+        ULocale en_NZ = ULocale.forLanguageTag("en-NZ");
         boolean[] isChoiceFormat = new boolean[1];
-        Currency usd = Currency.getInstance("USD");
+        Currency USD = Currency.getInstance("USD");
+        Currency CAD = Currency.getInstance("CAD");
+        Currency USX = Currency.getInstance("USX");
         // Warning: HARD-CODED LOCALE DATA in this test.  If it fails, CHECK
         // THE LOCALE DATA before diving into the code.
-        assertEquals("USD.getName(SYMBOL_NAME)",
+        assertEquals("USD.getName(SYMBOL_NAME, en)",
                 "$",
-                usd.getName(en, Currency.SYMBOL_NAME, isChoiceFormat));
-        assertEquals("USD.getName(LONG_NAME)",
+                USD.getName(en, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USD.getName(NARROW_SYMBOL_NAME, en)",
+                "$",
+                USD.getName(en, Currency.NARROW_SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USD.getName(LONG_NAME, en)",
                 "US Dollar",
-                usd.getName(en, Currency.LONG_NAME, isChoiceFormat));
-        // TODO add more tests later
+                USD.getName(en, Currency.LONG_NAME, isChoiceFormat));
+        assertEquals("CAD.getName(SYMBOL_NAME, en)",
+                "CA$",
+                CAD.getName(en, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("CAD.getName(NARROW_SYMBOL_NAME, en)",
+                "$",
+                CAD.getName(en, Currency.NARROW_SYMBOL_NAME, isChoiceFormat));
+        assertEquals("CAD.getName(SYMBOL_NAME, en_CA)",
+                "$",
+                CAD.getName(en_CA, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USD.getName(SYMBOL_NAME, en_CA)",
+                "US$",
+                USD.getName(en_CA, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USD.getName(NARROW_SYMBOL_NAME, en_CA)",
+                "$",
+                USD.getName(en_CA, Currency.NARROW_SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USD.getName(SYMBOL_NAME) in en_NZ",
+                "US$",
+                USD.getName(en_NZ, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("CAD.getName(SYMBOL_NAME)",
+                "CA$",
+                CAD.getName(en_NZ, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USX.getName(SYMBOL_NAME)",
+                "USX",
+                USX.getName(en_US, Currency.SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USX.getName(NARROW_SYMBOL_NAME)",
+                "USX",
+                USX.getName(en_US, Currency.NARROW_SYMBOL_NAME, isChoiceFormat));
+        assertEquals("USX.getName(LONG_NAME)",
+                "USX",
+                USX.getName(en_US, Currency.LONG_NAME, isChoiceFormat));
     }
 
     @Test
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/DebugUtilitiesData.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/DebugUtilitiesData.java
index 39d0804..679a94c 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/DebugUtilitiesData.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/DebugUtilitiesData.java
@@ -10,7 +10,7 @@
 package com.ibm.icu.dev.test.util;
 
 public class DebugUtilitiesData extends Object {
-    public static final String ICU4C_VERSION="60.2";
+    public static final String ICU4C_VERSION="61.1";
     public static final int UDebugEnumType = 0;
     public static final int UCalendarDateFields = 1;
     public static final int UCalendarMonths = 2;
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/RegionTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/RegionTest.java
index bd4117a..559798b 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/RegionTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/RegionTest.java
@@ -99,12 +99,12 @@
             { "BS" , "044", "029", "TERRITORY", "019" },
             { "BT" , "064", "034", "TERRITORY", "142" },
             { "BU" , "104", "035", "TERRITORY", "142" },
-            { "BV" , "074", "QO" , "TERRITORY", "009" },
+            { "BV" , "074", "005", "TERRITORY", "019" },
             { "BW" , "072", "018", "TERRITORY", "002" },
             { "BY" , "112", "151", "TERRITORY", "150" },
             { "BZ" , "084", "013", "TERRITORY", "019" },
             { "CA" , "124", "021", "TERRITORY", "019" },
-            { "CC" , "166", "QO" , "TERRITORY", "009" },
+            { "CC" , "166", "053", "TERRITORY", "009" },
             { "CD" , "180", "017", "TERRITORY", "002" },
             { "CF" , "140", "017", "TERRITORY", "002" },
             { "CG" , "178", "017", "TERRITORY", "002" },
@@ -120,7 +120,7 @@
             { "CU" , "192", "029", "TERRITORY", "019" },
             { "CV" , "132", "011", "TERRITORY", "002" },
             { "CW" , "531", "029", "TERRITORY", "019" },
-            { "CX" , "162", "QO" , "TERRITORY", "009" },
+            { "CX" , "162", "053", "TERRITORY", "009" },
             { "CY" , "196", "145", "TERRITORY", "142" },
             { "CZ" , "203", "151", "TERRITORY", "150" },
             { "DD" , "276", "155", "TERRITORY", "150" },
@@ -161,13 +161,13 @@
             { "GP" , "312", "029", "TERRITORY", "019" },
             { "GQ" , "226", "017", "TERRITORY", "002" },
             { "GR" , "300", "039", "TERRITORY", "150" },
-            { "GS" , "239", "QO" , "TERRITORY", "009" },
+            { "GS" , "239", "005", "TERRITORY", "019" },
             { "GT" , "320", "013", "TERRITORY", "019" },
             { "GU" , "316", "057", "TERRITORY", "009" },
             { "GW" , "624", "011", "TERRITORY", "002" },
             { "GY" , "328", "005", "TERRITORY", "019" },
             { "HK" , "344", "030", "TERRITORY", "142" },
-            { "HM" , "334", "QO" , "TERRITORY", "009" },
+            { "HM" , "334", "053", "TERRITORY", "009" },
             { "HN" , "340", "013", "TERRITORY", "019" },
             { "HR" , "191", "039", "TERRITORY", "150" },
             { "HT" , "332", "029", "TERRITORY", "019" },
@@ -178,7 +178,7 @@
             { "IL" , "376", "145", "TERRITORY", "142" },
             { "IM" , "833", "154", "TERRITORY", "150" },
             { "IN" , "356", "034", "TERRITORY", "142" },
-            { "IO" , "086", "QO" , "TERRITORY", "009" },
+            { "IO" , "086", "014", "TERRITORY", "002" },
             { "IQ" , "368", "145", "TERRITORY", "142" },
             { "IR" , "364", "034", "TERRITORY", "142" },
             { "IS" , "352", "154", "TERRITORY", "150" },
@@ -293,7 +293,7 @@
             { "TA" , "-1" , "QO", "TERRITORY", "009" },
             { "TC" , "796", "029", "TERRITORY", "019" },
             { "TD" , "148", "017", "TERRITORY", "002" },
-            { "TF" , "260", "QO" , "TERRITORY", "009" },
+            { "TF" , "260", "145", "TERRITORY", "142" },
             { "TG" , "768", "011", "TERRITORY", "002" },
             { "TH" , "764", "035", "TERRITORY", "142" },
             { "TJ" , "762", "143", "TERRITORY", "142" },
@@ -310,7 +310,7 @@
             { "TZ" , "834", "014", "TERRITORY", "002" },
             { "UA" , "804", "151", "TERRITORY", "150" },
             { "UG" , "800", "014", "TERRITORY", "002" },
-            { "UM" , "581", "QO" , "TERRITORY", "009" },
+            { "UM" , "581", "057", "TERRITORY", "009" },
             { "US" , "840", "021", "TERRITORY", "019" },
             { "UY" , "858", "005", "TERRITORY", "019" },
             { "UZ" , "860", "143", "TERRITORY", "142" },
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/TextTrieMapTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/TextTrieMapTest.java
index 4266d9c..4bd8fe1 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/TextTrieMapTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/TextTrieMapTest.java
@@ -17,6 +17,7 @@
 
 import com.ibm.icu.dev.test.TestFmwk;
 import com.ibm.icu.impl.TextTrieMap;
+import com.ibm.icu.text.UnicodeSet;
 
 @RunWith(JUnit4.class)
 public class TextTrieMapTest extends TestFmwk {
@@ -33,6 +34,7 @@
     private static final Integer SUP2 = new Integer(9);
     private static final Integer SUP3 = new Integer(10);
     private static final Integer SUP4 = new Integer(11);
+    private static final Integer SUP5 = new Integer(12);
 
     private static final Integer FOO = new Integer(-1);
     private static final Integer BAR = new Integer(-2);
@@ -63,6 +65,9 @@
         {"L📺1", SUP2}, // L, 0xD83D, 0xDCFA, 1
         {"L📻", SUP3}, // L, 0xD83D, 0xDCFB
         {"L🃏", SUP4}, // L, 0xD83C, 0xDCCF
+        {"📺", SUP5}, // 0xD83D, 0xDCFA
+        {"📻", SUP5}, // 0xD83D, 0xDCFB
+        {"🃏", SUP5}, // 0xD83C, 0xDCCF
     };
 
     private static final Object[][] TESTCASES = {
@@ -80,67 +85,6 @@
         {"l📺", null, SUP1},
     };
 
-    private static final Object[][] TESTCASES_PARSE = {
-            {
-                "Sunday",
-                new Object[]{
-                        new Object[]{SAT,SUN}, new Object[]{SAT,SUN}, // matches on "S"
-                        null, null, // matches on "Su"
-                        SUN, SUN, // matches on "Sun"
-                        null, null, // matches on "Sund"
-                        null, null, // matches on "Sunda"
-                        SUN, SUN, // matches on "Sunday"
-                }
-            },
-            {
-                "sunday",
-                new Object[]{
-                        null, new Object[]{SAT,SUN}, // matches on "s"
-                        null, null, // matches on "su"
-                        null, SUN, // matches on "sun"
-                        null, null, // matches on "sund"
-                        null, null, // matches on "sunda"
-                        null, SUN, // matches on "sunday"
-                }
-            },
-            {
-                "MMM",
-                new Object[]{
-                        MON, MON, // matches on "M"
-                        // no more matches in data
-                }
-            },
-            {
-                "BBB",
-                new Object[]{
-                        // no matches in data
-                }
-            },
-            {
-                "l📺12",
-                new Object[]{
-                        null, null, // matches on "L"
-                        null, SUP1, // matches on "L📺"
-                        null, SUP2, // matches on "L📺1"
-                        // no more matches in data
-                }
-            },
-            {
-                "L📻",
-                new Object[] {
-                        null, null, // matches on "L"
-                        SUP3, SUP3, // matches on "L📻"
-                }
-            },
-            {
-                "L🃏",
-                new Object[] {
-                        null, null, // matches on "L"
-                        SUP4, SUP4, // matches on "L🃏"
-                }
-            }
-    };
-
     @Test
     public void TestCaseSensitive() {
         Iterator itr = null;
@@ -167,12 +111,29 @@
             checkResult("get(String, int) case " + i, itr, TESTCASES[i][1]);
         }
 
-        logln("Test for ParseState");
-        for (int i = 0; i < TESTCASES_PARSE.length; i++) {
-            String test = (String) TESTCASES_PARSE[i][0];
-            Object[] expecteds = (Object[]) TESTCASES_PARSE[i][1];
-            checkParse(map, test, expecteds, true);
+        logln("Test for partial match");
+        for (Object[] cas : TESTDATA) {
+            String str = (String) cas[0];
+            for (int i = 0; i < str.length() - 1; i++) {
+                TextTrieMap.Output output = new TextTrieMap.Output();
+                map.get(str.substring(0, i), 0, output);
+                assertTrue("Partial string means partial match", output.partialMatch);
+            }
+            String bad = str + "x";
+            TextTrieMap.Output output = new TextTrieMap.Output();
+            map.get(bad, 0, output);
+            assertFalse("No partial match on bad string", output.partialMatch);
         }
+        TextTrieMap.Output output = new TextTrieMap.Output();
+        map.get("Sunday", 0, output);
+        assertFalse("No partial match on string with no continuation", output.partialMatch);
+
+        logln("Test for LeadCodePoints");
+        // Note: The 📺 and 📻 have the same lead surrogate
+        UnicodeSet expectedLeadCodePoints = new UnicodeSet("[SMTWFL📺📻🃏]");
+        UnicodeSet actualLeadCodePoints = new UnicodeSet();
+        map.putLeadCodePoints(actualLeadCodePoints);
+        assertEquals("leadCodePoints", expectedLeadCodePoints, actualLeadCodePoints);
 
         // Add duplicated entry
         map.put("Sunday", FOO);
@@ -210,12 +171,28 @@
             checkResult("get(String, int) case " + i, itr, TESTCASES[i][2]);
         }
 
-        logln("Test for ParseState");
-        for (int i = 0; i < TESTCASES_PARSE.length; i++) {
-            String test = (String) TESTCASES_PARSE[i][0];
-            Object[] expecteds = (Object[]) TESTCASES_PARSE[i][1];
-            checkParse(map, test, expecteds, false);
+        logln("Test for partial match");
+        for (Object[] cas : TESTDATA) {
+            String str = (String) cas[0];
+            for (int i = 0; i < str.length() - 1; i++) {
+                TextTrieMap.Output output = new TextTrieMap.Output();
+                map.get(str.substring(0, i), 0, output);
+                assertTrue("Partial string means partial match", output.partialMatch);
+            }
+            String bad = str + "x";
+            TextTrieMap.Output output = new TextTrieMap.Output();
+            map.get(bad, 0, output);
+            assertFalse("No partial match on bad string", output.partialMatch);
         }
+        TextTrieMap.Output output = new TextTrieMap.Output();
+        map.get("Sunday", 0, output);
+        assertFalse("No partial match on string with no continuation", output.partialMatch);
+
+        logln("Test for LeadCodePoints");
+        UnicodeSet expectedLeadCodePoints = new UnicodeSet("[smtwfl📺📻🃏]");
+        UnicodeSet actualLeadCodePoints = new UnicodeSet();
+        map.putLeadCodePoints(actualLeadCodePoints);
+        assertEquals("leadCodePoints", expectedLeadCodePoints, actualLeadCodePoints);
 
         // Add duplicated entry
         map.put("Sunday", FOO);
@@ -227,54 +204,6 @@
         checkResult("Get Sunday", itr, new Object[]{SUN, FOO, BAR});
     }
 
-    private void checkParse(TextTrieMap map, String text, Object[] rawExpecteds, boolean caseSensitive) {
-        // rawExpecteds has even-valued indices for case sensitive and odd-valued indicies for case insensitive
-        // Get out only the values that we want.
-        Object[] expecteds = null;
-        for (int i=rawExpecteds.length/2-1; i>=0; i--) {
-            int j = i*2+(caseSensitive?0:1);
-            if (rawExpecteds[j] != null) {
-                if (expecteds == null) {
-                    expecteds = new Object[i+1];
-                }
-                expecteds[i] = rawExpecteds[j];
-            }
-        }
-        if (expecteds == null) {
-            expecteds = new Object[0];
-        }
-
-        TextTrieMap.ParseState state = null;
-        for (int charOffset=0, cpOffset=0; charOffset < text.length(); cpOffset++) {
-            int cp = Character.codePointAt(text, charOffset);
-            if (state == null) {
-                state = map.openParseState(cp);
-            }
-            if (state == null) {
-                assertEquals("Expected matches, but no matches are available", 0, expecteds.length);
-                break;
-            }
-            state.accept(cp);
-            if (cpOffset < expecteds.length - 1) {
-                assertFalse(
-                        "In middle of parse sequence, but atEnd() is true: '" + text + "' offset " + charOffset,
-                        state.atEnd());
-            } else if (cpOffset == expecteds.length) {
-                // Note: it possible for atEnd() to be either true or false at expecteds.length - 1;
-                // if true, we are at the end of the input string; if false, there is still input string
-                // left to be consumed, but we don't know if there are remaining matches.
-                assertTrue(
-                        "At end of parse sequence, but atEnd() is false: '" + text + "' offset " + charOffset,
-                        state.atEnd());
-                break;
-            }
-            Object expected = expecteds[cpOffset];
-            Iterator actual = state.getCurrentMatches();
-            checkResult("ParseState '" + text + "' offset " + charOffset, actual, expected);
-            charOffset += Character.charCount(cp);
-        }
-    }
-
     private boolean eql(Object o1, Object o2) {
         if (o1 == null || o2 == null) {
             if (o1 == null && o2 == null) {
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/UtilityTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/UtilityTest.java
index 708c611..7cfc981 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/UtilityTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/UtilityTest.java
@@ -15,6 +15,7 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Random;
 import java.util.Set;
 
 import org.junit.Test;
@@ -249,4 +250,45 @@
     public String CheckSourceLocale() {
         return TestFmwk.sourceLocation();
     }
+
+    static final String RANDOM_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+    static final Random RANDOM = new Random(2018);
+
+    @Test
+    public void TestCharSequenceEqualsAndHashCode() {
+        for (int t=0; t<1000; t++) {
+            int length = RANDOM.nextInt(5);
+            CharSequence a = randomCharSequence(length);
+            CharSequence b = randomCharSequence(length);
+            CharSequence c = randomCharSequence(length + 3);
+            String message = "a=" + a + "; b=" + b + "; c=" + c;
+
+            assertTrue(message, Utility.charSequenceEquals(a, a));
+            assertFalse(message, Utility.charSequenceEquals(a, c));
+            assertTrue(message, Utility.charSequenceEquals(b, b));
+            assertFalse(message, Utility.charSequenceEquals(b, c));
+            assertFalse(message, Utility.charSequenceEquals(c, a));
+            assertFalse(message, Utility.charSequenceEquals(c, b));
+            assertTrue(message, Utility.charSequenceEquals(c, c));
+            if (length == 0 || a.toString().equals(b.toString())) {
+                assertTrue(message, Utility.charSequenceEquals(a, b));
+                assertTrue(message, Utility.charSequenceEquals(b, a));
+            } else {
+                assertFalse(message, Utility.charSequenceEquals(a, b));
+                assertFalse(message, Utility.charSequenceEquals(b, a));
+            }
+
+            assertEquals(message, Utility.charSequenceHashCode(a), a.toString().hashCode());
+            assertEquals(message, Utility.charSequenceHashCode(b), b.toString().hashCode());
+            assertEquals(message, Utility.charSequenceHashCode(c), c.toString().hashCode());
+        }
+    }
+
+    private CharSequence randomCharSequence(int length) {
+        StringBuilder sb = new StringBuilder();
+        for (int i=0; i<length; i++) {
+            sb.append(RANDOM_CHARS.charAt(RANDOM.nextInt(RANDOM_CHARS.length())));
+        }
+        return sb;
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/XLocaleDistanceTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/XLocaleDistanceTest.java
index ce8cb8b..9f331e2 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/XLocaleDistanceTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/XLocaleDistanceTest.java
@@ -54,6 +54,7 @@
         }
     }
 
+    @SuppressWarnings("unused")
     @Ignore("Disabled because of Linux; need to investigate.")
     @Test
     public void testTiming() {
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/impl/number/DecimalQuantity_64BitBCD.java b/icu4j/main/tests/core/src/com/ibm/icu/impl/number/DecimalQuantity_64BitBCD.java
deleted file mode 100644
index c968a0a..0000000
--- a/icu4j/main/tests/core/src/com/ibm/icu/impl/number/DecimalQuantity_64BitBCD.java
+++ /dev/null
@@ -1,181 +0,0 @@
-// © 2017 and later: Unicode, Inc. and others.
-// License & terms of use: http://www.unicode.org/copyright.html#License
-package com.ibm.icu.impl.number;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-public final class DecimalQuantity_64BitBCD extends DecimalQuantity_AbstractBCD {
-
-  /**
-   * The BCD of the 16 digits of the number represented by this object. Every 4 bits of the long map
-   * to one digit. For example, the number "12345" in BCD is "0x12345".
-   *
-   * <p>Whenever bcd changes internally, {@link #compact()} must be called, except in special cases
-   * like setting the digit to zero.
-   */
-  private long bcd;
-
-  @Override
-  public int maxRepresentableDigits() {
-    return 16;
-  }
-
-  public DecimalQuantity_64BitBCD(long input) {
-    setToLong(input);
-  }
-
-  public DecimalQuantity_64BitBCD(int input) {
-    setToInt(input);
-  }
-
-  public DecimalQuantity_64BitBCD(double input) {
-    setToDouble(input);
-  }
-
-  public DecimalQuantity_64BitBCD(BigInteger input) {
-    setToBigInteger(input);
-  }
-
-  public DecimalQuantity_64BitBCD(BigDecimal input) {
-    setToBigDecimal(input);
-  }
-
-  public DecimalQuantity_64BitBCD(DecimalQuantity_64BitBCD other) {
-    copyFrom(other);
-  }
-
-  @Override
-  public DecimalQuantity createCopy() {
-    return new DecimalQuantity_64BitBCD(this);
-  }
-
-  @Override
-  protected byte getDigitPos(int position) {
-    if (position < 0 || position >= 16) return 0;
-    return (byte) ((bcd >>> (position * 4)) & 0xf);
-  }
-
-  @Override
-  protected void setDigitPos(int position, byte value) {
-    assert position >= 0 && position < 16;
-    int shift = position * 4;
-    bcd = bcd & ~(0xfL << shift) | ((long) value << shift);
-  }
-
-  @Override
-  protected void shiftLeft(int numDigits) {
-    assert precision + numDigits <= 16;
-    bcd <<= (numDigits * 4);
-    scale -= numDigits;
-    precision += numDigits;
-  }
-
-  @Override
-  protected void shiftRight(int numDigits) {
-    bcd >>>= (numDigits * 4);
-    scale += numDigits;
-    precision -= numDigits;
-  }
-
-  @Override
-  protected void setBcdToZero() {
-    bcd = 0L;
-    scale = 0;
-    precision = 0;
-    isApproximate = false;
-    origDouble = 0;
-    origDelta = 0;
-  }
-
-  @Override
-  protected void readIntToBcd(int n) {
-    assert n != 0;
-    long result = 0L;
-    int i = 16;
-    for (; n != 0; n /= 10, i--) {
-      result = (result >>> 4) + (((long) n % 10) << 60);
-    }
-    // ints can't overflow the 16 digits in the BCD, so scale is always zero
-    bcd = result >>> (i * 4);
-    scale = 0;
-    precision = 16 - i;
-  }
-
-  @Override
-  protected void readLongToBcd(long n) {
-    assert n != 0;
-    long result = 0L;
-    int i = 16;
-    for (; n != 0L; n /= 10L, i--) {
-      result = (result >>> 4) + ((n % 10) << 60);
-    }
-    int adjustment = (i > 0) ? i : 0;
-    bcd = result >>> (adjustment * 4);
-    scale = (i < 0) ? -i : 0;
-    precision = 16 - i;
-  }
-
-  @Override
-  protected void readBigIntegerToBcd(BigInteger n) {
-    assert n.signum() != 0;
-    long result = 0L;
-    int i = 16;
-    for (; n.signum() != 0; i--) {
-      BigInteger[] temp = n.divideAndRemainder(BigInteger.TEN);
-      result = (result >>> 4) + (temp[1].longValue() << 60);
-      n = temp[0];
-    }
-    int adjustment = (i > 0) ? i : 0;
-    bcd = result >>> (adjustment * 4);
-    scale = (i < 0) ? -i : 0;
-  }
-
-  @Override
-  protected BigDecimal bcdToBigDecimal() {
-    long tempLong = 0L;
-    for (int shift = (precision - 1); shift >= 0; shift--) {
-      tempLong = tempLong * 10 + getDigitPos(shift);
-    }
-    BigDecimal result = BigDecimal.valueOf(tempLong);
-    result = result.scaleByPowerOfTen(scale);
-    if (isNegative()) result = result.negate();
-    return result;
-  }
-
-  @Override
-  protected void compact() {
-    // Special handling for 0
-    if (bcd == 0L) {
-      scale = 0;
-      precision = 0;
-      return;
-    }
-
-    // Compact the number (remove trailing zeros)
-    int delta = Long.numberOfTrailingZeros(bcd) / 4;
-    bcd >>>= delta * 4;
-    scale += delta;
-
-    // Compute precision
-    precision = 16 - (Long.numberOfLeadingZeros(bcd) / 4);
-  }
-
-  @Override
-  protected void copyBcdFrom(DecimalQuantity _other) {
-    DecimalQuantity_64BitBCD other = (DecimalQuantity_64BitBCD) _other;
-    bcd = other.bcd;
-  }
-
-  @Override
-  public String toString() {
-    return String.format(
-        "<DecimalQuantity2 %s:%d:%d:%s %016XE%d>",
-        (lOptPos > 1000 ? "max" : String.valueOf(lOptPos)),
-        lReqPos,
-        rReqPos,
-        (rOptPos < -1000 ? "min" : String.valueOf(rOptPos)),
-        bcd,
-        scale);
-  }
-}
diff --git a/icu4j/readme.html b/icu4j/readme.html
index 05d2089..2d02cdf 100644
--- a/icu4j/readme.html
+++ b/icu4j/readme.html
@@ -14,23 +14,21 @@
 <body style="background-color: rgb(255, 255, 255);" lang="EN-US"
  link="#0000ff" vlink="#800080">
 <h1>International Components for Unicode for Java (ICU4J)</h1>
-<h2>Read Me for ICU4J 60.2</h2>
-(Last Update: 2017-Dec-7)
+<h2>Read Me for ICU4J 61.1</h2>
+(Last Update: 2018-Mar-20)
 <hr size="2" width="100%">
 
 <p>
-<b>Note:</b> This is an updated release of ICU4J 60. This release contains
-bug fixes and updated data, but does not introduce any new APIs for functionalities.
-<!-- <b>Note:</b> This is major release of ICU4J. It contains bug fixes and adds implementations
-of inherited API and introduces new API or functionality. -->
-<!-- <b>Note:</b> This is a development milestone of ICU4J 60.
+<b>Note:</b> This is major release of ICU4J. It contains bug fixes and adds implementations
+of inherited API and introduces new API or functionality.
+<!-- <b>Note:</b> This is a development milestone of ICU4J 62.
 The contents of this document may not reflect the recent changes done
-for ICU 60 development. It is not recommended for production use. -->
-<!-- <b>Note:</b> This is a release candidate of ICU4J 60.
+for ICU 62 development. It is not recommended for production use. -->
+<!-- <b>Note:</b> This is a release candidate of ICU4J 61.
 The contents of this document may not reflect the recent changes done
-for ICU 60 development. This release candidate is intended for those
-wishing to verify ICU 60 integration before final release. It is not
-recommended for production use. -->
+for ICU 61 development. This release candidate is intended for those
+wishing to verify ICU 61 integration before final release. It is not
+recommended for production use.-->
 </p>
 <p>For the most recent release, see the <a
  href="http://www.icu-project.org/download/"> ICU4J
@@ -141,19 +139,15 @@
 </blockquote>
 
 <h2 class="doc"><a name="changes"></a>Changes In This Release</h2>
-<h3>ICU4J 60.2</h3>
-<p>See the <a href="https://sites.google.com/site/icusite/download/60">ICU 60 download page</a>
-  about updates in this maintenance release.</p>
 
-<h3>ICU4J 60.1</h3>
-<p>See the <a href="https://sites.google.com/site/icusite/download/60">ICU 60 download page</a>
-about new features in this major release.</p>
+<p>See the <a href="https://sites.google.com/site/icusite/download/61">ICU 61 download page</a>
+about new features in this release.</p>
 <p>The list of API changes since the previous ICU4J release is available
-<a href="http://source.icu-project.org/repos/icu/tags/release-60-rc/icu4j/APIChangeReport.html">here</a>.</p>
+<a href="http://source.icu-project.org/repos/icu/tags/release-61-1/icu4j/APIChangeReport.html">here</a>.</p>
 
-<!-- ICU 60 items -->
+<!-- ICU 61 items -->
 <!-- <h3>[Subject]</h3> -->
-<!-- end ICU 60 items -->
+<!-- end ICU 61 items -->
 
 <h2 class="doc"><a name="license"></a>License Information</h2>
 <p>
@@ -167,8 +161,8 @@
 </p>
 <h2 class="doc"><a name="PlatformDependencies"></a>Platform Dependencies</h2>
 <p>
-ICU4J 60 depends on J2SE 6 functionality.  Therefore, ICU4J only runs on
-JRE version 6 or later. ICU4J 60 is tested on JRE 6, 7, 8 and 9.
+ICU4J 61 depends on J2SE 6 functionality.  Therefore, ICU4J only runs on
+JRE version 6 or later. ICU4J 61 is tested on JRE 6, 7, 8 and 9.
 
 <h2 class="doc"><a name="download"></a>How to Download ICU4J</h2>
 <p>There are a few different ways to download the ICU4J releases.
@@ -186,19 +180,19 @@
 &lt;dependency&gt;
     &lt;groupId&gt;com.ibm.icu&lt;/groupId&gt;
     &lt;artifactId&gt;icu4j&lt;/artifactId&gt;
-    &lt;version&gt;60.2&lt;/version&gt;
+    &lt;version&gt;61.1&lt;/version&gt;
 &lt;/dependency&gt;
 
 &lt;dependency&gt;
     &lt;groupId&gt;com.ibm.icu&lt;/groupId&gt;
     &lt;artifactId&gt;icu4j-charset&lt;/artifactId&gt;
-    &lt;version&gt;60.2&lt;/version&gt;
+    &lt;version&gt;61.1&lt;/version&gt;
 &lt;/dependency&gt;
 
 &lt;dependency&gt;
     &lt;groupId&gt;com.ibm.icu&lt;/groupId&gt;
     &lt;artifactId&gt;icu4j-localespi&lt;/artifactId&gt;
-    &lt;version&gt;60.2&lt;/version&gt;
+    &lt;version&gt;61.1&lt;/version&gt;
 &lt;/dependency&gt;
 </pre>
   </ul>
@@ -573,8 +567,8 @@
 
 @copy:
      [copy] Copying 24 files to C:\icu4j\main\classes\core\out\bin
-     [copy] Copied 4 empty directories to 3 empty directories under D:\devicu\ma
-int-60\icu4j\main\classes\core\out\bin
+     [copy] Copied 4 empty directories to 3 empty directories under C:\icu4j\mai
+n\classes\core\out\bin
 
 set-icuconfig-datapath:
 
@@ -737,54 +731,54 @@
 organization
 of the data in ICU4J.</p>
 <ul>
-  <li>The primary <b>locale data</b> is under the directory <tt>icudt60b</tt>,
+  <li>The primary <b>locale data</b> is under the directory <tt>icudt61b</tt>,
   as a set of <tt>".res"</tt> files whose names are the locale identifiers. 
   Locale naming is documented the <code>com.ibm.icu.util.ULocale</code>
   class, and the use of these names in searching for resources is documented 
   in <code>com.ibm.icu.util.UResourceBundle</code>.</li>
 
-  <li>The <b>break iterator data</b> is under the directory <tt>icudt60b/brkitr</tt>,
+  <li>The <b>break iterator data</b> is under the directory <tt>icudt61b/brkitr</tt>,
   as a set of <tt>".res"</tt>, <tt>".brk"</tt> and <tt>".dict"</tt> files.</li>
 
-  <li>The <b>collation data</b> is under the directory <tt>icudt60b/coll</tt>,
+  <li>The <b>collation data</b> is under the directory <tt>icudt61b/coll</tt>,
   as a set of <tt>".res"</tt> files.</li>
 
-  <li>The <b>currency display name data</b> is under the directory <tt>icudt60b/curr</tt>,
+  <li>The <b>currency display name data</b> is under the directory <tt>icudt61b/curr</tt>,
   as a set of <tt>".res"</tt> files.</li>
 
-  <li>The <b>language display name data</b> is under the directory <tt>icudt60b/lang</tt>,
+  <li>The <b>language display name data</b> is under the directory <tt>icudt61b/lang</tt>,
   as a set of <tt>".res"</tt> files.</li>
 
   <li>The <b>rule-based number format data</b> is under the directory
-  <tt>icudt60b/rbnf</tt>, as a set of <tt>".res"</tt> files.
+  <tt>icudt61b/rbnf</tt>, as a set of <tt>".res"</tt> files.
 
-  <li>The <b>region display name data</b> is under the directory <tt>icudt60b/region</tt>,
+  <li>The <b>region display name data</b> is under the directory <tt>icudt61b/region</tt>,
   as a set of <tt>".res"</tt> files.</li>
 
   <li>The <b>rule-based transliterator data</b> is under the directory
-  <tt>icudt60b/translit</tt>, as a set of <tt>".res"</tt> files.</li>
+  <tt>icudt61b/translit</tt>, as a set of <tt>".res"</tt> files.</li>
 
-  <li>The <b>measurement unit data</b> is under the directory <tt>icudt60b/unit</tt>,
+  <li>The <b>measurement unit data</b> is under the directory <tt>icudt61b/unit</tt>,
   as a set of <tt>".res"</tt> files.</li>
 
   <li>The <b>time zone display name data</b> is under the directory
-  <tt>icudt60b/zone</tt>, as a set of <tt>".res"</tt> files.</li>
+  <tt>icudt61b/zone</tt>, as a set of <tt>".res"</tt> files.</li>
 
   <li>The <b>character property data</b> and default <b>unicode collation algorithm
-  (UCA) data</b> is found under the directory <tt>icudt60b</tt>, as a set of
+  (UCA) data</b> is found under the directory <tt>icudt61b</tt>, as a set of
   <tt>".icu"</tt> files. </li>
 
-  <li>The <b>normalization data</b> is found under the directory <tt>icudt60b</tt>,
+  <li>The <b>normalization data</b> is found under the directory <tt>icudt61b</tt>,
   as a set of <tt>".nrm"</tt> files. </li>
 
   <li>The <b>character set converter data</b> is under the directory
-  <tt>icudt60b</tt>, as a set of <tt>".cnv"</tt> files.  These files are
+  <tt>icudt61b</tt>, as a set of <tt>".cnv"</tt> files.  These files are
   currently included only in icu-charset.jar.</li>
 
   <li>The <b>time zone rule data</b> is under the directory 
-  <tt>icudt60b</tt>, as <tt>zoneinfo64.res</tt>.</li>
+  <tt>icudt61b</tt>, as <tt>zoneinfo64.res</tt>.</li>
 
-  <li>The <b>holiday data</b> is under the directory <tt>icudt60b</tt>,
+  <li>The <b>holiday data</b> is under the directory <tt>icudt61b</tt>,
   as a set of <tt>".class"</tt> files, named <tt>"HolidayBundle_"</tt>
   followed by the locale ID.</li>
 
@@ -882,8 +876,8 @@
 <h5> Generating Data from CLDR </h5>
 <I> Note: This procedure assumes that all 3 sources are present</I>
 <ol>
-    <li>Checkout or download CLDR version 'release-32-0-1'</li>
-    <li>Checkout ICU with tag 'release-60-2'</li>
+    <li>Checkout or download CLDR version 'release-33'</li>
+    <li>Checkout ICU with tag 'release-61-1'</li>
     <li>cd to icu4c/source/data directory</li>
     <li>Follow the instructions in icu4c/source/data/cldr-icu-readme.txt</li>
     <li>Rebuild ICU4C with the newly generated data.</li>
diff --git a/icu4j/tools/build/.settings/org.eclipse.jdt.core.prefs b/icu4j/tools/build/.settings/org.eclipse.jdt.core.prefs
index 4421bad..cb97209 100644
--- a/icu4j/tools/build/.settings/org.eclipse.jdt.core.prefs
+++ b/icu4j/tools/build/.settings/org.eclipse.jdt.core.prefs
@@ -7,9 +7,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=1.6
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -98,7 +98,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.source=1.6
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
diff --git a/icu4j/tools/build/icu4j48.api3.gz b/icu4j/tools/build/icu4j48.api3.gz
deleted file mode 100644
index 570a58d..0000000
--- a/icu4j/tools/build/icu4j48.api3.gz
+++ /dev/null
Binary files differ
diff --git a/icu4j/tools/build/icu4j49.api3.gz b/icu4j/tools/build/icu4j49.api3.gz
deleted file mode 100644
index 622252d..0000000
--- a/icu4j/tools/build/icu4j49.api3.gz
+++ /dev/null
Binary files differ
diff --git a/icu4j/tools/build/icu4j50.api3.gz b/icu4j/tools/build/icu4j50.api3.gz
deleted file mode 100644
index 58fc2c6..0000000
--- a/icu4j/tools/build/icu4j50.api3.gz
+++ /dev/null
Binary files differ
diff --git a/icu4j/tools/build/icu4j51.api3.gz b/icu4j/tools/build/icu4j51.api3.gz
deleted file mode 100644
index b73f249..0000000
--- a/icu4j/tools/build/icu4j51.api3.gz
+++ /dev/null
Binary files differ
diff --git a/icu4j/tools/build/icu4j61.api3.gz b/icu4j/tools/build/icu4j61.api3.gz
new file mode 100644
index 0000000..45d2e58
--- /dev/null
+++ b/icu4j/tools/build/icu4j61.api3.gz
Binary files differ
diff --git a/icu4j/tools/build/src/com/ibm/icu/dev/tool/docs/DeprecatedAPIChecker.java b/icu4j/tools/build/src/com/ibm/icu/dev/tool/docs/DeprecatedAPIChecker.java
index c7ae792..61abf72 100644
--- a/icu4j/tools/build/src/com/ibm/icu/dev/tool/docs/DeprecatedAPIChecker.java
+++ b/icu4j/tools/build/src/com/ibm/icu/dev/tool/docs/DeprecatedAPIChecker.java
@@ -364,16 +364,18 @@
         // erase generic args
         if (paramsSegment.indexOf('<') >= 0) {
             StringBuilder buf = new StringBuilder();
-            boolean inGenericsParams = false;
+            int genericsNestLevel = 0;
             for (int i = 0; i < paramsSegment.length(); i++) {
                 char c = paramsSegment.charAt(i);
-                if (inGenericsParams) {
-                    if (c == '>') {
-                        inGenericsParams = false;
+                if (genericsNestLevel > 0) {
+                    if (c == '<') {
+                        genericsNestLevel++;
+                    } else if (c == '>') {
+                        genericsNestLevel--;
                     }
                 } else {
                     if (c == '<') {
-                        inGenericsParams = true;
+                        genericsNestLevel++;
                     } else {
                         buf.append(c);
                     }
diff --git a/tools/srcgen/src/main/java/com/android/icu4j/srcgen/ShardingAnnotator.java b/tools/srcgen/src/main/java/com/android/icu4j/srcgen/ShardingAnnotator.java
index a96cbfb..0349d4c 100644
--- a/tools/srcgen/src/main/java/com/android/icu4j/srcgen/ShardingAnnotator.java
+++ b/tools/srcgen/src/main/java/com/android/icu4j/srcgen/ShardingAnnotator.java
@@ -63,7 +63,8 @@
             // All annotations must be included in cts/tests/tests/icu/AndroidTest.xml.
             ImmutableMap.of(
                     "android.icu.dev.test.format.NumberRegressionTests", "HiMemTestShard",
-                    "android.icu.dev.test.format.TimeUnitTest", "HiMemTestShard"
+                    "android.icu.dev.test.format.TimeUnitTest", "HiMemTestShard",
+                    "android.icu.dev.test.rbbi.RBBIMonkeyTest", "HiMemTestShard"
             );
 
     @Override