am d4709848: Fixes for formatInOriginalFormat.

* commit 'd470984844c388d6766c3de6ac64e93e00480fc9':
  Fixes for formatInOriginalFormat.
diff --git a/README.android b/README.android
index cb1eb5d..51c5fc1 100644
--- a/README.android
+++ b/README.android
@@ -1,5 +1,5 @@
 URL: http://code.google.com/p/libphonenumber/
-Version: 3.8 (r325)
+Version: 4.3 (r398)
 License: Apache 2
 Description: Google Phone Number Library.
 Local Modification:
diff --git a/java/release_notes.txt b/java/release_notes.txt
index f915803..d73b7d6 100644
--- a/java/release_notes.txt
+++ b/java/release_notes.txt
@@ -1,3 +1,86 @@
+November 24th, 2011: libphonenumber-4.3
+* Code changes
+ - Fix the problems with AYTF crashing for longer numbers entered with +CountryCode, and incorrectly
+   removing national prefix for some numbers.
+ - Improve PhoneNumberMatcher to not match numbers ending with '%'.
+ - Fix formatNumberForMobileDialing to handle Israeli star numbers, Peruvian and Colombian numbers.
+ - Modify formatInOriginalFormat to use the raw input if we don't have a formatting pattern for a
+   number.
+ - Simple offline geocoding function which takes into account the user's region.
+
+* Metadata changes
+ - Updates for CR, GN, JP, KE, PL, SG, SR, SX, TH, TK
+
+November 10th, 2011: libphonenumber-4.2
+* Code changes
+ - Providing an "exact match" isEmergencyNumber method
+ - Improvement to PhoneNumberMatcher: requires national prefix to be present
+   when matching national-format numbers, unless matching for a region where it
+   is explicitly marked in the metadata that they may be omitted. Applies to
+   leniency level VALID and higher.
+ - Change formatNumberForMobileDialing not to modify the phoneNumber passed in.
+
+* Metadata changes
+ - Emergency numbers added for all remaining countries
+ - Collected data on which numbers we format with a national prefix are
+   commonly written without one and added this
+ - Updates for AR, AT, BH, CZ, GR, IR, KM, LT, MX, PT, SE, SO, UG
+ - Addition of SX (Sint Maarten)
+
+October 19th, 2011: libphonenumber-4.1
+* Code changes
+ - Update code and metadata for countries with IDD "8~10" to accept phone
+   numbers where the "~" is omitted.
+ - Modify formatInOriginalFormat to use raw_input (when present) when the number
+   is considered as invalid by the library.
+ - Add ShortNumberUtil to deal with international short phone numbers, such as
+   short codes and emergency numbers.
+ - Increase the maximum phone-number length accepted when parsing (now set to
+   16).
+
+* Metadata changes
+ - Updates: BF, BN, CN, DE, DK, DO, FR, IN, KI, KW, MC, MD, ML, PA, QA, SB, UK,
+   WS
+ - Emergency number information also added to: AE, AF, AL, AM, AR, AT, AU, BA,
+   BB, BD, BE, BG, BH, BO, BR, BY, CA, CH, CL, CN, CO, CR, CY, CZ, DE, DJ, DK,
+   DO, DZ, EC, EE, EG, ES, FI, FJ, FO, FR, GB, GE, GF, GH, GI, GL, GR, GT, GY,
+   HK, HN, HR, HU, ID, IE, IL, IN, IR, IS, IT, JM, JO, JP, KR, KW, KY, KZ, LB,
+   LK, LT, LU, LV, MA, MC, MD, ME, MK, ML, MM, MN, MO, MT, MU, MV, MX, MY, NG,
+   NI, NL, NO, NP, OM, PA, PE, PH, PK, PL, PM, PT, PY, QA, RO, RS, RU, RW, SA,
+   SB, SD, SE, SG, SI, SK, SL, SM, SR, SV, SY, TD, TH, TJ, TM, TN, TR, TT, TW,
+   UA, UG, US, UY, UZ, VA, VE, VN, VU, ZA, ZM, ZW
+
+October 6th, 2011: libphonenumber-4.0
+* Code changes
+ - New function formatNumberForMobileDialing, which attempts to format a number in
+   such a way that the call can be connected from a mobile phone. If this is
+   impossible, for example for numbers that cannot be internationally dialled,
+   then an empty string is returned.
+ - Fallback functionality to English for non-CJK languages for geocoding
+
+* Metadata changes
+ - Collecting data for emergency numbers
+ - Updates: AR, AU, BR, CN, CZ, EG, GD, IE, IL, JM, KW, KH, SD, SO, TR, UG, UZ
+ - Geocoding data changes: AO, AR, AT, BJ, BR, CD, CG, CI, CL, CN, CV, DE, ES,
+   FR, GR, GW, HU, KM, MR, MZ, NL, PL, PT, SE, ST, SZ
+
+September 13th, 2011: libphonenumber-3.9
+* Code changes
+ - Enable AsYouTypeFormatter to handle long IDD and NDD.
+ - Allow the presence of an IDD following a +.
+ - Fix formatting of phone numbers which contain only 0s in the national number.
+ - Refactored some code in geocoding including AreaCodeMap and the storage
+   strategies.
+
+* Metadata changes
+ - Updates: AM, BE, BH, BJ, BR, BT, BZ, CI, CL, CN, DE, DK, DM, DZ, EC, EG, FJ,
+   GR, HR, HT, IN, IQ, IS, JM, KE, KG, KH, KR, LA, LB, LR, MA, MD, ML, MO, MX,
+   MY, NE, NG, PG, PH, PK, PY, QA, SA, SD, SG, SN, TD, TG, TH, TN, TT, UG, YE,
+   ZA, ZM
+ - New geocoding data for: AC, CG, CU, CV, EG, ET, FI, FI, FI, GL, JP, KM, MA,
+   MA, MU, MU, MU, MZ, RS, SH, SH, SL, SO, ST, TG, TG, TG, UG, ZM
+ - Updated geocoding data for: AR, DE
+
 August 11th, 2011: libphonenumber-3.8
 * Code changes
  - Fix to demo to not throw null-ptr exceptions for invalid NANPA numbers
diff --git a/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java b/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java
index 7c713c8..554fcd6 100644
--- a/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java
+++ b/java/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -45,7 +45,11 @@
   private String currentFormattingPattern = "";
   private StringBuilder accruedInput = new StringBuilder();
   private StringBuilder accruedInputWithoutFormatting = new StringBuilder();
+  // This indicates whether AsYouTypeFormatter is currently doing the formatting.
   private boolean ableToFormat = true;
+  // Set to true when users enter their own formatting. AsYouTypeFormatter will do no formatting at
+  // all when this is set to true.
+  private boolean inputHasFormatting = false;
   private boolean isInternationalFormatting = false;
   private boolean isExpectingCountryCallingCode = false;
   private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
@@ -91,7 +95,13 @@
   // The position of a digit upon which inputDigitAndRememberPosition is most recently invoked, as
   // found in accruedInputWithoutFormatting.
   private int positionToRemember = 0;
+  // This contains anything that has been entered so far preceding the national significant number,
+  // and it is formatted (e.g. with space inserted). For example, this can contain IDD, country
+  // code, and/or NDD, etc.
   private StringBuilder prefixBeforeNationalNumber = new StringBuilder();
+  // This contains the national prefix that has been extracted. It contains only digits without
+  // formatting.
+  private String nationalPrefixExtracted = "";
   private StringBuilder nationalNumber = new StringBuilder();
   private List<NumberFormat> possibleFormats = new ArrayList<NumberFormat>();
 
