diff --git a/Android.bp b/Android.bp
index 10f8f8b..61f097c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -33,7 +33,7 @@
     ],
 
     libs: [
-        "unsupportedappusage-annotation",
+        "unsupportedappusage",
     ],
 
     sdk_version: "core_current",
diff --git a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java
index 55d41c6..3482960 100644
--- a/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java
+++ b/repackaged/geocoder/src/com/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder.java
@@ -54,7 +54,7 @@
    *
    * @return  a {@link PhoneNumberOfflineGeocoder} instance
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public static synchronized PhoneNumberOfflineGeocoder getInstance() {
     if (instance == null) {
       instance = new PhoneNumberOfflineGeocoder(MAPPING_DATA_DIRECTORY);
@@ -188,7 +188,7 @@
    * @return  a text description for the given language code for the given phone number, or empty
    *     string if the number passed in is invalid or could belong to multiple countries
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public String getDescriptionForNumber(PhoneNumber number, Locale languageCode) {
     PhoneNumberType numberType = phoneUtil.getNumberType(number);
     if (numberType == PhoneNumberType.UNKNOWN) {
diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java
index 0bde5fb..68744b5 100644
--- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java
+++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/AsYouTypeFormatter.java
@@ -255,7 +255,7 @@
   /**
    * Clears the internal state of the formatter, so it can be reused.
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public void clear() {
     currentOutput = "";
     accruedInput.setLength(0);
@@ -288,7 +288,7 @@
    *     be shown as they are.
    * @return  the partially formatted phone number.
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public String inputDigit(char nextChar) {
     currentOutput = inputDigitWithOptionToRememberPosition(nextChar, false);
     return currentOutput;
@@ -300,7 +300,7 @@
    * position will be automatically adjusted if additional formatting characters are later
    * inserted/removed in front of {@code nextChar}.
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public String inputDigitAndRememberPosition(char nextChar) {
     currentOutput = inputDigitWithOptionToRememberPosition(nextChar, true);
     return currentOutput;
@@ -453,7 +453,7 @@
    * Returns the current position in the partially formatted phone number of the character which was
    * previously passed in as the parameter of {@link #inputDigitAndRememberPosition}.
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public int getRememberedPosition() {
     if (!ableToFormat) {
       return originalPosition;
diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/NumberParseException.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/NumberParseException.java
index 71f3d1f..48075f8 100644
--- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/NumberParseException.java
+++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/NumberParseException.java
@@ -68,7 +68,7 @@
   /**
    * Returns the error type of the exception that has been thrown.
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public ErrorType getErrorType() {
     return errorType;
   }
diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java
index ace0a92..5503bd2 100644
--- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java
+++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberMatch.java
@@ -81,25 +81,25 @@
   }
 
   /** Returns the phone number matched by the receiver. */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public PhoneNumber number() {
     return number;
   }
 
   /** Returns the start index of the matched phone number within the searched text. */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public int start() {
     return start;
   }
 
   /** Returns the exclusive end index of the matched phone number within the searched text. */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public int end() {
     return start + rawString.length();
   }
 
   /** Returns the raw string matched as a phone number in the searched text. */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public String rawString() {
     return rawString;
   }
diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java
index e4567dd..a49914a 100644
--- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java
+++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/PhoneNumberUtil.java
@@ -393,15 +393,15 @@
    * use the PhoneNumber class.
    * @hide This class is not part of the Android public SDK API
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage(implicitMember = "values()[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;")
+  @android.compat.annotation.UnsupportedAppUsage(implicitMember = "values()[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;")
   public enum PhoneNumberFormat {
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     E164,
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     INTERNATIONAL,
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     NATIONAL,
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     RFC3966
   }
 
@@ -409,42 +409,42 @@
    * Type of phone numbers.
    * @hide This class is not part of the Android public SDK API
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage(implicitMember = "values()[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;")
+  @android.compat.annotation.UnsupportedAppUsage(implicitMember = "values()[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;")
   public enum PhoneNumberType {
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     FIXED_LINE,
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     MOBILE,
     // In some regions (e.g. the USA), it is impossible to distinguish between fixed-line and
     // mobile numbers by looking at the phone number itself.
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     FIXED_LINE_OR_MOBILE,
     // Freephone lines
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     TOLL_FREE,
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     PREMIUM_RATE,
     // The cost of this call is shared between the caller and the recipient, and is hence typically
     // less than PREMIUM_RATE calls. See // http://en.wikipedia.org/wiki/Shared_Cost_Service for
     // more information.
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     SHARED_COST,
     // Voice over IP numbers. This includes TSoIP (Telephony Service over IP).
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     VOIP,
     // A personal number is associated with a particular person, and may be routed to either a
     // MOBILE or FIXED_LINE number. Some more information can be found here:
     // http://en.wikipedia.org/wiki/Personal_Numbers
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     PERSONAL_NUMBER,
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     PAGER,
     // Used for "Universal Access Numbers" or "Company Numbers". They may be further routed to
     // specific offices, but allow one number to be used for a company.
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     UAN,
     // Used for "Voice Mail Access Numbers".
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     VOICEMAIL,
     // A phone number is of type UNKNOWN when it does not fit any of the known patterns for a
     // specific region.
@@ -455,17 +455,17 @@
    * Types of phone number matches. See detailed description beside the isNumberMatch() method.
    * @hide This class is not part of the Android public SDK API
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage(implicitMember = "values()[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$MatchType;")
+  @android.compat.annotation.UnsupportedAppUsage(implicitMember = "values()[Lcom/android/i18n/phonenumbers/PhoneNumberUtil$MatchType;")
   public enum MatchType {
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     NOT_A_NUMBER,
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     NO_MATCH,
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     SHORT_NSN_MATCH,
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     NSN_MATCH,
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     EXACT_MATCH,
   }
 
@@ -475,7 +475,7 @@
    */
   public enum ValidationResult {
     /** The number length matches that of valid numbers for this region. */
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     IS_POSSIBLE,
     /**
      * The number length matches that of local numbers for this region only (i.e. numbers that may
@@ -496,7 +496,7 @@
      */
     INVALID_LENGTH,
     /** The number is longer than all valid numbers for this region. */
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     TOO_LONG,
   }
 
@@ -510,7 +510,7 @@
      * Phone numbers accepted are {@linkplain PhoneNumberUtil#isPossibleNumber(PhoneNumber)
      * possible}, but not necessarily {@linkplain PhoneNumberUtil#isValidNumber(PhoneNumber) valid}.
      */
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     POSSIBLE {
       @Override
       boolean verify(
@@ -1128,7 +1128,7 @@
    *
    * @return a PhoneNumberUtil instance
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public static synchronized PhoneNumberUtil getInstance() {
     if (instance == null) {
       setInstance(createInstance(MetadataManager.DEFAULT_METADATA_LOADER));
@@ -1232,7 +1232,7 @@
    * @param numberFormat  the format the phone number should be formatted into
    * @return  the formatted phone number
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public String format(PhoneNumber number, PhoneNumberFormat numberFormat) {
     if (number.getNationalNumber() == 0 && number.hasRawInput()) {
       // Unparseable numbers that kept their raw input just use that.
@@ -1604,7 +1604,7 @@
    *     has one
    * @return  the formatted phone number in its original number format
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public String formatInOriginalFormat(PhoneNumber number, String regionCallingFrom) {
     if (number.hasRawInput() && !hasFormattingPatternForNumber(number)) {
       // We check if we have the formatting pattern because without that, we might format the number
@@ -1856,7 +1856,7 @@
    * @param number  the phone number for which the national significant number is needed
    * @return  the national significant number of the PhoneNumber object passed in
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public String getNationalSignificantNumber(PhoneNumber number) {
     // If leading zero(s) have been set, we prefix this now. Note this is not a national prefix.
     StringBuilder nationalNumber = new StringBuilder();
@@ -2200,7 +2200,7 @@
    * @param number  the phone number that we want to know the type
    * @return  the type of the phone number, or UNKNOWN if it is invalid
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public PhoneNumberType getNumberType(PhoneNumber number) {
     String regionCode = getRegionCodeForNumber(number);
     PhoneMetadata metadata = getMetadataForRegionOrCallingCode(number.getCountryCode(), regionCode);
@@ -2300,7 +2300,7 @@
    * @param number  the phone number that we want to validate
    * @return  a boolean that indicates whether the number is of a valid pattern
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public boolean isValidNumber(PhoneNumber number) {
     String regionCode = getRegionCodeForNumber(number);
     return isValidNumberForRegion(number, regionCode);
@@ -2345,7 +2345,7 @@
    * @return  the region where the phone number is from, or null if no region matches this calling
    *     code
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public String getRegionCodeForNumber(PhoneNumber number) {
     int countryCode = number.getCountryCode();
     List<String> regions = countryCallingCodeToRegionCodeMap.get(countryCode);
@@ -2410,7 +2410,7 @@
    * @param regionCode  the region that we want to get the country calling code for
    * @return  the country calling code for the region denoted by regionCode
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public int getCountryCodeForRegion(String regionCode) {
     if (!isValidRegionCode(regionCode)) {
       logger.log(Level.WARNING,
@@ -2514,7 +2514,7 @@
    * @param number  the number that needs to be checked
    * @return  true if the number is possible
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public boolean isPossibleNumber(PhoneNumber number) {
     ValidationResult result = isPossibleNumberWithReason(number);
     return result == ValidationResult.IS_POSSIBLE
@@ -2643,7 +2643,7 @@
    * @param number  the number that needs to be checked
    * @return  a ValidationResult object which indicates whether the number is possible
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public ValidationResult isPossibleNumberWithReason(PhoneNumber number) {
     return isPossibleNumberForTypeWithReason(number, PhoneNumberType.UNKNOWN);
   }
@@ -2753,7 +2753,7 @@
    * @return  an {@link com.android.i18n.phonenumbers.AsYouTypeFormatter} object, which can be used
    *     to format phone numbers in the specific region "as you type"
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public AsYouTypeFormatter getAsYouTypeFormatter(String regionCode) {
     return new AsYouTypeFormatter(regionCode);
   }
@@ -3149,7 +3149,7 @@
    *     This is to cover degenerate cases where the text has a lot of false positives in it. Must
    *     be {@code >= 0}.
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public Iterable<PhoneNumberMatch> findNumbers(
       final CharSequence text, final String defaultRegion, final Leniency leniency,
       final long maxTries) {
@@ -3396,7 +3396,7 @@
    * @return  NO_MATCH, SHORT_NSN_MATCH, NSN_MATCH or EXACT_MATCH depending on the level of equality
    *     of the two numbers, described in the method definition.
    */
-  @dalvik.annotation.compat.UnsupportedAppUsage
+  @android.compat.annotation.UnsupportedAppUsage
   public MatchType isNumberMatch(PhoneNumber firstNumberIn, PhoneNumber secondNumberIn) {
     // We only care about the fields that uniquely define a number, so we copy these across
     // explicitly.
diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/Phonemetadata.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/Phonemetadata.java
index 145af6f..3527ae1 100644
--- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/Phonemetadata.java
+++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/Phonemetadata.java
@@ -87,7 +87,7 @@
     private boolean hasPattern;
     private String pattern_ = "";
     public boolean hasPattern() { return hasPattern; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public String getPattern() { return pattern_; }
     public NumberFormat setPattern(String value) {
       hasPattern = true;
@@ -99,7 +99,7 @@
     private boolean hasFormat;
     private String format_ = "";
     public boolean hasFormat() { return hasFormat; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public String getFormat() { return format_; }
     public NumberFormat setFormat(String value) {
       hasFormat = true;
@@ -112,9 +112,9 @@
     public java.util.List<String> leadingDigitPatterns() {
       return leadingDigitsPattern_;
     }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public int leadingDigitsPatternSize() { return leadingDigitsPattern_.size(); }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public String getLeadingDigitsPattern(int index) {
       return leadingDigitsPattern_.get(index);
     }
@@ -130,7 +130,7 @@
     private boolean hasNationalPrefixFormattingRule;
     private String nationalPrefixFormattingRule_ = "";
     public boolean hasNationalPrefixFormattingRule() { return hasNationalPrefixFormattingRule; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public String getNationalPrefixFormattingRule() { return nationalPrefixFormattingRule_; }
     public NumberFormat setNationalPrefixFormattingRule(String value) {
       hasNationalPrefixFormattingRule = true;
@@ -161,7 +161,7 @@
     private String domesticCarrierCodeFormattingRule_ = "";
     public boolean hasDomesticCarrierCodeFormattingRule() {
       return hasDomesticCarrierCodeFormattingRule; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public String getDomesticCarrierCodeFormattingRule() {
       return domesticCarrierCodeFormattingRule_; }
     public NumberFormat setDomesticCarrierCodeFormattingRule(String value) {
@@ -250,7 +250,7 @@
     private boolean hasNationalNumberPattern;
     private String nationalNumberPattern_ = "";
     public boolean hasNationalNumberPattern() { return hasNationalNumberPattern; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public String getNationalNumberPattern() { return nationalNumberPattern_; }
     public PhoneNumberDesc setNationalNumberPattern(String value) {
       hasNationalNumberPattern = true;
@@ -393,7 +393,7 @@
     private boolean hasGeneralDesc;
     private PhoneNumberDesc generalDesc_ = null;
     public boolean hasGeneralDesc() { return hasGeneralDesc; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public PhoneNumberDesc getGeneralDesc() { return generalDesc_; }
     public PhoneMetadata setGeneralDesc(PhoneNumberDesc value) {
       if (value == null) {
@@ -643,7 +643,7 @@
     private boolean hasCountryCode;
     private int countryCode_ = 0;
     public boolean hasCountryCode() { return hasCountryCode; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public int getCountryCode() { return countryCode_; }
     public PhoneMetadata setCountryCode(int value) {
       hasCountryCode = true;
@@ -681,7 +681,7 @@
     // optional string national_prefix = 12;
     private boolean hasNationalPrefix;
     private String nationalPrefix_ = "";
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public boolean hasNationalPrefix() { return hasNationalPrefix; }
     public String getNationalPrefix() { return nationalPrefix_; }
     public PhoneMetadata setNationalPrefix(String value) {
@@ -698,9 +698,9 @@
     // optional string preferred_extn_prefix = 13;
     private boolean hasPreferredExtnPrefix;
     private String preferredExtnPrefix_ = "";
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public boolean hasPreferredExtnPrefix() { return hasPreferredExtnPrefix; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public String getPreferredExtnPrefix() { return preferredExtnPrefix_; }
     public PhoneMetadata setPreferredExtnPrefix(String value) {
       hasPreferredExtnPrefix = true;
@@ -717,7 +717,7 @@
     private boolean hasNationalPrefixForParsing;
     private String nationalPrefixForParsing_ = "";
     public boolean hasNationalPrefixForParsing() { return hasNationalPrefixForParsing; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public String getNationalPrefixForParsing() { return nationalPrefixForParsing_; }
     public PhoneMetadata setNationalPrefixForParsing(String value) {
       hasNationalPrefixForParsing = true;
@@ -729,7 +729,7 @@
     private boolean hasNationalPrefixTransformRule;
     private String nationalPrefixTransformRule_ = "";
     public boolean hasNationalPrefixTransformRule() { return hasNationalPrefixTransformRule; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public String getNationalPrefixTransformRule() { return nationalPrefixTransformRule_; }
     public PhoneMetadata setNationalPrefixTransformRule(String value) {
       hasNationalPrefixTransformRule = true;
@@ -760,7 +760,7 @@
 
     // repeated NumberFormat number_format = 19;
     private java.util.List<NumberFormat> numberFormat_ = new java.util.ArrayList<NumberFormat>();
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public java.util.List<NumberFormat> numberFormats() {
       return numberFormat_;
     }
@@ -779,7 +779,7 @@
     // repeated NumberFormat intl_number_format = 20;
     private java.util.List<NumberFormat> intlNumberFormat_ =
         new java.util.ArrayList<NumberFormat>();
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public java.util.List<NumberFormat> intlNumberFormats() {
       return intlNumberFormat_;
     }
@@ -1154,7 +1154,7 @@
    */
   public static class PhoneMetadataCollection implements Externalizable {
     private static final long serialVersionUID = 1;
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public PhoneMetadataCollection() {}
 
     /**
@@ -1175,7 +1175,7 @@
     // repeated PhoneMetadata metadata = 1;
     private java.util.List<PhoneMetadata> metadata_ = new java.util.ArrayList<PhoneMetadata>();
 
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public java.util.List<PhoneMetadata> getMetadataList() {
       return metadata_;
     }
diff --git a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/Phonenumber.java b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/Phonenumber.java
index fca9467..ccd46a0 100644
--- a/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/Phonenumber.java
+++ b/repackaged/libphonenumber/src/com/android/i18n/phonenumbers/Phonenumber.java
@@ -38,15 +38,15 @@
     /**
      * @hide This class is not part of the Android public SDK API
      */
-    @dalvik.annotation.compat.UnsupportedAppUsage(implicitMember = "values()[Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;")
+    @android.compat.annotation.UnsupportedAppUsage(implicitMember = "values()[Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;")
     public enum CountryCodeSource {
-      @dalvik.annotation.compat.UnsupportedAppUsage
+      @android.compat.annotation.UnsupportedAppUsage
       FROM_NUMBER_WITH_PLUS_SIGN,
-      @dalvik.annotation.compat.UnsupportedAppUsage
+      @android.compat.annotation.UnsupportedAppUsage
       FROM_NUMBER_WITH_IDD,
-      @dalvik.annotation.compat.UnsupportedAppUsage
+      @android.compat.annotation.UnsupportedAppUsage
       FROM_NUMBER_WITHOUT_PLUS_SIGN,
-      @dalvik.annotation.compat.UnsupportedAppUsage
+      @android.compat.annotation.UnsupportedAppUsage
       FROM_DEFAULT_COUNTRY,
       UNSPECIFIED
     }
@@ -58,16 +58,16 @@
     // required int32 country_code = 1;
     private boolean hasCountryCode;
     private int countryCode_ = 0;
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public boolean hasCountryCode() { return hasCountryCode; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public int getCountryCode() { return countryCode_; }
     public PhoneNumber setCountryCode(int value) {
       hasCountryCode = true;
       countryCode_ = value;
       return this;
     }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public PhoneNumber clearCountryCode() {
       hasCountryCode = false;
       countryCode_ = 0;
@@ -78,7 +78,7 @@
     private boolean hasNationalNumber;
     private long nationalNumber_ = 0L;
     public boolean hasNationalNumber() { return hasNationalNumber; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public long getNationalNumber() { return nationalNumber_; }
     public PhoneNumber setNationalNumber(long value) {
       hasNationalNumber = true;
@@ -94,9 +94,9 @@
     // optional string extension = 3;
     private boolean hasExtension;
     private java.lang.String extension_ = "";
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public boolean hasExtension() { return hasExtension; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public String getExtension() { return extension_; }
     public PhoneNumber setExtension(String value) {
       if (value == null) {
@@ -167,7 +167,7 @@
     private boolean hasCountryCodeSource;
     private CountryCodeSource countryCodeSource_;
     public boolean hasCountryCodeSource() { return hasCountryCodeSource; }
-    @dalvik.annotation.compat.UnsupportedAppUsage
+    @android.compat.annotation.UnsupportedAppUsage
     public CountryCodeSource getCountryCodeSource() { return countryCodeSource_; }
     public PhoneNumber setCountryCodeSource(CountryCodeSource value) {
       if (value == null) {
