diff --git a/luni/src/main/java/java/util/jar/StrictJarFile.java b/luni/src/main/java/java/util/jar/StrictJarFile.java
index 0a8eaa2..a73ca2a 100644
--- a/luni/src/main/java/java/util/jar/StrictJarFile.java
+++ b/luni/src/main/java/java/util/jar/StrictJarFile.java
@@ -24,6 +24,7 @@
 import java.security.cert.Certificate;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Set;
 import java.util.zip.Inflater;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
@@ -64,6 +65,12 @@
             HashMap<String, byte[]> metaEntries = getMetaEntries();
             this.manifest = new Manifest(metaEntries.get(JarFile.MANIFEST_NAME), true);
             this.verifier = new JarVerifier(fileName, manifest, metaEntries);
+            Set<String> files = this.manifest.getEntries().keySet();
+            for (String file : files) {
+                if (findEntry(file) == null) {
+                    throw new SecurityException(fileName + ": File " + file + " in manifest does not exist");
+                }
+            }
 
             isSigned = verifier.readCertificates() && verifier.isSignedJar();
         } catch (IOException | SecurityException e) {
diff --git a/luni/src/main/java/libcore/icu/DateIntervalFormat.java b/luni/src/main/java/libcore/icu/DateIntervalFormat.java
index fbef89a..96d2ca7 100644
--- a/luni/src/main/java/libcore/icu/DateIntervalFormat.java
+++ b/luni/src/main/java/libcore/icu/DateIntervalFormat.java
@@ -16,13 +16,14 @@
 
 package libcore.icu;
 
+import java.text.FieldPosition;
 import java.util.Calendar;
 import java.util.Locale;
 import java.util.TimeZone;
 import libcore.util.BasicLruCache;
 
 /**
- * Exposes icu4c's DateIntervalFormat.
+ * Exposes icu4j's DateIntervalFormat.
  */
 public final class DateIntervalFormat {
 
@@ -49,15 +50,11 @@
 
   private static final FormatterCache CACHED_FORMATTERS = new FormatterCache();
 
-  static class FormatterCache extends BasicLruCache<String, Long> {
+  static class FormatterCache extends BasicLruCache<String, com.ibm.icu.text.DateIntervalFormat> {
     FormatterCache() {
       super(8);
     }
-
-    protected void entryEvicted(String key, Long value) {
-      destroyDateIntervalFormat(value);
-    }
-  };
+  }
 
   private DateIntervalFormat() {
   }
@@ -73,7 +70,8 @@
 
   // This is our slightly more sensible internal API. (A truly sane replacement would take a
   // skeleton instead of int flags.)
-  public static String formatDateRange(Locale locale, TimeZone tz, long startMs, long endMs, int flags) {
+  public static String formatDateRange(Locale locale, TimeZone tz, long startMs, long endMs,
+      int flags) {
     Calendar startCalendar = Calendar.getInstance(tz);
     startCalendar.setTimeInMillis(startMs);
 
@@ -89,7 +87,7 @@
 
     // If we're not showing the time or the start and end times are on the same day, and the
     // end time is midnight, fudge the end date so we don't count the day that's about to start.
-    // This is not the behavior of icu4c's DateIntervalFormat, but it's the historical behavior
+    // This is not the behavior of icu4j's DateIntervalFormat, but it's the historical behavior
     // of Android's DateUtils.formatDateRange.
     if (startMs != endMs && endsAtMidnight &&
         ((flags & FORMAT_SHOW_TIME) == 0 || dayDistance(startCalendar, endCalendar) <= 1)) {
@@ -99,19 +97,24 @@
 
     String skeleton = toSkeleton(startCalendar, endCalendar, flags);
     synchronized (CACHED_FORMATTERS) {
-      return formatDateInterval(getFormatter(skeleton, locale.toString(), tz.getID()), startMs, endMs);
+      com.ibm.icu.text.DateIntervalFormat formatter = getFormatter(skeleton, locale, tz);
+      com.ibm.icu.util.Calendar scal = icuCalendar(startCalendar);
+      com.ibm.icu.util.Calendar ecal = icuCalendar(endCalendar);
+      return formatter.format(scal, ecal, new StringBuffer(), new FieldPosition(0)).toString();
     }
   }
 
-  private static long getFormatter(String skeleton, String localeName, String tzName) {
-    String key = skeleton + "\t" + localeName + "\t" + tzName;
-    Long formatter = CACHED_FORMATTERS.get(key);
+  private static com.ibm.icu.text.DateIntervalFormat getFormatter(String skeleton, Locale locale,
+      TimeZone tz) {
+    String key = skeleton + "\t" + locale + "\t" + tz;
+    com.ibm.icu.text.DateIntervalFormat formatter = CACHED_FORMATTERS.get(key);
     if (formatter != null) {
       return formatter;
     }
-    long address = createDateIntervalFormat(skeleton, localeName, tzName);
-    CACHED_FORMATTERS.put(key, address);
-    return address;
+    formatter = com.ibm.icu.text.DateIntervalFormat.getInstance(skeleton, locale);
+    formatter.setTimeZone(icuTimeZone(tz));
+    CACHED_FORMATTERS.put(key, formatter);
+    return formatter;
   }
 
   private static String toSkeleton(Calendar startCalendar, Calendar endCalendar, int flags) {
@@ -243,7 +246,16 @@
     return (int) (utcMs / DAY_IN_MS) + EPOCH_JULIAN_DAY;
   }
 
-  private static native long createDateIntervalFormat(String skeleton, String localeName, String tzName);
-  private static native void destroyDateIntervalFormat(long address);
-  private static native String formatDateInterval(long address, long fromDate, long toDate);
+  private static com.ibm.icu.util.TimeZone icuTimeZone(TimeZone tz) {
+    final int timezoneType = com.ibm.icu.util.TimeZone.TIMEZONE_JDK;
+    return com.ibm.icu.util.TimeZone.getTimeZone(tz.getID(), timezoneType);
+  }
+
+  private static com.ibm.icu.util.Calendar icuCalendar(Calendar cal) {
+    com.ibm.icu.util.TimeZone timeZone = icuTimeZone(cal.getTimeZone());
+    com.ibm.icu.util.Calendar result = com.ibm.icu.util.Calendar.getInstance(timeZone);
+    result.setTime(cal.getTime());
+    return result;
+  }
+
 }
diff --git a/luni/src/main/java/libcore/icu/RelativeDateTimeFormatter.java b/luni/src/main/java/libcore/icu/RelativeDateTimeFormatter.java
index e861571..750df00 100644
--- a/luni/src/main/java/libcore/icu/RelativeDateTimeFormatter.java
+++ b/luni/src/main/java/libcore/icu/RelativeDateTimeFormatter.java
@@ -22,9 +22,11 @@
 import java.util.TimeZone;
 import libcore.util.BasicLruCache;
 import libcore.icu.DateIntervalFormat;
+import com.ibm.icu.text.DisplayContext;
+import com.ibm.icu.util.ULocale;
 
 /**
- * Exposes icu4c's RelativeDateTimeFormatter.
+ * Exposes icu4j's RelativeDateTimeFormatter.
  */
 public final class RelativeDateTimeFormatter {
 
@@ -48,48 +50,13 @@
   // constant comes from public API in DateUtils, it cannot be fixed here.
   public static final long YEAR_IN_MILLIS = WEEK_IN_MILLIS * 52;
 
-  // Values from icu4c UDateRelativeUnit enum in unicode/reldatefmt.h.
-  // The following U* constants must agree with the ones in icu4c.
-  private static final int UDAT_RELATIVE_SECONDS = 0;
-  private static final int UDAT_RELATIVE_MINUTES = 1;
-  private static final int UDAT_RELATIVE_HOURS = 2;
-  private static final int UDAT_RELATIVE_DAYS = 3;
-  private static final int UDAT_RELATIVE_WEEKS = 4;
-  private static final int UDAT_RELATIVE_MONTHS = 5;
-  private static final int UDAT_RELATIVE_YEARS = 6;
-
-  // Values from icu4c UDateAbsoluteUnit enum in unicode/reldatefmt.h.
-  private static final int UDAT_ABSOLUTE_DAY = 7;
-
-  // Values from icu4c UDisplayContext enum in unicode/udisplaycontext.h.
-  private static final int UDISPCTX_CAPITALIZATION_NONE = 1 << 8;
-  private static final int UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE = (1 << 8) + 2;
-
-  // Values from icu4c UDateDirection enum in unicode/reldatefmt.h.
-  private static final int UDAT_DIRECTION_LAST_2 = 0;
-  private static final int UDAT_DIRECTION_LAST = 1;
-  private static final int UDAT_DIRECTION_THIS = 2;
-  private static final int UDAT_DIRECTION_NEXT = 3;
-  private static final int UDAT_DIRECTION_NEXT_2 = 4;
-  private static final int UDAT_DIRECTION_PLAIN = 5;
-
-  // Values from icu4c UDateRelativeDateTimeFormatterStyle enum in
-  // unicode/reldatefmt.h.
-  private static final int UDAT_STYLE_LONG = 0;
-  private static final int UDAT_STYLE_SHORT = 1;
-  private static final int UDAT_STYLE_NARROW = 2;
-
   private static final FormatterCache CACHED_FORMATTERS = new FormatterCache();
-  private static final int EPOCH_JULIAN_DAY = 2440588;
 
-  static class FormatterCache extends BasicLruCache<String, Long> {
+  static class FormatterCache
+      extends BasicLruCache<String, com.ibm.icu.text.RelativeDateTimeFormatter> {
     FormatterCache() {
       super(8);
     }
-
-    protected void entryEvicted(String key, Long value) {
-      destroyRelativeDateTimeFormatter(value);
-    }
   };
 
   private RelativeDateTimeFormatter() {
@@ -107,7 +74,7 @@
    * Callers may also specify the desired minimum resolution to show in the
    * result. For example, '45 minutes ago' will become '0 hours ago' when
    * minResolution is HOUR_IN_MILLIS. Once getting the quantity and unit to
-   * display, it calls icu4c's RelativeDateTimeFormatter to format the actual
+   * display, it calls icu4j's RelativeDateTimeFormatter to format the actual
    * string according to the given locale.
    *
    * Note that when minResolution is set to DAY_IN_MILLIS, it returns the
@@ -133,12 +100,11 @@
     long duration = Math.abs(now - time);
     boolean past = (now >= time);
 
-    // Use UDAT_STYLE_SHORT or UDAT_STYLE_LONG.
-    int style;
+    com.ibm.icu.text.RelativeDateTimeFormatter.Style style;
     if ((flags & (FORMAT_ABBREV_RELATIVE | FORMAT_ABBREV_ALL)) != 0) {
-        style = UDAT_STYLE_SHORT;
+        style = com.ibm.icu.text.RelativeDateTimeFormatter.Style.SHORT;
     } else {
-        style = UDAT_STYLE_LONG;
+        style = com.ibm.icu.text.RelativeDateTimeFormatter.Style.LONG;
     }
 
     // We are currently using the _NONE and _FOR_BEGINNING_OF_SENTENCE for the
@@ -146,14 +112,13 @@
     // to capitalize the first letter of strings that don't contain
     // quantities, such as "Yesterday", "Today" and etc. This is for backward
     // compatibility (see b/14493853).
-    int capitalizationContext = UDISPCTX_CAPITALIZATION_NONE;
+    DisplayContext capitalizationContext = DisplayContext.CAPITALIZATION_NONE;
 
-    // Use UDAT_DIRECTION_LAST or UDAT_DIRECTION_NEXT.
-    int direction;
+    com.ibm.icu.text.RelativeDateTimeFormatter.Direction direction;
     if (past) {
-        direction = UDAT_DIRECTION_LAST;
+        direction = com.ibm.icu.text.RelativeDateTimeFormatter.Direction.LAST;
     } else {
-        direction = UDAT_DIRECTION_NEXT;
+        direction = com.ibm.icu.text.RelativeDateTimeFormatter.Direction.NEXT;
     }
 
     // 'relative' defaults to true as we are generating relative time span
@@ -161,65 +126,68 @@
     // a quantity, such as 'Yesterday', etc.
     boolean relative = true;
     int count;
-    int unit;
+    com.ibm.icu.text.RelativeDateTimeFormatter.RelativeUnit unit;
+    com.ibm.icu.text.RelativeDateTimeFormatter.AbsoluteUnit aunit = null;
 
     if (duration < MINUTE_IN_MILLIS && minResolution < MINUTE_IN_MILLIS) {
       count = (int)(duration / SECOND_IN_MILLIS);
-      unit = UDAT_RELATIVE_SECONDS;
+      unit = com.ibm.icu.text.RelativeDateTimeFormatter.RelativeUnit.SECONDS;
     } else if (duration < HOUR_IN_MILLIS && minResolution < HOUR_IN_MILLIS) {
       count = (int)(duration / MINUTE_IN_MILLIS);
-      unit = UDAT_RELATIVE_MINUTES;
+      unit = com.ibm.icu.text.RelativeDateTimeFormatter.RelativeUnit.MINUTES;
     } else if (duration < DAY_IN_MILLIS && minResolution < DAY_IN_MILLIS) {
       // Even if 'time' actually happened yesterday, we don't format it as
       // "Yesterday" in this case. Unless the duration is longer than a day,
       // or minResolution is specified as DAY_IN_MILLIS by user.
       count = (int)(duration / HOUR_IN_MILLIS);
-      unit = UDAT_RELATIVE_HOURS;
+      unit = com.ibm.icu.text.RelativeDateTimeFormatter.RelativeUnit.HOURS;
     } else if (duration < WEEK_IN_MILLIS && minResolution < WEEK_IN_MILLIS) {
       count = Math.abs(DateIntervalFormat.dayDistance(tz, time, now));
-      unit = UDAT_RELATIVE_DAYS;
+      unit = com.ibm.icu.text.RelativeDateTimeFormatter.RelativeUnit.DAYS;
 
       if (count == 2) {
         // Some locales have special terms for "2 days ago". Return them if
         // available. Note that we cannot set up direction and unit here and
         // make it fall through to use the call near the end of the function,
         // because for locales that don't have special terms for "2 days ago",
-        // icu4c returns an empty string instead of falling back to strings
+        // icu4j returns an empty string instead of falling back to strings
         // like "2 days ago".
-        capitalizationContext = UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE;
+        capitalizationContext = DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE;
         String str;
         if (past) {
           synchronized (CACHED_FORMATTERS) {
-            str = formatWithAbsoluteUnit(getFormatter(locale.toString(), style,
-                                                      capitalizationContext),
-                                         UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY);
+            str = getFormatter(locale.toString(), style, capitalizationContext)
+                .format(
+                    com.ibm.icu.text.RelativeDateTimeFormatter.Direction.LAST_2,
+                    com.ibm.icu.text.RelativeDateTimeFormatter.AbsoluteUnit.DAY);
           }
         } else {
           synchronized (CACHED_FORMATTERS) {
-            str = formatWithAbsoluteUnit(getFormatter(locale.toString(), style,
-                                                      capitalizationContext),
-                                         UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY);
+            str = getFormatter(locale.toString(), style, capitalizationContext)
+                .format(
+                    com.ibm.icu.text.RelativeDateTimeFormatter.Direction.NEXT_2,
+                    com.ibm.icu.text.RelativeDateTimeFormatter.AbsoluteUnit.DAY);
           }
         }
-        if (!str.isEmpty()) {
+        if (str != null && !str.isEmpty()) {
           return str;
         }
         // Fall back to show something like "2 days ago". Reset the
         // capitalization setting.
-        capitalizationContext = UDISPCTX_CAPITALIZATION_NONE;
+        capitalizationContext = DisplayContext.CAPITALIZATION_NONE;
       } else if (count == 1) {
         // Show "Yesterday / Tomorrow" instead of "1 day ago / in 1 day".
-        unit = UDAT_ABSOLUTE_DAY;
+        aunit = com.ibm.icu.text.RelativeDateTimeFormatter.AbsoluteUnit.DAY;
         relative = false;
       } else if (count == 0) {
         // Show "Today" if time and now are on the same day.
-        unit = UDAT_ABSOLUTE_DAY;
-        direction = UDAT_DIRECTION_THIS;
+        aunit = com.ibm.icu.text.RelativeDateTimeFormatter.AbsoluteUnit.DAY;
+        direction = com.ibm.icu.text.RelativeDateTimeFormatter.Direction.THIS;
         relative = false;
       }
     } else if (minResolution == WEEK_IN_MILLIS) {
       count = (int)(duration / WEEK_IN_MILLIS);
-      unit = UDAT_RELATIVE_WEEKS;
+      unit = com.ibm.icu.text.RelativeDateTimeFormatter.RelativeUnit.WEEKS;
     } else {
       // The duration is longer than a week and minResolution is not
       // WEEK_IN_MILLIS. Return the absolute date instead of relative time.
@@ -249,16 +217,14 @@
 
     if (relative) {
       synchronized (CACHED_FORMATTERS) {
-        return formatWithRelativeUnit(getFormatter(locale.toString(), style,
-                                                   capitalizationContext),
-                                      count, direction, unit);
+        return getFormatter(locale.toString(), style, capitalizationContext)
+            .format(count, direction, unit);
       }
     } else {
-      capitalizationContext = UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE;
+      capitalizationContext = DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE;
       synchronized (CACHED_FORMATTERS) {
-        return formatWithAbsoluteUnit(getFormatter(locale.toString(), style,
-                                                   capitalizationContext),
-                                      direction, unit);
+        return getFormatter(locale.toString(), style, capitalizationContext)
+            .format(direction, aunit);
       }
     }
   }
@@ -277,7 +243,7 @@
    * clause. When the elapsed time is less than the transition resolution, it
    * displays the relative time string. Otherwise, it gives the absolute
    * numeric date string as the date clause. With the date and time clauses, it
-   * relies on icu4c's RelativeDateTimeFormatter::combineDateAndTime() to
+   * relies on icu4j's RelativeDateTimeFormatter::combineDateAndTime() to
    * concatenate the two.
    *
    * It takes two additional parameters of Locale and TimeZone than the
@@ -311,17 +277,16 @@
     if (transitionResolution > WEEK_IN_MILLIS) {
         transitionResolution = WEEK_IN_MILLIS;
     }
-    // Use UDAT_STYLE_SHORT or UDAT_STYLE_LONG.
-    int style;
+    com.ibm.icu.text.RelativeDateTimeFormatter.Style style;
     if ((flags & (FORMAT_ABBREV_RELATIVE | FORMAT_ABBREV_ALL)) != 0) {
-        style = UDAT_STYLE_SHORT;
+        style = com.ibm.icu.text.RelativeDateTimeFormatter.Style.SHORT;
     } else {
-        style = UDAT_STYLE_LONG;
+        style = com.ibm.icu.text.RelativeDateTimeFormatter.Style.LONG;
     }
 
-    // icu4c also has other options available to control the capitalization. We
+    // icu4j also has other options available to control the capitalization. We
     // are currently using the _NONE option only.
-    int capitalizationContext = UDISPCTX_CAPITALIZATION_NONE;
+    DisplayContext capitalizationContext = DisplayContext.CAPITALIZATION_NONE;
 
     Calendar timeCalendar = new GregorianCalendar(false);
     timeCalendar.setTimeZone(tz);
@@ -358,8 +323,8 @@
 
     // Combine the two clauses, such as '5 days ago, 10:50 AM'.
     synchronized (CACHED_FORMATTERS) {
-      return combineDateAndTime(getFormatter(locale.toString(), style, capitalizationContext),
-                                dateClause, timeClause);
+      return getFormatter(locale.toString(), style, capitalizationContext)
+              .combineDateAndTime(dateClause, timeClause);
     }
   }
 
@@ -371,19 +336,16 @@
    * getFormatter() may have been evicted by the time of the call to
    * formatter->action().
    */
-  private static long getFormatter(String localeName, int style, int capitalizationContext) {
+  private static com.ibm.icu.text.RelativeDateTimeFormatter getFormatter(
+      String localeName, com.ibm.icu.text.RelativeDateTimeFormatter.Style style,
+      DisplayContext capitalizationContext) {
     String key = localeName + "\t" + style + "\t" + capitalizationContext;
-    Long formatter = CACHED_FORMATTERS.get(key);
+    com.ibm.icu.text.RelativeDateTimeFormatter formatter = CACHED_FORMATTERS.get(key);
     if (formatter == null) {
-      formatter = createRelativeDateTimeFormatter(localeName, style, capitalizationContext);
+      formatter = com.ibm.icu.text.RelativeDateTimeFormatter.getInstance(
+          new ULocale(localeName), null, style, capitalizationContext);
       CACHED_FORMATTERS.put(key, formatter);
     }
     return formatter;
   }
-
-  private static native long createRelativeDateTimeFormatter(String localeName, int style, int capitalizationContext);
-  private static native void destroyRelativeDateTimeFormatter(long address);
-  private static native String formatWithRelativeUnit(long address, int quantity, int direction, int unit);
-  private static native String formatWithAbsoluteUnit(long address, int direction, int unit);
-  private static native String combineDateAndTime(long address, String relativeDateString, String timeString);
 }
diff --git a/luni/src/main/native/Register.cpp b/luni/src/main/native/Register.cpp
index fdc4027..035b1d9 100644
--- a/luni/src/main/native/Register.cpp
+++ b/luni/src/main/native/Register.cpp
@@ -58,7 +58,6 @@
     REGISTER(register_java_util_zip_Deflater);
     REGISTER(register_java_util_zip_Inflater);
     REGISTER(register_libcore_icu_AlphabeticIndex);
-    REGISTER(register_libcore_icu_DateIntervalFormat);
     REGISTER(register_libcore_icu_ICU);
     REGISTER(register_libcore_icu_NativeCollation);
     REGISTER(register_libcore_icu_NativeConverter);
@@ -66,7 +65,6 @@
     REGISTER(register_libcore_icu_NativeIDN);
     REGISTER(register_libcore_icu_NativeNormalizer);
     REGISTER(register_libcore_icu_NativePluralRules);
-    REGISTER(register_libcore_icu_RelativeDateTimeFormatter);
     REGISTER(register_libcore_icu_TimeZoneNames);
     REGISTER(register_libcore_icu_Transliterator);
     REGISTER(register_libcore_io_AsynchronousCloseMonitor);
diff --git a/luni/src/main/native/libcore_icu_DateIntervalFormat.cpp b/luni/src/main/native/libcore_icu_DateIntervalFormat.cpp
deleted file mode 100644
index f369a09..0000000
--- a/luni/src/main/native/libcore_icu_DateIntervalFormat.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * 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.
- */
-
-#define LOG_TAG "DateIntervalFormat"
-
-#include "IcuUtilities.h"
-#include "JniConstants.h"
-#include "ScopedIcuLocale.h"
-#include "ScopedJavaUnicodeString.h"
-#include "cutils/log.h"
-#include "unicode/dtitvfmt.h"
-
-static jlong DateIntervalFormat_createDateIntervalFormat(JNIEnv* env, jclass, jstring javaSkeleton, jstring javaLocaleName, jstring javaTzName) {
-  ScopedIcuLocale icuLocale(env, javaLocaleName);
-  if (!icuLocale.valid()) {
-    return 0;
-  }
-
-  ScopedJavaUnicodeString skeletonHolder(env, javaSkeleton);
-  if (!skeletonHolder.valid()) {
-    return 0;
-  }
-
-  UErrorCode status = U_ZERO_ERROR;
-  icu::DateIntervalFormat* formatter(icu::DateIntervalFormat::createInstance(skeletonHolder.unicodeString(), icuLocale.locale(), status));
-  if (maybeThrowIcuException(env, "DateIntervalFormat::createInstance", status)) {
-    return 0;
-  }
-
-  ScopedJavaUnicodeString tzNameHolder(env, javaTzName);
-  if (!tzNameHolder.valid()) {
-    return 0;
-  }
-  formatter->adoptTimeZone(icu::TimeZone::createTimeZone(tzNameHolder.unicodeString()));
-
-  return reinterpret_cast<uintptr_t>(formatter);
-}
-
-static void DateIntervalFormat_destroyDateIntervalFormat(JNIEnv*, jclass, jlong address) {
-  delete reinterpret_cast<icu::DateIntervalFormat*>(address);
-}
-
-static jstring DateIntervalFormat_formatDateInterval(JNIEnv* env, jclass, jlong address, jlong fromDate, jlong toDate) {
-  icu::DateIntervalFormat* formatter(reinterpret_cast<icu::DateIntervalFormat*>(address));
-  icu::DateInterval date_interval(fromDate, toDate);
-
-  icu::UnicodeString s;
-  icu::FieldPosition pos = 0;
-  UErrorCode status = U_ZERO_ERROR;
-  formatter->format(&date_interval, s, pos, status);
-  if (maybeThrowIcuException(env, "DateIntervalFormat::format", status)) {
-    return NULL;
-  }
-
-  return env->NewString(s.getBuffer(), s.length());
-}
-
-static JNINativeMethod gMethods[] = {
-  NATIVE_METHOD(DateIntervalFormat, createDateIntervalFormat, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)J"),
-  NATIVE_METHOD(DateIntervalFormat, destroyDateIntervalFormat, "(J)V"),
-  NATIVE_METHOD(DateIntervalFormat, formatDateInterval, "(JJJ)Ljava/lang/String;"),
-};
-void register_libcore_icu_DateIntervalFormat(JNIEnv* env) {
-  jniRegisterNativeMethods(env, "libcore/icu/DateIntervalFormat", gMethods, NELEM(gMethods));
-}
diff --git a/luni/src/main/native/libcore_icu_RelativeDateTimeFormatter.cpp b/luni/src/main/native/libcore_icu_RelativeDateTimeFormatter.cpp
deleted file mode 100644
index 6215d5f..0000000
--- a/luni/src/main/native/libcore_icu_RelativeDateTimeFormatter.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * 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.
- */
-
-#define LOG_TAG "RelativeDateTimeFormatter"
-
-#include "IcuUtilities.h"
-#include "JniConstants.h"
-#include "ScopedIcuLocale.h"
-#include "ScopedJavaUnicodeString.h"
-#include "cutils/log.h"
-#include "unicode/reldatefmt.h"
-
-static jlong RelativeDateTimeFormatter_createRelativeDateTimeFormatter(JNIEnv* env, jclass,
-    jstring javaLocaleName, jint style, jint capitalizationContext) {
-  ScopedIcuLocale icuLocale(env, javaLocaleName);
-  if (!icuLocale.valid()) {
-    return 0;
-  }
-
-  UErrorCode status = U_ZERO_ERROR;
-  icu::RelativeDateTimeFormatter* formatter = new icu::RelativeDateTimeFormatter(
-      icuLocale.locale(), nullptr, static_cast<UDateRelativeDateTimeFormatterStyle>(style),
-      static_cast<UDisplayContext>(capitalizationContext), status);
-  if (maybeThrowIcuException(env, "RelativeDateTimeFormatter::RelativeDateTimeFormatter", status)) {
-    return 0;
-  }
-
-  return reinterpret_cast<uintptr_t>(formatter);
-}
-
-static void RelativeDateTimeFormatter_destroyRelativeDateTimeFormatter(JNIEnv*, jclass,
-    jlong formatterAddress) {
-  delete reinterpret_cast<icu::RelativeDateTimeFormatter*>(static_cast<uintptr_t>(formatterAddress));
-}
-
-static jstring RelativeDateTimeFormatter_formatWithRelativeUnit(JNIEnv* env, jclass,
-    jlong formatterAddress, jint quantity, jint direction, jint unit) {
-  icu::RelativeDateTimeFormatter* formatter(reinterpret_cast<icu::RelativeDateTimeFormatter*>(formatterAddress));
-  icu::UnicodeString s;
-  UErrorCode status = U_ZERO_ERROR;
-  // RelativeDateTimeFormatter::format() takes a double-type quantity.
-  formatter->format(static_cast<double>(quantity), static_cast<UDateDirection>(direction),
-                    static_cast<UDateRelativeUnit>(unit), s, status);
-  if (maybeThrowIcuException(env, "RelativeDateTimeFormatter::format", status)) {
-    return nullptr;
-  }
-
-  return env->NewString(s.getBuffer(), s.length());
-}
-
-static jstring RelativeDateTimeFormatter_formatWithAbsoluteUnit(JNIEnv* env, jclass,
-    jlong formatterAddress, jint direction, jint unit) {
-  icu::RelativeDateTimeFormatter* formatter(reinterpret_cast<icu::RelativeDateTimeFormatter*>(formatterAddress));
-  icu::UnicodeString s;
-  UErrorCode status = U_ZERO_ERROR;
-  formatter->format(static_cast<UDateDirection>(direction), static_cast<UDateAbsoluteUnit>(unit), s, status);
-  if (maybeThrowIcuException(env, "RelativeDateTimeFormatter::format", status)) {
-    return nullptr;
-  }
-
-  return env->NewString(s.getBuffer(), s.length());
-}
-
-static jstring RelativeDateTimeFormatter_combineDateAndTime(JNIEnv* env, jclass,
-    jlong formatterAddress, jstring relativeDateString0, jstring timeString0) {
-  icu::RelativeDateTimeFormatter* formatter(reinterpret_cast<icu::RelativeDateTimeFormatter*>(formatterAddress));
-  ScopedJavaUnicodeString relativeDateString(env, relativeDateString0);
-  if (!relativeDateString.valid()) {
-    return 0;
-  }
-
-  ScopedJavaUnicodeString timeString(env, timeString0);
-  if (!timeString.valid()) {
-    return 0;
-  }
-  icu::UnicodeString s;
-  UErrorCode status = U_ZERO_ERROR;
-  formatter->combineDateAndTime(relativeDateString.unicodeString(), timeString.unicodeString(), s, status);
-  if (maybeThrowIcuException(env, "RelativeDateTimeFormatter::combineDateAndTime", status)) {
-    return nullptr;
-  }
-
-  return env->NewString(s.getBuffer(), s.length());
-}
-
-static JNINativeMethod gMethods[] = {
-  NATIVE_METHOD(RelativeDateTimeFormatter, createRelativeDateTimeFormatter, "(Ljava/lang/String;II)J"),
-  NATIVE_METHOD(RelativeDateTimeFormatter, destroyRelativeDateTimeFormatter, "(J)V"),
-  NATIVE_METHOD(RelativeDateTimeFormatter, formatWithRelativeUnit, "(JIII)Ljava/lang/String;"),
-  NATIVE_METHOD(RelativeDateTimeFormatter, formatWithAbsoluteUnit, "(JII)Ljava/lang/String;"),
-  NATIVE_METHOD(RelativeDateTimeFormatter, combineDateAndTime, "(JLjava/lang/String;Ljava/lang/String;)Ljava/lang/String;"),
-};
-
-void register_libcore_icu_RelativeDateTimeFormatter(JNIEnv* env) {
-  jniRegisterNativeMethods(env, "libcore/icu/RelativeDateTimeFormatter", gMethods, NELEM(gMethods));
-}
diff --git a/luni/src/main/native/sub.mk b/luni/src/main/native/sub.mk
index 886ab0d..2bc44ed 100644
--- a/luni/src/main/native/sub.mk
+++ b/luni/src/main/native/sub.mk
@@ -38,7 +38,6 @@
     java_util_zip_Deflater.cpp \
     java_util_zip_Inflater.cpp \
     libcore_icu_AlphabeticIndex.cpp \
-    libcore_icu_DateIntervalFormat.cpp \
     libcore_icu_ICU.cpp \
     libcore_icu_NativeCollation.cpp \
     libcore_icu_NativeConverter.cpp \
@@ -46,7 +45,6 @@
     libcore_icu_NativeIDN.cpp \
     libcore_icu_NativeNormalizer.cpp \
     libcore_icu_NativePluralRules.cpp \
-    libcore_icu_RelativeDateTimeFormatter.cpp \
     libcore_icu_TimeZoneNames.cpp \
     libcore_icu_Transliterator.cpp \
     libcore_io_AsynchronousCloseMonitor.cpp \
diff --git a/luni/src/test/java/libcore/icu/DateIntervalFormatTest.java b/luni/src/test/java/libcore/icu/DateIntervalFormatTest.java
index 279f934..d49579c 100644
--- a/luni/src/test/java/libcore/icu/DateIntervalFormatTest.java
+++ b/luni/src/test/java/libcore/icu/DateIntervalFormatTest.java
@@ -143,6 +143,7 @@
 
     assertEquals("19 de ene. de 2009 – 9 de feb. de 2012", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_DATE | FORMAT_ABBREV_ALL));
     assertEquals("ene. de 2009 – feb. de 2012", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_NO_MONTH_DAY | FORMAT_ABBREV_ALL));
+
     assertEquals("19 de enero de 2009–9 de febrero de 2012", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * YEAR, 0));
     assertEquals("lunes, 19 de enero de 2009–jueves, 9 de febrero de 2012", formatDateRange(es_US, tz, fixedTime, fixedTime + 3 * YEAR, FORMAT_SHOW_WEEKDAY));
 
diff --git a/luni/src/test/java/libcore/java/util/jar/StrictJarFileTest.java b/luni/src/test/java/libcore/java/util/jar/StrictJarFileTest.java
index e5a6cd8..9496ad0 100644
--- a/luni/src/test/java/libcore/java/util/jar/StrictJarFileTest.java
+++ b/luni/src/test/java/libcore/java/util/jar/StrictJarFileTest.java
@@ -169,6 +169,10 @@
         assertThrowsOnInit("Modified_SF_EntryAttributes.jar");
     }
 
+    public void testJarSigning_removedEntry() throws Exception {
+        assertThrowsOnInit("removed.jar");
+    }
+
     private void assertThrowsOnInit(String name) throws Exception {
         Support_Resources.copyFile(resources, null,  name);
         try {
diff --git a/support/src/test/java/tests/resources/removed.jar b/support/src/test/java/tests/resources/removed.jar
new file mode 100644
index 0000000..2100322
--- /dev/null
+++ b/support/src/test/java/tests/resources/removed.jar
Binary files differ