@@ -137,6 +147,9 @@
       }
       if (createFormattingTemplate(numberFormat)) {
         currentFormattingPattern = pattern;
+        // With a new formatting template, the matched position using the old template needs to be
+        // reset.
+        lastMatchPosition = 0;
         return true;
       } else {  // Remove the current number format from possibleFormats.
         it.remove();
@@ -236,8 +249,10 @@
     lastMatchPosition = 0;
     currentFormattingPattern = "";
     prefixBeforeNationalNumber.setLength(0);
+    nationalPrefixExtracted = "";
     nationalNumber.setLength(0);
     ableToFormat = true;
+    inputHasFormatting = false;
     positionToRemember = 0;
     originalPosition = 0;
     isInternationalFormatting = false;
@@ -283,13 +298,29 @@
     // sign (accepted at the start of the number only).
     if (!isDigitOrLeadingPlusSign(nextChar)) {
       ableToFormat = false;
+      inputHasFormatting = true;
+    } else {
+      nextChar = normalizeAndAccrueDigitsAndPlusSign(nextChar, rememberPosition);
     }
     if (!ableToFormat) {
+      // When we are unable to format because of reasons other than that formatting chars have been
+      // entered, it can be due to really long IDDs or NDDs. If that is the case, we might be able
+      // to do formatting again after extracting them.
+      if (inputHasFormatting) {
+        return accruedInput.toString();
+      } else if (attemptToExtractIdd()) {
+        if (attemptToExtractCountryCallingCode()) {
+          return attemptToChoosePatternWithPrefixExtracted();
+        }
+      } else if (ableToExtractLongerNdd()) {
+        // Add an additional space to separate long NDD and national significant number for
+        // readability.
+        prefixBeforeNationalNumber.append(" ");
+        return attemptToChoosePatternWithPrefixExtracted();
+      }
       return accruedInput.toString();
     }
 
-    nextChar = normalizeAndAccrueDigitsAndPlusSign(nextChar, rememberPosition);
-
     // We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH digits (the plus
     // sign is counted as a digit as well for this purpose) have been entered.
     switch (accruedInputWithoutFormatting.length()) {
@@ -300,26 +331,17 @@
       case 3:
         if (attemptToExtractIdd()) {
           isExpectingCountryCallingCode = true;
-        } else {  // No IDD or plus sign is found, must be entering in national format.
-          removeNationalPrefixFromNationalNumber();
+        } else {  // No IDD or plus sign is found, might be entering in national format.
+          nationalPrefixExtracted = removeNationalPrefixFromNationalNumber();
           return attemptToChooseFormattingPattern();
         }
-      case 4:
-      case 5:
+      default:
         if (isExpectingCountryCallingCode) {
           if (attemptToExtractCountryCallingCode()) {
             isExpectingCountryCallingCode = false;
           }
           return prefixBeforeNationalNumber + nationalNumber.toString();
         }
-      // We make a last attempt to extract a country calling code at the 6th digit because the
-      // maximum length of IDD and country calling code are both 3.
-      case 6:
-        if (isExpectingCountryCallingCode && !attemptToExtractCountryCallingCode()) {
-          ableToFormat = false;
-          return accruedInput.toString();
-        }
-      default:
         if (possibleFormats.size() > 0) {  // The formatting pattern is already chosen.
           String tempNationalNumber = inputDigitHelper(nextChar);
           // See if the accrued digits can be formatted properly already. If not, use the results
@@ -341,6 +363,28 @@
     }
   }
 
+  private String attemptToChoosePatternWithPrefixExtracted() {
+    ableToFormat = true;
+    isExpectingCountryCallingCode = false;
+    possibleFormats.clear();
+    return attemptToChooseFormattingPattern();
+  }
+
+  // Some national prefixes are a substring of others. If extracting the shorter NDD doesn't result
+  // in a number we can format, we try to see if we can extract a longer version here.
+  private boolean ableToExtractLongerNdd() {
+    if (nationalPrefixExtracted.length() > 0) {
+      // Put the extracted NDD back to the national number before attempting to extract a new NDD.
+      nationalNumber.insert(0, nationalPrefixExtracted);
+      // Remove the previously extracted NDD from prefixBeforeNationalNumber. We cannot simply set
+      // it to empty string because people sometimes enter national prefix after country code, e.g
+      // +44 (0)20-1234-5678.
+      int indexOfPreviousNdd = prefixBeforeNationalNumber.lastIndexOf(nationalPrefixExtracted);
+      prefixBeforeNationalNumber.setLength(indexOfPreviousNdd);
+    }
+    return !nationalPrefixExtracted.equals(removeNationalPrefixFromNationalNumber());
+  }
+
   private boolean isDigitOrLeadingPlusSign(char nextChar) {
     return Character.isDigit(nextChar) ||
         (accruedInput.length() == 1 &&
@@ -384,8 +428,7 @@
     // number (excluding national prefix) have been entered.
     if (nationalNumber.length() >= MIN_LEADING_DIGITS_LENGTH) {
       getAvailableFormats(nationalNumber.substring(0, MIN_LEADING_DIGITS_LENGTH));
-      maybeCreateNewTemplate();
-      return inputAccruedNationalNumber();
+      return maybeCreateNewTemplate() ? inputAccruedNationalNumber() : accruedInput.toString();
     } else {
       return prefixBeforeNationalNumber + nationalNumber.toString();
     }
@@ -408,13 +451,14 @@
     }
   }
 
-  private void removeNationalPrefixFromNationalNumber() {
+  // Returns the national prefix extracted, or an empty string if it is not present.
+  private String removeNationalPrefixFromNationalNumber() {
     int startOfNationalNumber = 0;
     if (currentMetaData.getCountryCode() == 1 && nationalNumber.charAt(0) == '1') {
       startOfNationalNumber = 1;
       prefixBeforeNationalNumber.append("1 ");
       isInternationalFormatting = true;
-    } else if (currentMetaData.hasNationalPrefix()) {
+    } else if (currentMetaData.hasNationalPrefixForParsing()) {
       Pattern nationalPrefixForParsing =
         regexCache.getPatternForRegex(currentMetaData.getNationalPrefixForParsing());
       Matcher m = nationalPrefixForParsing.matcher(nationalNumber);
@@ -427,7 +471,9 @@
         prefixBeforeNationalNumber.append(nationalNumber.substring(0, startOfNationalNumber));
       }
     }
+    String nationalPrefix = nationalNumber.substring(0, startOfNationalNumber);
     nationalNumber.delete(0, startOfNationalNumber);
+    return nationalPrefix;
   }
 
   /**
@@ -447,6 +493,7 @@
       int startOfCountryCallingCode = iddMatcher.end();
       nationalNumber.setLength(0);
       nationalNumber.append(accruedInputWithoutFormatting.substring(startOfCountryCallingCode));
+      prefixBeforeNationalNumber.setLength(0);
       prefixBeforeNationalNumber.append(
           accruedInputWithoutFormatting.substring(0, startOfCountryCallingCode));
       if (accruedInputWithoutFormatting.charAt(0) != PhoneNumberUtil.PLUS_SIGN) {
diff --git a/java/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java b/java/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java
index c80da97..3600f82 100644
--- a/java/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java
+++ b/java/src/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMap.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -38,7 +38,7 @@
 
     ArrayList<String> listWithRegionCode;
 
-    listWithRegionCode = new ArrayList<String>(24);
+    listWithRegionCode = new ArrayList<String>(25);
     listWithRegionCode.add("US");
     listWithRegionCode.add("AG");
     listWithRegionCode.add("AI");
@@ -58,6 +58,7 @@
     listWithRegionCode.add("MP");
     listWithRegionCode.add("MS");
     listWithRegionCode.add("PR");
+    listWithRegionCode.add("SX");
     listWithRegionCode.add("TC");
     listWithRegionCode.add("TT");
     listWithRegionCode.add("VC");
diff --git a/java/src/com/android/i18n/phonenumbers/NumberParseException.java b/java/src/com/android/i18n/phonenumbers/NumberParseException.java
index 598723d..038c473 100644
--- a/java/src/com/android/i18n/phonenumbers/NumberParseException.java
+++ b/java/src/com/android/i18n/phonenumbers/NumberParseException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/java/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java b/java/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java
index ac51111..336ecac 100644
--- a/java/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java
+++ b/java/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java b/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java
index 44efdf7..3ddc773 100644
--- a/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java
+++ b/java/src/com/android/i18n/phonenumbers/PhoneNumberMatcher.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -279,6 +279,7 @@
    * combining marks should also return true since we assume they have been added to a preceding
    * Latin character.
    */
+  // @VisibleForTesting
   static boolean isLatinLetter(char letter) {
     // Combining marks are a subset of non-spacing-mark.
     if (!Character.isLetter(letter) && Character.getType(letter) != Character.NON_SPACING_MARK) {
@@ -293,8 +294,8 @@
         block.equals(UnicodeBlock.COMBINING_DIACRITICAL_MARKS);
   }
 
-  private static boolean isCurrencySymbol(char character) {
-    return Character.getType(character) == Character.CURRENCY_SYMBOL;
+  private static boolean isInvalidPunctuationSymbol(char character) {
+    return character == '%' || Character.getType(character) == Character.CURRENCY_SYMBOL;
   }
 
   /**
@@ -406,22 +407,28 @@
         // punctuation, check the previous character.
         if (offset > 0 && !LEAD_CLASS.matcher(candidate).lookingAt()) {
           char previousChar = text.charAt(offset - 1);
-          // We return null if it is a latin letter or a currency symbol.
-          if (isCurrencySymbol(previousChar) || isLatinLetter(previousChar)) {
+          // We return null if it is a latin letter or an invalid punctuation symbol.
+          if (isInvalidPunctuationSymbol(previousChar) || isLatinLetter(previousChar)) {
             return null;
           }
         }
         int lastCharIndex = offset + candidate.length();
         if (lastCharIndex < text.length()) {
           char nextChar = text.charAt(lastCharIndex);
-          if (isCurrencySymbol(nextChar) || isLatinLetter(nextChar)) {
+          if (isInvalidPunctuationSymbol(nextChar) || isLatinLetter(nextChar)) {
             return null;
           }
         }
       }
 
-      PhoneNumber number = phoneUtil.parse(candidate, preferredRegion);
+      PhoneNumber number = phoneUtil.parseAndKeepRawInput(candidate, preferredRegion);
       if (leniency.verify(number, candidate, phoneUtil)) {
+        // We used parseAndKeepRawInput to create this number, but for now we don't return the extra
+        // values parsed. TODO: stop clearing all values here and switch all users over
+        // to using rawInput() rather than the rawString() of PhoneNumberMatch.
+        number.clearCountryCodeSource();
+        number.clearRawInput();
+        number.clearPreferredDomesticCarrierCode();
         return new PhoneNumberMatch(offset, candidate, number);
       }
     } catch (NumberParseException e) {
diff --git a/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java b/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java
index 16a975e..705a8be 100644
--- a/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java
+++ b/java/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -59,7 +59,8 @@
   static final int REGEX_FLAGS = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE;
   // The minimum and maximum length of the national significant number.
   private static final int MIN_LENGTH_FOR_NSN = 3;
-  static final int MAX_LENGTH_FOR_NSN = 15;
+  // The ITU says the maximum length should be 15, but we have found longer numbers in Germany.
+  static final int MAX_LENGTH_FOR_NSN = 16;
   // The maximum length of the country calling code.
   static final int MAX_LENGTH_COUNTRY_CODE = 3;
   static final String META_DATA_FILE_PREFIX =
@@ -87,11 +88,20 @@
   private final Set<String> nanpaRegions = new HashSet<String>(35);
   private static final int NANPA_COUNTRY_CODE = 1;
 
+  // The prefix that needs to be inserted in front of a Colombian landline number when dialed from
+  // a mobile phone in Colombia.
+  private static final String COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX = "3";
+
   // The PLUS_SIGN signifies the international prefix.
   static final char PLUS_SIGN = '+';
 
   private static final String RFC3966_EXTN_PREFIX = ";ext=";
 
+  // A map that contains characters that are essential when dialling. That means any of the
+  // characters in this map must not be removed from a number when dialing, otherwise the call will
+  // not reach the intended destination.
+  private static final Map<Character, Character> DIALLABLE_CHAR_MAPPINGS;
+
   // Only upper-case variants of alpha characters are stored.
   private static final Map<Character, Character> ALPHA_MAPPINGS;
 
@@ -151,6 +161,12 @@
     combinedMap.putAll(asciiDigitMappings);
     ALPHA_PHONE_MAPPINGS = Collections.unmodifiableMap(combinedMap);
 
+    HashMap<Character, Character> diallableCharMap = new HashMap<Character, Character>();
+    diallableCharMap.putAll(asciiDigitMappings);
+    diallableCharMap.put('+', '+');
+    diallableCharMap.put('*', '*');
+    DIALLABLE_CHAR_MAPPINGS = Collections.unmodifiableMap(diallableCharMap);
+
     HashMap<Character, Character> allPlusNumberGroupings = new HashMap<Character, Character>();
     // Put (lower letter -> upper letter) and (upper letter -> upper letter) mappings.
     for (char c : ALPHA_MAPPINGS.keySet()) {
@@ -402,9 +418,8 @@
    */
   public enum Leniency {
     /**
-     * Phone numbers accepted are
-     * {@linkplain PhoneNumberUtil#isPossibleNumber(Phonenumber.PhoneNumber) possible}, but not
-     * necessarily {@linkplain PhoneNumberUtil#isValidNumber(Phonenumber.PhoneNumber) valid}.
+     * Phone numbers accepted are {@linkplain PhoneNumberUtil#isPossibleNumber(PhoneNumber)
+     * possible}, but not necessarily {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid}.
      */
     POSSIBLE {
       @Override
@@ -413,17 +428,19 @@
       }
     },
     /**
-     * Phone numbers accepted are
-     * {@linkplain PhoneNumberUtil#isPossibleNumber(Phonenumber.PhoneNumber) possible} and
-     * {@linkplain PhoneNumberUtil#isValidNumber(Phonenumber.PhoneNumber) valid}.
+     * Phone numbers accepted are {@linkplain PhoneNumberUtil#isPossibleNumber(PhoneNumber)
+     * possible} and {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid}. Numbers written
+     * in national format must have their national-prefix present if it is usually written for a
+     * number of this type.
      */
     VALID {
       @Override
       boolean verify(PhoneNumber number, String candidate, PhoneNumberUtil util) {
-        if (!util.isValidNumber(number)) {
+        if (!util.isValidNumber(number) ||
+            !containsOnlyValidXChars(number, candidate, util)) {
           return false;
         }
-        return containsOnlyValidXChars(number, candidate, util);
+        return isNationalPrefixPresentIfRequired(number, util);
       }
     },
     /**
@@ -442,7 +459,8 @@
       boolean verify(PhoneNumber number, String candidate, PhoneNumberUtil util) {
         if (!util.isValidNumber(number) ||
             !containsOnlyValidXChars(number, candidate, util) ||
-            containsMoreThanOneSlash(candidate)) {
+            containsMoreThanOneSlash(candidate) ||
+            !isNationalPrefixPresentIfRequired(number, util)) {
           return false;
         }
         // TODO: Evaluate how this works for other locales (testing has been
@@ -496,7 +514,8 @@
       boolean verify(PhoneNumber number, String candidate, PhoneNumberUtil util) {
         if (!util.isValidNumber(number) ||
             !containsOnlyValidXChars(number, candidate, util) ||
-            containsMoreThanOneSlash(candidate)) {
+            containsMoreThanOneSlash(candidate) ||
+            !isNationalPrefixPresentIfRequired(number, util)) {
           return false;
         }
         // TODO: Evaluate how this works for other locales (testing has been
@@ -586,6 +605,51 @@
       return true;
     }
 
+    private static boolean isNationalPrefixPresentIfRequired(
+        PhoneNumber number, PhoneNumberUtil util) {
+      // First, check how we deduced the country code. If it was written in international format,
+      // then the national prefix is not required.
+      if (number.getCountryCodeSource() != CountryCodeSource.FROM_DEFAULT_COUNTRY) {
+        return true;
+      }
+      String phoneNumberRegion =
+          util.getRegionCodeForCountryCode(number.getCountryCode());
+      PhoneMetadata metadata = util.getMetadataForRegion(phoneNumberRegion);
+      if (metadata == null) {
+        return true;
+      }
+      // Check if a national prefix should be present when formatting this number.
+      String nationalNumber = util.getNationalSignificantNumber(number);
+      NumberFormat formatRule =
+          util.chooseFormattingPatternForNumber(metadata.numberFormats(), nationalNumber);
+      // To do this, we check that a national prefix formatting rule was present and that it wasn't
+      // just the first-group symbol ($1) with punctuation.
+      if ((formatRule != null) && formatRule.getNationalPrefixFormattingRule().length() > 0) {
+        if (formatRule.isNationalPrefixOptionalWhenFormatting()) {
+          // The national-prefix is optional in these cases, so we don't need to check if it was
+          // present.
+          return true;
+        }
+        // Remove the first-group symbol.
+        String candidateNationalPrefixRule = formatRule.getNationalPrefixFormattingRule();
+        // We assume that the first-group symbol will never be _before_ the national prefix.
+        candidateNationalPrefixRule =
+            candidateNationalPrefixRule.substring(0, candidateNationalPrefixRule.indexOf("$1"));
+        candidateNationalPrefixRule = util.normalizeDigitsOnly(candidateNationalPrefixRule);
+        if (candidateNationalPrefixRule.length() == 0) {
+          // National Prefix not needed for this number.
+          return true;
+        }
+        // Normalize the remainder.
+        String rawInputCopy = util.normalizeDigitsOnly(number.getRawInput());
+        StringBuilder rawInput = new StringBuilder(rawInputCopy);
+        // Check if we found a national prefix and/or carrier code at the start of the raw input,
+        // and return the result.
+        return util.maybeStripNationalPrefixAndCarrierCode(rawInput, metadata, null);
+      }
+      return true;
+    }
+
     /** Returns true if {@code number} is a verified number according to this leniency. */
     abstract boolean verify(PhoneNumber number, String candidate, PhoneNumberUtil util);
   }
@@ -622,7 +686,7 @@
     }
   }
 
-  private void close(InputStream in) {
+  private static void close(InputStream in) {
     if (in != null) {
       try {
         in.close();
@@ -678,6 +742,7 @@
    * @param number  string to be checked for viability as a phone number
    * @return        true if the number could be a phone number of some sort, otherwise false
    */
+  // @VisibleForTesting
   static boolean isViablePhoneNumber(String number) {
     if (number.length() < MIN_LENGTH_FOR_NSN) {
       return false;
@@ -867,7 +932,7 @@
       return 0;
     }
 
-    if (getRegionCodeForNumber(number).equals("AR") &&
+    if (getRegionCodeForCountryCode(number.getCountryCode()).equals("AR") &&
         getNumberType(number) == PhoneNumberType.MOBILE) {
       // Argentinian mobile numbers, when formatted in the international format, are in the form of
       // +54 9 NDC XXXX.... As a result, we take the length of the third group (NDC) and add 1 for
@@ -929,7 +994,7 @@
   }
 
   /**
-   * Convenience method to enable tests to get a list of what regions the library has metadata for.
+   * Convenience method to get a list of what regions the library has metadata for.
    */
   public Set<String> getSupportedRegions() {
     return supportedRegions;
@@ -1003,9 +1068,8 @@
   }
 
   /**
-   * Same as {@link #format(Phonenumber.PhoneNumber, PhoneNumberUtil.PhoneNumberFormat)}, but
-   * accepts a mutable StringBuilder as a parameter to decrease object creation when invoked many
-   * times.
+   * Same as {@link #format(PhoneNumber, PhoneNumberFormat)}, but accepts a mutable StringBuilder as
+   * a parameter to decrease object creation when invoked many times.
    */
   public void format(PhoneNumber number, PhoneNumberFormat numberFormat,
                      StringBuilder formattedNumber) {
@@ -1153,6 +1217,62 @@
   }
 
   /**
+   * Returns a number formatted in such a way that it can be dialed from a mobile phone in a
+   * specific region. If the number cannot be reached from the region (e.g. some countries block
+   * toll-free numbers from being called outside of the country), the method returns an empty
+   * string.
+   *
+   * @param number  the phone number to be formatted
+   * @param regionCallingFrom  the region where the call is being placed
+   * @param withFormatting  whether the number should be returned with formatting symbols, such as
+   *     spaces and dashes.
+   * @return  the formatted phone number
+   */
+  public String formatNumberForMobileDialing(PhoneNumber number, String regionCallingFrom,
+                                             boolean withFormatting) {
+    String regionCode = getRegionCodeForCountryCode(number.getCountryCode());
+    if (!isValidRegionCode(regionCode)) {
+      return number.hasRawInput() ? number.getRawInput() : "";
+    }
+
+    String formattedNumber;
+    // Clear the extension, as that part cannot normally be dialed together with the main number.
+    PhoneNumber numberNoExt = new PhoneNumber().mergeFrom(number).clearExtension();
+    PhoneNumberType numberType = getNumberType(numberNoExt);
+    if (regionCode.equals("CO") && regionCallingFrom.equals("CO")) {
+      if (numberType == PhoneNumberType.FIXED_LINE) {
+        formattedNumber =
+            formatNationalNumberWithCarrierCode(numberNoExt, COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX);
+      } else {
+        // E164 doesn't work at all when dialing within Colombia.
+        formattedNumber = format(numberNoExt, PhoneNumberFormat.NATIONAL);
+      }
+    } else if (regionCode.equals("PE") && regionCallingFrom.equals("PE")) {
+      // In Peru, numbers cannot be dialled using E164 format from a mobile phone for Movistar.
+      // Instead they must be dialled in national format.
+      formattedNumber = format(numberNoExt, PhoneNumberFormat.NATIONAL);
+    } else if (regionCode.equals("BR") && regionCallingFrom.equals("BR") &&
+        ((numberType == PhoneNumberType.FIXED_LINE) || (numberType == PhoneNumberType.MOBILE) ||
+         (numberType == PhoneNumberType.FIXED_LINE_OR_MOBILE))) {
+      formattedNumber = numberNoExt.hasPreferredDomesticCarrierCode()
+          ? formatNationalNumberWithPreferredCarrierCode(numberNoExt, "")
+          // Brazilian fixed line and mobile numbers need to be dialed with a carrier code when
+          // called within Brazil. Without that, most of the carriers won't connect the call.
+          // Because of that, we return an empty string here.
+          : "";
+    } else if (canBeInternationallyDialled(numberNoExt)) {
+      return withFormatting ? format(numberNoExt, PhoneNumberFormat.INTERNATIONAL)
+                            : format(numberNoExt, PhoneNumberFormat.E164);
+    } else {
+      formattedNumber = (regionCallingFrom.equals(regionCode))
+          ? format(numberNoExt, PhoneNumberFormat.NATIONAL) : "";
+    }
+    return withFormatting ? formattedNumber
+                          : normalizeHelper(formattedNumber, DIALLABLE_CHAR_MAPPINGS,
+                                            true /* remove non matches */);
+  }
+
+  /**
    * Formats a phone number for out-of-country dialing purposes. If no regionCallingFrom is
    * supplied, we format the number in its INTERNATIONAL format. If the country calling code is the
    * same as that of the region where the number is from, then NATIONAL formatting will be applied.
@@ -1412,7 +1532,7 @@
         formattedNumber.insert(0, " ").insert(0, countryCallingCode).insert(0, PLUS_SIGN);
         return;
       case RFC3966:
-        formattedNumber.insert(0, "-").insert(0, countryCallingCode) .insert(0, PLUS_SIGN);
+        formattedNumber.insert(0, "-").insert(0, countryCallingCode).insert(0, PLUS_SIGN);
         return;
       case NATIONAL:
       default:
@@ -1481,44 +1601,37 @@
                                           List<NumberFormat> availableFormats,
                                           PhoneNumberFormat numberFormat,
                                           String carrierCode) {
-    for (NumberFormat numFormat : availableFormats) {
-      int size = numFormat.leadingDigitsPatternSize();
-      if (size == 0 || regexCache.getPatternForRegex(
-              // We always use the last leading_digits_pattern, as it is the most detailed.
-              numFormat.getLeadingDigitsPattern(size - 1)).matcher(nationalNumber).lookingAt()) {
-        Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber);
-        if (m.matches()) {
-          String numberFormatRule = numFormat.getFormat();
-          if (numberFormat == PhoneNumberFormat.NATIONAL &&
-              carrierCode != null && carrierCode.length() > 0 &&
-              numFormat.getDomesticCarrierCodeFormattingRule().length() > 0) {
-            // Replace the $CC in the formatting rule with the desired carrier code.
-            String carrierCodeFormattingRule = numFormat.getDomesticCarrierCodeFormattingRule();
-            carrierCodeFormattingRule =
-                CC_PATTERN.matcher(carrierCodeFormattingRule).replaceFirst(carrierCode);
-            // Now replace the $FG in the formatting rule with the first group and the carrier code
-            // combined in the appropriate way.
-            numberFormatRule = FIRST_GROUP_PATTERN.matcher(numberFormatRule)
-                .replaceFirst(carrierCodeFormattingRule);
-            return m.replaceAll(numberFormatRule);
-          } else {
-            // Use the national prefix formatting rule instead.
-            String nationalPrefixFormattingRule = numFormat.getNationalPrefixFormattingRule();
-            if (numberFormat == PhoneNumberFormat.NATIONAL &&
-                nationalPrefixFormattingRule != null &&
-                nationalPrefixFormattingRule.length() > 0) {
-              Matcher firstGroupMatcher = FIRST_GROUP_PATTERN.matcher(numberFormatRule);
-              return m.replaceAll(firstGroupMatcher.replaceFirst(nationalPrefixFormattingRule));
-            } else {
-              return m.replaceAll(numberFormatRule);
-            }
-          }
-        }
+    NumberFormat numFormat = chooseFormattingPatternForNumber(availableFormats, nationalNumber);
+    if (numFormat == null) {
+      // If no pattern above is matched, we format the number as a whole.
+      return nationalNumber;
+    }
+    String numberFormatRule = numFormat.getFormat();
+    Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber);
+    if (numberFormat == PhoneNumberFormat.NATIONAL &&
+        carrierCode != null && carrierCode.length() > 0 &&
+        numFormat.getDomesticCarrierCodeFormattingRule().length() > 0) {
+      // Replace the $CC in the formatting rule with the desired carrier code.
+      String carrierCodeFormattingRule = numFormat.getDomesticCarrierCodeFormattingRule();
+      carrierCodeFormattingRule =
+          CC_PATTERN.matcher(carrierCodeFormattingRule).replaceFirst(carrierCode);
+      // Now replace the $FG in the formatting rule with the first group and the carrier code
+      // combined in the appropriate way.
+      numberFormatRule = FIRST_GROUP_PATTERN.matcher(numberFormatRule)
+          .replaceFirst(carrierCodeFormattingRule);
+      return m.replaceAll(numberFormatRule);
+    } else {
+      // Use the national prefix formatting rule instead.
+      String nationalPrefixFormattingRule = numFormat.getNationalPrefixFormattingRule();
+      if (numberFormat == PhoneNumberFormat.NATIONAL &&
+          nationalPrefixFormattingRule != null &&
+          nationalPrefixFormattingRule.length() > 0) {
+        Matcher firstGroupMatcher = FIRST_GROUP_PATTERN.matcher(numberFormatRule);
+        return m.replaceAll(firstGroupMatcher.replaceFirst(nationalPrefixFormattingRule));
+      } else {
+        return m.replaceAll(numberFormatRule);
       }
     }
-
-    // If no pattern above is matched, we format the number as a whole.
-    return nationalNumber;
   }
 
   /**
@@ -1543,7 +1656,7 @@
   public PhoneNumber getExampleNumberForType(String regionCode, PhoneNumberType type) {
     // Check the region code is valid.
     if (!isValidRegionCode(regionCode)) {
-      LOGGER.log(Level.WARNING, "Invalid or unknown region code provided.");
+      LOGGER.log(Level.SEVERE, "Invalid or unknown region code provided: " + regionCode);
       return null;
     }
     PhoneNumberDesc desc = getNumberDescByType(getMetadataForRegion(regionCode), type);
@@ -1961,10 +2074,10 @@
   /**
    * Check whether a phone number is a possible number given a number in the form of a string, and
    * the region where the number could be dialed from. It provides a more lenient check than
-   * {@link #isValidNumber}. See {@link #isPossibleNumber(Phonenumber.PhoneNumber)} for details.
+   * {@link #isValidNumber}. See {@link #isPossibleNumber(PhoneNumber)} for details.
    *
-   * <p>This method first parses the number, then invokes
-   * {@link #isPossibleNumber(Phonenumber.PhoneNumber)} with the resultant PhoneNumber object.
+   * <p>This method first parses the number, then invokes {@link #isPossibleNumber(PhoneNumber)}
+   * with the resultant PhoneNumber object.
    *
    * @param number  the number that needs to be checked, in the form of a string
    * @param regionDialingFrom  the region that we are expecting the number to be dialed from.
@@ -2027,6 +2140,10 @@
   // 0 if fullNumber doesn't start with a valid country calling code, and leaves nationalNumber
   // unmodified.
   int extractCountryCode(StringBuilder fullNumber, StringBuilder nationalNumber) {
+    if ((fullNumber.length() == 0) || (fullNumber.charAt(0) == '0')) {
+      // Country codes do not begin with a '0'.
+      return 0;
+    }
     int potentialCountryCode;
     int numberLength = fullNumber.length();
     for (int i = 1; i <= MAX_LENGTH_COUNTRY_CODE && i <= numberLength; i++) {
@@ -2070,6 +2187,7 @@
    *     only populated when keepCountryCodeSource is true.
    * @return  the country calling code extracted or 0 if none could be extracted
    */
+  // @VisibleForTesting
   int maybeExtractCountryCode(String number, PhoneMetadata defaultRegionMetadata,
                               StringBuilder nationalNumber, boolean keepRawInput,
                               PhoneNumber phoneNumber)
@@ -2118,7 +2236,8 @@
         PhoneNumberDesc generalDesc = defaultRegionMetadata.getGeneralDesc();
         Pattern validNumberPattern =
             regexCache.getPatternForRegex(generalDesc.getNationalNumberPattern());
-        maybeStripNationalPrefixAndCarrierCode(potentialNationalNumber, defaultRegionMetadata);
+        maybeStripNationalPrefixAndCarrierCode(
+            potentialNationalNumber, defaultRegionMetadata, null /* Don't need the carrier code */);
         Pattern possibleNumberPattern =
             regexCache.getPatternForRegex(generalDesc.getPossibleNumberPattern());
         // If the number was not valid before but is valid now, or if it was too long before, we
@@ -2177,6 +2296,7 @@
    *     removed from the number, otherwise CountryCodeSource.FROM_DEFAULT_COUNTRY if the number did
    *     not seem to be in international format.
    */
+  // @VisibleForTesting
   CountryCodeSource maybeStripInternationalPrefixAndNormalize(
       StringBuilder number,
       String possibleIddPrefix) {
@@ -2193,13 +2313,6 @@
     }
     // Attempt to parse the first digits as an international prefix.
     Pattern iddPattern = regexCache.getPatternForRegex(possibleIddPrefix);
-    if (parsePrefixAsIdd(iddPattern, number)) {
-      normalize(number);
-      return CountryCodeSource.FROM_NUMBER_WITH_IDD;
-    }
-    // If still not found, then try and normalize the number and then try again. This shouldn't be
-    // done before, since non-numeric characters (+ and ~) may legally be in the international
-    // prefix.
     normalize(number);
     return parsePrefixAsIdd(iddPattern, number)
            ? CountryCodeSource.FROM_NUMBER_WITH_IDD
@@ -2212,15 +2325,17 @@
    * @param number  the normalized telephone number that we wish to strip any national
    *     dialing prefix from
    * @param metadata  the metadata for the region that we think this number is from
-   * @return the carrier code extracted if it is present, otherwise return an empty string.
+   * @param carrierCode  a place to insert the carrier code if one is extracted
+   * @return true if a national prefix or carrier code (or both) could be extracted.
    */
-  String maybeStripNationalPrefixAndCarrierCode(StringBuilder number, PhoneMetadata metadata) {
-    String carrierCode = "";
+  // @VisibleForTesting
+  boolean maybeStripNationalPrefixAndCarrierCode(
+      StringBuilder number, PhoneMetadata metadata, StringBuilder carrierCode) {
     int numberLength = number.length();
     String possibleNationalPrefix = metadata.getNationalPrefixForParsing();
     if (numberLength == 0 || possibleNationalPrefix.length() == 0) {
       // Early return for numbers of zero length.
-      return "";
+      return false;
     }
     // Attempt to parse the first digits as a national prefix.
     Matcher prefixMatcher = regexCache.getPatternForRegex(possibleNationalPrefix).matcher(number);
@@ -2239,12 +2354,13 @@
         // If the original number was viable, and the resultant number is not, we return.
         if (isViableOriginalNumber &&
             !nationalNumberRule.matcher(number.substring(prefixMatcher.end())).matches()) {
-          return "";
+          return false;
         }
-        if (numOfGroups > 0 && prefixMatcher.group(numOfGroups) != null) {
-          carrierCode = prefixMatcher.group(1);
+        if (carrierCode != null && numOfGroups > 0 && prefixMatcher.group(numOfGroups) != null) {
+          carrierCode.append(prefixMatcher.group(1));
         }
         number.delete(0, prefixMatcher.end());
+        return true;
       } else {
         // Check that the resultant number is still viable. If not, return. Check this by copying
         // the string buffer and making the transformation on the copy first.
@@ -2252,15 +2368,16 @@
         transformedNumber.replace(0, numberLength, prefixMatcher.replaceFirst(transformRule));
         if (isViableOriginalNumber &&
             !nationalNumberRule.matcher(transformedNumber.toString()).matches()) {
-          return "";
+          return false;
         }
-        if (numOfGroups > 1) {
-          carrierCode = prefixMatcher.group(1);
+        if (carrierCode != null && numOfGroups > 1) {
+          carrierCode.append(prefixMatcher.group(1));
         }
         number.replace(0, number.length(), transformedNumber.toString());
+        return true;
       }
     }
-    return carrierCode;
+    return false;
   }
 
   /**
@@ -2270,6 +2387,7 @@
    * @param number  the non-normalized telephone number that we wish to strip the extension from
    * @return        the phone extension
    */
+  // @VisibleForTesting
   String maybeStripExtension(StringBuilder number) {
     Matcher m = EXTN_PATTERN.matcher(number);
     // If we find a potential extension, and the number preceding this is a viable number, we assume
@@ -2457,8 +2575,29 @@
     // Check to see if the number is given in international format so we know whether this number is
     // from the default region or not.
     StringBuilder normalizedNationalNumber = new StringBuilder();
-    int countryCode = maybeExtractCountryCode(nationalNumber.toString(), regionMetadata,
-                                              normalizedNationalNumber, keepRawInput, phoneNumber);
+    int countryCode = 0;
+    try {
+      // TODO: This method should really just take in the string buffer that has already
+      // been created, and just remove the prefix, rather than taking in a string and then
+      // outputting a string buffer.
+      countryCode = maybeExtractCountryCode(nationalNumber.toString(), regionMetadata,
+                                            normalizedNationalNumber, keepRawInput, phoneNumber);
+    } catch (NumberParseException e) {
+      Matcher matcher = PLUS_CHARS_PATTERN.matcher(nationalNumber.toString());
+      if (e.getErrorType() == NumberParseException.ErrorType.INVALID_COUNTRY_CODE &&
+          matcher.lookingAt()) {
+        // Strip the plus-char, and try again.
+        countryCode = maybeExtractCountryCode(nationalNumber.substring(matcher.end()),
+                                              regionMetadata, normalizedNationalNumber,
+                                              keepRawInput, phoneNumber);
+        if (countryCode == 0) {
+          throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
+                                         "Could not interpret numbers after plus-sign.");
+        }
+      } else {
+        throw new NumberParseException(e.getErrorType(), e.getMessage());
+      }
+    }
     if (countryCode != 0) {
       String phoneNumberRegion = getRegionCodeForCountryCode(countryCode);
       if (!phoneNumberRegion.equals(defaultRegion)) {
@@ -2481,10 +2620,10 @@
                                      "The string supplied is too short to be a phone number.");
     }
     if (regionMetadata != null) {
-      String carrierCode =
-          maybeStripNationalPrefixAndCarrierCode(normalizedNationalNumber, regionMetadata);
+      StringBuilder carrierCode = new StringBuilder();
+      maybeStripNationalPrefixAndCarrierCode(normalizedNationalNumber, regionMetadata, carrierCode);
       if (keepRawInput) {
-        phoneNumber.setPreferredDomesticCarrierCode(carrierCode);
+        phoneNumber.setPreferredDomesticCarrierCode(carrierCode.toString());
       }
     }
     int lengthOfNationalNumber = normalizedNationalNumber.length();
@@ -2590,15 +2729,14 @@
 
   /**
    * Takes two phone numbers as strings and compares them for equality. This is a convenience
-   * wrapper for {@link #isNumberMatch(Phonenumber.PhoneNumber, Phonenumber.PhoneNumber)}. No
-   * default region is known.
+   * wrapper for {@link #isNumberMatch(PhoneNumber, PhoneNumber)}. No default region is known.
    *
    * @param firstNumber  first number to compare. Can contain formatting, and can have country
    *     calling code specified with + at the start.
    * @param secondNumber  second number to compare. Can contain formatting, and can have country
    *     calling code specified with + at the start.
    * @return  NOT_A_NUMBER, NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH, EXACT_MATCH. See
-   *     {@link #isNumberMatch(Phonenumber.PhoneNumber, Phonenumber.PhoneNumber)} for more details.
+   *     {@link #isNumberMatch(PhoneNumber, PhoneNumber)} for more details.
    */
   public MatchType isNumberMatch(String firstNumber, String secondNumber) {
     try {
@@ -2630,14 +2768,13 @@
 
   /**
    * Takes two phone numbers and compares them for equality. This is a convenience wrapper for
-   * {@link #isNumberMatch(Phonenumber.PhoneNumber, Phonenumber.PhoneNumber)}. No default region is
-   * known.
+   * {@link #isNumberMatch(PhoneNumber, PhoneNumber)}. No default region is known.
    *
    * @param firstNumber  first number to compare in proto buffer format.
    * @param secondNumber  second number to compare. Can contain formatting, and can have country
    *     calling code specified with + at the start.
    * @return  NOT_A_NUMBER, NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH, EXACT_MATCH. See
-   *     {@link #isNumberMatch(Phonenumber.PhoneNumber, Phonenumber.PhoneNumber)} for more details.
+   *     {@link #isNumberMatch(PhoneNumber, PhoneNumber)} for more details.
    */
   public MatchType isNumberMatch(PhoneNumber firstNumber, String secondNumber) {
     // First see if the second number has an implicit country calling code, by attempting to parse
diff --git a/java/src/com/android/i18n/phonenumbers/Phonemetadata.java b/java/src/com/android/i18n/phonenumbers/Phonemetadata.java
index 3642b34..927a6c3 100644
--- a/java/src/com/android/i18n/phonenumbers/Phonemetadata.java
+++ b/java/src/com/android/i18n/phonenumbers/Phonemetadata.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -102,6 +102,19 @@
       return this;
     }
 
+    // optional bool national_prefix_optional_when_formatting = 6;
+    private boolean hasNationalPrefixOptionalWhenFormatting;
+    private boolean nationalPrefixOptionalWhenFormatting_ = false;
+    public boolean hasNationalPrefixOptionalWhenFormatting() {
+      return hasNationalPrefixOptionalWhenFormatting; }
+    public boolean isNationalPrefixOptionalWhenFormatting() {
+      return nationalPrefixOptionalWhenFormatting_; }
+    public NumberFormat setNationalPrefixOptionalWhenFormatting(boolean value) {
+      hasNationalPrefixOptionalWhenFormatting = true;
+      nationalPrefixOptionalWhenFormatting_ = value;
+      return this;
+    }
+
     // optional string domestic_carrier_code_formatting_rule = 5;
     private boolean hasDomesticCarrierCodeFormattingRule;
     private String domesticCarrierCodeFormattingRule_ = "";
@@ -132,6 +145,7 @@
       if (other.hasDomesticCarrierCodeFormattingRule()) {
         setDomesticCarrierCodeFormattingRule(other.getDomesticCarrierCodeFormattingRule());
       }
+      setNationalPrefixOptionalWhenFormatting(other.isNationalPrefixOptionalWhenFormatting());
       return this;
     }
 
@@ -152,6 +166,7 @@
       if (hasDomesticCarrierCodeFormattingRule) {
         objectOutput.writeUTF(domesticCarrierCodeFormattingRule_);
       }
+      objectOutput.writeBoolean(nationalPrefixOptionalWhenFormatting_);
     }
 
     public void readExternal(ObjectInput objectInput) throws IOException {
@@ -167,6 +182,7 @@
       if (objectInput.readBoolean()) {
         setDomesticCarrierCodeFormattingRule(objectInput.readUTF());
       }
+      setNationalPrefixOptionalWhenFormatting(objectInput.readBoolean());
     }
   }
 
@@ -430,6 +446,20 @@
       return this;
     }
 
+    // required PhoneNumberDesc emergency = 27;
+    private boolean hasEmergency;
+    private PhoneNumberDesc emergency_ = null;
+    public boolean hasEmergency() { return hasEmergency; }
+    public PhoneNumberDesc getEmergency() { return emergency_; }
+    public PhoneMetadata setEmergency(PhoneNumberDesc value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      hasEmergency = true;
+      emergency_ = value;
+      return this;
+    }
+
     // required PhoneNumberDesc noInternationalDialling = 24;
     private boolean hasNoInternationalDialling;
     private PhoneNumberDesc noInternationalDialling_ = null;
@@ -660,6 +690,10 @@
       if (hasUan) {
         uan_.writeExternal(objectOutput);
       }
+      objectOutput.writeBoolean(hasEmergency);
+      if (hasEmergency) {
+        emergency_.writeExternal(objectOutput);
+      }
       objectOutput.writeBoolean(hasNoInternationalDialling);
       if (hasNoInternationalDialling) {
         noInternationalDialling_.writeExternal(objectOutput);
@@ -783,6 +817,12 @@
       if (hasDesc) {
         PhoneNumberDesc desc = new PhoneNumberDesc();
         desc.readExternal(objectInput);
+        setEmergency(desc);
+      }
+      hasDesc = objectInput.readBoolean();
+      if (hasDesc) {
+        PhoneNumberDesc desc = new PhoneNumberDesc();
+        desc.readExternal(objectInput);
         setNoInternationalDialling(desc);
       }
 
diff --git a/java/src/com/android/i18n/phonenumbers/Phonenumber.java b/java/src/com/android/i18n/phonenumbers/Phonenumber.java
index 86afef1..73fa884 100644
--- a/java/src/com/android/i18n/phonenumbers/Phonenumber.java
+++ b/java/src/com/android/i18n/phonenumbers/Phonenumber.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/java/src/com/android/i18n/phonenumbers/RegexCache.java b/java/src/com/android/i18n/phonenumbers/RegexCache.java
index 1d90390..d2e9b2a 100644
--- a/java/src/com/android/i18n/phonenumbers/RegexCache.java
+++ b/java/src/com/android/i18n/phonenumbers/RegexCache.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/java/src/com/android/i18n/phonenumbers/ShortNumberUtil.java b/java/src/com/android/i18n/phonenumbers/ShortNumberUtil.java
new file mode 100644
index 0000000..951164d
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/ShortNumberUtil.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2011 The Libphonenumber Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.phonenumbers;
+
+import com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
+import com.android.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
+
+import java.util.regex.Pattern;
+
+/*
+ * Utility for international short phone numbers, such as short codes and emergency numbers. Note
+ * most commercial short numbers are not handled here, but by the PhoneNumberUtil.
+ *
+ * @author Shaopeng Jia
+ */
+public class ShortNumberUtil {
+
+  private final PhoneNumberUtil phoneUtil;
+
+  public ShortNumberUtil() {
+    phoneUtil = PhoneNumberUtil.getInstance();
+  }
+
+  // @VisibleForTesting
+  ShortNumberUtil(PhoneNumberUtil util) {
+    phoneUtil = util;
+  }
+
+  /**
+   * Returns true if the number might be used to connect to an emergency service in the given
+   * region.
+   *
+   * This method takes into account cases where the number might contain formatting, or might have
+   * additional digits appended (when it is okay to do that in the region specified).
+   *
+   * @param number  the phone number to test
+   * @param regionCode  the region where the phone number is being dialed
+   * @return  if the number might be used to connect to an emergency service in the given region.
+   */
+  public boolean connectsToEmergencyNumber(String number, String regionCode) {
+    return matchesEmergencyNumberHelper(number, regionCode, true /* allows prefix match */);
+  }
+
+  /**
+   * Returns true if the number exactly matches an emergency service number in the given region.
+   *
+   * This method takes into account cases where the number might contain formatting, but doesn't
+   * allow additional digits to be appended.
+   *
+   * @param number  the phone number to test
+   * @param regionCode  the region where the phone number is being dialed
+   * @return  if the number exactly matches an emergency services number in the given region.
+   */
+  public boolean isEmergencyNumber(String number, String regionCode) {
+    return matchesEmergencyNumberHelper(number, regionCode, false /* doesn't allow prefix match */);
+  }
+
+  private boolean matchesEmergencyNumberHelper(String number, String regionCode,
+      boolean allowPrefixMatch) {
+    number = PhoneNumberUtil.extractPossibleNumber(number);
+    if (PhoneNumberUtil.PLUS_CHARS_PATTERN.matcher(number).lookingAt()) {
+      // Returns false if the number starts with a plus sign. We don't believe dialing the country
+      // code before emergency numbers (e.g. +1911) works, but later, if that proves to work, we can
+      // add additional logic here to handle it.
+      return false;
+    }
+    PhoneMetadata metadata = phoneUtil.getMetadataForRegion(regionCode);
+    if (metadata == null || !metadata.hasEmergency()) {
+      return false;
+    }
+    Pattern emergencyNumberPattern =
+        Pattern.compile(metadata.getEmergency().getNationalNumberPattern());
+    String normalizedNumber = PhoneNumberUtil.normalizeDigitsOnly(number);
+    // In Brazil, it is impossible to append additional digits to an emergency number to dial the
+    // number.
+    return (!allowPrefixMatch || regionCode.equals("BR"))
+        ? emergencyNumberPattern.matcher(normalizedNumber).matches()
+        : emergencyNumberPattern.matcher(normalizedNumber).lookingAt();
+  }
+}
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC
index d0069f1..63a0784 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD
index 2f5199b..5651404 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE
index 2f543e1..5ce6bd9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF
index 0120a23..ce0b677 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG
index ce1d508..0fb852a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI
index 2bdd9da..5ec108b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL
index 15cbd77..e7f2d42 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM
index 7d0f2a2..5af20f5 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AN
index e2aa056..27c2ae3 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO
index 13a5285..77b08cb 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR
index a4f9793..a39c601 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS
index 76f517c..3b38675 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT
index 6cdcf99..c38a56c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU
index 0b96301..2fa06cf 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW
index 5e69468..fb3aad4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX
index 8abd003..c0dbabf 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AX
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ
index 8b6224b..e4b14a6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_AZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA
index c5e36f6..ad4662f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB
index 553a1de..982cff9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BB
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD
index f335c39..b6c204a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE
index 2463660..b37f61f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF
index 9cd27d8..48d20e7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG
index f3645fd..2b3c0ae 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH
index 9e7b9c8..841ea9a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI
index 2b67b00..293ebbc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ
index e5ef1ec..e3c5863 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BJ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL
index b410d02..4987820 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM
index c50e099..d014b2a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN
index 46b0177..c257c58 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO
index 8e8857c..f5919ff 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR
index 9aa4d28..ec29af2 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS
index 23bbf75..f52796e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT
index 139f181..e549cd7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW
index 641043d..21fd265 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY
index b07157e..a679105 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ
index 3e4f371..5a4d052 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_BZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA
index 396702d..5bf386d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC
index 948af63..2f2f8aa 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD
index 4456d29..cf7bba2 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF
index eeb5eeb..e3ce491 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG
index 6b809d4..2b4128d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH
index 1b520c3..409254a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI
index dadad8e..98198b8 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK
index ce2a8ec..2f6fe63 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL
index 8fabf74..0e90d89 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM
index 5fb3c1f..4018df4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN
index 697b08c..67a7f5e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO
index e87ef01..b1dbb84 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR
index 5090575..a1d4d34 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU
index 3d2e499..97e9838 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV
index 947e660..4517244 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CV
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX
index 585d96a..cb8dfd9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CX
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY
index fb374ed..de1e004 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ
index 43ec39e..5c41a79 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE
index 87844f3..cfc5b19 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ
index 2978ffe..5511381 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DJ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK
index cbb0f4c..0082966 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM
index 8713673..723ea80 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO
index c48d82c..0305f76 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ
index c3d52a0..4107335 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_DZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC
index 6578ddd..343743d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE
index 8387a3b..28bd9fb 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG
index a00edb4..38e39b3 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_EG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER
index 5c25636..ae89200 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ER
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES
index c5717d0..9b855f1 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET
index 6aacbc5..8843e54 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ET
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI
index bd871b6..604d7ff 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ
index d123c00..cdd713c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FJ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK
index 47e774d..6c19901 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM
index 678e85d..b4031f0 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO
index f6641dd..46dac92 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR
index 7a2adfd..66d244e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_FR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA
index 800c4f2..dddd714 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB
index d1ae758..bd6e72a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD
index ef111dd..e120fa5 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE
index 9b0cc6e..ac5bb57 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF
index b84bf20..da17df2 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG
index 7d24686..0e6809f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH
index 4e97d13..dea89c7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI
index 6625331..7dcc9ff 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL
index f50ade6..d327b75 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM
index abef42b..3bf3e41 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN
index c865a17..468f4d2 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP
index fdce952..e03584b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GP
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ
index 2444a74..424b068 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GQ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR
index 2c4a828..655b5b4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT
index 2f9f995..a2a20cf 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU
index 7cd7701..9a006f1 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW
index 9ca2299..77b6398 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY
index 1636ed4..eb36761 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_GY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK
index 89a9cff..dfd2d09 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN
index 8aa3857..6dd47c0 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR
index 9766d56..27a0c8a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT
index 6ee3bd1..245ee93 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU
index 98f85c9..6ef1306 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_HU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID
index c2d6738..3d0f8cc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ID
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE
index bd1e9ed..12bc792 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL
index f784b0f..a0f1071 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM
index ab78e3a..8d8c881 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN
index 8354c60..05b4b50 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO
index 7731fb8..a9aa569 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ
index 475492f..4009946 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IQ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR
index a5b3394..9edbc87 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS
index eb45cb4..d281347 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT
index da951bc..d5c2c71 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_IT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE
index 37dc706..1908b64 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM
index dce03a8..81be1e1 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO
index cc0d091..47058ad 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP
index 9b020a4..1754045 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE
index 4c35cb2..a87c7e8 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG
index dc63e31..617ce07 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH
index f88db2f..9f757d4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI
index 1b754cc..82bdb90 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM
index b691649..21570ae 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN
index 9045dfb..5a5f4e8 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP
index aa771a1..42a4b26 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KP
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR
index f74cb4d..47f4390 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW
index e0df426..77f805a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY
index 5bfc93e..cfd2678 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ
index 06708a2..b129ff6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_KZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA
index 7f78cb8..62db7dc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB
index f1dfbca..65b3c94 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LB
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC
index 3239dd6..c8a6ad5 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI
index e1d137c..c29d890 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK
index 2b06a38..a9a9d2e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR
index dd7306b..f1ce4be 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS
index e65316e..e04c603 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT
index 02ad948..0c11315 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU
index ef5e720..4ffc791 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV
index 80c3aa3..a76eab9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LV
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY
index a3c6000..8fc1ee7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_LY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA
index dd0beb5..ef1522a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC
index 1a80b90..79fac1a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD
index 0763f61..b17e4af 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME
index 7cce967..24937fd 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ME
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF
index 2daec61..3813149 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG
index 7eef113..072379f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH
index ec542a9..fc64213 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK
index 040a791..3bbd43e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML
index c7d6d18..5cce562 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ML
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM
index fbe65bc..4f3ea91 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN
index b96b7f9..0a7e31a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO
index d0bb6ae..4cf9625 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP
index 83c50af..0f9476d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MP
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ
index 889f649..c48db34 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MQ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR
index d4e34bc..36db9e4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS
index c6d5fe5..969cafc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT
index e4ef74a..c2aaa53 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU
index 51ef9b2..d69bd68 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV
index 7e2e0b3..8841a29 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MV
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW
index 36fe6c9..7bf7d43 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX
index dc44efb..fa3cb40 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MX
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY
index 35b8414..07b6b85 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ
index 5128f4e..3d0967a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_MZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA
index 5c54aa0..86d10bc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC
index 6e85722..6e5d3f7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE
index 62309e5..b9cd0ac 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF
index 59991ff..622d39f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG
index 4e12b36..0f478ca 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI
index 95e956a..64d3eb0 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL
index f0a7b30..aaefdd9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO
index cf7b46e..6838854 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP
index e54df79..2868f9c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NP
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR
index 65dd064..c8ec23e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU
index ac5a701..50dbafd 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ
index 199e3c2..6c3535b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_NZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM
index a3ce6c1..84cded4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_OM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA
index ad660fc..2c032e6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE
index 7c9e801..6b89b38 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF
index f09ce4c..60c6d30 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG
index 767f47c..9fbb7bc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH
index cf6ad8d..56a53cb 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK
index 6b0027d..e1114b6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL
index 012f5b7..4d33462 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM
index b91198c..f8da61b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR
index ed7165b..3b8c4a2 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS
index 1114659..da7d297 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT
index 9c691cc..6baccc7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW
index f51d0d1..45398fa 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY
index 628bd87..6bc931e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_PY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA
index da69ee2..8ec44a0 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_QA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE
index 0a282a4..e2af509 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO
index d45708a..a55d60f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS
index d3691b5..5a803f9 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU
index 189e57f..28bb82d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW
index 22f3ec7..cb6329e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_RW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA
index a938bbf..aefd945 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB
index 5524740..e35361f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SB
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC
index 95fa89a..f012a55 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD
index 37871a1..060bd91 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE
index 8851346..e5850c7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG
index 6020eb3..cb7d012 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH
index e928407..dcf690a 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI
index b9df92b..ca7c517 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ
index aca19d3..17122cc 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SJ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK
index 50b4e3a..48323b5 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL
index 5ab8432..e942566 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM
index 176add7..9432784 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN
index 853bd40..549ff61 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO
index 2db9450..0b4edc7 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR
index a215045..4633905 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST
index 9a8a7ec..265f3af 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ST
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV
index 695ef3f..436b979 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SV
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX
new file mode 100644
index 0000000..5500274
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SX
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY
index 858b5da..4a6a7b8 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ
index b487a13..c1ed388 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_SZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC
index 0db9395..dc62e4c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD
index dc573d1..b92127f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TD
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG
index 924a860..176b9bf 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH
index 119af7d..7800483 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TH
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ
index e683407..efce54e 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TJ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK
index 83d8bfc..48c9c31 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TK
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL
index 3e96e18..46a855f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TL
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM
index b3b4ad8..cf1c21d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN
index b4c0747..50a7217 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO
index 256eebf..e2cd8de 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TO
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR
index df54d35..060cc34 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TR
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT
index a023922..945011b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV
index 973582a..3b53210 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TV
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW
index 08b4172..acda89f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ
index b5c29af..5450858 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_TZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA
index f74e132..5019f02 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG
index 97fd6fb..d154f24 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US
index d6ac18f..1046ec6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_US
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY
index ebf41e1..f9e4805 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UY
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ
index 05c6854..f894a1f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_UZ
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA
index 0b7f9ee..42367de 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC
index 5817468..294335d 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VC
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE
index 1db7196..645c9a5 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG
index 3c4a379..bda87e4 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VG
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI
index 3f93a89..987acec 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VI
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN
index 6f2b378..ad1e62b 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VN
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU
index fe110d2..26ecb82 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_VU
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF
index f6b6c15..2337ed6 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WF
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS
index 9022baa..03fa87f 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_WS
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE
index b18ec98..be646a1 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YE
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT
index ae7df49..e5eb105 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_YT
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA
index b036930..c742d5c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZA
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM
index 5e0253d..dd3dea3 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZM
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW
index 45b6bc1..2766b3c 100644
--- a/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW
+++ b/java/src/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMap.java b/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMap.java
index cab8818..c22bde5 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMap.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMap.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -129,12 +129,15 @@
    * Supports Java Serialization.
    */
   public void writeExternal(ObjectOutput objectOutput) throws IOException {
-    objectOutput.writeBoolean(areaCodeMapStorage.isFlyweight());
+    objectOutput.writeBoolean(areaCodeMapStorage instanceof FlyweightMapStorage);
     areaCodeMapStorage.writeExternal(objectOutput);
   }
 
   /**
-   * Returns the description of the geographical area the {@code number} corresponds to.
+   * Returns the description of the geographical area the {@code number} corresponds to. This method
+   * distinguishes the case of an invalid prefix and a prefix for which the name is not available in
+   * the current language. If the description is not available in the current language an empty
+   * string is returned. If no description was found for the provided number, null is returned.
    *
    * @param number  the phone number to look up
    * @return  the description of the geographical area
@@ -142,7 +145,7 @@
   String lookup(PhoneNumber number) {
     int numOfEntries = areaCodeMapStorage.getNumOfEntries();
     if (numOfEntries == 0) {
-      return "";
+      return null;
     }
     long phonePrefix =
         Long.parseLong(number.getCountryCode() + phoneUtil.getNationalSignificantNumber(number));
@@ -156,7 +159,7 @@
       }
       currentIndex = binarySearch(0, currentIndex, phonePrefix);
       if (currentIndex < 0) {
-        return "";
+        return null;
       }
       int currentPrefix = areaCodeMapStorage.getPrefix(currentIndex);
       if (phonePrefix == currentPrefix) {
@@ -164,7 +167,7 @@
       }
       currentSetOfLengths = currentSetOfLengths.headSet(possibleLength);
     }
-    return "";
+    return null;
   }
 
   /**
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java b/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java
index 2d88c12..c91f5d1 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/AreaCodeMapStorageStrategy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -29,35 +29,10 @@
  *
  * @author Philippe Liard
  */
-// @VisibleForTesting
 abstract class AreaCodeMapStorageStrategy {
   protected int numOfEntries = 0;
   protected final TreeSet<Integer> possibleLengths = new TreeSet<Integer>();
 
-  public AreaCodeMapStorageStrategy() {}
-
-  /**
-   * Returns whether the underlying implementation of this abstract class is flyweight.
-   * It is expected to be flyweight if it implements the {@code FlyweightMapStorage} class.
-   *
-   * @return  whether the underlying implementation of this abstract class is flyweight
-   */
-  public abstract boolean isFlyweight();
-
-  /**
-   * @return  the number of entries contained in the area code map
-   */
-  public int getNumOfEntries() {
-    return numOfEntries;
-  }
-
-  /**
-   * @return  the set containing the possible lengths of prefixes
-   */
-  public TreeSet<Integer> getPossibleLengths() {
-    return possibleLengths;
-  }
-
   /**
    * Gets the phone number prefix located at the provided {@code index}.
    *
@@ -68,7 +43,8 @@
 
   /**
    * Gets the description corresponding to the phone number prefix located at the provided {@code
-   * index}.
+   * index}. If the description is not available in the current language an empty string is
+   * returned.
    *
    * @param index  the index of the phone number prefix that needs to be returned
    * @return  the description corresponding to the phone number prefix at the provided index
@@ -102,16 +78,30 @@
    */
   public abstract void writeExternal(ObjectOutput objectOutput) throws IOException;
 
+  /**
+   * @return  the number of entries contained in the area code map
+   */
+  public int getNumOfEntries() {
+    return numOfEntries;
+  }
+
+  /**
+   * @return  the set containing the possible lengths of prefixes
+   */
+  public TreeSet<Integer> getPossibleLengths() {
+    return possibleLengths;
+  }
+
   @Override
   public String toString() {
     StringBuilder output = new StringBuilder();
     int numOfEntries = getNumOfEntries();
 
     for (int i = 0; i < numOfEntries; i++) {
-      output.append(getPrefix(i));
-      output.append("|");
-      output.append(getDescription(i));
-      output.append("\n");
+      output.append(getPrefix(i))
+          .append("|")
+          .append(getDescription(i))
+          .append("\n");
     }
     return output.toString();
   }
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/DefaultMapStorage.java b/java/src/com/android/i18n/phonenumbers/geocoding/DefaultMapStorage.java
index 00f40fd..8cae4c7 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/DefaultMapStorage.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/DefaultMapStorage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -36,11 +36,6 @@
   private String[] descriptions;
 
   @Override
-  public boolean isFlyweight() {
-    return false;
-  }
-
-  @Override
   public int getPrefix(int index) {
     return phoneNumberPrefixes[index];
   }
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorage.java b/java/src/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorage.java
index 453856f..f0b27bb 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorage.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +21,6 @@
 import java.io.ObjectOutput;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
-import java.util.Comparator;
 import java.util.Map.Entry;
 import java.util.SortedMap;
 import java.util.SortedSet;
@@ -34,10 +33,10 @@
  *
  * @author Philippe Liard
  */
-class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
+final class FlyweightMapStorage extends AreaCodeMapStorageStrategy {
   // Size of short and integer types in bytes.
-  private static final int SHORT_SIZE = Short.SIZE / 8;
-  private static final int INT_SIZE = Integer.SIZE / 8;
+  private static final int SHORT_NUM_BYTES = Short.SIZE / 8;
+  private static final int INT_NUM_BYTES = Integer.SIZE / 8;
 
   // The number of bytes used to store a phone number prefix.
   private int prefixSizeInBytes;
@@ -51,103 +50,142 @@
   // Sorted string array of unique description strings.
   private String[] descriptionPool;
 
-  public FlyweightMapStorage() {}
-
-  @Override
-  public boolean isFlyweight() {
-    return true;
-  }
-
-  /**
-   * Gets the minimum number of bytes that can be used to store the provided {@code value}.
-   */
-  private static int getOptimalNumberOfBytesForValue(int value) {
-    return value <= Short.MAX_VALUE ? SHORT_SIZE : INT_SIZE;
-  }
-
-  /**
-   * Stores the provided {@code value} to the provided byte {@code buffer} at the specified {@code
-   * index} using the provided {@code wordSize} in bytes. Note that only integer and short sizes are
-   * supported.
-   *
-   * @param buffer  the byte buffer to which the value is stored
-   * @param wordSize  the number of bytes used to store the provided value
-   * @param index  the index to which the value is stored
-   * @param value  the value that is stored assuming it does not require more than the specified
-   *    number of bytes.
-   */
-  private static void storeWordInBuffer(ByteBuffer buffer, int wordSize, int index, int value) {
-    index *= wordSize;
-
-    if (wordSize == SHORT_SIZE) {
-      buffer.putShort(index, (short) value);
-    } else {
-      buffer.putInt(index, value);
-    }
-  }
-
-  /**
-   * Reads the {@code value} at the specified {@code index} from the provided byte {@code buffer}.
-   * Note that only integer and short sizes are supported.
-   *
-   * @param buffer  the byte buffer from which the value is read
-   * @param wordSize  the number of bytes used to store the value
-   * @param index  the index where the value is read from
-   *
-   * @return  the value read from the buffer
-   */
-  private static int readWordFromBuffer(ByteBuffer buffer, int wordSize, int index) {
-    index *= wordSize;
-    return wordSize == SHORT_SIZE ? buffer.getShort(index) : buffer.getInt(index);
-  }
-
   @Override
   public int getPrefix(int index) {
     return readWordFromBuffer(phoneNumberPrefixes, prefixSizeInBytes, index);
   }
 
+  /**
+   * This implementation returns the same string (same identity) when called for multiple indexes
+   * corresponding to prefixes that have the same description.
+   */
   @Override
   public String getDescription(int index) {
-    return descriptionPool[readWordFromBuffer(descriptionIndexes, descIndexSizeInBytes, index)];
+    int indexInDescriptionPool =
+        readWordFromBuffer(descriptionIndexes, descIndexSizeInBytes, index);
+    return descriptionPool[indexInDescriptionPool];
   }
 
   @Override
-  public void readFromSortedMap(SortedMap<Integer, String> sortedAreaCodeMap) {
+  public void readFromSortedMap(SortedMap<Integer, String> areaCodeMap) {
     SortedSet<String> descriptionsSet = new TreeSet<String>();
-    numOfEntries = sortedAreaCodeMap.size();
-    prefixSizeInBytes = getOptimalNumberOfBytesForValue(sortedAreaCodeMap.lastKey());
+    numOfEntries = areaCodeMap.size();
+    prefixSizeInBytes = getOptimalNumberOfBytesForValue(areaCodeMap.lastKey());
     phoneNumberPrefixes = ByteBuffer.allocate(numOfEntries * prefixSizeInBytes);
 
     // Fill the phone number prefixes byte buffer, the set of possible lengths of prefixes and the
     // description set.
     int index = 0;
-    for (Entry<Integer, String> entry : sortedAreaCodeMap.entrySet()) {
+    for (Entry<Integer, String> entry : areaCodeMap.entrySet()) {
       int prefix = entry.getKey();
-      storeWordInBuffer(phoneNumberPrefixes, prefixSizeInBytes, index++, prefix);
+      storeWordInBuffer(phoneNumberPrefixes, prefixSizeInBytes, index, prefix);
       possibleLengths.add((int) Math.log10(prefix) + 1);
       descriptionsSet.add(entry.getValue());
+      ++index;
     }
+    createDescriptionPool(descriptionsSet, areaCodeMap);
+  }
 
-    // Create the description pool.
+  /**
+   * Creates the description pool from the provided set of string descriptions and area code map.
+   */
+  private void createDescriptionPool(SortedSet<String> descriptionsSet,
+      SortedMap<Integer, String> areaCodeMap) {
     descIndexSizeInBytes = getOptimalNumberOfBytesForValue(descriptionsSet.size() - 1);
     descriptionIndexes = ByteBuffer.allocate(numOfEntries * descIndexSizeInBytes);
     descriptionPool = new String[descriptionsSet.size()];
     descriptionsSet.toArray(descriptionPool);
 
     // Map the phone number prefixes to the descriptions.
-    index = 0;
+    int index = 0;
     for (int i = 0; i < numOfEntries; i++) {
       int prefix = readWordFromBuffer(phoneNumberPrefixes, prefixSizeInBytes, i);
-      String description = sortedAreaCodeMap.get(prefix);
-      int positionInDescriptionPool =
-          Arrays.binarySearch(descriptionPool, description, new Comparator<String>() {
-            public int compare(String o1, String o2) { return o1.compareTo(o2); }
-          });
-      storeWordInBuffer(descriptionIndexes, descIndexSizeInBytes, index++,
-                        positionInDescriptionPool);
+      String description = areaCodeMap.get(prefix);
+      int positionInDescriptionPool = Arrays.binarySearch(descriptionPool, description);
+      storeWordInBuffer(descriptionIndexes, descIndexSizeInBytes, index, positionInDescriptionPool);
+      ++index;
     }
   }
 
+  @Override
+  public void readExternal(ObjectInput objectInput) throws IOException {
+    // Read binary words sizes.
+    prefixSizeInBytes = objectInput.readInt();
+    descIndexSizeInBytes = objectInput.readInt();
+
+    // Read possible lengths.
+    int sizeOfLengths = objectInput.readInt();
+    possibleLengths.clear();
+    for (int i = 0; i < sizeOfLengths; i++) {
+      possibleLengths.add(objectInput.readInt());
+    }
+
+    // Read description pool size.
+    int descriptionPoolSize = objectInput.readInt();
+    // Read description pool.
+    if (descriptionPool == null || descriptionPool.length < descriptionPoolSize) {
+      descriptionPool = new String[descriptionPoolSize];
+    }
+    for (int i = 0; i < descriptionPoolSize; i++) {
+      String description = objectInput.readUTF();
+      descriptionPool[i] = description;
+    }
+    readEntries(objectInput);
+  }
+
+  /**
+   * Reads the area code entries from the provided input stream and stores them to the internal byte
+   * buffers.
+   */
+  private void readEntries(ObjectInput objectInput) throws IOException {
+    numOfEntries = objectInput.readInt();
+    if (phoneNumberPrefixes == null || phoneNumberPrefixes.capacity() < numOfEntries) {
+      phoneNumberPrefixes = ByteBuffer.allocate(numOfEntries * prefixSizeInBytes);
+    }
+    if (descriptionIndexes == null || descriptionIndexes.capacity() < numOfEntries) {
+      descriptionIndexes = ByteBuffer.allocate(numOfEntries * descIndexSizeInBytes);
+    }
+    for (int i = 0; i < numOfEntries; i++) {
+      readExternalWord(objectInput, prefixSizeInBytes, phoneNumberPrefixes, i);
+      readExternalWord(objectInput, descIndexSizeInBytes, descriptionIndexes, i);
+    }
+  }
+
+  @Override
+  public void writeExternal(ObjectOutput objectOutput) throws IOException {
+    // Write binary words sizes.
+    objectOutput.writeInt(prefixSizeInBytes);
+    objectOutput.writeInt(descIndexSizeInBytes);
+
+    // Write possible lengths.
+    int sizeOfLengths = possibleLengths.size();
+    objectOutput.writeInt(sizeOfLengths);
+    for (Integer length : possibleLengths) {
+      objectOutput.writeInt(length);
+    }
+
+    // Write description pool size.
+    objectOutput.writeInt(descriptionPool.length);
+    // Write description pool.
+    for (String description : descriptionPool) {
+      objectOutput.writeUTF(description);
+    }
+
+    // Write entries.
+    objectOutput.writeInt(numOfEntries);
+    for (int i = 0; i < numOfEntries; i++) {
+      writeExternalWord(objectOutput, prefixSizeInBytes, phoneNumberPrefixes, i);
+      writeExternalWord(objectOutput, descIndexSizeInBytes, descriptionIndexes, i);
+    }
+  }
+
+  /**
+   * Gets the minimum number of bytes that can be used to store the provided {@code value}.
+   */
+  private static int getOptimalNumberOfBytesForValue(int value) {
+    return value <= Short.MAX_VALUE ? SHORT_NUM_BYTES : INT_NUM_BYTES;
+  }
+
   /**
    * Stores a value which is read from the provided {@code objectInput} to the provided byte {@code
    * buffer} at the specified {@code index}.
@@ -159,47 +197,12 @@
    * @throws IOException  if an error occurred reading from the object input stream
    */
   private static void readExternalWord(ObjectInput objectInput, int wordSize,
-                                       ByteBuffer outputBuffer, int index) throws IOException {
-    index *= wordSize;
-    if (wordSize == SHORT_SIZE) {
-      outputBuffer.putShort(index, objectInput.readShort());
+      ByteBuffer outputBuffer, int index) throws IOException {
+    int wordIndex = index * wordSize;
+    if (wordSize == SHORT_NUM_BYTES) {
+      outputBuffer.putShort(wordIndex, objectInput.readShort());
     } else {
-      outputBuffer.putInt(index, objectInput.readInt());
-    }
-  }
-
-  @Override
-  public void readExternal(ObjectInput objectInput) throws IOException {
-    // Read binary words sizes.
-    prefixSizeInBytes = objectInput.readInt();
-    descIndexSizeInBytes = objectInput.readInt();
-    // Read possible lengths.
-    int sizeOfLengths = objectInput.readInt();
-    possibleLengths.clear();
-    for (int i = 0; i < sizeOfLengths; i++) {
-      possibleLengths.add(objectInput.readInt());
-    }
-    // Read description pool size.
-    int descriptionPoolSize = objectInput.readInt();
-    // Read description pool.
-    if (descriptionPool == null || descriptionPool.length < descriptionPoolSize) {
-      descriptionPool = new String[descriptionPoolSize];
-    }
-    for (int i = 0; i < descriptionPoolSize; i++) {
-      String description = objectInput.readUTF();
-      descriptionPool[i] = description;
-    }
-    // Read entries.
-    numOfEntries = objectInput.readInt();
-    if (phoneNumberPrefixes == null || phoneNumberPrefixes.capacity() < numOfEntries) {
-        phoneNumberPrefixes = ByteBuffer.allocate(numOfEntries * prefixSizeInBytes);
-    }
-    if (descriptionIndexes == null || descriptionIndexes.capacity() < numOfEntries) {
-      descriptionIndexes = ByteBuffer.allocate(numOfEntries * descIndexSizeInBytes);
-    }
-    for (int i = 0; i < numOfEntries; i++) {
-      readExternalWord(objectInput, prefixSizeInBytes, phoneNumberPrefixes, i);
-      readExternalWord(objectInput, descIndexSizeInBytes, descriptionIndexes, i);
+      outputBuffer.putInt(wordIndex, objectInput.readInt());
     }
   }
 
@@ -214,37 +217,47 @@
    * @throws IOException if an error occurred writing to the provided object output stream
    */
   private static void writeExternalWord(ObjectOutput objectOutput, int wordSize,
-                                        ByteBuffer inputBuffer, int index) throws IOException {
-    index *= wordSize;
-    if (wordSize == SHORT_SIZE) {
-      objectOutput.writeShort(inputBuffer.getShort(index));
+      ByteBuffer inputBuffer, int index) throws IOException {
+    int wordIndex = index * wordSize;
+    if (wordSize == SHORT_NUM_BYTES) {
+      objectOutput.writeShort(inputBuffer.getShort(wordIndex));
     } else {
-      objectOutput.writeInt(inputBuffer.getInt(index));
+      objectOutput.writeInt(inputBuffer.getInt(wordIndex));
     }
   }
 
-  @Override
-  public void writeExternal(ObjectOutput objectOutput) throws IOException {
-    // Write binary words sizes.
-    objectOutput.writeInt(prefixSizeInBytes);
-    objectOutput.writeInt(descIndexSizeInBytes);
-    // Write possible lengths.
-    int sizeOfLengths = possibleLengths.size();
-    objectOutput.writeInt(sizeOfLengths);
-    for (Integer length : possibleLengths) {
-      objectOutput.writeInt(length);
-    }
-    // Write description pool size.
-    objectOutput.writeInt(descriptionPool.length);
-    // Write description pool.
-    for (String description : descriptionPool) {
-      objectOutput.writeUTF(description);
-    }
-    // Write entries.
-    objectOutput.writeInt(numOfEntries);
-    for (int i = 0; i < numOfEntries; i++) {
-      writeExternalWord(objectOutput, prefixSizeInBytes, phoneNumberPrefixes, i);
-      writeExternalWord(objectOutput, descIndexSizeInBytes, descriptionIndexes, i);
+  /**
+   * Reads the {@code value} at the specified {@code index} from the provided byte {@code buffer}.
+   * Note that only integer and short sizes are supported.
+   *
+   * @param buffer  the byte buffer from which the value is read
+   * @param wordSize  the number of bytes used to store the value
+   * @param index  the index where the value is read from
+   *
+   * @return  the value read from the buffer
+   */
+  private static int readWordFromBuffer(ByteBuffer buffer, int wordSize, int index) {
+    int wordIndex = index * wordSize;
+    return wordSize == SHORT_NUM_BYTES ? buffer.getShort(wordIndex) : buffer.getInt(wordIndex);
+  }
+
+  /**
+   * Stores the provided {@code value} to the provided byte {@code buffer} at the specified {@code
+   * index} using the provided {@code wordSize} in bytes. Note that only integer and short sizes are
+   * supported.
+   *
+   * @param buffer  the byte buffer to which the value is stored
+   * @param wordSize  the number of bytes used to store the provided value
+   * @param index  the index to which the value is stored
+   * @param value  the value that is stored assuming it does not require more than the specified
+   *    number of bytes.
+   */
+  private static void storeWordInBuffer(ByteBuffer buffer, int wordSize, int index, int value) {
+    int wordIndex = index * wordSize;
+    if (wordSize == SHORT_NUM_BYTES) {
+      buffer.putShort(wordIndex, (short) value);
+    } else {
+      buffer.putInt(wordIndex, value);
     }
   }
 }
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/MappingFileProvider.java b/java/src/com/android/i18n/phonenumbers/geocoding/MappingFileProvider.java
index 2c294c4..481655a 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/MappingFileProvider.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/MappingFileProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java b/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java
index a577e10..658a6e2 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -71,8 +71,8 @@
   }
 
   private AreaCodeMap getPhonePrefixDescriptions(
-      int countryCallingCode, String language, String script, String region) {
-    String fileName = mappingFileProvider.getFileName(countryCallingCode, language, script, region);
+      int prefixMapKey, String language, String script, String region) {
+    String fileName = mappingFileProvider.getFileName(prefixMapKey, language, script, region);
     if (fileName.length() == 0) {
       return null;
     }
@@ -98,7 +98,7 @@
     }
   }
 
-  private void close(InputStream in) {
+  private static void close(InputStream in) {
     if (in != null) {
       try {
         in.close();
@@ -130,15 +130,24 @@
    */
   private String getCountryNameForNumber(PhoneNumber number, Locale language) {
     String regionCode = phoneUtil.getRegionCodeForNumber(number);
+    return getRegionDisplayName(regionCode, language);
+  }
+
+  /**
+   * Returns the customary display name in the given language for the given region.
+   */
+  private String getRegionDisplayName(String regionCode, Locale language) {
     return (regionCode == null || regionCode.equals("ZZ"))
         ? "" : new Locale("", regionCode).getDisplayCountry(language);
   }
 
   /**
-   * Returns a text description for the given language code for the given phone number. The
-   * description might consist of the name of the country where the phone number is from and/or the
-   * name of the geographical area the phone number is from. This method assumes the validity of the
-   * number passed in has already been checked.
+   * Returns a text description for the given phone number, in the language provided. The
+   * description might consist of the name of the country where the phone number is from, or the
+   * name of the geographical area the phone number is from if more detailed information is
+   * available.
+   *
+   * <p>This method assumes the validity of the number passed in has already been checked.
    *
    * @param number  a valid phone number for which we want to get a text description
    * @param languageCode  the language code for which the description should be written
@@ -156,10 +165,44 @@
   }
 
   /**
-   * Returns a text description for the given language code for the given phone number. The
-   * description might consist of the name of the country where the phone number is from and/or the
-   * name of the geographical area the phone number is from. This method explictly checkes the
-   * validity of the number passed in.
+   * As per {@link #getDescriptionForValidNumber(PhoneNumber, Locale)} but also considers the
+   * region of the user. If the phone number is from the same region as the user, only a lower-level
+   * description will be returned, if one exists. Otherwise, the phone number's region will be
+   * returned, with optionally some more detailed information.
+   *
+   * <p>For example, for a user from the region "US" (United States), we would show "Mountain View,
+   * CA" for a particular number, omitting the United States from the description. For a user from
+   * the United Kingdom (region "GB"), for the same number we may show "Mountain View, CA, United
+   * States" or even just "United States".
+   *
+   * <p>This method assumes the validity of the number passed in has already been checked.
+   *
+   * @param number  the phone number for which we want to get a text description
+   * @param languageCode  the language code for which the description should be written
+   * @param userRegion  the region code for a given user. This region will be omitted from the
+   *     description if the phone number comes from this region. It is a two-letter uppercase ISO
+   *     country code as defined by ISO 3166-1.
+   * @return  a text description for the given language code for the given phone number, or empty
+   *     string if the number passed in is invalid
+   */
+  public String getDescriptionForValidNumber(PhoneNumber number, Locale languageCode,
+                                             String userRegion) {
+    // If the user region matches the number's region, then we just show the lower-level
+    // description, if one exists - if no description exists, we will show the region(country) name
+    // for the number.
+    String regionCode = phoneUtil.getRegionCodeForNumber(number);
+    if (userRegion.equals(regionCode)) {
+      return getDescriptionForValidNumber(number, languageCode);
+    }
+    // Otherwise, we just show the region(country) name for now.
+    return getRegionDisplayName(regionCode, languageCode);
+    // TODO: Concatenate the lower-level and country-name information in an appropriate
+    // way for each language.
+  }
+
+  /**
+   * As per {@link #getDescriptionForValidNumber(PhoneNumber, Locale)} but explicitly checks
+   * the validity of the number passed in.
    *
    * @param number  the phone number for which we want to get a text description
    * @param languageCode  the language code for which the description should be written
@@ -174,6 +217,26 @@
   }
 
   /**
+   * As per {@link #getDescriptionForValidNumber(PhoneNumber, Locale, String)} but
+   * explicitly checks the validity of the number passed in.
+   *
+   * @param number  the phone number for which we want to get a text description
+   * @param languageCode  the language code for which the description should be written
+   * @param userRegion  the region code for a given user. This region will be omitted from the
+   *     description if the phone number comes from this region. It is a two-letter uppercase ISO
+   *     country code as defined by ISO 3166-1.
+   * @return  a text description for the given language code for the given phone number, or empty
+   *     string if the number passed in is invalid
+   */
+  public String getDescriptionForNumber(PhoneNumber number, Locale languageCode,
+                                        String userRegion) {
+    if (!phoneUtil.isValidNumber(number)) {
+      return "";
+    }
+    return getDescriptionForValidNumber(number, languageCode, userRegion);
+  }
+
+  /**
    * Returns an area-level text description in the given language for the given phone number.
    *
    * @param number  the phone number for which we want to get a text description
@@ -193,6 +256,25 @@
         countryCallingCode : (1000 + (int) (number.getNationalNumber() / 10000000));
     AreaCodeMap phonePrefixDescriptions =
         getPhonePrefixDescriptions(phonePrefix, lang, script, region);
-    return (phonePrefixDescriptions != null) ? phonePrefixDescriptions.lookup(number) : "";
+    String description = (phonePrefixDescriptions != null)
+        ? phonePrefixDescriptions.lookup(number)
+        : null;
+    // When a location is not available in the requested language, fall back to English.
+    if ((description == null || description.length() == 0) && mayFallBackToEnglish(lang)) {
+      AreaCodeMap defaultMap = getPhonePrefixDescriptions(phonePrefix, "en", "", "");
+      if (defaultMap == null) {
+        return "";
+      }
+      description = defaultMap.lookup(number);
+    }
+    return description != null ? description : "";
+  }
+
+  private boolean mayFallBackToEnglish(String lang) {
+    // Don't fall back to English if the requested language is among the following:
+    // - Chinese
+    // - Japanese
+    // - Korean
+    return !lang.equals("zh") && !lang.equals("ja") && !lang.equals("ko");
   }
 }
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/20_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/20_en
new file mode 100644
index 0000000..76b227e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/20_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/212_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/212_en
new file mode 100644
index 0000000..ad7f944
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/212_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/212_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/212_fr
new file mode 100644
index 0000000..9016b0d
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/212_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/213_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/213_en
new file mode 100644
index 0000000..7a1379c
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/213_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/216_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/216_en
new file mode 100644
index 0000000..9af2d13
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/216_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/220_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/220_en
new file mode 100644
index 0000000..29941e6
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/220_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/221_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/221_en
new file mode 100644
index 0000000..b876d30
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/221_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/222_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/222_en
new file mode 100644
index 0000000..7b4ec36
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/222_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/222_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/222_fr
new file mode 100644
index 0000000..ceb0870
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/222_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/224_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/224_en
new file mode 100644
index 0000000..e63507d
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/224_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/225_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/225_en
new file mode 100644
index 0000000..e290e50
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/225_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/225_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/225_fr
new file mode 100644
index 0000000..e290e50
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/225_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/226_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/226_en
new file mode 100644
index 0000000..ed31886
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/226_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/228_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_en
new file mode 100644
index 0000000..192a5d7
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/228_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_es
new file mode 100644
index 0000000..7c124ef
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_es
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/228_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_fr
new file mode 100644
index 0000000..884ca42
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/228_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/229_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/229_en
new file mode 100644
index 0000000..21b5b82
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/229_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/229_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/229_fr
new file mode 100644
index 0000000..6002a86
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/229_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/230_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_en
new file mode 100644
index 0000000..3cf3259
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/230_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_es
new file mode 100644
index 0000000..49f2050
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_es
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/230_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_fr
new file mode 100644
index 0000000..bf51072
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/230_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/232_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/232_en
new file mode 100644
index 0000000..9cb3996
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/232_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/233_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/233_en
new file mode 100644
index 0000000..aca1927
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/233_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/238_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/238_en
new file mode 100644
index 0000000..092d85a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/238_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/238_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/238_pt
new file mode 100644
index 0000000..092d85a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/238_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/239_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/239_en
new file mode 100644
index 0000000..37a5e89
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/239_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/239_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/239_pt
new file mode 100644
index 0000000..8610e0a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/239_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/242_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/242_en
new file mode 100644
index 0000000..86c316f
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/242_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/242_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/242_fr
new file mode 100644
index 0000000..2ad2a1a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/242_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/243_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/243_en
new file mode 100644
index 0000000..14b51a0
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/243_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/243_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/243_fr
new file mode 100644
index 0000000..ac48d42
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/243_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/244_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/244_en
new file mode 100644
index 0000000..59c00b9
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/244_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/244_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/244_pt
new file mode 100644
index 0000000..34cf12b
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/244_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/245_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/245_en
new file mode 100644
index 0000000..2738fe8
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/245_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/245_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/245_pt
new file mode 100644
index 0000000..2738fe8
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/245_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/247_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/247_en
new file mode 100644
index 0000000..259944a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/247_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/249_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/249_en
new file mode 100644
index 0000000..d605df8
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/249_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/251_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/251_en
new file mode 100644
index 0000000..e389d1c
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/251_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/252_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/252_en
new file mode 100644
index 0000000..241ed68
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/252_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/254_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/254_en
new file mode 100644
index 0000000..b21858b
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/254_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/256_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/256_en
new file mode 100644
index 0000000..6043317
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/256_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/258_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/258_en
new file mode 100644
index 0000000..6f11df7
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/258_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/258_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/258_pt
new file mode 100644
index 0000000..18ddf2e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/258_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/260_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/260_en
new file mode 100644
index 0000000..b469b16
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/260_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/261_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/261_en
new file mode 100644
index 0000000..af8affb
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/261_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/263_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/263_en
new file mode 100644
index 0000000..7ec8339
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/263_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/264_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/264_en
new file mode 100644
index 0000000..ef92fe5
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/264_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/266_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/266_en
new file mode 100644
index 0000000..3fc9c6f
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/266_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/267_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/267_en
new file mode 100644
index 0000000..4c52bd2
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/267_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/268_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/268_en
new file mode 100644
index 0000000..16067ff
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/268_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/269_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/269_en
new file mode 100644
index 0000000..bbc053b
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/269_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/269_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/269_fr
new file mode 100644
index 0000000..bbc053b
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/269_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/27_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/27_en
new file mode 100644
index 0000000..c86a27c
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/27_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/290_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/290_en
new file mode 100644
index 0000000..b65865d
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/290_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/290_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/290_fr
new file mode 100644
index 0000000..a9df787
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/290_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/299_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/299_en
new file mode 100644
index 0000000..2e0fee5
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/299_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/30_el b/java/src/com/android/i18n/phonenumbers/geocoding/data/30_el
new file mode 100644
index 0000000..3ae0b10
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/30_el
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/30_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/30_en
new file mode 100644
index 0000000..8211506
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/30_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/31_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/31_en
new file mode 100644
index 0000000..7565cac
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/31_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/31_nl b/java/src/com/android/i18n/phonenumbers/geocoding/data/31_nl
index c1807c8..78768ba 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/31_nl
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/31_nl
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/33_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_en
new file mode 100644
index 0000000..7e9655f
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr
index c18f305..85f2c6b 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/33_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/34_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_en
new file mode 100644
index 0000000..3ec6b10
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es
index e4719ca..749b162 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/34_es
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/351_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/351_en
new file mode 100644
index 0000000..61f0da1
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/351_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/351_pt b/java/src/com/android/i18n/phonenumbers/geocoding/data/351_pt
index 04dc74e..eb08045 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/351_pt
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/351_pt
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/352_de b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_de
new file mode 100644
index 0000000..d20ebca
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_de
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/352_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_en
new file mode 100644
index 0000000..e510e7b
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/352_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/354_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/354_en
new file mode 100644
index 0000000..2e85aa2
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/354_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/355_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/355_en
new file mode 100644
index 0000000..b903bcd
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/355_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/358_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_en
new file mode 100644
index 0000000..3e9c6c3
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/358_fi b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_fi
new file mode 100644
index 0000000..3824cfb
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_fi
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/358_se b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_se
new file mode 100644
index 0000000..3c49760
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/358_se
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/36_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/36_en
new file mode 100644
index 0000000..d9f2a71
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/36_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/36_hu b/java/src/com/android/i18n/phonenumbers/geocoding/data/36_hu
new file mode 100644
index 0000000..6eaf151
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/36_hu
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/370_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/370_en
new file mode 100644
index 0000000..52b47bd
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/370_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/371_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/371_en
new file mode 100644
index 0000000..5273f0e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/371_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/372_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/372_en
new file mode 100644
index 0000000..aaaa338
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/372_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/373_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_en
new file mode 100644
index 0000000..9ef1b6e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ro b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ro
new file mode 100644
index 0000000..3ef4931
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ro
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ru b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ru
new file mode 100644
index 0000000..b643821
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/373_ru
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/374_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/374_en
new file mode 100644
index 0000000..8bdf764
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/374_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/381_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/381_en
new file mode 100644
index 0000000..8cde57a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/381_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/381_sr b/java/src/com/android/i18n/phonenumbers/geocoding/data/381_sr
new file mode 100644
index 0000000..2a5deaa
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/381_sr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/39_it b/java/src/com/android/i18n/phonenumbers/geocoding/data/39_it
index 2bd7c5c..db32682 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/39_it
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/39_it
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_de b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_de
index 86723f3..e62c797 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_de
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_de
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_fr b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_fr
index b62ae33..6fb2df8 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_fr
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_fr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_it b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_it
index 847fc3f..9cc1e5b 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/41_it
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/41_it
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/420_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/420_en
new file mode 100644
index 0000000..6e39c43
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/420_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/421_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/421_en
new file mode 100644
index 0000000..5a5dc09
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/421_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/43_de b/java/src/com/android/i18n/phonenumbers/geocoding/data/43_de
index 3143ede..5687e97 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/43_de
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/43_de
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/43_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/43_en
new file mode 100644
index 0000000..050418d
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/43_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/46_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/46_en
new file mode 100644
index 0000000..934bb3e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/46_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/46_sv b/java/src/com/android/i18n/phonenumbers/geocoding/data/46_sv
index 016fd62..31a27a8 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/46_sv
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/46_sv
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/48_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/48_en
new file mode 100644
index 0000000..969da0c
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/48_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/48_pl b/java/src/com/android/i18n/phonenumbers/geocoding/data/48_pl
new file mode 100644
index 0000000..cd5eb5a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/48_pl
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/49_de b/java/src/com/android/i18n/phonenumbers/geocoding/data/49_de
index 2da69ea..428b8bf 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/49_de
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/49_de
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/49_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/49_en
new file mode 100644
index 0000000..40b3748
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/49_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/51_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/51_en
new file mode 100644
index 0000000..7f84d3e
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/51_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/53_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/53_en
new file mode 100644
index 0000000..5d15867
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/53_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/54_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/54_en
new file mode 100644
index 0000000..ae2fbdd
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/54_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/54_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/54_es
index 7d89c05..afd958b 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/54_es
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/54_es
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/55_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/55_en
new file mode 100644
index 0000000..753576a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/55_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/56_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/56_en
new file mode 100644
index 0000000..9126f78
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/56_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/58_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/58_en
new file mode 100644
index 0000000..9c7a787
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/58_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/58_es b/java/src/com/android/i18n/phonenumbers/geocoding/data/58_es
new file mode 100644
index 0000000..8407816
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/58_es
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/81_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/81_en
new file mode 100644
index 0000000..f9d096f
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/81_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/84_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/84_en
new file mode 100644
index 0000000..5221729
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/84_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/84_vi b/java/src/com/android/i18n/phonenumbers/geocoding/data/84_vi
new file mode 100644
index 0000000..1b0e2d7
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/84_vi
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/86_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/86_en
new file mode 100644
index 0000000..b5b21b7
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/86_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/86_zh b/java/src/com/android/i18n/phonenumbers/geocoding/data/86_zh
index afa8d67..bbd7660 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/86_zh
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/86_zh
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/90_tr b/java/src/com/android/i18n/phonenumbers/geocoding/data/90_tr
index 7ba238e..cfcf99a 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/90_tr
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/90_tr
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/94_en b/java/src/com/android/i18n/phonenumbers/geocoding/data/94_en
new file mode 100644
index 0000000..0794d2a
--- /dev/null
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/94_en
Binary files differ
diff --git a/java/src/com/android/i18n/phonenumbers/geocoding/data/config b/java/src/com/android/i18n/phonenumbers/geocoding/data/config
index b40fe26..c7db9c8 100644
--- a/java/src/com/android/i18n/phonenumbers/geocoding/data/config
+++ b/java/src/com/android/i18n/phonenumbers/geocoding/data/config
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/AsYouTypeFormatterTest.java b/java/test/com/android/i18n/phonenumbers/AsYouTypeFormatterTest.java
index 93a58f2..b202324 100644
--- a/java/test/com/android/i18n/phonenumbers/AsYouTypeFormatterTest.java
+++ b/java/test/com/android/i18n/phonenumbers/AsYouTypeFormatterTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@
   }
 
   public void testInvalidRegion() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("ZZ");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
     assertEquals("+", formatter.inputDigit('+'));
     assertEquals("+4", formatter.inputDigit('4'));
     assertEquals("+48 ", formatter.inputDigit('8'));
@@ -57,7 +57,7 @@
   }
 
   public void testInvalidPlusSign() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("ZZ");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
     assertEquals("+", formatter.inputDigit('+'));
     assertEquals("+4", formatter.inputDigit('4'));
     assertEquals("+48 ", formatter.inputDigit('8'));
@@ -77,7 +77,7 @@
     // See http://code.google.com/p/libphonenumber/issues/detail?id=36
     // The bug occurred last time for countries which have two formatting rules with exactly the
     // same leading digits pattern but differ in length.
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("ZZ");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
     assertEquals("+", formatter.inputDigit('+'));
     assertEquals("+8", formatter.inputDigit('8'));
     assertEquals("+81 ", formatter.inputDigit('1'));
@@ -93,10 +93,11 @@
     assertEquals("+81 90 1234 5678", formatter.inputDigit('8'));
     assertEquals("+81 90 12 345 6789", formatter.inputDigit('9'));
     assertEquals("+81901234567890", formatter.inputDigit('0'));
+    assertEquals("+819012345678901", formatter.inputDigit('1'));
   }
 
   public void testAYTFUS() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
     assertEquals("6", formatter.inputDigit('6'));
     assertEquals("65", formatter.inputDigit('5'));
     assertEquals("650", formatter.inputDigit('0'));
@@ -190,7 +191,7 @@
   }
 
   public void testAYTFUSFullWidthCharacters() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
     assertEquals("\uFF16", formatter.inputDigit('\uFF16'));
     assertEquals("\uFF16\uFF15", formatter.inputDigit('\uFF15'));
     assertEquals("650", formatter.inputDigit('\uFF10'));
@@ -204,7 +205,7 @@
   }
 
   public void testAYTFUSMobileShortCode() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
     assertEquals("*", formatter.inputDigit('*'));
     assertEquals("*1", formatter.inputDigit('1'));
     assertEquals("*12", formatter.inputDigit('2'));
@@ -213,7 +214,7 @@
   }
 
   public void testAYTFUSVanityNumber() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
     assertEquals("8", formatter.inputDigit('8'));
     assertEquals("80", formatter.inputDigit('0'));
     assertEquals("800", formatter.inputDigit('0'));
@@ -229,7 +230,7 @@
   }
 
   public void testAYTFAndRememberPositionUS() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
     assertEquals("1", formatter.inputDigitAndRememberPosition('1'));
     assertEquals(1, formatter.getRememberedPosition());
     assertEquals("16", formatter.inputDigit('6'));
@@ -365,7 +366,7 @@
   }
 
   public void testAYTFGBFixedLine() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("GB");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
     assertEquals("0", formatter.inputDigit('0'));
     assertEquals("02", formatter.inputDigit('2'));
     assertEquals("020", formatter.inputDigit('0'));
@@ -382,7 +383,7 @@
   }
 
   public void testAYTFGBTollFree() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("GB");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
     assertEquals("0", formatter.inputDigit('0'));
     assertEquals("08", formatter.inputDigit('8'));
     assertEquals("080", formatter.inputDigit('0'));
@@ -397,7 +398,7 @@
   }
 
   public void testAYTFGBPremiumRate() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("GB");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
     assertEquals("0", formatter.inputDigit('0'));
     assertEquals("09", formatter.inputDigit('9'));
     assertEquals("090", formatter.inputDigit('0'));
@@ -412,7 +413,7 @@
   }
 
   public void testAYTFNZMobile() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("NZ");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.NZ);
     assertEquals("0", formatter.inputDigit('0'));
     assertEquals("02", formatter.inputDigit('2'));
     assertEquals("021", formatter.inputDigit('1'));
@@ -426,7 +427,7 @@
   }
 
   public void testAYTFDE() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("DE");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.DE);
     assertEquals("0", formatter.inputDigit('0'));
     assertEquals("03", formatter.inputDigit('3'));
     assertEquals("030", formatter.inputDigit('0'));
@@ -477,7 +478,7 @@
   }
 
   public void testAYTFAR() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AR");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AR);
     assertEquals("0", formatter.inputDigit('0'));
     assertEquals("01", formatter.inputDigit('1'));
     assertEquals("011", formatter.inputDigit('1'));
@@ -492,7 +493,7 @@
   }
 
   public void testAYTFARMobile() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AR");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AR);
     assertEquals("+", formatter.inputDigit('+'));
     assertEquals("+5", formatter.inputDigit('5'));
     assertEquals("+54 ", formatter.inputDigit('4'));
@@ -511,7 +512,7 @@
 
   public void testAYTFKR() {
     // +82 51 234 5678
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
     assertEquals("+", formatter.inputDigit('+'));
     assertEquals("+8", formatter.inputDigit('8'));
     assertEquals("+82 ", formatter.inputDigit('2'));
@@ -600,7 +601,7 @@
   }
 
   public void testAYTF_MX() {
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("MX");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.MX);
 
     // +52 800 123 4567
     assertEquals("+", formatter.inputDigit('+'));
@@ -686,7 +687,7 @@
 
   public void testAYTFMultipleLeadingDigitPatterns() {
     // +81 50 2345 6789
-    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("JP");
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.JP);
     assertEquals("+", formatter.inputDigit('+'));
     assertEquals("+8", formatter.inputDigit('8'));
     assertEquals("+81 ", formatter.inputDigit('1'));
@@ -716,6 +717,15 @@
     assertEquals("+81 222 12 567", formatter.inputDigit('7'));
     assertEquals("+81 222 12 5678", formatter.inputDigit('8'));
 
+    // 011113
+    formatter.clear();
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("01", formatter.inputDigit('1'));
+    assertEquals("011", formatter.inputDigit('1'));
+    assertEquals("011 1", formatter.inputDigit('1'));
+    assertEquals("011 11", formatter.inputDigit('1'));
+    assertEquals("011113", formatter.inputDigit('3'));
+
     // +81 3332 2 5678
     formatter.clear();
     assertEquals("+", formatter.inputDigit('+'));
@@ -731,4 +741,137 @@
     assertEquals("+81 3332 2 567", formatter.inputDigit('7'));
     assertEquals("+81 3332 2 5678", formatter.inputDigit('8'));
   }
+
+  public void testAYTFLongIDD_AU() {
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AU");
+    // 0011 1 650 253 2250
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("00", formatter.inputDigit('0'));
+    assertEquals("001", formatter.inputDigit('1'));
+    assertEquals("0011", formatter.inputDigit('1'));
+    assertEquals("0011 1 ", formatter.inputDigit('1'));
+    assertEquals("0011 1 6", formatter.inputDigit('6'));
+    assertEquals("0011 1 65", formatter.inputDigit('5'));
+    assertEquals("0011 1 650", formatter.inputDigit('0'));
+    assertEquals("0011 1 650 2", formatter.inputDigit('2'));
+    assertEquals("0011 1 650 25", formatter.inputDigit('5'));
+    assertEquals("0011 1 650 253", formatter.inputDigit('3'));
+    assertEquals("0011 1 650 253 2", formatter.inputDigit('2'));
+    assertEquals("0011 1 650 253 22", formatter.inputDigit('2'));
+    assertEquals("0011 1 650 253 222", formatter.inputDigit('2'));
+    assertEquals("0011 1 650 253 2222", formatter.inputDigit('2'));
+
+    // 0011 81 3332 2 5678
+    formatter.clear();
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("00", formatter.inputDigit('0'));
+    assertEquals("001", formatter.inputDigit('1'));
+    assertEquals("0011", formatter.inputDigit('1'));
+    assertEquals("00118", formatter.inputDigit('8'));
+    assertEquals("0011 81 ", formatter.inputDigit('1'));
+    assertEquals("0011 81 3", formatter.inputDigit('3'));
+    assertEquals("0011 81 33", formatter.inputDigit('3'));
+    assertEquals("0011 81 33 3", formatter.inputDigit('3'));
+    assertEquals("0011 81 3332", formatter.inputDigit('2'));
+    assertEquals("0011 81 3332 2", formatter.inputDigit('2'));
+    assertEquals("0011 81 3332 2 5", formatter.inputDigit('5'));
+    assertEquals("0011 81 3332 2 56", formatter.inputDigit('6'));
+    assertEquals("0011 81 3332 2 567", formatter.inputDigit('7'));
+    assertEquals("0011 81 3332 2 5678", formatter.inputDigit('8'));
+
+    // 0011 244 250 253 222
+    formatter.clear();
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("00", formatter.inputDigit('0'));
+    assertEquals("001", formatter.inputDigit('1'));
+    assertEquals("0011", formatter.inputDigit('1'));
+    assertEquals("00112", formatter.inputDigit('2'));
+    assertEquals("001124", formatter.inputDigit('4'));
+    assertEquals("0011 244 ", formatter.inputDigit('4'));
+    assertEquals("0011 244 2", formatter.inputDigit('2'));
+    assertEquals("0011 244 25", formatter.inputDigit('5'));
+    assertEquals("0011 244 250", formatter.inputDigit('0'));
+    assertEquals("0011 244 250 2", formatter.inputDigit('2'));
+    assertEquals("0011 244 250 25", formatter.inputDigit('5'));
+    assertEquals("0011 244 250 253", formatter.inputDigit('3'));
+    assertEquals("0011 244 250 253 2", formatter.inputDigit('2'));
+    assertEquals("0011 244 250 253 22", formatter.inputDigit('2'));
+    assertEquals("0011 244 250 253 222", formatter.inputDigit('2'));
+  }
+
+  public void testAYTFLongIDD_KR() {
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
+    // 00300 1 650 253 2222
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("00", formatter.inputDigit('0'));
+    assertEquals("003", formatter.inputDigit('3'));
+    assertEquals("0030", formatter.inputDigit('0'));
+    assertEquals("00300", formatter.inputDigit('0'));
+    assertEquals("00300 1 ", formatter.inputDigit('1'));
+    assertEquals("00300 1 6", formatter.inputDigit('6'));
+    assertEquals("00300 1 65", formatter.inputDigit('5'));
+    assertEquals("00300 1 650", formatter.inputDigit('0'));
+    assertEquals("00300 1 650 2", formatter.inputDigit('2'));
+    assertEquals("00300 1 650 25", formatter.inputDigit('5'));
+    assertEquals("00300 1 650 253", formatter.inputDigit('3'));
+    assertEquals("00300 1 650 253 2", formatter.inputDigit('2'));
+    assertEquals("00300 1 650 253 22", formatter.inputDigit('2'));
+    assertEquals("00300 1 650 253 222", formatter.inputDigit('2'));
+    assertEquals("00300 1 650 253 2222", formatter.inputDigit('2'));
+  }
+
+  public void testAYTFLongNDD_KR() {
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
+    // 08811-9876-7890
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("08", formatter.inputDigit('8'));
+    assertEquals("088", formatter.inputDigit('8'));
+    assertEquals("0881", formatter.inputDigit('1'));
+    assertEquals("08811", formatter.inputDigit('1'));
+    assertEquals("08811-9", formatter.inputDigit('9'));
+    assertEquals("08811-98", formatter.inputDigit('8'));
+    assertEquals("08811-987", formatter.inputDigit('7'));
+    assertEquals("08811-9876", formatter.inputDigit('6'));
+    assertEquals("08811-9876-7", formatter.inputDigit('7'));
+    assertEquals("08811-9876-78", formatter.inputDigit('8'));
+    assertEquals("08811-9876-789", formatter.inputDigit('9'));
+    assertEquals("08811-9876-7890", formatter.inputDigit('0'));
+
+    // 08500 11-9876-7890
+    formatter.clear();
+    assertEquals("0", formatter.inputDigit('0'));
+    assertEquals("08", formatter.inputDigit('8'));
+    assertEquals("085", formatter.inputDigit('5'));
+    assertEquals("0850", formatter.inputDigit('0'));
+    assertEquals("08500 ", formatter.inputDigit('0'));
+    assertEquals("08500 1", formatter.inputDigit('1'));
+    assertEquals("08500 11", formatter.inputDigit('1'));
+    assertEquals("08500 11-9", formatter.inputDigit('9'));
+    assertEquals("08500 11-98", formatter.inputDigit('8'));
+    assertEquals("08500 11-987", formatter.inputDigit('7'));
+    assertEquals("08500 11-9876", formatter.inputDigit('6'));
+    assertEquals("08500 11-9876-7", formatter.inputDigit('7'));
+    assertEquals("08500 11-9876-78", formatter.inputDigit('8'));
+    assertEquals("08500 11-9876-789", formatter.inputDigit('9'));
+    assertEquals("08500 11-9876-7890", formatter.inputDigit('0'));
+  }
+
+  public void testAYTFLongNDD_SG() {
+    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("SG");
+    // 777777 9876 7890
+    assertEquals("7", formatter.inputDigit('7'));
+    assertEquals("77", formatter.inputDigit('7'));
+    assertEquals("777", formatter.inputDigit('7'));
+    assertEquals("7777", formatter.inputDigit('7'));
+    assertEquals("77777", formatter.inputDigit('7'));
+    assertEquals("777777 ", formatter.inputDigit('7'));
+    assertEquals("777777 9", formatter.inputDigit('9'));
+    assertEquals("777777 98", formatter.inputDigit('8'));
+    assertEquals("777777 987", formatter.inputDigit('7'));
+    assertEquals("777777 9876", formatter.inputDigit('6'));
+    assertEquals("777777 9876 7", formatter.inputDigit('7'));
+    assertEquals("777777 9876 78", formatter.inputDigit('8'));
+    assertEquals("777777 9876 789", formatter.inputDigit('9'));
+    assertEquals("777777 9876 7890", formatter.inputDigit('0'));
+  }
 }
diff --git a/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java b/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java
index 6201f14..075f8eb 100644
--- a/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java
+++ b/java/test/com/android/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -31,10 +31,10 @@
   // countries sharing a calling code, such as the NANPA countries, the one
   // indicated with "isMainCountryForCode" in the metadata should be first.
   static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() {
-    // The capacity is set to 20 as there are 15 different country codes,
+    // The capacity is set to 21 as there are 16 different country codes,
     // and this offers a load factor of roughly 0.75.
     Map<Integer, List<String>> countryCodeToRegionCodeMap =
-        new HashMap<Integer, List<String>>(20);
+        new HashMap<Integer, List<String>>(21);
 
     ArrayList<String> listWithRegionCode;
 
@@ -68,6 +68,10 @@
     countryCodeToRegionCodeMap.put(54, listWithRegionCode);
 
     listWithRegionCode = new ArrayList<String>(1);
+    listWithRegionCode.add("BR");
+    countryCodeToRegionCodeMap.put(55, listWithRegionCode);
+
+    listWithRegionCode = new ArrayList<String>(1);
     listWithRegionCode.add("AU");
     countryCodeToRegionCodeMap.put(61, listWithRegionCode);
 
diff --git a/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java b/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java
index 5800049..9f19826 100644
--- a/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java
+++ b/java/test/com/android/i18n/phonenumbers/ExampleNumbersTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -166,4 +166,11 @@
     }
     assertEquals(0, wrongTypeCases.size());
   }
+
+  public void testEveryRegionHasAnExampleNumber() throws Exception {
+    for (String regionCode : phoneNumberUtil.getSupportedRegions()) {
+      PhoneNumber exampleNumber = phoneNumberUtil.getExampleNumber(regionCode);
+      assertNotNull("None found for region " + regionCode, exampleNumber);
+    }
+  }
 }
diff --git a/java/test/com/android/i18n/phonenumbers/PhoneNumberMatchTest.java b/java/test/com/android/i18n/phonenumbers/PhoneNumberMatchTest.java
index b54ff57..7f14ba1 100644
--- a/java/test/com/android/i18n/phonenumbers/PhoneNumberMatchTest.java
+++ b/java/test/com/android/i18n/phonenumbers/PhoneNumberMatchTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java b/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java
index a37b122..692fffa 100644
--- a/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java
+++ b/java/test/com/android/i18n/phonenumbers/PhoneNumberMatcherTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -44,141 +44,142 @@
   /** See {@link PhoneNumberUtilTest#testParseNationalNumber()}. */
   public void testFindNationalNumber() throws Exception {
     // same cases as in testParseNationalNumber
-    doTestFindInContext("033316005", "NZ");
-    doTestFindInContext("33316005", "NZ");
+    doTestFindInContext("033316005", RegionCode.NZ);
+    // ("33316005", RegionCode.NZ) is omitted since the national prefix is obligatory for these
+    // types of numbers in New Zealand.
     // National prefix attached and some formatting present.
-    doTestFindInContext("03-331 6005", "NZ");
-    doTestFindInContext("03 331 6005", "NZ");
+    doTestFindInContext("03-331 6005", RegionCode.NZ);
+    doTestFindInContext("03 331 6005", RegionCode.NZ);
     // Testing international prefixes.
     // Should strip country code.
-    doTestFindInContext("0064 3 331 6005", "NZ");
+    doTestFindInContext("0064 3 331 6005", RegionCode.NZ);
     // Try again, but this time we have an international number with Region Code US. It should
     // recognize the country code and parse accordingly.
-    doTestFindInContext("01164 3 331 6005", "US");
-    doTestFindInContext("+64 3 331 6005", "US");
+    doTestFindInContext("01164 3 331 6005", RegionCode.US);
+    doTestFindInContext("+64 3 331 6005", RegionCode.US);
 
-    doTestFindInContext("64(0)64123456", "NZ");
+    doTestFindInContext("64(0)64123456", RegionCode.NZ);
     // Check that using a "/" is fine in a phone number.
-    doTestFindInContext("123/45678", "DE");
-    doTestFindInContext("123-456-7890", "US");
+    doTestFindInContext("123/45678", RegionCode.DE);
+    doTestFindInContext("123-456-7890", RegionCode.US);
   }
 
   /** See {@link PhoneNumberUtilTest#testParseWithInternationalPrefixes()}. */
   public void testFindWithInternationalPrefixes() throws Exception {
-    doTestFindInContext("+1 (650) 333-6000", "NZ");
-    doTestFindInContext("1-650-333-6000", "US");
+    doTestFindInContext("+1 (650) 333-6000", RegionCode.NZ);
+    doTestFindInContext("1-650-333-6000", RegionCode.US);
     // Calling the US number from Singapore by using different service providers
     // 1st test: calling using SingTel IDD service (IDD is 001)
-    doTestFindInContext("0011-650-333-6000", "SG");
+    doTestFindInContext("0011-650-333-6000", RegionCode.SG);
     // 2nd test: calling using StarHub IDD service (IDD is 008)
-    doTestFindInContext("0081-650-333-6000", "SG");
+    doTestFindInContext("0081-650-333-6000", RegionCode.SG);
     // 3rd test: calling using SingTel V019 service (IDD is 019)
-    doTestFindInContext("0191-650-333-6000", "SG");
+    doTestFindInContext("0191-650-333-6000", RegionCode.SG);
     // Calling the US number from Poland
-    doTestFindInContext("0~01-650-333-6000", "PL");
+    doTestFindInContext("0~01-650-333-6000", RegionCode.PL);
     // Using "++" at the start.
-    doTestFindInContext("++1 (650) 333-6000", "PL");
+    doTestFindInContext("++1 (650) 333-6000", RegionCode.PL);
     // Using a full-width plus sign.
-    doTestFindInContext("\uFF0B1 (650) 333-6000", "SG");
+    doTestFindInContext("\uFF0B1 (650) 333-6000", RegionCode.SG);
     // The whole number, including punctuation, is here represented in full-width form.
     doTestFindInContext("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" +
         "\u3000\uFF13\uFF13\uFF13\uFF0D\uFF16\uFF10\uFF10\uFF10",
-        "SG");
+        RegionCode.SG);
   }
 
   /** See {@link PhoneNumberUtilTest#testParseWithLeadingZero()}. */
   public void testFindWithLeadingZero() throws Exception {
-    doTestFindInContext("+39 02-36618 300", "NZ");
-    doTestFindInContext("02-36618 300", "IT");
-    doTestFindInContext("312 345 678", "IT");
+    doTestFindInContext("+39 02-36618 300", RegionCode.NZ);
+    doTestFindInContext("02-36618 300", RegionCode.IT);
+    doTestFindInContext("312 345 678", RegionCode.IT);
   }
 
   /** See {@link PhoneNumberUtilTest#testParseNationalNumberArgentina()}. */
   public void testFindNationalNumberArgentina() throws Exception {
     // Test parsing mobile numbers of Argentina.
-    doTestFindInContext("+54 9 343 555 1212", "AR");
-    doTestFindInContext("0343 15 555 1212", "AR");
+    doTestFindInContext("+54 9 343 555 1212", RegionCode.AR);
+    doTestFindInContext("0343 15 555 1212", RegionCode.AR);
 
-    doTestFindInContext("+54 9 3715 65 4320", "AR");
-    doTestFindInContext("03715 15 65 4320", "AR");
+    doTestFindInContext("+54 9 3715 65 4320", RegionCode.AR);
+    doTestFindInContext("03715 15 65 4320", RegionCode.AR);
 
     // Test parsing fixed-line numbers of Argentina.
-    doTestFindInContext("+54 11 3797 0000", "AR");
-    doTestFindInContext("011 3797 0000", "AR");
+    doTestFindInContext("+54 11 3797 0000", RegionCode.AR);
+    doTestFindInContext("011 3797 0000", RegionCode.AR);
 
-    doTestFindInContext("+54 3715 65 4321", "AR");
-    doTestFindInContext("03715 65 4321", "AR");
+    doTestFindInContext("+54 3715 65 4321", RegionCode.AR);
+    doTestFindInContext("03715 65 4321", RegionCode.AR);
 
-    doTestFindInContext("+54 23 1234 0000", "AR");
-    doTestFindInContext("023 1234 0000", "AR");
+    doTestFindInContext("+54 23 1234 0000", RegionCode.AR);
+    doTestFindInContext("023 1234 0000", RegionCode.AR);
   }
 
   /** See {@link PhoneNumberUtilTest#testParseWithXInNumber()}. */
   public void testFindWithXInNumber() throws Exception {
-    doTestFindInContext("(0xx) 123456789", "AR");
+    doTestFindInContext("(0xx) 123456789", RegionCode.AR);
     // A case where x denotes both carrier codes and extension symbol.
-    doTestFindInContext("(0xx) 123456789 x 1234", "AR");
+    doTestFindInContext("(0xx) 123456789 x 1234", RegionCode.AR);
 
     // This test is intentionally constructed such that the number of digit after xx is larger than
     // 7, so that the number won't be mistakenly treated as an extension, as we allow extensions up
     // to 7 digits. This assumption is okay for now as all the countries where a carrier selection
     // code is written in the form of xx have a national significant number of length larger than 7.
-    doTestFindInContext("011xx5481429712", "US");
+    doTestFindInContext("011xx5481429712", RegionCode.US);
   }
 
   /** See {@link PhoneNumberUtilTest#testParseNumbersMexico()}. */
   public void testFindNumbersMexico() throws Exception {
     // Test parsing fixed-line numbers of Mexico.
-    doTestFindInContext("+52 (449)978-0001", "MX");
-    doTestFindInContext("01 (449)978-0001", "MX");
-    doTestFindInContext("(449)978-0001", "MX");
+    doTestFindInContext("+52 (449)978-0001", RegionCode.MX);
+    doTestFindInContext("01 (449)978-0001", RegionCode.MX);
+    doTestFindInContext("(449)978-0001", RegionCode.MX);
 
     // Test parsing mobile numbers of Mexico.
-    doTestFindInContext("+52 1 33 1234-5678", "MX");
-    doTestFindInContext("044 (33) 1234-5678", "MX");
-    doTestFindInContext("045 33 1234-5678", "MX");
+    doTestFindInContext("+52 1 33 1234-5678", RegionCode.MX);
+    doTestFindInContext("044 (33) 1234-5678", RegionCode.MX);
+    doTestFindInContext("045 33 1234-5678", RegionCode.MX);
   }
 
   /** See {@link PhoneNumberUtilTest#testParseNumbersWithPlusWithNoRegion()}. */
   public void testFindNumbersWithPlusWithNoRegion() throws Exception {
-    // "ZZ" is allowed only if the number starts with a '+' - then the country code can be
+    // RegionCode.ZZ is allowed only if the number starts with a '+' - then the country code can be
     // calculated.
-    doTestFindInContext("+64 3 331 6005", "ZZ");
+    doTestFindInContext("+64 3 331 6005", RegionCode.ZZ);
     // Null is also allowed for the region code in these cases.
     doTestFindInContext("+64 3 331 6005", null);
   }
 
   /** See {@link PhoneNumberUtilTest#testParseExtensions()}. */
   public void testFindExtensions() throws Exception {
-    doTestFindInContext("03 331 6005 ext 3456", "NZ");
-    doTestFindInContext("03-3316005x3456", "NZ");
-    doTestFindInContext("03-3316005 int.3456", "NZ");
-    doTestFindInContext("03 3316005 #3456", "NZ");
-    doTestFindInContext("0~0 1800 7493 524", "PL");
-    doTestFindInContext("(1800) 7493.524", "US");
+    doTestFindInContext("03 331 6005 ext 3456", RegionCode.NZ);
+    doTestFindInContext("03-3316005x3456", RegionCode.NZ);
+    doTestFindInContext("03-3316005 int.3456", RegionCode.NZ);
+    doTestFindInContext("03 3316005 #3456", RegionCode.NZ);
+    doTestFindInContext("0~0 1800 7493 524", RegionCode.PL);
+    doTestFindInContext("(1800) 7493.524", RegionCode.US);
     // Check that the last instance of an extension token is matched.
-    doTestFindInContext("0~0 1800 7493 524 ~1234", "PL");
+    doTestFindInContext("0~0 1800 7493 524 ~1234", RegionCode.PL);
     // Verifying bug-fix where the last digit of a number was previously omitted if it was a 0 when
     // extracting the extension. Also verifying a few different cases of extensions.
-    doTestFindInContext("+44 2034567890x456", "NZ");
-    doTestFindInContext("+44 2034567890x456", "GB");
-    doTestFindInContext("+44 2034567890 x456", "GB");
-    doTestFindInContext("+44 2034567890 X456", "GB");
-    doTestFindInContext("+44 2034567890 X 456", "GB");
-    doTestFindInContext("+44 2034567890 X  456", "GB");
-    doTestFindInContext("+44 2034567890  X 456", "GB");
+    doTestFindInContext("+44 2034567890x456", RegionCode.NZ);
+    doTestFindInContext("+44 2034567890x456", RegionCode.GB);
+    doTestFindInContext("+44 2034567890 x456", RegionCode.GB);
+    doTestFindInContext("+44 2034567890 X456", RegionCode.GB);
+    doTestFindInContext("+44 2034567890 X 456", RegionCode.GB);
+    doTestFindInContext("+44 2034567890 X  456", RegionCode.GB);
+    doTestFindInContext("+44 2034567890  X 456", RegionCode.GB);
 
-    doTestFindInContext("(800) 901-3355 x 7246433", "US");
-    doTestFindInContext("(800) 901-3355 , ext 7246433", "US");
-    doTestFindInContext("(800) 901-3355 ,extension 7246433", "US");
+    doTestFindInContext("(800) 901-3355 x 7246433", RegionCode.US);
+    doTestFindInContext("(800) 901-3355 , ext 7246433", RegionCode.US);
+    doTestFindInContext("(800) 901-3355 ,extension 7246433", RegionCode.US);
     // The next test differs from PhoneNumberUtil -> when matching we don't consider a lone comma to
     // indicate an extension, although we accept it when parsing.
-    doTestFindInContext("(800) 901-3355 ,x 7246433", "US");
-    doTestFindInContext("(800) 901-3355 ext: 7246433", "US");
+    doTestFindInContext("(800) 901-3355 ,x 7246433", RegionCode.US);
+    doTestFindInContext("(800) 901-3355 ext: 7246433", RegionCode.US);
   }
 
   public void testFindInterspersedWithSpace() throws Exception {
-    doTestFindInContext("0 3   3 3 1   6 0 0 5", "NZ");
+    doTestFindInContext("0 3   3 3 1   6 0 0 5", RegionCode.NZ);
   }
 
   /**
@@ -205,10 +206,10 @@
   public void testMatchWithSurroundingZipcodes() throws Exception {
     String number = "415-666-7777";
     String zipPreceding = "My address is CA 34215 - " + number + " is my number.";
-    PhoneNumber expectedResult = phoneUtil.parse(number, "US");
+    PhoneNumber expectedResult = phoneUtil.parse(number, RegionCode.US);
 
     Iterator<PhoneNumberMatch> iterator =
-        phoneUtil.findNumbers(zipPreceding, "US").iterator();
+        phoneUtil.findNumbers(zipPreceding, RegionCode.US).iterator();
     PhoneNumberMatch match = iterator.hasNext() ? iterator.next() : null;
     assertNotNull("Did not find a number in '" + zipPreceding + "'; expected " + number, match);
     assertEquals(expectedResult, match.number());
@@ -218,7 +219,7 @@
     number = "(415) 666 7777";
 
     String zipFollowing = "My number is " + number + ". 34215 is my zip-code.";
-    iterator = phoneUtil.findNumbers(zipFollowing, "US").iterator();
+    iterator = phoneUtil.findNumbers(zipFollowing, RegionCode.US).iterator();
 
     PhoneNumberMatch matchWithSpaces = iterator.hasNext() ? iterator.next() : null;
     assertNotNull("Did not find a number in '" + zipFollowing + "'; expected " + number,
@@ -265,6 +266,13 @@
     findMatchesInContexts(possibleOnlyContexts, false, true);
   }
 
+  public void testPercentageNotSeenAsPhoneNumber() throws Exception {
+    ArrayList<NumberContext> possibleOnlyContexts = new ArrayList<NumberContext>();
+    possibleOnlyContexts.add(new NumberContext("", "%"));
+    // Numbers followed by % should be dropped.
+    findMatchesInContexts(possibleOnlyContexts, false, true);
+  }
+
   public void testPhoneNumberWithLeadingOrTrailingMoneyMatches() throws Exception {
     // Because of the space after the 20 (or before the 100) these dollar amounts should not stop
     // the actual number from being found.
@@ -286,8 +294,8 @@
     // considered possible.
     String numberWithPlus = "+14156667777";
     String numberWithBrackets = "(415)6667777";
-    findMatchesInContexts(possibleOnlyContexts, false, true, "US", numberWithPlus);
-    findMatchesInContexts(possibleOnlyContexts, false, true, "US", numberWithBrackets);
+    findMatchesInContexts(possibleOnlyContexts, false, true, RegionCode.US, numberWithPlus);
+    findMatchesInContexts(possibleOnlyContexts, false, true, RegionCode.US, numberWithBrackets);
 
     ArrayList<NumberContext> validContexts = new ArrayList<NumberContext>();
     validContexts.add(new NumberContext("abc", ""));
@@ -296,8 +304,8 @@
     validContexts.add(new NumberContext("\u00C9", " def"));  // Trailing white-space.
 
     // Numbers should be considered valid, since they start with punctuation.
-    findMatchesInContexts(validContexts, true, true, "US", numberWithPlus);
-    findMatchesInContexts(validContexts, true, true, "US", numberWithBrackets);
+    findMatchesInContexts(validContexts, true, true, RegionCode.US, numberWithPlus);
+    findMatchesInContexts(validContexts, true, true, RegionCode.US, numberWithBrackets);
   }
 
   public void testMatchesWithSurroundingChineseChars() throws Exception {
@@ -323,7 +331,7 @@
 
   public void testMatchesMultiplePhoneNumbersSeparatedByPhoneNumberPunctuation() throws Exception {
     String text = "Call 650-253-4561 -- 455-234-3451";
-    String region = "US";
+    String region = RegionCode.US;
 
     PhoneNumber number1 = new PhoneNumber();
     number1.setCountryCode(phoneUtil.getCountryCodeForRegion(region));
@@ -343,7 +351,7 @@
   public void testDoesNotMatchMultiplePhoneNumbersSeparatedWithNoWhiteSpace() throws Exception {
     // No white-space found between numbers - neither is found.
     String text = "Call 650-253-4561--455-234-3451";
-    String region = "US";
+    String region = RegionCode.US;
 
     assertTrue(hasNoMatches(phoneUtil.findNumbers(text, region)));
   }
@@ -352,29 +360,30 @@
    * Strings with number-like things that shouldn't be found under any level.
    */
   private static final NumberTest[] IMPOSSIBLE_CASES = {
-    new NumberTest("12345", "US"),
-    new NumberTest("23456789", "US"),
-    new NumberTest("234567890112", "US"),
-    new NumberTest("650+253+1234", "US"),
-    new NumberTest("3/10/1984", "CA"),
-    new NumberTest("03/27/2011", "US"),
-    new NumberTest("31/8/2011", "US"),
-    new NumberTest("1/12/2011", "US"),
-    new NumberTest("10/12/82", "DE"),
+    new NumberTest("12345", RegionCode.US),
+    new NumberTest("23456789", RegionCode.US),
+    new NumberTest("234567890112", RegionCode.US),
+    new NumberTest("650+253+1234", RegionCode.US),
+    new NumberTest("3/10/1984", RegionCode.CA),
+    new NumberTest("03/27/2011", RegionCode.US),
+    new NumberTest("31/8/2011", RegionCode.US),
+    new NumberTest("1/12/2011", RegionCode.US),
+    new NumberTest("10/12/82", RegionCode.DE),
   };
 
   /**
    * Strings with number-like things that should only be found under "possible".
    */
   private static final NumberTest[] POSSIBLE_ONLY_CASES = {
-    new NumberTest("abc8002345678", "US"),
+    new NumberTest("abc8002345678", RegionCode.US),
     // US numbers cannot start with 7 in the test metadata to be valid.
-    new NumberTest("7121115678", "US"),
+    new NumberTest("7121115678", RegionCode.US),
     // 'X' should not be found in numbers at leniencies stricter than POSSIBLE, unless it represents
     // a carrier code or extension.
-    new NumberTest("1650 x 253 - 1234", "US"),
-    new NumberTest("650 x 253 - 1234", "US"),
-    new NumberTest("650x2531234", "US"),
+    new NumberTest("1650 x 253 - 1234", RegionCode.US),
+    new NumberTest("650 x 253 - 1234", RegionCode.US),
+    new NumberTest("650x2531234", RegionCode.US),
+    new NumberTest("(20) 3346 1234", RegionCode.GB),  // Non-optional NP omitted
   };
 
   /**
@@ -382,16 +391,18 @@
    * leniency level.
    */
   private static final NumberTest[] VALID_CASES = {
-    new NumberTest("65 02 53 00 00.", "US"),
-    new NumberTest("6502 538365", "US"),
-    new NumberTest("650//253-1234", "US"),  // 2 slashes are illegal at higher levels
-    new NumberTest("650/253/1234", "US"),
-    new NumberTest("9002309. 158", "US"),
-    new NumberTest("21 7/8 - 14 12/34 - 5", "US"),
-    new NumberTest("12.1 - 23.71 - 23.45", "US"),
-    new NumberTest("1979-2011 100%", "US"),
-    new NumberTest("800 234 1 111x1111", "US"),
-    new NumberTest("+494949-4-94", "DE"),  // National number in wrong format
+    new NumberTest("65 02 53 00 00.", RegionCode.US),
+    new NumberTest("6502 538365", RegionCode.US),
+    new NumberTest("650//253-1234", RegionCode.US),  // 2 slashes are illegal at higher levels
+    new NumberTest("650/253/1234", RegionCode.US),
+    new NumberTest("9002309. 158", RegionCode.US),
+    new NumberTest("21 7/8 - 14 12/34 - 5", RegionCode.US),
+    new NumberTest("12.1 - 23.71 - 23.45", RegionCode.US),
+    new NumberTest("1979-2011 100%", RegionCode.US),
+    new NumberTest("800 234 1 111x1111", RegionCode.US),
+    new NumberTest("+494949-4-94", RegionCode.DE),  // National number in wrong format
+    new NumberTest("\uFF14\uFF11\uFF15\uFF16\uFF16\uFF16\uFF16-\uFF17\uFF17\uFF17\uFF17",
+                   RegionCode.US),
   };
 
   /**
@@ -399,40 +410,40 @@
    * "strict_grouping" leniency level.
    */
   private static final NumberTest[] STRICT_GROUPING_CASES = {
-    new NumberTest("(415) 6667777", "US"),
-    new NumberTest("415-6667777", "US"),
+    new NumberTest("(415) 6667777", RegionCode.US),
+    new NumberTest("415-6667777", RegionCode.US),
     // Should be found by strict grouping but not exact grouping, as the last two groups are
     // formatted together as a block.
-    new NumberTest("800-2491234", "DE"),
+    new NumberTest("0800-2491234", RegionCode.DE),
   };
 
   /**
    * Strings with number-like things that should found at all levels.
    */
   private static final NumberTest[] EXACT_GROUPING_CASES = {
-    new NumberTest("\uFF14\uFF11\uFF15\uFF16\uFF16\uFF16\uFF17\uFF17\uFF17\uFF17", "US"),
-    new NumberTest("\uFF14\uFF11\uFF15-\uFF16\uFF16\uFF16-\uFF17\uFF17\uFF17\uFF17", "US"),
-    new NumberTest("4156667777", "US"),
-    new NumberTest("4156667777 x 123", "US"),
-    new NumberTest("415-666-7777", "US"),
-    new NumberTest("415/666-7777", "US"),
-    new NumberTest("415-666-7777 ext. 503", "US"),
-    new NumberTest("1 415 666 7777 x 123", "US"),
-    new NumberTest("+1 415-666-7777", "US"),
-    new NumberTest("+494949 49", "DE"),
-    new NumberTest("+49-49-34", "DE"),
-    new NumberTest("+49-4931-49", "DE"),
-    new NumberTest("04931-49", "DE"),  // With National Prefix
-    new NumberTest("+49-494949", "DE"),  // One group with country code
-    new NumberTest("+49-494949 ext. 49", "DE"),
-    new NumberTest("+49494949 ext. 49", "DE"),
-    new NumberTest("0494949", "DE"),
-    new NumberTest("0494949 ext. 49", "DE"),
+    new NumberTest("\uFF14\uFF11\uFF15\uFF16\uFF16\uFF16\uFF17\uFF17\uFF17\uFF17", RegionCode.US),
+    new NumberTest("\uFF14\uFF11\uFF15-\uFF16\uFF16\uFF16-\uFF17\uFF17\uFF17\uFF17", RegionCode.US),
+    new NumberTest("4156667777", RegionCode.US),
+    new NumberTest("4156667777 x 123", RegionCode.US),
+    new NumberTest("415-666-7777", RegionCode.US),
+    new NumberTest("415/666-7777", RegionCode.US),
+    new NumberTest("415-666-7777 ext. 503", RegionCode.US),
+    new NumberTest("1 415 666 7777 x 123", RegionCode.US),
+    new NumberTest("+1 415-666-7777", RegionCode.US),
+    new NumberTest("+494949 49", RegionCode.DE),
+    new NumberTest("+49-49-34", RegionCode.DE),
+    new NumberTest("+49-4931-49", RegionCode.DE),
+    new NumberTest("04931-49", RegionCode.DE),  // With National Prefix
+    new NumberTest("+49-494949", RegionCode.DE),  // One group with country code
+    new NumberTest("+49-494949 ext. 49", RegionCode.DE),
+    new NumberTest("+49494949 ext. 49", RegionCode.DE),
+    new NumberTest("0494949", RegionCode.DE),
+    new NumberTest("0494949 ext. 49", RegionCode.DE),
+    new NumberTest("01 (33) 3461 2234", RegionCode.MX),  // Optional NP present
+    new NumberTest("(33) 3461 2234", RegionCode.MX),  // Optional NP omitted
   };
 
   public void testMatchesWithStrictGroupingLeniency() throws Exception {
-    int noMatchFoundCount = 0;
-    int wrongMatchFoundCount = 0;
     List<NumberTest> testCases = new ArrayList<NumberTest>();
     testCases.addAll(Arrays.asList(STRICT_GROUPING_CASES));
     testCases.addAll(Arrays.asList(EXACT_GROUPING_CASES));
@@ -440,8 +451,8 @@
   }
 
   public void testNonMatchesWithStrictGroupLeniency() throws Exception {
-    int matchFoundCount = 0;
     List<NumberTest> testCases = new ArrayList<NumberTest>();
+    testCases.addAll(Arrays.asList(IMPOSSIBLE_CASES));
     testCases.addAll(Arrays.asList(POSSIBLE_ONLY_CASES));
     testCases.addAll(Arrays.asList(VALID_CASES));
     doTestNumberNonMatchesForLeniency(testCases, Leniency.STRICT_GROUPING);
@@ -455,6 +466,7 @@
 
   public void testNonMatchesExactGroupLeniency() throws Exception {
     List<NumberTest> testCases = new ArrayList<NumberTest>();
+    testCases.addAll(Arrays.asList(IMPOSSIBLE_CASES));
     testCases.addAll(Arrays.asList(POSSIBLE_ONLY_CASES));
     testCases.addAll(Arrays.asList(VALID_CASES));
     testCases.addAll(Arrays.asList(STRICT_GROUPING_CASES));
@@ -534,7 +546,7 @@
    */
   private void findMatchesInContexts(List<NumberContext> contexts, boolean isValid,
                                      boolean isPossible) {
-    String region = "US";
+    String region = RegionCode.US;
     String number = "415-666-7777";
 
     findMatchesInContexts(contexts, isValid, isPossible, region, number);
@@ -544,19 +556,19 @@
     // The digits up to the ", " form a valid US number, but it shouldn't be matched as one since
     // there was a non-matching bracket present.
     assertTrue(hasNoMatches(phoneUtil.findNumbers(
-        "80.585 [79.964, 81.191]", "US")));
+        "80.585 [79.964, 81.191]", RegionCode.US)));
 
     // The trailing "]" is thrown away before parsing, so the resultant number, while a valid US
     // number, does not have matching brackets.
     assertTrue(hasNoMatches(phoneUtil.findNumbers(
-        "80.585 [79.964]", "US")));
+        "80.585 [79.964]", RegionCode.US)));
 
     assertTrue(hasNoMatches(phoneUtil.findNumbers(
-        "80.585 ((79.964)", "US")));
+        "80.585 ((79.964)", RegionCode.US)));
 
     // This case has too many sets of brackets to be valid.
     assertTrue(hasNoMatches(phoneUtil.findNumbers(
-        "(80).(585) (79).(9)64", "US")));
+        "(80).(585) (79).(9)64", RegionCode.US)));
   }
 
   public void testNoMatchIfRegionIsNull() throws Exception {
@@ -566,19 +578,19 @@
   }
 
   public void testNoMatchInEmptyString() throws Exception {
-    assertTrue(hasNoMatches(phoneUtil.findNumbers("", "US")));
-    assertTrue(hasNoMatches(phoneUtil.findNumbers("  ", "US")));
+    assertTrue(hasNoMatches(phoneUtil.findNumbers("", RegionCode.US)));
+    assertTrue(hasNoMatches(phoneUtil.findNumbers("  ", RegionCode.US)));
   }
 
   public void testNoMatchIfNoNumber() throws Exception {
     assertTrue(hasNoMatches(phoneUtil.findNumbers(
-        "Random text body - number is foobar, see you there", "US")));
+        "Random text body - number is foobar, see you there", RegionCode.US)));
   }
 
   public void testSequences() throws Exception {
     // Test multiple occurrences.
     String text = "Call 033316005  or 032316005!";
-    String region = "NZ";
+    String region = RegionCode.NZ;
 
     PhoneNumber number1 = new PhoneNumber();
     number1.setCountryCode(phoneUtil.getCountryCodeForRegion(region));
@@ -598,7 +610,7 @@
   }
 
   public void testNullInput() throws Exception {
-    assertTrue(hasNoMatches(phoneUtil.findNumbers(null, "US")));
+    assertTrue(hasNoMatches(phoneUtil.findNumbers(null, RegionCode.US)));
     assertTrue(hasNoMatches(phoneUtil.findNumbers(null, null)));
   }
 
@@ -617,7 +629,7 @@
     }
 
     Iterable<PhoneNumberMatch> iterable =
-        phoneUtil.findNumbers(numbers.toString(), "US", Leniency.VALID, 10);
+        phoneUtil.findNumbers(numbers.toString(), RegionCode.US, Leniency.VALID, 10);
     List<PhoneNumber> actual = new ArrayList<PhoneNumber>(100);
     for (PhoneNumberMatch match : iterable) {
       actual.add(match.number());
@@ -636,7 +648,7 @@
     }
 
     Iterable<PhoneNumberMatch> iterable =
-        phoneUtil.findNumbers(numbers.toString(), "US", Leniency.VALID, 10);
+        phoneUtil.findNumbers(numbers.toString(), RegionCode.US, Leniency.VALID, 10);
     assertFalse(iterable.iterator().hasNext());
   }
 
