Merge "java/io/RandomAccessFile: do not nullify FileChannel when closing the RAF"
diff --git a/benchmarks/src/benchmarks/regression/DateIntervalFormatBenchmark.java b/benchmarks/src/benchmarks/regression/DateIntervalFormatBenchmark.java
index e84c287..e904b4d 100644
--- a/benchmarks/src/benchmarks/regression/DateIntervalFormatBenchmark.java
+++ b/benchmarks/src/benchmarks/regression/DateIntervalFormatBenchmark.java
@@ -21,7 +21,9 @@
 import android.icu.util.ULocale;
 import android.icu.util.TimeZone;
 
-import static libcore.icu.DateIntervalFormat.*;
+import libcore.icu.DateIntervalFormat;
+
+import static libcore.icu.DateUtilsBridge.*;
 
 public class DateIntervalFormatBenchmark extends SimpleBenchmark {
   public void timeDateIntervalFormat_formatDateRange_DATE(int reps) throws Exception {
@@ -30,7 +32,7 @@
     int flags = FORMAT_SHOW_DATE | FORMAT_SHOW_WEEKDAY;
 
     for (int rep = 0; rep < reps; ++rep) {
-      formatDateRange(l, utc, 0L, 0L, flags);
+      DateIntervalFormat.formatDateRange(l, utc, 0L, 0L, flags);
     }
   }
 
@@ -40,7 +42,7 @@
     int flags = FORMAT_SHOW_TIME | FORMAT_24HOUR;
 
     for (int rep = 0; rep < reps; ++rep) {
-      formatDateRange(l, utc, 0L, 0L, flags);
+      DateIntervalFormat.formatDateRange(l, utc, 0L, 0L, flags);
     }
   }
 
@@ -50,7 +52,7 @@
     int flags = FORMAT_SHOW_DATE | FORMAT_SHOW_WEEKDAY | FORMAT_SHOW_TIME | FORMAT_24HOUR;
 
     for (int rep = 0; rep < reps; ++rep) {
-      formatDateRange(l, utc, 0L, 0L, flags);
+      DateIntervalFormat.formatDateRange(l, utc, 0L, 0L, flags);
     }
   }
 }
diff --git a/benchmarks/src/benchmarks/regression/RelativeDateTimeFormatterBenchmark.java b/benchmarks/src/benchmarks/regression/RelativeDateTimeFormatterBenchmark.java
index 30670b4..ea2cf4a 100644
--- a/benchmarks/src/benchmarks/regression/RelativeDateTimeFormatterBenchmark.java
+++ b/benchmarks/src/benchmarks/regression/RelativeDateTimeFormatterBenchmark.java
@@ -21,9 +21,9 @@
 import java.util.Locale;
 import java.util.TimeZone;
 
+import static libcore.icu.DateUtilsBridge.FORMAT_ABBREV_RELATIVE;
 import static libcore.icu.RelativeDateTimeFormatter.getRelativeDateTimeString;
 import static libcore.icu.RelativeDateTimeFormatter.getRelativeTimeSpanString;
-import static libcore.icu.RelativeDateTimeFormatter.FORMAT_ABBREV_RELATIVE;
 
 public class RelativeDateTimeFormatterBenchmark extends SimpleBenchmark {
   public void timeRelativeDateTimeFormatter_getRelativeTimeSpanString(int reps) throws Exception {
diff --git a/libart/src/main/java/java/lang/String.java b/libart/src/main/java/java/lang/String.java
index 0107b6e..a5bf34c 100644
--- a/libart/src/main/java/java/lang/String.java
+++ b/libart/src/main/java/java/lang/String.java
@@ -22,12 +22,12 @@
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
-import java.nio.charset.Charsets;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Formatter;
 import java.util.Locale;
 import java.util.regex.Pattern;
+import libcore.util.CharsetUtils;
 import libcore.util.EmptyArray;
 
 /**
@@ -337,12 +337,12 @@
             this.offset = 0;
             this.value = new char[byteCount];
             this.count = byteCount;
-            Charsets.isoLatin1BytesToChars(data, offset, byteCount, value);
+            CharsetUtils.isoLatin1BytesToChars(data, offset, byteCount, value);
         } else if (canonicalCharsetName.equals("US-ASCII")) {
             this.offset = 0;
             this.value = new char[byteCount];
             this.count = byteCount;
-            Charsets.asciiBytesToChars(data, offset, byteCount, value);
+            CharsetUtils.asciiBytesToChars(data, offset, byteCount, value);
         } else {
             CharBuffer cb = charset.decode(ByteBuffer.wrap(data, offset, byteCount));
             this.offset = 0;
@@ -772,13 +772,13 @@
     public byte[] getBytes(Charset charset) {
         String canonicalCharsetName = charset.name();
         if (canonicalCharsetName.equals("UTF-8")) {
-            return Charsets.toUtf8Bytes(value, offset, count);
+            return CharsetUtils.toUtf8Bytes(value, offset, count);
         } else if (canonicalCharsetName.equals("ISO-8859-1")) {
-            return Charsets.toIsoLatin1Bytes(value, offset, count);
+            return CharsetUtils.toIsoLatin1Bytes(value, offset, count);
         } else if (canonicalCharsetName.equals("US-ASCII")) {
-            return Charsets.toAsciiBytes(value, offset, count);
+            return CharsetUtils.toAsciiBytes(value, offset, count);
         } else if (canonicalCharsetName.equals("UTF-16BE")) {
-            return Charsets.toBigEndianUtf16Bytes(value, offset, count);
+            return CharsetUtils.toBigEndianUtf16Bytes(value, offset, count);
         } else {
             CharBuffer chars = CharBuffer.wrap(this.value, this.offset, this.count);
             ByteBuffer buffer = charset.encode(chars.asReadOnlyBuffer());
diff --git a/luni/src/main/java/libcore/icu/DateIntervalFormat.java b/luni/src/main/java/libcore/icu/DateIntervalFormat.java
index 10e3e6a..509d0a0 100644
--- a/luni/src/main/java/libcore/icu/DateIntervalFormat.java
+++ b/luni/src/main/java/libcore/icu/DateIntervalFormat.java
@@ -16,38 +16,20 @@
 
 package libcore.icu;
 
-import com.ibm.icu.impl.JavaTimeZone;
 import com.ibm.icu.util.Calendar;
-import com.ibm.icu.util.GregorianCalendar;
 import com.ibm.icu.util.ULocale;
 
 import java.text.FieldPosition;
 import java.util.TimeZone;
 import libcore.util.BasicLruCache;
 
+import static libcore.icu.DateUtilsBridge.FORMAT_UTC;
+
 /**
  * Exposes icu4j's DateIntervalFormat.
  */
 public final class DateIntervalFormat {
 
-  // These are all public API in DateUtils. There are others, but they're either for use with
-  // other methods (like FORMAT_ABBREV_RELATIVE), don't internationalize (like FORMAT_CAP_AMPM),
-  // or have never been implemented anyway.
-  public static final int FORMAT_SHOW_TIME      = 0x00001;
-  public static final int FORMAT_SHOW_WEEKDAY   = 0x00002;
-  public static final int FORMAT_SHOW_YEAR      = 0x00004;
-  public static final int FORMAT_NO_YEAR        = 0x00008;
-  public static final int FORMAT_SHOW_DATE      = 0x00010;
-  public static final int FORMAT_NO_MONTH_DAY   = 0x00020;
-  public static final int FORMAT_12HOUR         = 0x00040;
-  public static final int FORMAT_24HOUR         = 0x00080;
-  public static final int FORMAT_UTC            = 0x02000;
-  public static final int FORMAT_ABBREV_TIME    = 0x04000;
-  public static final int FORMAT_ABBREV_WEEKDAY = 0x08000;
-  public static final int FORMAT_ABBREV_MONTH   = 0x10000;
-  public static final int FORMAT_NUMERIC_DATE   = 0x20000;
-  public static final int FORMAT_ABBREV_ALL     = 0x80000;
-
   private static final FormatterCache CACHED_FORMATTERS = new FormatterCache();
 
   static class FormatterCache extends BasicLruCache<String, com.ibm.icu.text.DateIntervalFormat> {
@@ -67,7 +49,7 @@
     // We create a java.util.TimeZone here to use libcore's data and libcore's olson ID / pseudo-tz
     // logic.
     TimeZone tz = (olsonId != null) ? TimeZone.getTimeZone(olsonId) : TimeZone.getDefault();
-    com.ibm.icu.util.TimeZone icuTimeZone = icuTimeZone(tz);
+    com.ibm.icu.util.TimeZone icuTimeZone = DateUtilsBridge.icuTimeZone(tz);
     ULocale icuLocale = ULocale.getDefault();
     return formatDateRange(icuLocale, icuTimeZone, startMs, endMs, flags);
   }
@@ -76,12 +58,12 @@
   // skeleton instead of int flags.)
   public static String formatDateRange(ULocale icuLocale, com.ibm.icu.util.TimeZone icuTimeZone,
       long startMs, long endMs, int flags) {
-    Calendar startCalendar = createIcuCalendar(icuTimeZone, icuLocale, startMs);
+    Calendar startCalendar = DateUtilsBridge.createIcuCalendar(icuTimeZone, icuLocale, startMs);
     Calendar endCalendar;
     if (startMs == endMs) {
       endCalendar = startCalendar;
     } else {
-      endCalendar = createIcuCalendar(icuTimeZone, icuLocale, endMs);
+      endCalendar = DateUtilsBridge.createIcuCalendar(icuTimeZone, icuLocale, endMs);
     }
 
     boolean endsAtMidnight = isMidnight(endCalendar);
@@ -91,11 +73,12 @@
     // 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)) {
+        ((flags & DateUtilsBridge.FORMAT_SHOW_TIME) == 0
+            || DateUtilsBridge.dayDistance(startCalendar, endCalendar) <= 1)) {
       endCalendar.roll(Calendar.DAY_OF_MONTH, false);
     }
 
-    String skeleton = toSkeleton(startCalendar, endCalendar, flags);
+    String skeleton = DateUtilsBridge.toSkeleton(startCalendar, endCalendar, flags);
     synchronized (CACHED_FORMATTERS) {
       com.ibm.icu.text.DateIntervalFormat formatter =
           getFormatter(skeleton, icuLocale, icuTimeZone);
@@ -117,86 +100,6 @@
     return formatter;
   }
 
-  private static String toSkeleton(Calendar startCalendar, Calendar endCalendar, int flags) {
-    if ((flags & FORMAT_ABBREV_ALL) != 0) {
-      flags |= FORMAT_ABBREV_MONTH | FORMAT_ABBREV_TIME | FORMAT_ABBREV_WEEKDAY;
-    }
-
-    String monthPart = "MMMM";
-    if ((flags & FORMAT_NUMERIC_DATE) != 0) {
-      monthPart = "M";
-    } else if ((flags & FORMAT_ABBREV_MONTH) != 0) {
-      monthPart = "MMM";
-    }
-
-    String weekPart = "EEEE";
-    if ((flags & FORMAT_ABBREV_WEEKDAY) != 0) {
-      weekPart = "EEE";
-    }
-
-    String timePart = "j"; // "j" means choose 12 or 24 hour based on current locale.
-    if ((flags & FORMAT_24HOUR) != 0) {
-      timePart = "H";
-    } else if ((flags & FORMAT_12HOUR) != 0) {
-      timePart = "h";
-    }
-
-    // If we've not been asked to abbreviate times, or we're using the 24-hour clock (where it
-    // never makes sense to leave out the minutes), include minutes. This gets us times like
-    // "4 PM" while avoiding times like "16" (for "16:00").
-    if ((flags & FORMAT_ABBREV_TIME) == 0 || (flags & FORMAT_24HOUR) != 0) {
-      timePart += "m";
-    } else {
-      // Otherwise, we're abbreviating a 12-hour time, and should only show the minutes
-      // if they're not both "00".
-      if (!(onTheHour(startCalendar) && onTheHour(endCalendar))) {
-        timePart = timePart + "m";
-      }
-    }
-
-    if (fallOnDifferentDates(startCalendar, endCalendar)) {
-      flags |= FORMAT_SHOW_DATE;
-    }
-
-    if (fallInSameMonth(startCalendar, endCalendar) && (flags & FORMAT_NO_MONTH_DAY) != 0) {
-      flags &= (~FORMAT_SHOW_WEEKDAY);
-      flags &= (~FORMAT_SHOW_TIME);
-    }
-
-    if ((flags & (FORMAT_SHOW_DATE | FORMAT_SHOW_TIME | FORMAT_SHOW_WEEKDAY)) == 0) {
-      flags |= FORMAT_SHOW_DATE;
-    }
-
-    // If we've been asked to show the date, work out whether we think we should show the year.
-    if ((flags & FORMAT_SHOW_DATE) != 0) {
-      if ((flags & FORMAT_SHOW_YEAR) != 0) {
-        // The caller explicitly wants us to show the year.
-      } else if ((flags & FORMAT_NO_YEAR) != 0) {
-        // The caller explicitly doesn't want us to show the year, even if we otherwise would.
-      } else if (!fallInSameYear(startCalendar, endCalendar) || !isThisYear(startCalendar)) {
-        flags |= FORMAT_SHOW_YEAR;
-      }
-    }
-
-    StringBuilder builder = new StringBuilder();
-    if ((flags & (FORMAT_SHOW_DATE | FORMAT_NO_MONTH_DAY)) != 0) {
-      if ((flags & FORMAT_SHOW_YEAR) != 0) {
-        builder.append("y");
-      }
-      builder.append(monthPart);
-      if ((flags & FORMAT_NO_MONTH_DAY) == 0) {
-        builder.append("d");
-      }
-    }
-    if ((flags & FORMAT_SHOW_WEEKDAY) != 0) {
-      builder.append(weekPart);
-    }
-    if ((flags & FORMAT_SHOW_TIME) != 0) {
-      builder.append(timePart);
-    }
-    return builder.toString();
-  }
-
   private static boolean isMidnight(Calendar c) {
     return c.get(Calendar.HOUR_OF_DAY) == 0 &&
         c.get(Calendar.MINUTE) == 0 &&
@@ -204,49 +107,4 @@
         c.get(Calendar.MILLISECOND) == 0;
   }
 
-  private static boolean onTheHour(Calendar c) {
-    return c.get(Calendar.MINUTE) == 0 && c.get(Calendar.SECOND) == 0;
-  }
-
-  private static boolean fallOnDifferentDates(Calendar c1, Calendar c2) {
-    return c1.get(Calendar.YEAR) != c2.get(Calendar.YEAR) ||
-        c1.get(Calendar.MONTH) != c2.get(Calendar.MONTH) ||
-        c1.get(Calendar.DAY_OF_MONTH) != c2.get(Calendar.DAY_OF_MONTH);
-  }
-
-  private static boolean fallInSameMonth(Calendar c1, Calendar c2) {
-    return c1.get(Calendar.MONTH) == c2.get(Calendar.MONTH);
-  }
-
-  private static boolean fallInSameYear(Calendar c1, Calendar c2) {
-    return c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR);
-  }
-
-  private static boolean isThisYear(Calendar c) {
-    Calendar now = (Calendar) c.clone();
-    now.setTimeInMillis(System.currentTimeMillis());
-    return c.get(Calendar.YEAR) == now.get(Calendar.YEAR);
-  }
-
-  public static int dayDistance(Calendar c1, Calendar c2) {
-    return c2.get(Calendar.JULIAN_DAY) - c1.get(Calendar.JULIAN_DAY);
-  }
-
-  /**
-   * Creates an immutable ICU timezone backed by the specified libcore timezone data. At the time of
-   * writing the libcore implementation is faster but restricted to 1902 - 2038.
-   * Callers must not modify the {@code tz} after calling this method.
-   */
-  static com.ibm.icu.util.TimeZone icuTimeZone(TimeZone tz) {
-    JavaTimeZone javaTimeZone = new JavaTimeZone(tz, null);
-    javaTimeZone.freeze(); // Optimization - allows the timezone to be copied cheaply.
-    return javaTimeZone;
-  }
-
-  static Calendar createIcuCalendar(com.ibm.icu.util.TimeZone icuTimeZone, ULocale icuLocale,
-      long timeInMillis) {
-    Calendar calendar = new GregorianCalendar(icuTimeZone, icuLocale);
-    calendar.setTimeInMillis(timeInMillis);
-    return calendar;
-  }
 }
diff --git a/luni/src/main/java/libcore/icu/DateTimeFormat.java b/luni/src/main/java/libcore/icu/DateTimeFormat.java
new file mode 100644
index 0000000..7323c26
--- /dev/null
+++ b/luni/src/main/java/libcore/icu/DateTimeFormat.java
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+package libcore.icu;
+
+import com.ibm.icu.text.DateFormat;
+import com.ibm.icu.text.DateTimePatternGenerator;
+import com.ibm.icu.text.DisplayContext;
+import com.ibm.icu.text.SimpleDateFormat;
+import com.ibm.icu.util.Calendar;
+import com.ibm.icu.util.ULocale;
+
+import libcore.util.BasicLruCache;
+
+/**
+ * A formatter that outputs a single date/time.
+ */
+public class DateTimeFormat {
+  private static final FormatterCache CACHED_FORMATTERS = new FormatterCache();
+
+  static class FormatterCache extends BasicLruCache<String, DateFormat> {
+    FormatterCache() {
+      super(8);
+    }
+  }
+
+  private DateTimeFormat() {
+  }
+
+  public static String format(ULocale icuLocale, Calendar time, int flags,
+      DisplayContext displayContext) {
+    String skeleton = DateUtilsBridge.toSkeleton(time, flags);
+    String key = skeleton + "\t" + icuLocale + "\t" + time.getTimeZone();
+    synchronized(CACHED_FORMATTERS) {
+      DateFormat formatter = CACHED_FORMATTERS.get(key);
+      if (formatter == null) {
+        DateTimePatternGenerator generator = DateTimePatternGenerator.getInstance(icuLocale);
+        formatter = new SimpleDateFormat(generator.getBestPattern(skeleton), icuLocale);
+        CACHED_FORMATTERS.put(key, formatter);
+      }
+      formatter.setContext(displayContext);
+      return formatter.format(time);
+    }
+  }
+}
diff --git a/luni/src/main/java/libcore/icu/DateUtilsBridge.java b/luni/src/main/java/libcore/icu/DateUtilsBridge.java
new file mode 100644
index 0000000..88faa90
--- /dev/null
+++ b/luni/src/main/java/libcore/icu/DateUtilsBridge.java
@@ -0,0 +1,177 @@
+/*
+ * 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.
+ */
+
+package libcore.icu;
+
+import com.ibm.icu.impl.JavaTimeZone;
+import com.ibm.icu.util.Calendar;
+import com.ibm.icu.util.GregorianCalendar;
+import com.ibm.icu.util.ULocale;
+
+/**
+ * Common methods and constants for the various ICU formatters used to support
+ * android.text.format.DateUtils.
+ */
+public final class DateUtilsBridge {
+  // These are all public API in DateUtils. There are others, but they're either for use with
+  // other methods (like FORMAT_ABBREV_RELATIVE), don't internationalize (like FORMAT_CAP_AMPM),
+  // or have never been implemented anyway.
+  public static final int FORMAT_SHOW_TIME       = 0x00001;
+  public static final int FORMAT_SHOW_WEEKDAY    = 0x00002;
+  public static final int FORMAT_SHOW_YEAR       = 0x00004;
+  public static final int FORMAT_NO_YEAR         = 0x00008;
+  public static final int FORMAT_SHOW_DATE       = 0x00010;
+  public static final int FORMAT_NO_MONTH_DAY    = 0x00020;
+  public static final int FORMAT_12HOUR          = 0x00040;
+  public static final int FORMAT_24HOUR          = 0x00080;
+  public static final int FORMAT_UTC             = 0x02000;
+  public static final int FORMAT_ABBREV_TIME     = 0x04000;
+  public static final int FORMAT_ABBREV_WEEKDAY  = 0x08000;
+  public static final int FORMAT_ABBREV_MONTH    = 0x10000;
+  public static final int FORMAT_NUMERIC_DATE    = 0x20000;
+  public static final int FORMAT_ABBREV_RELATIVE = 0x40000;
+  public static final int FORMAT_ABBREV_ALL      = 0x80000;
+
+  /**
+   * Creates an immutable ICU timezone backed by the specified libcore timezone data. At the time of
+   * writing the libcore implementation is faster but restricted to 1902 - 2038.
+   * Callers must not modify the {@code tz} after calling this method.
+   */
+  public static com.ibm.icu.util.TimeZone icuTimeZone(java.util.TimeZone tz) {
+    JavaTimeZone javaTimeZone = new JavaTimeZone(tz, null);
+    javaTimeZone.freeze(); // Optimization - allows the timezone to be copied cheaply.
+    return javaTimeZone;
+  }
+
+  public static Calendar createIcuCalendar(com.ibm.icu.util.TimeZone icuTimeZone, ULocale icuLocale,
+      long timeInMillis) {
+    Calendar calendar = new GregorianCalendar(icuTimeZone, icuLocale);
+    calendar.setTimeInMillis(timeInMillis);
+    return calendar;
+  }
+
+  public static String toSkeleton(Calendar calendar, int flags) {
+    return toSkeleton(calendar, calendar, flags);
+  }
+
+  public static String toSkeleton(Calendar startCalendar, Calendar endCalendar, int flags) {
+    if ((flags & FORMAT_ABBREV_ALL) != 0) {
+      flags |= FORMAT_ABBREV_MONTH | FORMAT_ABBREV_TIME | FORMAT_ABBREV_WEEKDAY;
+    }
+
+    String monthPart = "MMMM";
+    if ((flags & FORMAT_NUMERIC_DATE) != 0) {
+      monthPart = "M";
+    } else if ((flags & FORMAT_ABBREV_MONTH) != 0) {
+      monthPart = "MMM";
+    }
+
+    String weekPart = "EEEE";
+    if ((flags & FORMAT_ABBREV_WEEKDAY) != 0) {
+      weekPart = "EEE";
+    }
+
+    String timePart = "j"; // "j" means choose 12 or 24 hour based on current locale.
+    if ((flags & FORMAT_24HOUR) != 0) {
+      timePart = "H";
+    } else if ((flags & FORMAT_12HOUR) != 0) {
+      timePart = "h";
+    }
+
+    // If we've not been asked to abbreviate times, or we're using the 24-hour clock (where it
+    // never makes sense to leave out the minutes), include minutes. This gets us times like
+    // "4 PM" while avoiding times like "16" (for "16:00").
+    if ((flags & FORMAT_ABBREV_TIME) == 0 || (flags & FORMAT_24HOUR) != 0) {
+      timePart += "m";
+    } else {
+      // Otherwise, we're abbreviating a 12-hour time, and should only show the minutes
+      // if they're not both "00".
+      if (!(onTheHour(startCalendar) && onTheHour(endCalendar))) {
+        timePart = timePart + "m";
+      }
+    }
+
+    if (fallOnDifferentDates(startCalendar, endCalendar)) {
+      flags |= FORMAT_SHOW_DATE;
+    }
+
+    if (fallInSameMonth(startCalendar, endCalendar) && (flags & FORMAT_NO_MONTH_DAY) != 0) {
+      flags &= (~FORMAT_SHOW_WEEKDAY);
+      flags &= (~FORMAT_SHOW_TIME);
+    }
+
+    if ((flags & (FORMAT_SHOW_DATE | FORMAT_SHOW_TIME | FORMAT_SHOW_WEEKDAY)) == 0) {
+      flags |= FORMAT_SHOW_DATE;
+    }
+
+    // If we've been asked to show the date, work out whether we think we should show the year.
+    if ((flags & FORMAT_SHOW_DATE) != 0) {
+      if ((flags & FORMAT_SHOW_YEAR) != 0) {
+        // The caller explicitly wants us to show the year.
+      } else if ((flags & FORMAT_NO_YEAR) != 0) {
+        // The caller explicitly doesn't want us to show the year, even if we otherwise would.
+      } else if (!fallInSameYear(startCalendar, endCalendar) || !isThisYear(startCalendar)) {
+        flags |= FORMAT_SHOW_YEAR;
+      }
+    }
+
+    StringBuilder builder = new StringBuilder();
+    if ((flags & (FORMAT_SHOW_DATE | FORMAT_NO_MONTH_DAY)) != 0) {
+      if ((flags & FORMAT_SHOW_YEAR) != 0) {
+        builder.append("y");
+      }
+      builder.append(monthPart);
+      if ((flags & FORMAT_NO_MONTH_DAY) == 0) {
+        builder.append("d");
+      }
+    }
+    if ((flags & FORMAT_SHOW_WEEKDAY) != 0) {
+      builder.append(weekPart);
+    }
+    if ((flags & FORMAT_SHOW_TIME) != 0) {
+      builder.append(timePart);
+    }
+    return builder.toString();
+  }
+
+  public static int dayDistance(Calendar c1, Calendar c2) {
+    return c2.get(Calendar.JULIAN_DAY) - c1.get(Calendar.JULIAN_DAY);
+  }
+
+  private static boolean onTheHour(Calendar c) {
+    return c.get(Calendar.MINUTE) == 0 && c.get(Calendar.SECOND) == 0;
+  }
+
+  private static boolean fallOnDifferentDates(Calendar c1, Calendar c2) {
+    return c1.get(Calendar.YEAR) != c2.get(Calendar.YEAR) ||
+        c1.get(Calendar.MONTH) != c2.get(Calendar.MONTH) ||
+        c1.get(Calendar.DAY_OF_MONTH) != c2.get(Calendar.DAY_OF_MONTH);
+  }
+
+  private static boolean fallInSameMonth(Calendar c1, Calendar c2) {
+    return c1.get(Calendar.MONTH) == c2.get(Calendar.MONTH);
+  }
+
+  private static boolean fallInSameYear(Calendar c1, Calendar c2) {
+    return c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR);
+  }
+
+  private static boolean isThisYear(Calendar c) {
+    Calendar now = (Calendar) c.clone();
+    now.setTimeInMillis(System.currentTimeMillis());
+    return c.get(Calendar.YEAR) == now.get(Calendar.YEAR);
+  }
+}
diff --git a/luni/src/main/java/libcore/icu/RelativeDateTimeFormatter.java b/luni/src/main/java/libcore/icu/RelativeDateTimeFormatter.java
index 8d62c78..e2afa61 100644
--- a/luni/src/main/java/libcore/icu/RelativeDateTimeFormatter.java
+++ b/luni/src/main/java/libcore/icu/RelativeDateTimeFormatter.java
@@ -23,22 +23,20 @@
 import com.ibm.icu.util.Calendar;
 import com.ibm.icu.util.ULocale;
 