@@ -655,7 +667,7 @@
     }
 
     Iterable<PhoneNumberMatch> iterable =
-        phoneUtil.findNumbers(numbers.toString(), "US", Leniency.VALID, 10);
+        phoneUtil.findNumbers(numbers.toString(), RegionCode.US, Leniency.VALID, 10);
     List<PhoneNumber> actual = new ArrayList<PhoneNumber>(100);
     for (PhoneNumberMatch match : iterable) {
       actual.add(match.number());
@@ -664,7 +676,7 @@
   }
 
   public void testEmptyIteration() throws Exception {
-    Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("", "ZZ");
+    Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("", RegionCode.ZZ);
     Iterator<PhoneNumberMatch> iterator = iterable.iterator();
 
     assertFalse(iterator.hasNext());
@@ -677,7 +689,7 @@
   }
 
   public void testSingleIteration() throws Exception {
-    Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("+14156667777", "ZZ");
+    Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("+14156667777", RegionCode.ZZ);
 
     // With hasNext() -> next().
     Iterator<PhoneNumberMatch> iterator = iterable.iterator();
@@ -703,7 +715,7 @@
 
   public void testDoubleIteration() throws Exception {
     Iterable<PhoneNumberMatch> iterable =
-        phoneUtil.findNumbers("+14156667777 foobar +14156667777 ", "ZZ");
+        phoneUtil.findNumbers("+14156667777 foobar +14156667777 ", RegionCode.ZZ);
 
     // With hasNext() -> next().
     Iterator<PhoneNumberMatch> iterator = iterable.iterator();
@@ -736,7 +748,7 @@
    * change iteration behavior.
    */
   public void testRemovalNotSupported() throws Exception {
-    Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("+14156667777", "ZZ");
+    Iterable<PhoneNumberMatch> iterable = phoneUtil.findNumbers("+14156667777", RegionCode.ZZ);
 
     Iterator<PhoneNumberMatch> iterator = iterable.iterator();
     try {
@@ -768,7 +780,7 @@
   private void assertEqualRange(CharSequence text, int index, int start, int end) {
     CharSequence sub = text.subSequence(index, text.length());
     Iterator<PhoneNumberMatch> matches =
-      phoneUtil.findNumbers(sub, "NZ", Leniency.POSSIBLE, Long.MAX_VALUE).iterator();
+      phoneUtil.findNumbers(sub, RegionCode.NZ, Leniency.POSSIBLE, Long.MAX_VALUE).iterator();
     assertTrue(matches.hasNext());
     PhoneNumberMatch match = matches.next();
     assertEquals(start - index, match.start());
@@ -892,13 +904,6 @@
     return phoneUtil.findNumbers(text, defaultCountry, leniency, Long.MAX_VALUE).iterator();
   }
 
-  /**
-   * Returns true if there were no matches found.
-   */
-  private boolean hasNoMatches(Iterator<PhoneNumberMatch> iterator) {
-    return !iterator.hasNext();
-  }
-
   private boolean hasNoMatches(Iterable<PhoneNumberMatch> iterable) {
     return !iterable.iterator().hasNext();
   }
diff --git a/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java b/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java
index c613977..5113ec6 100644
--- a/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java
+++ b/java/test/com/android/i18n/phonenumbers/PhoneNumberUtilTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -71,6 +71,8 @@
   private static final PhoneNumber IT_NUMBER =
       new PhoneNumber().setCountryCode(39).setNationalNumber(236618300L).
       setItalianLeadingZero(true);
+  private static final PhoneNumber JP_STAR_NUMBER =
+      new PhoneNumber().setCountryCode(81).setNationalNumber(2345);
   // Numbers to test the formatting rules from Mexico.
   private static final PhoneNumber MX_MOBILE1 =
       new PhoneNumber().setCountryCode(52).setNationalNumber(12345678900L);
@@ -104,29 +106,6 @@
       new PhoneNumber().setCountryCode(1).setNationalNumber(0L)
           .setRawInput("000-000-0000");
 
-  // Class containing string constants of region codes for easier testing.
-  private static class RegionCode {
-    static final String AD = "AD";
-    static final String AO = "AO";
-    static final String AR = "AR";
-    static final String AU = "AU";
-    static final String BS = "BS";
-    static final String CS = "CS";
-    static final String DE = "DE";
-    static final String GB = "GB";
-    static final String IT = "IT";
-    static final String KR = "KR";
-    static final String MX = "MX";
-    static final String NZ = "NZ";
-    static final String PL = "PL";
-    static final String RE = "RE";
-    static final String SG = "SG";
-    static final String US = "US";
-    static final String YT = "YT";
-    // Official code for the unknown region.
-    static final String ZZ = "ZZ";
-  }
-
   public PhoneNumberUtilTest() {
     phoneUtil = initializePhoneUtilForTesting();
   }
@@ -144,7 +123,7 @@
 
   public void testGetInstanceLoadUSMetadata() {
     PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.US);
-    assertEquals("US", metadata.getId());
+    assertEquals(RegionCode.US, metadata.getId());
     assertEquals(1, metadata.getCountryCode());
     assertEquals("011", metadata.getInternationalPrefix());
     assertTrue(metadata.hasNationalPrefix());
@@ -165,7 +144,7 @@
 
   public void testGetInstanceLoadDEMetadata() {
     PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.DE);
-    assertEquals("DE", metadata.getId());
+    assertEquals(RegionCode.DE, metadata.getId());
     assertEquals(49, metadata.getCountryCode());
     assertEquals("00", metadata.getInternationalPrefix());
     assertEquals("0", metadata.getNationalPrefix());
@@ -185,7 +164,7 @@
 
   public void testGetInstanceLoadARMetadata() {
     PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.AR);
-    assertEquals("AR", metadata.getId());
+    assertEquals(RegionCode.AR, metadata.getId());
     assertEquals(54, metadata.getCountryCode());
     assertEquals("00", metadata.getInternationalPrefix());
     assertEquals("0", metadata.getNationalPrefix());
@@ -465,7 +444,7 @@
     assertEquals("1 650 253 0000",
                  phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, RegionCode.BS));
 
-    assertEquals("0~0 1 650 253 0000",
+    assertEquals("00 1 650 253 0000",
                  phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, RegionCode.PL));
 
     assertEquals("011 44 7912 345 678",
@@ -500,6 +479,13 @@
                  phoneUtil.formatOutOfCountryCallingNumber(arNumberWithExtn, RegionCode.AR));
   }
 
+  public void testFormatOutOfCountryWithInvalidRegion() {
+    // AQ/Antarctica isn't a valid region code for phone number formatting,
+    // so this falls back to intl formatting.
+    assertEquals("+1 650 253 0000",
+                 phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, "AQ"));
+  }
+
   public void testFormatOutOfCountryWithPreferredIntlPrefix() {
     // This should use 0011, since that is the preferred international prefix (both 0011 and 0012
     // are accepted as possible international prefixes in our test metadta.)
@@ -626,6 +612,42 @@
         phoneUtil.formatNationalNumberWithPreferredCarrierCode(usNumber, "15"));
   }
 
+  public void testFormatNumberForMobileDialing() {
+    // US toll free numbers are marked as noInternationalDialling in the test metadata for testing
+    // purposes.
+    assertEquals("800 253 0000",
+        phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.US,
+                                               true /*  keep formatting */));
+    assertEquals("", phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.CN, true));
+    assertEquals("+1 650 253 0000",
+        phoneUtil.formatNumberForMobileDialing(US_NUMBER, RegionCode.US, true));
+    PhoneNumber usNumberWithExtn = new PhoneNumber().mergeFrom(US_NUMBER).setExtension("1234");
+    assertEquals("+1 650 253 0000",
+        phoneUtil.formatNumberForMobileDialing(usNumberWithExtn, RegionCode.US, true));
+
+    assertEquals("8002530000",
+        phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.US,
+                                               false /* remove formatting */));
+    assertEquals("", phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.CN, false));
+    assertEquals("+16502530000",
+        phoneUtil.formatNumberForMobileDialing(US_NUMBER, RegionCode.US, false));
+    assertEquals("+16502530000",
+        phoneUtil.formatNumberForMobileDialing(usNumberWithExtn, RegionCode.US, false));
+
+    // An invalid US number, which is one digit too long.
+    assertEquals("+165025300001",
+        phoneUtil.formatNumberForMobileDialing(US_LONG_NUMBER, RegionCode.US, false));
+    assertEquals("+1 65025300001",
+        phoneUtil.formatNumberForMobileDialing(US_LONG_NUMBER, RegionCode.US, true));
+
+    // Star numbers. In real life they appear in Israel, but we have them in JP in our test
+    // metadata.
+    assertEquals("*2345",
+        phoneUtil.formatNumberForMobileDialing(JP_STAR_NUMBER, RegionCode.JP, false));
+    assertEquals("*2345",
+        phoneUtil.formatNumberForMobileDialing(JP_STAR_NUMBER, RegionCode.JP, true));
+  }
+
   public void testFormatByPattern() {
     NumberFormat newNumFormat = new NumberFormat();
     newNumFormat.setPattern("(\\d{3})(\\d{3})(\\d{4})");
@@ -717,6 +739,15 @@
     PhoneNumber number5 = phoneUtil.parse("+442087654321", RegionCode.GB);
     assertEquals("(020) 8765 4321", phoneUtil.formatInOriginalFormat(number5, RegionCode.GB));
 
+    // Invalid numbers should be formatted using its raw input when that is available. Note area
+    // codes starting with 7 are intentionally excluded in the test metadata for testing purposes.
+    PhoneNumber number6 = phoneUtil.parseAndKeepRawInput("7345678901", RegionCode.US);
+    assertEquals("7345678901", phoneUtil.formatInOriginalFormat(number6, RegionCode.US));
+
+    // When the raw input is unavailable, format as usual.
+    PhoneNumber number7 = phoneUtil.parse("7345678901", RegionCode.US);
+    assertEquals("734 567 8901", phoneUtil.formatInOriginalFormat(number7, RegionCode.US));
+
     // This number is valid, but we don't have a formatting pattern for it. Fall back to the raw
     // input.
     PhoneNumber number8 = phoneUtil.parseAndKeepRawInput("02-4567-8900", RegionCode.KR);
@@ -979,7 +1010,7 @@
     adNumber.setCountryCode(376).setNationalNumber(13L);
     assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT,
                  phoneUtil.isPossibleNumberWithReason(adNumber));