+import static libcore.icu.DateUtilsBridge.FORMAT_ABBREV_ALL;
+import static libcore.icu.DateUtilsBridge.FORMAT_ABBREV_MONTH;
+import static libcore.icu.DateUtilsBridge.FORMAT_ABBREV_RELATIVE;
+import static libcore.icu.DateUtilsBridge.FORMAT_NO_YEAR;
+import static libcore.icu.DateUtilsBridge.FORMAT_NUMERIC_DATE;
+import static libcore.icu.DateUtilsBridge.FORMAT_SHOW_DATE;
+import static libcore.icu.DateUtilsBridge.FORMAT_SHOW_TIME;
+import static libcore.icu.DateUtilsBridge.FORMAT_SHOW_YEAR;
+
 /**
  * Exposes icu4j's RelativeDateTimeFormatter.
  */
 public final class RelativeDateTimeFormatter {
 
-  // Values from public API in DateUtils to be used in this class. They must
-  // match the ones in DateUtils.java.
-  public static final int FORMAT_SHOW_TIME = 0x00001;
-  public static final int FORMAT_SHOW_YEAR = 0x00004;
-  public static final int FORMAT_NO_YEAR = 0x00008;
-  public static final int FORMAT_SHOW_DATE = 0x00010;
-  public static final int FORMAT_ABBREV_MONTH = 0x10000;
-  public static final int FORMAT_NUMERIC_DATE = 0x20000;
-  public static final int FORMAT_ABBREV_RELATIVE = 0x40000;
-  public static final int FORMAT_ABBREV_ALL = 0x80000;
-
   public static final long SECOND_IN_MILLIS = 1000;
   public static final long MINUTE_IN_MILLIS = SECOND_IN_MILLIS * 60;
   public static final long HOUR_IN_MILLIS = MINUTE_IN_MILLIS * 60;
@@ -58,7 +56,7 @@
     FormatterCache() {
       super(8);
     }
-  };
+  }
 
   private RelativeDateTimeFormatter() {
   }
@@ -92,6 +90,14 @@
    */
   public static String getRelativeTimeSpanString(Locale locale, java.util.TimeZone tz, long time,
       long now, long minResolution, int flags) {
+    // Android has been inconsistent about capitalization in the past. e.g. bug http://b/20247811.
+    // Now we capitalize everything consistently.
+    final DisplayContext displayContext = DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE;
+    return getRelativeTimeSpanString(locale, tz, time, now, minResolution, flags, displayContext);
+  }
+
+  public static String getRelativeTimeSpanString(Locale locale, java.util.TimeZone tz, long time,
+      long now, long minResolution, int flags, DisplayContext displayContext) {
     if (locale == null) {
       throw new NullPointerException("locale == null");
     }
@@ -99,30 +105,30 @@
       throw new NullPointerException("tz == null");
     }
     ULocale icuLocale = ULocale.forLocale(locale);