-    adNumber.setCountryCode(376).setNationalNumber(1234567890123456L);
+    adNumber.setCountryCode(376).setNationalNumber(12345678901234567L);
     assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG,
                  phoneUtil.isPossibleNumberWithReason(adNumber));
   }
@@ -1100,24 +1131,24 @@
     metadata.setGeneralDesc(new PhoneNumberDesc().setNationalNumberPattern("\\d{4,8}"));
     StringBuilder numberToStrip = new StringBuilder("34356778");
     String strippedNumber = "356778";
-    phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata);
+    assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
     assertEquals("Should have had national prefix stripped.",
                  strippedNumber, numberToStrip.toString());
     // Retry stripping - now the number should not start with the national prefix, so no more
     // stripping should occur.
-    phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata);
+    assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
     assertEquals("Should have had no change - no national prefix present.",
                  strippedNumber, numberToStrip.toString());
     // Some countries have no national prefix. Repeat test with none specified.
     metadata.setNationalPrefixForParsing("");
-    phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata);
+    assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
     assertEquals("Should not strip anything with empty national prefix.",
                  strippedNumber, numberToStrip.toString());
     // If the resultant number doesn't match the national rule, it shouldn't be stripped.
     metadata.setNationalPrefixForParsing("3");
     numberToStrip = new StringBuilder("3123");
     strippedNumber = "3123";
-    phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata);
+    assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
     assertEquals("Should have had no change - after stripping, it wouldn't have matched " +
                  "the national rule.",
                  strippedNumber, numberToStrip.toString());
@@ -1125,7 +1156,10 @@
     metadata.setNationalPrefixForParsing("0(81)?");
     numberToStrip = new StringBuilder("08122123456");
     strippedNumber = "22123456";
-    assertEquals("81", phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata));
+    StringBuilder carrierCode = new StringBuilder();
+    assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(
+        numberToStrip, metadata, carrierCode));
+    assertEquals("81", carrierCode.toString());
     assertEquals("Should have had national prefix and carrier code stripped.",
                  strippedNumber, numberToStrip.toString());
     // If there was a transform rule, check it was applied.
@@ -1134,7 +1168,7 @@
     metadata.setNationalPrefixForParsing("0(\\d{2})");
     numberToStrip = new StringBuilder("031123");
     String transformedNumber = "5315123";
-    phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata);
+    assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
     assertEquals("Should transform the 031 to a 5315.",
                  transformedNumber, numberToStrip.toString());
   }
@@ -1332,6 +1366,11 @@
     // recognise the country calling code and parse accordingly.
     assertEquals(NZ_NUMBER, phoneUtil.parse("01164 3 331 6005", RegionCode.US));
     assertEquals(NZ_NUMBER, phoneUtil.parse("+64 3 331 6005", RegionCode.US));