-    com.ibm.icu.util.TimeZone icuTimeZone = DateIntervalFormat.icuTimeZone(tz);
+    com.ibm.icu.util.TimeZone icuTimeZone = DateUtilsBridge.icuTimeZone(tz);
+    return getRelativeTimeSpanString(icuLocale, icuTimeZone, time, now, minResolution, flags,
+        displayContext);
+  }
+
+  private static String getRelativeTimeSpanString(ULocale icuLocale,
+      com.ibm.icu.util.TimeZone icuTimeZone, long time, long now, long minResolution, int flags,
+      DisplayContext displayContext) {
 
     long duration = Math.abs(now - time);
     boolean past = (now >= time);
 
     com.ibm.icu.text.RelativeDateTimeFormatter.Style style;
     if ((flags & (FORMAT_ABBREV_RELATIVE | FORMAT_ABBREV_ALL)) != 0) {
-        style = com.ibm.icu.text.RelativeDateTimeFormatter.Style.SHORT;
+      style = com.ibm.icu.text.RelativeDateTimeFormatter.Style.SHORT;
     } else {
-        style = com.ibm.icu.text.RelativeDateTimeFormatter.Style.LONG;
+      style = com.ibm.icu.text.RelativeDateTimeFormatter.Style.LONG;
     }
 
-    // We are currently using the _NONE and _FOR_BEGINNING_OF_SENTENCE for the
-    // capitalization. We use _NONE for relative time strings, and the latter
-    // 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).
-    DisplayContext capitalizationContext = DisplayContext.CAPITALIZATION_NONE;
-
     com.ibm.icu.text.RelativeDateTimeFormatter.Direction direction;
     if (past) {
-        direction = com.ibm.icu.text.RelativeDateTimeFormatter.Direction.LAST;
+      direction = com.ibm.icu.text.RelativeDateTimeFormatter.Direction.LAST;
     } else {
-        direction = com.ibm.icu.text.RelativeDateTimeFormatter.Direction.NEXT;
+      direction = com.ibm.icu.text.RelativeDateTimeFormatter.Direction.NEXT;
     }
 
     // 'relative' defaults to true as we are generating relative time span
@@ -156,18 +162,17 @@
         // because for locales that don't have special terms for "2 days ago",
         // icu4j returns an empty string instead of falling back to strings
         // like "2 days ago".
-        capitalizationContext = DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE;
         String str;
         if (past) {
           synchronized (CACHED_FORMATTERS) {
-            str = getFormatter(icuLocale, style, capitalizationContext)
+            str = getFormatter(icuLocale, style, displayContext)
                 .format(
                     com.ibm.icu.text.RelativeDateTimeFormatter.Direction.LAST_2,
                     com.ibm.icu.text.RelativeDateTimeFormatter.AbsoluteUnit.DAY);
           }
         } else {
           synchronized (CACHED_FORMATTERS) {
-            str = getFormatter(icuLocale, style, capitalizationContext)
+            str = getFormatter(icuLocale, style, displayContext)
                 .format(
                     com.ibm.icu.text.RelativeDateTimeFormatter.Direction.NEXT_2,
                     com.ibm.icu.text.RelativeDateTimeFormatter.AbsoluteUnit.DAY);
@@ -176,11 +181,9 @@
         if (str != null && !str.isEmpty()) {
           return str;
         }
-        // Fall back to show something like "2 days ago". Reset the
-        // capitalization setting.
-        capitalizationContext = DisplayContext.CAPITALIZATION_NONE;
+        // Fall back to show something like "2 days ago".
       } else if (count == 1) {
-        // Show "Yesterday / Tomorrow" instead of "1 day ago / in 1 day".
+        // Show "Yesterday / Tomorrow" instead of "1 day ago / In 1 day".
         aunit = com.ibm.icu.text.RelativeDateTimeFormatter.AbsoluteUnit.DAY;
         relative = false;
       } else if (count == 0) {
@@ -193,6 +196,7 @@
       count = (int)(duration / WEEK_IN_MILLIS);
       unit = com.ibm.icu.text.RelativeDateTimeFormatter.RelativeUnit.WEEKS;
     } else {
+      Calendar timeCalendar = DateUtilsBridge.createIcuCalendar(icuTimeZone, icuLocale, time);
       // The duration is longer than a week and minResolution is not
       // WEEK_IN_MILLIS. Return the absolute date instead of relative time.
 
@@ -202,8 +206,7 @@
       // formatDateRange() would determine that based on the current system
       // time and may give wrong results.
       if ((flags & (FORMAT_NO_YEAR | FORMAT_SHOW_YEAR)) == 0) {
-        Calendar timeCalendar = DateIntervalFormat.createIcuCalendar(icuTimeZone, icuLocale, time);
-        Calendar nowCalendar = DateIntervalFormat.createIcuCalendar(icuTimeZone, icuLocale, now);
+        Calendar nowCalendar = DateUtilsBridge.createIcuCalendar(icuTimeZone, icuLocale, now);
 
         if (timeCalendar.get(Calendar.YEAR) != nowCalendar.get(Calendar.YEAR)) {
           flags |= FORMAT_SHOW_YEAR;
@@ -211,20 +214,16 @@
           flags |= FORMAT_NO_YEAR;
         }
       }
-
-      return DateIntervalFormat.formatDateRange(icuLocale, icuTimeZone, time, time, flags);
+      return DateTimeFormat.format(icuLocale, timeCalendar, flags, displayContext);
     }
 
-    if (relative) {
-      synchronized (CACHED_FORMATTERS) {
-        return getFormatter(icuLocale, style, capitalizationContext)
-            .format(count, direction, unit);
-      }
-    } else {
-      capitalizationContext = DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE;
-      synchronized (CACHED_FORMATTERS) {
-        return getFormatter(icuLocale, style, capitalizationContext)
-            .format(direction, aunit);
+    synchronized (CACHED_FORMATTERS) {
+      com.ibm.icu.text.RelativeDateTimeFormatter formatter =
+          getFormatter(icuLocale, style, displayContext);
+      if (relative) {
+        return formatter.format(count, direction, unit);
+      } else {
+        return formatter.format(direction, aunit);
       }
     }
   }
@@ -268,11 +267,7 @@
       throw new NullPointerException("tz == null");
     }
     ULocale icuLocale = ULocale.forLocale(locale);
-    com.ibm.icu.util.TimeZone icuTimeZone = DateIntervalFormat.icuTimeZone(tz);
-
-    // Get the time clause first.
-    String timeClause = DateIntervalFormat.formatDateRange(icuLocale, icuTimeZone, time, time,
-        FORMAT_SHOW_TIME);
+    com.ibm.icu.util.TimeZone icuTimeZone = DateUtilsBridge.icuTimeZone(tz);
 
     long duration = Math.abs(now - time);
     // It doesn't make much sense to have results like: "1 week ago, 10:50 AM".
@@ -286,14 +281,10 @@
         style = com.ibm.icu.text.RelativeDateTimeFormatter.Style.LONG;
     }
 
-    // icu4j also has other options available to control the capitalization. We
-    // are currently using the _NONE option only.
-    DisplayContext capitalizationContext = DisplayContext.CAPITALIZATION_NONE;
+    Calendar timeCalendar = DateUtilsBridge.createIcuCalendar(icuTimeZone, icuLocale, time);
+    Calendar nowCalendar = DateUtilsBridge.createIcuCalendar(icuTimeZone, icuLocale, now);
 
-    Calendar timeCalendar = DateIntervalFormat.createIcuCalendar(icuTimeZone, icuLocale, time);
-    Calendar nowCalendar = DateIntervalFormat.createIcuCalendar(icuTimeZone, icuLocale, now);
-
-    int days = Math.abs(DateIntervalFormat.dayDistance(timeCalendar, nowCalendar));
+    int days = Math.abs(DateUtilsBridge.dayDistance(timeCalendar, nowCalendar));
 
     // Now get the date clause, either in relative format or the actual date.
     String dateClause;
@@ -304,7 +295,8 @@
       if (days > 0 && minResolution < DAY_IN_MILLIS) {
          minResolution = DAY_IN_MILLIS;
       }
-      dateClause = getRelativeTimeSpanString(locale, tz, time, now, minResolution, flags);
+      dateClause = getRelativeTimeSpanString(icuLocale, icuTimeZone, time, now, minResolution,
+          flags, DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE);
     } else {
       // We always use fixed flags to format the date clause. User-supplied
       // flags are ignored.
@@ -316,9 +308,17 @@
         flags = FORMAT_SHOW_DATE | FORMAT_NO_YEAR | FORMAT_ABBREV_MONTH;
       }
 
-      dateClause = DateIntervalFormat.formatDateRange(icuLocale, icuTimeZone, time, time, flags);
+      dateClause = DateTimeFormat.format(icuLocale, timeCalendar, flags,
+          DisplayContext.CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE);
     }
 
+    String timeClause = DateTimeFormat.format(icuLocale, timeCalendar, FORMAT_SHOW_TIME,
+        DisplayContext.CAPITALIZATION_NONE);
+
+    // icu4j also has other options available to control the capitalization. We are currently using
+    // the _NONE option only.
+    DisplayContext capitalizationContext = DisplayContext.CAPITALIZATION_NONE;
+
     // Combine the two clauses, such as '5 days ago, 10:50 AM'.
     synchronized (CACHED_FORMATTERS) {
       return getFormatter(icuLocale, style, capitalizationContext)
@@ -336,12 +336,12 @@
    */
   private static com.ibm.icu.text.RelativeDateTimeFormatter getFormatter(
       ULocale locale, com.ibm.icu.text.RelativeDateTimeFormatter.Style style,
-      DisplayContext capitalizationContext) {
-    String key = locale + "\t" + style + "\t" + capitalizationContext;
+      DisplayContext displayContext) {
+    String key = locale + "\t" + style + "\t" + displayContext;
     com.ibm.icu.text.RelativeDateTimeFormatter formatter = CACHED_FORMATTERS.get(key);
     if (formatter == null) {
       formatter = com.ibm.icu.text.RelativeDateTimeFormatter.getInstance(
-          locale, null, style, capitalizationContext);
+          locale, null, style, displayContext);
       CACHED_FORMATTERS.put(key, formatter);
     }
     return formatter;
diff --git a/luni/src/main/java/java/nio/charset/Charsets.java b/luni/src/main/java/libcore/util/CharsetUtils.java
similarity index 96%
rename from luni/src/main/java/java/nio/charset/Charsets.java
rename to luni/src/main/java/libcore/util/CharsetUtils.java
index 3dede7a..2e426c4 100644
--- a/luni/src/main/java/java/nio/charset/Charsets.java
+++ b/luni/src/main/java/libcore/util/CharsetUtils.java
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-package java.nio.charset;
+package libcore.util;
 
 /**
  * Various special-case charset conversions (for performance).
  *
  * @hide internal use only
  */
-public final class Charsets {
+public final class CharsetUtils {
     /**
      * Returns a new byte array containing the bytes corresponding to the given characters,
      * encoded in US-ASCII. Unrepresentable characters are replaced by (byte) '?'.
@@ -75,6 +75,6 @@
      */
     public static native void isoLatin1BytesToChars(byte[] bytes, int offset, int length, char[] chars);
 
-    private Charsets() {
+    private CharsetUtils() {
     }
 }
diff --git a/luni/src/main/native/Register.cpp b/luni/src/main/native/Register.cpp
index 035b1d9..0f2d0ad 100644
--- a/luni/src/main/native/Register.cpp
+++ b/luni/src/main/native/Register.cpp
@@ -48,7 +48,6 @@
     REGISTER(register_java_lang_System);
     REGISTER(register_java_math_NativeBN);
     REGISTER(register_java_nio_ByteOrder);
-    REGISTER(register_java_nio_charset_Charsets);
     REGISTER(register_java_text_Bidi);
     REGISTER(register_java_util_jar_StrictJarFile);
     REGISTER(register_java_util_regex_Matcher);
@@ -70,6 +69,7 @@
     REGISTER(register_libcore_io_AsynchronousCloseMonitor);
     REGISTER(register_libcore_io_Memory);
     REGISTER(register_libcore_io_Posix);
+    REGISTER(register_libcore_util_CharsetUtils);
     REGISTER(register_org_apache_harmony_dalvik_NativeTestTarget);
     REGISTER(register_org_apache_harmony_xml_ExpatParser);
     REGISTER(register_sun_misc_Unsafe);
diff --git a/luni/src/main/native/java_nio_charset_Charsets.cpp b/luni/src/main/native/libcore_util_CharsetUtils.cpp
similarity index 98%
rename from luni/src/main/native/java_nio_charset_Charsets.cpp
rename to luni/src/main/native/libcore_util_CharsetUtils.cpp
index a49ba22..57c8172 100644
--- a/luni/src/main/native/java_nio_charset_Charsets.cpp
+++ b/luni/src/main/native/libcore_util_CharsetUtils.cpp
@@ -245,6 +245,6 @@
     NATIVE_METHOD(Charsets, toIsoLatin1Bytes, "([CII)[B"),
     NATIVE_METHOD(Charsets, toUtf8Bytes, "([CII)[B"),
 };
-void register_java_nio_charset_Charsets(JNIEnv* env) {
-    jniRegisterNativeMethods(env, "java/nio/charset/Charsets", gMethods, NELEM(gMethods));
+void register_libcore_util_CharsetUtils(JNIEnv* env) {
+    jniRegisterNativeMethods(env, "libcore/util/CharsetUtils", gMethods, NELEM(gMethods));
 }
diff --git a/luni/src/main/native/sub.mk b/luni/src/main/native/sub.mk
index 2bc44ed..a90c683 100644
--- a/luni/src/main/native/sub.mk
+++ b/luni/src/main/native/sub.mk
@@ -28,7 +28,6 @@
     java_lang_System.cpp \
     java_math_NativeBN.cpp \
     java_nio_ByteOrder.cpp \
-    java_nio_charset_Charsets.cpp \
     java_text_Bidi.cpp \
     java_util_jar_StrictJarFile.cpp \
     java_util_regex_Matcher.cpp \
@@ -50,6 +49,7 @@
     libcore_io_AsynchronousCloseMonitor.cpp \
     libcore_io_Memory.cpp \
     libcore_io_Posix.cpp \
+    libcore_util_CharsetUtils.cpp \
     org_apache_harmony_xml_ExpatParser.cpp \
     readlink.cpp \
     sun_misc_Unsafe.cpp \
diff --git a/luni/src/test/java/libcore/icu/DateIntervalFormatTest.java b/luni/src/test/java/libcore/icu/DateIntervalFormatTest.java
index d14710c..7adad72 100644
--- a/luni/src/test/java/libcore/icu/DateIntervalFormatTest.java
+++ b/luni/src/test/java/libcore/icu/DateIntervalFormatTest.java
@@ -20,7 +20,8 @@
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
 
-import static libcore.icu.DateIntervalFormat.*;
+import static libcore.icu.DateIntervalFormat.formatDateRange;
+import static libcore.icu.DateUtilsBridge.*;
 
 public class DateIntervalFormatTest extends junit.framework.TestCase {
   private static final long MINUTE = 60 * 1000;
diff --git a/luni/src/test/java/libcore/icu/RelativeDateTimeFormatterTest.java b/luni/src/test/java/libcore/icu/RelativeDateTimeFormatterTest.java
index 0b7f8c3..101896f 100644
--- a/luni/src/test/java/libcore/icu/RelativeDateTimeFormatterTest.java
+++ b/luni/src/test/java/libcore/icu/RelativeDateTimeFormatterTest.java
@@ -16,22 +16,25 @@
 
 package libcore.icu;
 
+import android.icu.util.ULocale;
+
 import java.util.Calendar;
 import java.util.Locale;
 import java.util.TimeZone;
-import static libcore.icu.RelativeDateTimeFormatter.getRelativeDateTimeString;
-import static libcore.icu.RelativeDateTimeFormatter.getRelativeTimeSpanString;
-import static libcore.icu.RelativeDateTimeFormatter.FORMAT_ABBREV_ALL;
-import static libcore.icu.RelativeDateTimeFormatter.FORMAT_ABBREV_RELATIVE;
-import static libcore.icu.RelativeDateTimeFormatter.FORMAT_NUMERIC_DATE;
-import static libcore.icu.RelativeDateTimeFormatter.FORMAT_NO_YEAR;
-import static libcore.icu.RelativeDateTimeFormatter.FORMAT_SHOW_YEAR;
-import static libcore.icu.RelativeDateTimeFormatter.SECOND_IN_MILLIS;
-import static libcore.icu.RelativeDateTimeFormatter.MINUTE_IN_MILLIS;
-import static libcore.icu.RelativeDateTimeFormatter.HOUR_IN_MILLIS;
+
+import static libcore.icu.DateUtilsBridge.FORMAT_ABBREV_ALL;
+import static libcore.icu.DateUtilsBridge.FORMAT_ABBREV_RELATIVE;
+import static libcore.icu.DateUtilsBridge.FORMAT_NO_YEAR;
+import static libcore.icu.DateUtilsBridge.FORMAT_NUMERIC_DATE;
+import static libcore.icu.DateUtilsBridge.FORMAT_SHOW_YEAR;
 import static libcore.icu.RelativeDateTimeFormatter.DAY_IN_MILLIS;
+import static libcore.icu.RelativeDateTimeFormatter.HOUR_IN_MILLIS;
+import static libcore.icu.RelativeDateTimeFormatter.MINUTE_IN_MILLIS;
+import static libcore.icu.RelativeDateTimeFormatter.SECOND_IN_MILLIS;
 import static libcore.icu.RelativeDateTimeFormatter.WEEK_IN_MILLIS;
 import static libcore.icu.RelativeDateTimeFormatter.YEAR_IN_MILLIS;
+import static libcore.icu.RelativeDateTimeFormatter.getRelativeDateTimeString;
+import static libcore.icu.RelativeDateTimeFormatter.getRelativeTimeSpanString;
 
 public class RelativeDateTimeFormatterTest extends junit.framework.TestCase {
 
@@ -47,19 +50,19 @@
     assertEquals("0 minutes ago",
                  getRelativeTimeSpanString(en_US, tz, baseTime - SECOND_IN_MILLIS, baseTime,
                                            MINUTE_IN_MILLIS, 0));
-    assertEquals("in 0 minutes",
+    assertEquals("In 0 minutes",
                  getRelativeTimeSpanString(en_US, tz, baseTime + SECOND_IN_MILLIS, baseTime,
                                            MINUTE_IN_MILLIS, 0));
 
     assertEquals("1 minute ago",
                  getRelativeTimeSpanString(en_US, tz, 0, MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, 0));
-    assertEquals("in 1 minute",
+    assertEquals("In 1 minute",
                  getRelativeTimeSpanString(en_US, tz, MINUTE_IN_MILLIS, 0, MINUTE_IN_MILLIS, 0));
 
     assertEquals("42 minutes ago",
       getRelativeTimeSpanString(en_US, tz, baseTime - 42 * MINUTE_IN_MILLIS, baseTime,
                                 MINUTE_IN_MILLIS, 0));
-    assertEquals("in 42 minutes",
+    assertEquals("In 42 minutes",
       getRelativeTimeSpanString(en_US, tz, baseTime + 42 * MINUTE_IN_MILLIS, baseTime,
                                 MINUTE_IN_MILLIS, 0));
 
@@ -67,17 +70,17 @@
     assertEquals("2 hours ago",
                  getRelativeTimeSpanString(en_US, tz, baseTime - TWO_HOURS_IN_MS, baseTime,
                                            MINUTE_IN_MILLIS, FORMAT_NUMERIC_DATE));
-    assertEquals("in 2 hours",
+    assertEquals("In 2 hours",
                  getRelativeTimeSpanString(en_US, tz, baseTime + TWO_HOURS_IN_MS, baseTime,
                                            MINUTE_IN_MILLIS, FORMAT_NUMERIC_DATE));
 
-    assertEquals("in 42 min.",
+    assertEquals("In 42 min.",
                  getRelativeTimeSpanString(en_US, tz, baseTime + (42 * MINUTE_IN_MILLIS), baseTime,
                                            MINUTE_IN_MILLIS, FORMAT_ABBREV_RELATIVE));
 
     assertEquals("Tomorrow",
                  getRelativeTimeSpanString(en_US, tz, DAY_IN_MILLIS, 0, DAY_IN_MILLIS, 0));
-    assertEquals("in 2 days",
+    assertEquals("In 2 days",
                  getRelativeTimeSpanString(en_US, tz, 2 * DAY_IN_MILLIS, 0, DAY_IN_MILLIS, 0));
     assertEquals("Yesterday",
                  getRelativeTimeSpanString(en_US, tz, 0, DAY_IN_MILLIS, DAY_IN_MILLIS, 0));
@@ -115,46 +118,46 @@
   public void test_getRelativeTimeSpanString() throws Exception {
 
     test_getRelativeTimeSpanString_helper(0 * SECOND_IN_MILLIS, 0, "0 seconds ago", "0 seconds ago");
-    test_getRelativeTimeSpanString_helper(1 * MINUTE_IN_MILLIS, 0, "1 minute ago", "in 1 minute");
-    test_getRelativeTimeSpanString_helper(1 * MINUTE_IN_MILLIS, 0, "1 minute ago", "in 1 minute");
-    test_getRelativeTimeSpanString_helper(5 * DAY_IN_MILLIS, 0, "5 days ago", "in 5 days");
+    test_getRelativeTimeSpanString_helper(1 * MINUTE_IN_MILLIS, 0, "1 minute ago", "In 1 minute");
+    test_getRelativeTimeSpanString_helper(1 * MINUTE_IN_MILLIS, 0, "1 minute ago", "In 1 minute");
+    test_getRelativeTimeSpanString_helper(5 * DAY_IN_MILLIS, 0, "5 days ago", "In 5 days");
 
     test_getRelativeTimeSpanString_helper(0 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, "0 seconds ago",
                                           "0 seconds ago");
     test_getRelativeTimeSpanString_helper(1 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, "1 second ago",
-                                          "in 1 second");
+                                          "In 1 second");
     test_getRelativeTimeSpanString_helper(2 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, "2 seconds ago",
-                                          "in 2 seconds");
+                                          "In 2 seconds");
     test_getRelativeTimeSpanString_helper(25 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, "25 seconds ago",
-                                          "in 25 seconds");
+                                          "In 25 seconds");
     test_getRelativeTimeSpanString_helper(75 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, "1 minute ago",
-                                          "in 1 minute");
+                                          "In 1 minute");
     test_getRelativeTimeSpanString_helper(5000 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, "1 hour ago",
-                                          "in 1 hour");
+                                          "In 1 hour");
 
     test_getRelativeTimeSpanString_helper(0 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, "0 minutes ago",
                                           "0 minutes ago");
     test_getRelativeTimeSpanString_helper(1 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, "1 minute ago",
-                                          "in 1 minute");
+                                          "In 1 minute");
     test_getRelativeTimeSpanString_helper(2 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, "2 minutes ago",
-                                          "in 2 minutes");
+                                          "In 2 minutes");
     test_getRelativeTimeSpanString_helper(25 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, "25 minutes ago",
-                                          "in 25 minutes");
+                                          "In 25 minutes");
     test_getRelativeTimeSpanString_helper(75 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, "1 hour ago",
-                                          "in 1 hour");
+                                          "In 1 hour");
     test_getRelativeTimeSpanString_helper(720 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, "12 hours ago",
-                                          "in 12 hours");
+                                          "In 12 hours");
 
     test_getRelativeTimeSpanString_helper(0 * HOUR_IN_MILLIS, HOUR_IN_MILLIS, "0 hours ago",
                                           "0 hours ago");
     test_getRelativeTimeSpanString_helper(1 * HOUR_IN_MILLIS, HOUR_IN_MILLIS, "1 hour ago",
-                                          "in 1 hour");
+                                          "In 1 hour");
     test_getRelativeTimeSpanString_helper(2 * HOUR_IN_MILLIS, HOUR_IN_MILLIS, "2 hours ago",
-                                          "in 2 hours");
+                                          "In 2 hours");
     test_getRelativeTimeSpanString_helper(5 * HOUR_IN_MILLIS, HOUR_IN_MILLIS, "5 hours ago",
-                                          "in 5 hours");
+                                          "In 5 hours");
     test_getRelativeTimeSpanString_helper(20 * HOUR_IN_MILLIS, HOUR_IN_MILLIS, "20 hours ago",
-                                          "in 20 hours");
+                                          "In 20 hours");
 
     test_getRelativeTimeSpanString_helper(0 * DAY_IN_MILLIS, DAY_IN_MILLIS, "Today", "Today");
     test_getRelativeTimeSpanString_helper(20 * HOUR_IN_MILLIS, DAY_IN_MILLIS, "Yesterday",
@@ -162,68 +165,68 @@
     test_getRelativeTimeSpanString_helper(24 * HOUR_IN_MILLIS, DAY_IN_MILLIS, "Yesterday",
                                           "Tomorrow");
     test_getRelativeTimeSpanString_helper(2 * DAY_IN_MILLIS, DAY_IN_MILLIS, "2 days ago",
-                                          "in 2 days");
+                                          "In 2 days");
     test_getRelativeTimeSpanString_helper(25 * DAY_IN_MILLIS, DAY_IN_MILLIS, "January 11",
                                           "March 2");
 
     test_getRelativeTimeSpanString_helper(0 * WEEK_IN_MILLIS, WEEK_IN_MILLIS, "0 weeks ago",
                                           "0 weeks ago");
     test_getRelativeTimeSpanString_helper(1 * WEEK_IN_MILLIS, WEEK_IN_MILLIS, "1 week ago",
-                                          "in 1 week");
+                                          "In 1 week");
     test_getRelativeTimeSpanString_helper(2 * WEEK_IN_MILLIS, WEEK_IN_MILLIS, "2 weeks ago",
-                                          "in 2 weeks");
+                                          "In 2 weeks");
     test_getRelativeTimeSpanString_helper(25 * WEEK_IN_MILLIS, WEEK_IN_MILLIS, "25 weeks ago",
-                                          "in 25 weeks");
+                                          "In 25 weeks");
 
     // duration >= minResolution
     test_getRelativeTimeSpanString_helper(30 * SECOND_IN_MILLIS, 0, "30 seconds ago",
-                                          "in 30 seconds");
+                                          "In 30 seconds");
     test_getRelativeTimeSpanString_helper(30 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS,
-                                          "30 minutes ago", "in 30 minutes");
+                                          "30 minutes ago", "In 30 minutes");
     test_getRelativeTimeSpanString_helper(30 * HOUR_IN_MILLIS, MINUTE_IN_MILLIS, "Yesterday",
                                           "Tomorrow");
     test_getRelativeTimeSpanString_helper(5 * DAY_IN_MILLIS, MINUTE_IN_MILLIS, "5 days ago",
-                                          "in 5 days");
+                                          "In 5 days");
     test_getRelativeTimeSpanString_helper(30 * WEEK_IN_MILLIS, MINUTE_IN_MILLIS, "July 10, 2014",
                                           "September 3");
     test_getRelativeTimeSpanString_helper(5 * 365 * DAY_IN_MILLIS, MINUTE_IN_MILLIS,
                                           "February 6, 2010", "February 4, 2020");
 
     test_getRelativeTimeSpanString_helper(60 * SECOND_IN_MILLIS, MINUTE_IN_MILLIS, "1 minute ago",
-                                          "in 1 minute");
+                                          "In 1 minute");
     test_getRelativeTimeSpanString_helper(120 * SECOND_IN_MILLIS - 1, MINUTE_IN_MILLIS,
-                                          "1 minute ago", "in 1 minute");
+                                          "1 minute ago", "In 1 minute");
     test_getRelativeTimeSpanString_helper(60 * MINUTE_IN_MILLIS, HOUR_IN_MILLIS, "1 hour ago",
-                                          "in 1 hour");
+                                          "In 1 hour");
     test_getRelativeTimeSpanString_helper(120 * MINUTE_IN_MILLIS - 1, HOUR_IN_MILLIS, "1 hour ago",
-                                          "in 1 hour");
+                                          "In 1 hour");
     test_getRelativeTimeSpanString_helper(2 * HOUR_IN_MILLIS, DAY_IN_MILLIS, "Today", "Today");
     test_getRelativeTimeSpanString_helper(12 * HOUR_IN_MILLIS, DAY_IN_MILLIS, "Yesterday",
                                           "Today");
     test_getRelativeTimeSpanString_helper(24 * HOUR_IN_MILLIS, DAY_IN_MILLIS, "Yesterday",
                                           "Tomorrow");
     test_getRelativeTimeSpanString_helper(48 * HOUR_IN_MILLIS, DAY_IN_MILLIS, "2 days ago",
-                                          "in 2 days");
+                                          "In 2 days");
     test_getRelativeTimeSpanString_helper(45 * HOUR_IN_MILLIS, DAY_IN_MILLIS, "2 days ago",
-                                          "in 2 days");
+                                          "In 2 days");
     test_getRelativeTimeSpanString_helper(7 * DAY_IN_MILLIS, WEEK_IN_MILLIS, "1 week ago",
-                                          "in 1 week");
+                                          "In 1 week");
     test_getRelativeTimeSpanString_helper(14 * DAY_IN_MILLIS - 1, WEEK_IN_MILLIS, "1 week ago",
-                                          "in 1 week");
+                                          "In 1 week");
 
     // duration < minResolution
     test_getRelativeTimeSpanString_helper(59 * SECOND_IN_MILLIS, MINUTE_IN_MILLIS, "0 minutes ago",
-                                          "in 0 minutes");
+                                          "In 0 minutes");
     test_getRelativeTimeSpanString_helper(59 * MINUTE_IN_MILLIS, HOUR_IN_MILLIS, "0 hours ago",
-                                          "in 0 hours");
+                                          "In 0 hours");
     test_getRelativeTimeSpanString_helper(HOUR_IN_MILLIS - 1, HOUR_IN_MILLIS, "0 hours ago",
-                                          "in 0 hours");
+                                          "In 0 hours");
     test_getRelativeTimeSpanString_helper(DAY_IN_MILLIS - 1, DAY_IN_MILLIS, "Yesterday",
                                           "Tomorrow");
     test_getRelativeTimeSpanString_helper(20 * SECOND_IN_MILLIS, WEEK_IN_MILLIS, "0 weeks ago",
-                                          "in 0 weeks");
+                                          "In 0 weeks");
     test_getRelativeTimeSpanString_helper(WEEK_IN_MILLIS - 1, WEEK_IN_MILLIS, "0 weeks ago",
-                                          "in 0 weeks");
+                                          "In 0 weeks");
   }
 
   public void test_getRelativeTimeSpanStringAbbrev() throws Exception {
@@ -232,45 +235,45 @@
     test_getRelativeTimeSpanString_helper(0 * SECOND_IN_MILLIS, 0, flags, "0 sec. ago",
                                           "0 sec. ago");
     test_getRelativeTimeSpanString_helper(1 * MINUTE_IN_MILLIS, 0, flags, "1 min. ago",
-                                          "in 1 min.");
-    test_getRelativeTimeSpanString_helper(5 * DAY_IN_MILLIS, 0, flags, "5 days ago", "in 5 days");
+                                          "In 1 min.");
+    test_getRelativeTimeSpanString_helper(5 * DAY_IN_MILLIS, 0, flags, "5 days ago", "In 5 days");
 
     test_getRelativeTimeSpanString_helper(0 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, flags,
                                           "0 sec. ago", "0 sec. ago");
     test_getRelativeTimeSpanString_helper(1 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, flags,
-                                          "1 sec. ago", "in 1 sec.");
+                                          "1 sec. ago", "In 1 sec.");
     test_getRelativeTimeSpanString_helper(2 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, flags,
-                                          "2 sec. ago", "in 2 sec.");
+                                          "2 sec. ago", "In 2 sec.");
     test_getRelativeTimeSpanString_helper(25 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, flags,
-                                          "25 sec. ago", "in 25 sec.");
+                                          "25 sec. ago", "In 25 sec.");
     test_getRelativeTimeSpanString_helper(75 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, flags,
-                                          "1 min. ago", "in 1 min.");
+                                          "1 min. ago", "In 1 min.");
     test_getRelativeTimeSpanString_helper(5000 * SECOND_IN_MILLIS, SECOND_IN_MILLIS, flags,
-                                          "1 hr. ago", "in 1 hr.");
+                                          "1 hr. ago", "In 1 hr.");
 
     test_getRelativeTimeSpanString_helper(0 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, flags,
                                           "0 min. ago", "0 min. ago");
     test_getRelativeTimeSpanString_helper(1 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, flags,
-                                          "1 min. ago", "in 1 min.");
+                                          "1 min. ago", "In 1 min.");
     test_getRelativeTimeSpanString_helper(2 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, flags,
-                                          "2 min. ago", "in 2 min.");
+                                          "2 min. ago", "In 2 min.");
     test_getRelativeTimeSpanString_helper(25 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, flags,
-                                          "25 min. ago", "in 25 min.");
+                                          "25 min. ago", "In 25 min.");
     test_getRelativeTimeSpanString_helper(75 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, flags,
-                                          "1 hr. ago", "in 1 hr.");
+                                          "1 hr. ago", "In 1 hr.");
     test_getRelativeTimeSpanString_helper(720 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, flags,
-                                          "12 hr. ago", "in 12 hr.");
+                                          "12 hr. ago", "In 12 hr.");
 
     test_getRelativeTimeSpanString_helper(0 * HOUR_IN_MILLIS, HOUR_IN_MILLIS, flags,
                                           "0 hr. ago", "0 hr. ago");
     test_getRelativeTimeSpanString_helper(1 * HOUR_IN_MILLIS, HOUR_IN_MILLIS, flags,
-                                          "1 hr. ago", "in 1 hr.");
+                                          "1 hr. ago", "In 1 hr.");
     test_getRelativeTimeSpanString_helper(2 * HOUR_IN_MILLIS, HOUR_IN_MILLIS, flags,
-                                          "2 hr. ago", "in 2 hr.");
+                                          "2 hr. ago", "In 2 hr.");
     test_getRelativeTimeSpanString_helper(5 * HOUR_IN_MILLIS, HOUR_IN_MILLIS, flags,
-                                          "5 hr. ago", "in 5 hr.");
+                                          "5 hr. ago", "In 5 hr.");
     test_getRelativeTimeSpanString_helper(20 * HOUR_IN_MILLIS, HOUR_IN_MILLIS, flags,
-                                          "20 hr. ago", "in 20 hr.");
+                                          "20 hr. ago", "In 20 hr.");
 
     test_getRelativeTimeSpanString_helper(0 * DAY_IN_MILLIS, DAY_IN_MILLIS, flags, "Today",
                                           "Today");