+    // We should ignore the leading plus here, since it is not followed by a valid country code but
+    // instead is followed by the IDD for the US.
+    assertEquals(NZ_NUMBER, phoneUtil.parse("+01164 3 331 6005", RegionCode.US));
+    assertEquals(NZ_NUMBER, phoneUtil.parse("+0064 3 331 6005", RegionCode.NZ));
+    assertEquals(NZ_NUMBER, phoneUtil.parse("+ 00 64 3 331 6005", RegionCode.NZ));
 
     PhoneNumber nzNumber = new PhoneNumber();
     nzNumber.setCountryCode(64).setNationalNumber(64123456L);
@@ -1515,6 +1554,16 @@
                    e.getErrorType());
     }
     try {
+      String plusAndIddAndInvalidCountryCode = "+ 00 210 3 331 6005";
+      phoneUtil.parse(plusAndIddAndInvalidCountryCode, RegionCode.NZ);
+      fail("This should not parse without throwing an exception.");
+    } catch (NumberParseException e) {
+      // Expected this exception. 00 is a correct IDD, but 210 is not a valid country code.
+      assertEquals("Wrong error type stored in exception.",
+                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
+                   e.getErrorType());
+    }
+    try {
       String someNumber = "123 456 7890";
       phoneUtil.parse(someNumber, RegionCode.ZZ);
       fail("'Unknown' region code not allowed: should fail.");
diff --git a/java/test/com/android/i18n/phonenumbers/PhonenumberTest.java b/java/test/com/android/i18n/phonenumbers/PhonenumberTest.java
index ee93648..b2169d9 100644
--- a/java/test/com/android/i18n/phonenumbers/PhonenumberTest.java
+++ b/java/test/com/android/i18n/phonenumbers/PhonenumberTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Google Inc.
+ * Copyright (C) 2009 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/java/test/com/android/i18n/phonenumbers/RegexCacheTest.java b/java/test/com/android/i18n/phonenumbers/RegexCacheTest.java
index 2f5fa51..544c9e2 100644
--- a/java/test/com/android/i18n/phonenumbers/RegexCacheTest.java
+++ b/java/test/com/android/i18n/phonenumbers/RegexCacheTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/java/test/com/android/i18n/phonenumbers/RegionCode.java b/java/test/com/android/i18n/phonenumbers/RegionCode.java
new file mode 100644
index 0000000..ecf5660
--- /dev/null
+++ b/java/test/com/android/i18n/phonenumbers/RegionCode.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2011 The Libphonenumber Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.phonenumbers;
+
+/**
+ * Class containing string constants of region codes for easier testing.
+ */
+final class RegionCode {
+  static final String AD = "AD";
+  static final String AO = "AO";
+  static final String AR = "AR";
+  static final String AU = "AU";
+  static final String BR = "BR";
+  static final String BS = "BS";
+  static final String CA = "CA";
+  static final String CN = "CN";
+  static final String CS = "CS";
+  static final String DE = "DE";
+  static final String GB = "GB";
+  static final String IT = "IT";
+  static final String JP = "JP";
+  static final String KR = "KR";
+  static final String MX = "MX";
+  static final String NZ = "NZ";
+  static final String PL = "PL";
+  static final String RE = "RE";
+  static final String SG = "SG";
+  static final String US = "US";
+  static final String YT = "YT";
+  static final String ZW = "ZW";
+  // Official code for the unknown region.
+  static final String ZZ = "ZZ";
+}
diff --git a/java/test/com/android/i18n/phonenumbers/ShortNumberUtilTest.java b/java/test/com/android/i18n/phonenumbers/ShortNumberUtilTest.java
new file mode 100644
index 0000000..b1aaade
--- /dev/null
+++ b/java/test/com/android/i18n/phonenumbers/ShortNumberUtilTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2011 The Libphonenumber Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.i18n.phonenumbers;
+
+import junit.framework.TestCase;
+
+import java.io.InputStream;
+
+/**
+ * Unit tests for ShortNumberUtil.java
+ *
+ * @author Shaopeng Jia
+ */
+public class ShortNumberUtilTest extends TestCase {
+  private ShortNumberUtil shortUtil;
+  static final String TEST_META_DATA_FILE_PREFIX =
+      "/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting";
+
+  public ShortNumberUtilTest() {
+    PhoneNumberUtil.resetInstance();
+    PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(
+        TEST_META_DATA_FILE_PREFIX,
+        CountryCodeToRegionCodeMapForTesting.getCountryCodeToRegionCodeMap());
+    shortUtil = new ShortNumberUtil(phoneUtil);
+  }
+
+  public void testConnectsToEmergencyNumber_US() {
+    assertTrue(shortUtil.connectsToEmergencyNumber("911", RegionCode.US));
+    assertTrue(shortUtil.connectsToEmergencyNumber("119", RegionCode.US));
+    assertFalse(shortUtil.connectsToEmergencyNumber("999", RegionCode.US));
+  }
+
+  public void testConnectsToEmergencyNumberLongNumber_US() {
+    assertTrue(shortUtil.connectsToEmergencyNumber("9116666666", RegionCode.US));
+    assertTrue(shortUtil.connectsToEmergencyNumber("1196666666", RegionCode.US));
+    assertFalse(shortUtil.connectsToEmergencyNumber("9996666666", RegionCode.US));
+  }
+
+  public void testConnectsToEmergencyNumberWithFormatting_US() {
+    assertTrue(shortUtil.connectsToEmergencyNumber("9-1-1", RegionCode.US));
+    assertTrue(shortUtil.connectsToEmergencyNumber("1-1-9", RegionCode.US));
+    assertFalse(shortUtil.connectsToEmergencyNumber("9-9-9", RegionCode.US));
+  }
+
+  public void testConnectsToEmergencyNumberWithPlusSign_US() {
+    assertFalse(shortUtil.connectsToEmergencyNumber("+911", RegionCode.US));
+    assertFalse(shortUtil.connectsToEmergencyNumber("\uFF0B911", RegionCode.US));
+    assertFalse(shortUtil.connectsToEmergencyNumber(" +911", RegionCode.US));
+    assertFalse(shortUtil.connectsToEmergencyNumber("+119", RegionCode.US));
+    assertFalse(shortUtil.connectsToEmergencyNumber("+999", RegionCode.US));
+  }
+
+  public void testConnectsToEmergencyNumber_BR() {
+    assertTrue(shortUtil.connectsToEmergencyNumber("911", RegionCode.BR));
+    assertTrue(shortUtil.connectsToEmergencyNumber("190", RegionCode.BR));
+    assertFalse(shortUtil.connectsToEmergencyNumber("999", RegionCode.BR));
+  }
+
+  public void testConnectsToEmergencyNumberLongNumber_BR() {
+    // Brazilian emergency numbers don't work when additional digits are appended.
+    assertFalse(shortUtil.connectsToEmergencyNumber("9111", RegionCode.BR));
+    assertFalse(shortUtil.connectsToEmergencyNumber("1900", RegionCode.BR));
+    assertFalse(shortUtil.connectsToEmergencyNumber("9996", RegionCode.BR));
+  }
+
+  public void testConnectsToEmergencyNumber_AO() {
+    // Angola doesn't have any metadata for emergency numbers in the test metadata.
+    assertFalse(shortUtil.connectsToEmergencyNumber("911", RegionCode.AO));
+    assertFalse(shortUtil.connectsToEmergencyNumber("222123456", RegionCode.AO));
+    assertFalse(shortUtil.connectsToEmergencyNumber("923123456", RegionCode.AO));
+  }
+
+  public void testConnectsToEmergencyNumber_ZW() {
+    // Zimbabwe doesn't have any metadata in the test metadata.
+    assertFalse(shortUtil.connectsToEmergencyNumber("911", RegionCode.ZW));
+    assertFalse(shortUtil.connectsToEmergencyNumber("01312345", RegionCode.ZW));
+    assertFalse(shortUtil.connectsToEmergencyNumber("0711234567", RegionCode.ZW));
+  }
+
+  public void testIsEmergencyNumber_US() {
+    assertTrue(shortUtil.isEmergencyNumber("911", RegionCode.US));
+    assertTrue(shortUtil.isEmergencyNumber("119", RegionCode.US));
+    assertFalse(shortUtil.isEmergencyNumber("999", RegionCode.US));
+  }
+
+  public void testIsEmergencyNumberLongNumber_US() {
+    assertFalse(shortUtil.isEmergencyNumber("9116666666", RegionCode.US));
+    assertFalse(shortUtil.isEmergencyNumber("1196666666", RegionCode.US));
+    assertFalse(shortUtil.isEmergencyNumber("9996666666", RegionCode.US));
+  }
+
+  public void testIsEmergencyNumberWithFormatting_US() {
+    assertTrue(shortUtil.isEmergencyNumber("9-1-1", RegionCode.US));
+    assertTrue(shortUtil.isEmergencyNumber("*911", RegionCode.US));
+    assertTrue(shortUtil.isEmergencyNumber("1-1-9", RegionCode.US));
+    assertTrue(shortUtil.isEmergencyNumber("*119", RegionCode.US));
+    assertFalse(shortUtil.isEmergencyNumber("9-9-9", RegionCode.US));
+    assertFalse(shortUtil.isEmergencyNumber("*999", RegionCode.US));
+  }
+
+  public void testIsEmergencyNumberWithPlusSign_US() {
+    assertFalse(shortUtil.isEmergencyNumber("+911", RegionCode.US));
+    assertFalse(shortUtil.isEmergencyNumber("\uFF0B911", RegionCode.US));
+    assertFalse(shortUtil.isEmergencyNumber(" +911", RegionCode.US));
+    assertFalse(shortUtil.isEmergencyNumber("+119", RegionCode.US));
+    assertFalse(shortUtil.isEmergencyNumber("+999", RegionCode.US));
+  }
+
+  public void testIsEmergencyNumber_BR() {
+    assertTrue(shortUtil.isEmergencyNumber("911", RegionCode.BR));
+    assertTrue(shortUtil.isEmergencyNumber("190", RegionCode.BR));
+    assertFalse(shortUtil.isEmergencyNumber("999", RegionCode.BR));
+  }
+
+  public void testIsEmergencyNumberLongNumber_BR() {
+    assertFalse(shortUtil.isEmergencyNumber("9111", RegionCode.BR));
+    assertFalse(shortUtil.isEmergencyNumber("1900", RegionCode.BR));
+    assertFalse(shortUtil.isEmergencyNumber("9996", RegionCode.BR));
+  }
+
+  public void testIsEmergencyNumber_AO() {
+    // Angola doesn't have any metadata for emergency numbers in the test metadata.
+    assertFalse(shortUtil.isEmergencyNumber("911", RegionCode.AO));
+    assertFalse(shortUtil.isEmergencyNumber("222123456", RegionCode.AO));
+    assertFalse(shortUtil.isEmergencyNumber("923123456", RegionCode.AO));
+  }
+
+  public void testIsEmergencyNumber_ZW() {
+    // Zimbabwe doesn't have any metadata in the test metadata.
+    assertFalse(shortUtil.isEmergencyNumber("911", RegionCode.ZW));
+    assertFalse(shortUtil.isEmergencyNumber("01312345", RegionCode.ZW));
+    assertFalse(shortUtil.isEmergencyNumber("0711234567", RegionCode.ZW));
+  }
+}
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AD b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AD
index 0554c1f..8dba7fa 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AD
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AD
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AO b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AO
index 8f829b8..44b042e 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AO
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AO
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AR b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AR
index 80e8ebf..549bc8b 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AR
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AR
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AU b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AU
index ecd6757..b3ee483 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AU
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_AU
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BR b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BR
new file mode 100644
index 0000000..fc33520
--- /dev/null
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BR
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BS b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BS
index 2c30b61..7ec5aa3 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BS
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_BS
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_DE b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_DE
index 766539f..42d58fe 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_DE
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_DE
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_GB b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_GB
index 1cbd1f3..171bbc0 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_GB
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_GB
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_IT b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_IT
index a75f0db..be4d9c1 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_IT
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_IT
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_JP b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_JP
index cfb8f71..06f685a 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_JP
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_JP
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR
index 7f29bca..21c764e 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_KR
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_MX b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_MX
index 7f1e18b..854f020 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_MX
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_MX
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_NZ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_NZ
index 5a494e6..d3b27a6 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_NZ
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_NZ
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_PL b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_PL
index 424909c..9b082df 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_PL
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_PL
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_RE b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_RE
index 77a8f8f..02b38fa 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_RE
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_RE
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG
index 0838f55..c5df8dc 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_SG
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_US b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_US
index 0630d77..cf65f6a 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_US
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_US
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_YT b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_YT
index 50db378..ecee4a4 100644
--- a/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_YT
+++ b/java/test/com/android/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_YT
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/AreaCodeMapTest.java b/java/test/com/android/i18n/phonenumbers/geocoding/AreaCodeMapTest.java
index a01a96c..25ea63f 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/AreaCodeMapTest.java
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/AreaCodeMapTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -84,13 +84,13 @@
   public void testGetSmallerMapStorageChoosesDefaultImpl() {
     AreaCodeMapStorageStrategy mapStorage =
         new AreaCodeMap().getSmallerMapStorage(createDefaultStorageMapCandidate());
-    assertFalse(mapStorage.isFlyweight());
+    assertFalse(mapStorage instanceof FlyweightMapStorage);
   }
 
   public void testGetSmallerMapStorageChoosesFlyweightImpl() {
     AreaCodeMapStorageStrategy mapStorage =
         new AreaCodeMap().getSmallerMapStorage(createFlyweightStorageMapCandidate());
-    assertTrue(mapStorage.isFlyweight());
+    assertTrue(mapStorage instanceof FlyweightMapStorage);
   }
 
   public void testLookupInvalidNumber_US() {
@@ -126,12 +126,12 @@
 
   public void testLookupNumberNotFound_TX() {
     number.setCountryCode(1).setNationalNumber(9724811234L);
-    assertEquals("", areaCodeMapForUS.lookup(number));
+    assertNull(areaCodeMapForUS.lookup(number));
   }
 
   public void testLookupNumber_CH() {
     number.setCountryCode(41).setNationalNumber(446681300L);
-    assertEquals("", areaCodeMapForUS.lookup(number));
+    assertNull(areaCodeMapForUS.lookup(number));
   }
 
   public void testLookupNumber_IT() {
@@ -146,7 +146,7 @@
 
     // A mobile number
     number.setNationalNumber(321123456L).setItalianLeadingZero(false);
-    assertEquals("", areaCodeMapForIT.lookup(number));
+    assertNull(areaCodeMapForIT.lookup(number));
 
     // An invalid number (too short)
     number.setNationalNumber(321123L).setItalianLeadingZero(true);
@@ -173,7 +173,7 @@
   public void testReadWriteExternalWithDefaultStrategy() throws IOException {
     AreaCodeMap localAreaCodeMap = new AreaCodeMap();
     localAreaCodeMap.readAreaCodeMap(createDefaultStorageMapCandidate());
-    assertFalse(localAreaCodeMap.getAreaCodeMapStorage().isFlyweight());
+    assertFalse(localAreaCodeMap.getAreaCodeMapStorage() instanceof FlyweightMapStorage);
 
     AreaCodeMap newAreaCodeMap;
     newAreaCodeMap = createNewAreaCodeMap(localAreaCodeMap);
@@ -183,7 +183,7 @@
   public void testReadWriteExternalWithFlyweightStrategy() throws IOException {
     AreaCodeMap localAreaCodeMap = new AreaCodeMap();
     localAreaCodeMap.readAreaCodeMap(createFlyweightStorageMapCandidate());
-    assertTrue(localAreaCodeMap.getAreaCodeMapStorage().isFlyweight());
+    assertTrue(localAreaCodeMap.getAreaCodeMapStorage() instanceof FlyweightMapStorage);
 
     AreaCodeMap newAreaCodeMap;
     newAreaCodeMap = createNewAreaCodeMap(localAreaCodeMap);
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java b/java/test/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java
index d254c6a..4f7b78e 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/FlyweightMapStorageTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.util.Collections;
 import java.util.SortedMap;
 import java.util.TreeMap;
 
@@ -32,37 +33,48 @@
  * @author Philippe Liard
  */
 public class FlyweightMapStorageTest extends TestCase {
-  private final SortedMap<Integer, String> areaCodeMap = new TreeMap<Integer, String>();
+  private static final SortedMap<Integer, String> areaCodeMap;
+  static {
+    SortedMap<Integer, String> tmpMap = new TreeMap<Integer, String>();
+    tmpMap.put(331402, "Paris");
+    tmpMap.put(331434, "Paris");
+    tmpMap.put(334910, "Marseille");
+    tmpMap.put(334911, "Marseille");
+    tmpMap.put(334912, "");
+    tmpMap.put(334913, "");
+    areaCodeMap = Collections.unmodifiableSortedMap(tmpMap);
+  }
 
-  public FlyweightMapStorageTest() {
-    areaCodeMap.put(331402, "Paris");
-    areaCodeMap.put(331434, "Paris");
-    areaCodeMap.put(334910, "Marseille");
-    areaCodeMap.put(334911, "Marseille");
+  private FlyweightMapStorage mapStorage;
+
+  @Override
+  protected void setUp() throws Exception {
+    mapStorage = new FlyweightMapStorage();
+    mapStorage.readFromSortedMap(areaCodeMap);
   }
 
   public void testReadFromSortedMap() {
-    FlyweightMapStorage mapStorage = new FlyweightMapStorage();
-    mapStorage.readFromSortedMap(areaCodeMap);
-
     assertEquals(331402, mapStorage.getPrefix(0));
     assertEquals(331434, mapStorage.getPrefix(1));
     assertEquals(334910, mapStorage.getPrefix(2));
     assertEquals(334911, mapStorage.getPrefix(3));
 
-    String desc = mapStorage.getDescription(0);
-    assertEquals("Paris", desc);
-    assertTrue(desc == mapStorage.getDescription(1));  // Same identity.
+    assertEquals("Paris", mapStorage.getDescription(0));
+    assertSame(mapStorage.getDescription(0), mapStorage.getDescription(1));
 
-    desc = mapStorage.getDescription(2);
-    assertEquals("Marseille", desc);
-    assertTrue(desc == mapStorage.getDescription(3));  // Same identity.
+    assertEquals("Marseille", mapStorage.getDescription(2));
+    assertSame(mapStorage.getDescription(2), mapStorage.getDescription(3));
+  }
+
+  public void testReadFromSortedMapSupportsEmptyDescription() {
+    assertEquals(334912, mapStorage.getPrefix(4));
+    assertEquals(334913, mapStorage.getPrefix(5));
+
+    assertEquals("", mapStorage.getDescription(4));
+    assertSame(mapStorage.getDescription(4), mapStorage.getDescription(5));
   }
 
   public void testWriteAndReadExternal() throws IOException {
-    FlyweightMapStorage mapStorage = new FlyweightMapStorage();
-    mapStorage.readFromSortedMap(areaCodeMap);
-
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
     mapStorage.writeExternal(objectOutputStream);
@@ -74,7 +86,22 @@
     newMapStorage.readExternal(objectInputStream);
 
     String expected = mapStorage.toString();
-    assertFalse(expected.length() == 0);
     assertEquals(expected, newMapStorage.toString());
   }
+
+  public void testReadExternalThrowsIOExceptionWithMalformedData() throws IOException {
+    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+    ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
+    objectOutputStream.writeUTF("hello");
+    objectOutputStream.flush();
+    ObjectInputStream objectInputStream =
+        new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
+    FlyweightMapStorage newMapStorage = new FlyweightMapStorage();
+    try {
+      newMapStorage.readExternal(objectInputStream);
+      fail();
+    } catch (IOException e) {
+      // Exception expected.
+    }
+  }
 }
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/MappingFileProviderTest.java b/java/test/com/android/i18n/phonenumbers/geocoding/MappingFileProviderTest.java
index 95b6184..78e42be 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/MappingFileProviderTest.java
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/MappingFileProviderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java b/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java
index 553d43c..0f5e7da 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoderTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Google Inc.
+ * Copyright (C) 2011 The Libphonenumber Authors
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -47,6 +47,8 @@
       new PhoneNumber().setCountryCode(1).setNationalNumber(6509600000L);
   private static final PhoneNumber US_NUMBER3 =
       new PhoneNumber().setCountryCode(1).setNationalNumber(2128120000L);
+  private static final PhoneNumber US_NUMBER4 =
+      new PhoneNumber().setCountryCode(1).setNationalNumber(6174240000L);
   private static final PhoneNumber US_INVALID_NUMBER =
       new PhoneNumber().setCountryCode(1).setNationalNumber(123456789L);
   private static final PhoneNumber BS_NUMBER1 =
@@ -61,8 +63,6 @@
     // a result, the country name of United States in simplified Chinese is returned.
     assertEquals("\u7F8E\u56FD",
         geocoder.getDescriptionForNumber(US_NUMBER1, Locale.SIMPLIFIED_CHINESE));
-    assertEquals("Stati Uniti",
-        geocoder.getDescriptionForNumber(US_NUMBER1, Locale.ITALIAN));
     assertEquals("Bahamas",
         geocoder.getDescriptionForNumber(BS_NUMBER1, new Locale("en", "US")));
     assertEquals("Australia",
@@ -71,6 +71,13 @@
                                                       new Locale("en", "US")));
   }
 
+  public void testGetDescriptionForNumberWithMissingPrefix() {
+    // Test that the name of the country is returned when the number passed in is valid but not
+    // covered by the geocoding data file.
+    assertEquals("United States",
+        geocoder.getDescriptionForNumber(US_NUMBER4, new Locale("en", "US")));
+  }
+
   public void testGetDescriptionForNumber_en_US() {
     assertEquals("CA",
         geocoder.getDescriptionForNumber(US_NUMBER1, new Locale("en", "US")));
@@ -91,10 +98,44 @@
         geocoder.getDescriptionForNumber(KO_NUMBER1, Locale.KOREAN));
     assertEquals("\uC778\uCC9C",
         geocoder.getDescriptionForNumber(KO_NUMBER2, Locale.KOREAN));
-    assertEquals("\uC81C\uC8FC",
+  }
+
+  public void testGetDescriptionForFallBack() {
+    // No fallback, as the location name for the given phone number is available in the requested
+    // language.
+    assertEquals("Kalifornien",
+        geocoder.getDescriptionForNumber(US_NUMBER1, Locale.GERMAN));
+    // German falls back to English.
+    assertEquals("New York, NY",
+        geocoder.getDescriptionForNumber(US_NUMBER3, Locale.GERMAN));
+    // Italian falls back to English.
+    assertEquals("CA",
+        geocoder.getDescriptionForNumber(US_NUMBER1, Locale.ITALIAN));
+    // Korean doesn't fall back to English.
+    assertEquals("\uB300\uD55C\uBBFC\uAD6D",
         geocoder.getDescriptionForNumber(KO_NUMBER3, Locale.KOREAN));
   }
 
+  public void testGetDescriptionForNumberWithUserRegion() {
+    // User in Italy, American number. We should just show United States, in Spanish, and not more
+    // detailed information.
+    assertEquals("Estados Unidos",
+        geocoder.getDescriptionForNumber(US_NUMBER1, new Locale("es", "ES"), "IT"));
+    // Unknown region - should just show country name.
+    assertEquals("Estados Unidos",
+        geocoder.getDescriptionForNumber(US_NUMBER1, new Locale("es", "ES"), "ZZ"));
+    // User in the States, language German, should show detailed data.
+    assertEquals("Kalifornien",
+        geocoder.getDescriptionForNumber(US_NUMBER1, Locale.GERMAN, "US"));
+    // User in the States, language French, no data for French, so we fallback to English detailed
+    // data.
+    assertEquals("CA",
+        geocoder.getDescriptionForNumber(US_NUMBER1, Locale.FRENCH, "US"));
+    // Invalid number - return an empty string.
+    assertEquals("", geocoder.getDescriptionForNumber(US_INVALID_NUMBER, Locale.ENGLISH,
+                                                      "US"));
+  }
+
   public void testGetDescriptionForInvalidNumber() {
     assertEquals("", geocoder.getDescriptionForNumber(KO_INVALID_NUMBER, Locale.ENGLISH));
     assertEquals("", geocoder.getDescriptionForNumber(US_INVALID_NUMBER, Locale.ENGLISH));
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1201_de b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1201_de
new file mode 100644
index 0000000..2a516e0
--- /dev/null
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1201_de
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1650_de b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1650_de
new file mode 100644
index 0000000..1fa2f0f
--- /dev/null
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/1650_de
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/82_ko b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/82_ko
index cbc3017..dfa91c3 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/82_ko
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/82_ko
Binary files differ
diff --git a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/config b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/config
index 0731ac8..aab8c13 100644
--- a/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/config
+++ b/java/test/com/android/i18n/phonenumbers/geocoding/testing_data/config
Binary files differ