@@ -279,41 +282,41 @@
     test_getRelativeTimeSpanString_helper(24 * HOUR_IN_MILLIS, DAY_IN_MILLIS, flags,
                                           "Yesterday", "Tomorrow");
     test_getRelativeTimeSpanString_helper(2 * DAY_IN_MILLIS, DAY_IN_MILLIS, flags,
-                                          "2 days ago", "in 2 days");
+                                          "2 days ago", "In 2 days");
     test_getRelativeTimeSpanString_helper(25 * DAY_IN_MILLIS, DAY_IN_MILLIS, flags,
                                           "January 11", "March 2");
 
     test_getRelativeTimeSpanString_helper(0 * WEEK_IN_MILLIS, WEEK_IN_MILLIS, flags,
                                           "0 wk. ago", "0 wk. ago");
     test_getRelativeTimeSpanString_helper(1 * WEEK_IN_MILLIS, WEEK_IN_MILLIS, flags,
-                                          "1 wk. ago", "in 1 wk.");
+                                          "1 wk. ago", "In 1 wk.");
     test_getRelativeTimeSpanString_helper(2 * WEEK_IN_MILLIS, WEEK_IN_MILLIS, flags,
-                                          "2 wk. ago", "in 2 wk.");
+                                          "2 wk. ago", "In 2 wk.");
     test_getRelativeTimeSpanString_helper(25 * WEEK_IN_MILLIS, WEEK_IN_MILLIS, flags,
-                                          "25 wk. ago", "in 25 wk.");
+                                          "25 wk. ago", "In 25 wk.");
 
     // duration >= minResolution
     test_getRelativeTimeSpanString_helper(30 * SECOND_IN_MILLIS, 0, flags, "30 sec. ago",
-                                          "in 30 sec.");
+                                          "In 30 sec.");
     test_getRelativeTimeSpanString_helper(30 * MINUTE_IN_MILLIS, MINUTE_IN_MILLIS, flags,
-                                          "30 min. ago", "in 30 min.");
+                                          "30 min. ago", "In 30 min.");
     test_getRelativeTimeSpanString_helper(30 * HOUR_IN_MILLIS, MINUTE_IN_MILLIS, flags,
                                           "Yesterday", "Tomorrow");
     test_getRelativeTimeSpanString_helper(5 * DAY_IN_MILLIS, MINUTE_IN_MILLIS, flags,
-                                          "5 days ago", "in 5 days");
+                                          "5 days ago", "In 5 days");
     test_getRelativeTimeSpanString_helper(30 * WEEK_IN_MILLIS, MINUTE_IN_MILLIS, flags,
                                           "July 10, 2014", "September 3");
     test_getRelativeTimeSpanString_helper(5 * 365 * DAY_IN_MILLIS, MINUTE_IN_MILLIS, flags,
                                           "February 6, 2010", "February 4, 2020");
 
     test_getRelativeTimeSpanString_helper(60 * SECOND_IN_MILLIS, MINUTE_IN_MILLIS, flags,
-                                          "1 min. ago", "in 1 min.");
+                                          "1 min. ago", "In 1 min.");
     test_getRelativeTimeSpanString_helper(120 * SECOND_IN_MILLIS - 1, MINUTE_IN_MILLIS, flags,
-                                          "1 min. ago", "in 1 min.");
+                                          "1 min. ago", "In 1 min.");
     test_getRelativeTimeSpanString_helper(60 * MINUTE_IN_MILLIS, HOUR_IN_MILLIS, flags,
-                                          "1 hr. ago", "in 1 hr.");
+                                          "1 hr. ago", "In 1 hr.");
     test_getRelativeTimeSpanString_helper(120 * MINUTE_IN_MILLIS - 1, HOUR_IN_MILLIS, flags,
-                                          "1 hr. ago", "in 1 hr.");
+                                          "1 hr. ago", "In 1 hr.");
     test_getRelativeTimeSpanString_helper(2 * HOUR_IN_MILLIS, DAY_IN_MILLIS, flags, "Today",
                                           "Today");
     test_getRelativeTimeSpanString_helper(12 * HOUR_IN_MILLIS, DAY_IN_MILLIS, flags,
@@ -321,27 +324,27 @@
     test_getRelativeTimeSpanString_helper(24 * HOUR_IN_MILLIS, DAY_IN_MILLIS, flags,
                                           "Yesterday", "Tomorrow");
     test_getRelativeTimeSpanString_helper(48 * HOUR_IN_MILLIS, DAY_IN_MILLIS, flags,
-                                          "2 days ago", "in 2 days");
+                                          "2 days ago", "In 2 days");
     test_getRelativeTimeSpanString_helper(45 * HOUR_IN_MILLIS, DAY_IN_MILLIS, flags,
-                                          "2 days ago", "in 2 days");
+                                          "2 days ago", "In 2 days");
     test_getRelativeTimeSpanString_helper(7 * DAY_IN_MILLIS, WEEK_IN_MILLIS, flags,
-                                          "1 wk. ago", "in 1 wk.");
+                                          "1 wk. ago", "In 1 wk.");
     test_getRelativeTimeSpanString_helper(14 * DAY_IN_MILLIS - 1, WEEK_IN_MILLIS, flags,
-                                          "1 wk. ago", "in 1 wk.");
+                                          "1 wk. ago", "In 1 wk.");
 
     // duration < minResolution
     test_getRelativeTimeSpanString_helper(59 * SECOND_IN_MILLIS, MINUTE_IN_MILLIS, flags,
-                                          "0 min. ago", "in 0 min.");
+                                          "0 min. ago", "In 0 min.");
     test_getRelativeTimeSpanString_helper(59 * MINUTE_IN_MILLIS, HOUR_IN_MILLIS, flags,
-                                          "0 hr. ago", "in 0 hr.");
+                                          "0 hr. ago", "In 0 hr.");
     test_getRelativeTimeSpanString_helper(HOUR_IN_MILLIS - 1, HOUR_IN_MILLIS, flags,
-                                          "0 hr. ago", "in 0 hr.");
+                                          "0 hr. ago", "In 0 hr.");
     test_getRelativeTimeSpanString_helper(DAY_IN_MILLIS - 1, DAY_IN_MILLIS, flags,
                                           "Yesterday", "Tomorrow");
     test_getRelativeTimeSpanString_helper(20 * SECOND_IN_MILLIS, WEEK_IN_MILLIS, flags,
-                                          "0 wk. ago", "in 0 wk.");
+                                          "0 wk. ago", "In 0 wk.");
     test_getRelativeTimeSpanString_helper(WEEK_IN_MILLIS - 1, WEEK_IN_MILLIS, flags,
-                                          "0 wk. ago", "in 0 wk.");
+                                          "0 wk. ago", "In 0 wk.");
 
   }
 
@@ -358,21 +361,21 @@
     final long now = cal.getTimeInMillis();
 
     // 42 minutes ago
-    assertEquals("vor 42 Minuten", getRelativeTimeSpanString(de_DE, tz,
+    assertEquals("Vor 42 Minuten", getRelativeTimeSpanString(de_DE, tz,
         now - 42 * MINUTE_IN_MILLIS, now, MINUTE_IN_MILLIS, 0));
-    // in 42 minutes
-    assertEquals("in 42 Minuten", getRelativeTimeSpanString(de_DE, tz,
+    // In 42 minutes
+    assertEquals("In 42 Minuten", getRelativeTimeSpanString(de_DE, tz,
         now + 42 * MINUTE_IN_MILLIS, now, MINUTE_IN_MILLIS, 0));
-    // yesterday
+    // Yesterday
     assertEquals("Gestern", getRelativeTimeSpanString(de_DE, tz,
         now - DAY_IN_MILLIS, now, DAY_IN_MILLIS, 0));
-    // the day before yesterday
+    // The day before yesterday
     assertEquals("Vorgestern", getRelativeTimeSpanString(de_DE, tz,
         now - 2 * DAY_IN_MILLIS, now, DAY_IN_MILLIS, 0));
-    // tomorrow
+    // Tomorrow
     assertEquals("Morgen", getRelativeTimeSpanString(de_DE, tz,
         now + DAY_IN_MILLIS, now, DAY_IN_MILLIS, 0));
-    // the day after tomorrow
+    // The day after tomorrow
     assertEquals("Übermorgen", getRelativeTimeSpanString(de_DE, tz,
         now + 2 * DAY_IN_MILLIS, now, DAY_IN_MILLIS, 0));
   }
@@ -386,21 +389,21 @@
     final long now = cal.getTimeInMillis();
 
     // 42 minutes ago
-    assertEquals("il y a 42 minutes", getRelativeTimeSpanString(fr_FR, tz,
+    assertEquals("Il y a 42 minutes", getRelativeTimeSpanString(fr_FR, tz,
         now - (42 * MINUTE_IN_MILLIS), now, MINUTE_IN_MILLIS, 0));
-    // in 42 minutes
-    assertEquals("dans 42 minutes", getRelativeTimeSpanString(fr_FR, tz,
+    // In 42 minutes
+    assertEquals("Dans 42 minutes", getRelativeTimeSpanString(fr_FR, tz,
         now + (42 * MINUTE_IN_MILLIS), now, MINUTE_IN_MILLIS, 0));
-    // yesterday
+    // Yesterday
     assertEquals("Hier", getRelativeTimeSpanString(fr_FR, tz,
         now - DAY_IN_MILLIS, now, DAY_IN_MILLIS, 0));
-    // the day before yesterday
+    // The day before yesterday
     assertEquals("Avant-hier", getRelativeTimeSpanString(fr_FR, tz,
         now - 2 * DAY_IN_MILLIS, now, DAY_IN_MILLIS, 0));
-    // tomorrow
+    // Tomorrow
     assertEquals("Demain", getRelativeTimeSpanString(fr_FR, tz,
         now + DAY_IN_MILLIS, now, DAY_IN_MILLIS, 0));
-    // the day after tomorrow
+    // The day after tomorrow
     assertEquals("Après-demain", getRelativeTimeSpanString(fr_FR, tz,
         now + 2 * DAY_IN_MILLIS, now, DAY_IN_MILLIS, 0));
   }
@@ -474,10 +477,10 @@
                  getRelativeDateTimeString(en_US, tz, base - 5 * HOUR_IN_MILLIS, base, 0,
                                            WEEK_IN_MILLIS, 0));
 
-    // 1 hour after 2:00 AM should be formatted as 'in 1 hour, 4:00 AM'.
+    // 1 hour after 2:00 AM should be formatted as 'In 1 hour, 4:00 AM'.
     cal.set(2014, Calendar.MARCH, 9, 2, 0, 0);
     base = cal.getTimeInMillis();
-    assertEquals("in 1 hour, 4:00 AM",
+    assertEquals("In 1 hour, 4:00 AM",
                  getRelativeDateTimeString(en_US, tz, base + 1 * HOUR_IN_MILLIS, base, 0,
                                            WEEK_IN_MILLIS, 0));
 
@@ -491,16 +494,16 @@
 
     cal.set(2014, Calendar.NOVEMBER, 2, 0, 45, 0);
     base = cal.getTimeInMillis();
-    // 45 minutes after 0:45 AM should be 'in 45 minutes, 1:30 AM'.
-    assertEquals("in 45 minutes, 1:30 AM",
+    // 45 minutes after 0:45 AM should be 'In 45 minutes, 1:30 AM'.
+    assertEquals("In 45 minutes, 1:30 AM",
                  getRelativeDateTimeString(en_US, tz, base + 45 * MINUTE_IN_MILLIS, base, 0,
                                            WEEK_IN_MILLIS, 0));
-    // 45 minutes later, it should be 'in 45 minutes, 1:15 AM'.
-    assertEquals("in 45 minutes, 1:15 AM",
+    // 45 minutes later, it should be 'In 45 minutes, 1:15 AM'.
+    assertEquals("In 45 minutes, 1:15 AM",
                  getRelativeDateTimeString(en_US, tz, base + 90 * MINUTE_IN_MILLIS,
                                            base + 45 * MINUTE_IN_MILLIS, 0, WEEK_IN_MILLIS, 0));
-    // Another 45 minutes later, it should be 'in 45 minutes, 2:00 AM'.
-    assertEquals("in 45 minutes, 2:00 AM",
+    // Another 45 minutes later, it should be 'In 45 minutes, 2:00 AM'.
+    assertEquals("In 45 minutes, 2:00 AM",
                  getRelativeDateTimeString(en_US, tz, base + 135 * MINUTE_IN_MILLIS,
                                            base + 90 * MINUTE_IN_MILLIS, 0, WEEK_IN_MILLIS, 0));
   }
@@ -596,7 +599,7 @@
     Calendar twoDaysLaterCalendar1 = Calendar.getInstance(tz, en_US);
     twoDaysLaterCalendar1.set(2011, Calendar.SEPTEMBER, 4, 10, 22, 0);
     long twoDaysLater1 = twoDaysLaterCalendar1.getTimeInMillis();
-    assertEquals("in 2 days, 10:22 AM",
+    assertEquals("In 2 days, 10:22 AM",
                  getRelativeDateTimeString(en_US, tz, twoDaysLater1, now, MINUTE_IN_MILLIS,
                                            WEEK_IN_MILLIS, 0));
 
@@ -604,7 +607,7 @@
     Calendar twoDaysLaterCalendar2 = Calendar.getInstance(tz, en_US);
     twoDaysLaterCalendar2.set(2011, Calendar.SEPTEMBER, 4, 10, 24, 0);
     long twoDaysLater2 = twoDaysLaterCalendar2.getTimeInMillis();
-    assertEquals("in 2 days, 10:24 AM",
+    assertEquals("In 2 days, 10:24 AM",
                  getRelativeDateTimeString(en_US, tz, twoDaysLater2, now, MINUTE_IN_MILLIS,
                                            WEEK_IN_MILLIS, 0));
   }
diff --git a/luni/src/test/java/libcore/java/net/SocketTest.java b/luni/src/test/java/libcore/java/net/SocketTest.java
index fb09be0..9765a45 100644
--- a/luni/src/test/java/libcore/java/net/SocketTest.java
+++ b/luni/src/test/java/libcore/java/net/SocketTest.java
@@ -31,9 +31,11 @@
 import java.nio.channels.ServerSocketChannel;
 import java.nio.channels.SocketChannel;
 import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 
 public class SocketTest extends junit.framework.TestCase {
     // See http://b/2980559.
@@ -353,6 +355,37 @@
         assertEquals(boundAddress.getPort(), localAddressAfterClose.getPort());
     }
 
+    public void testCloseDuringConnect() throws Exception {
+        final CountDownLatch signal = new CountDownLatch(1);
+
+        final Socket s = new Socket();
+        new Thread() {
+            @Override
+            public void run() {
+                try {
+                    // This address is reserved for documentation: should never be reachable.
+                    InetSocketAddress unreachableIp = new InetSocketAddress("192.0.2.0", 80);
+                    // This should never return.
+                    s.connect(unreachableIp, 0 /* infinite */);
+                    fail("Connect returned unexpectedly for: " + unreachableIp);
+                } catch (SocketException expected) {
+                    assertTrue(expected.getMessage().contains("Socket closed"));
+                    signal.countDown();
+                } catch (IOException e) {
+                    fail("Unexpected exception: " + e);
+                }
+            }
+        }.start();
+
+        // Wait for the connect() thread to run and start connect()
+        Thread.sleep(2000);
+
+        s.close();
+
+        boolean connectUnblocked = signal.await(2000, TimeUnit.MILLISECONDS);
+        assertTrue(connectUnblocked);
+    }
+
     static class MockServer {
         private ExecutorService executor;
         private ServerSocket serverSocket;