diff --git a/icu4j/build.xml b/icu4j/build.xml
index 7424c7395599..0556595260d7 100644
--- a/icu4j/build.xml
+++ b/icu4j/build.xml
@@ -672,7 +672,7 @@
-
+
@@ -1263,7 +1263,7 @@
-
+
@@ -1281,7 +1281,7 @@
-
+
@@ -1874,6 +1874,7 @@
+
diff --git a/icu4j/main/tests/translit/src/com/ibm/icu/dev/util/ElapsedTimer.java b/icu4j/main/tests/translit/src/com/ibm/icu/dev/util/ElapsedTimer.java
new file mode 100644
index 000000000000..855d798b5a61
--- /dev/null
+++ b/icu4j/main/tests/translit/src/com/ibm/icu/dev/util/ElapsedTimer.java
@@ -0,0 +1,110 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+//
+// ElapsedTimer.java
+//
+// Created by Steven R. Loomis on 11/11/2005.
+// Copyright 2005-2012 IBM. All rights reserved.
+//
+
+package com.ibm.icu.dev.util;
+
+import java.util.Locale;
+
+import com.ibm.icu.text.MessageFormat;
+import com.ibm.icu.text.NumberFormat;
+import com.ibm.icu.text.RuleBasedNumberFormat;
+
+
+/**
+ * Simple stopwatch timer.
+ * Usage: { ElapsedTimer et = new ElapsedTimer();
+ * do_some_stuff;
+ * System.out.println("It took " + et + " to do stuff."); }
+ *
+ * Advanced: { ElapsedTimer et = new ElapsedTimer("Thing2's time: {0}"); // messageformat pattern
+ * do_thing_2();
+ * System.out.println(et.toString()); }
+ *
+ * More advanced: NumberFormat and/or MessageFormat can be provided in the constructor
+ *
+ * @internal CLDR
+ */
+public final class ElapsedTimer {
+
+ /**
+ * Convenience method to print the elasped time (in milliseconds)
+ */
+ public static String elapsedTime(long start, long end) {
+ return diffTime(getFormat(), start, end);
+ }
+
+ public static String elapsedTime(long start) {
+ return diffTime(getFormat(), start, System.currentTimeMillis());
+ }
+
+ // class
+
+ private long startTime = System.currentTimeMillis();
+ private NumberFormat myDurationFormat = null;
+ private MessageFormat myMsgFormat = null;
+
+ public ElapsedTimer() {
+ }
+
+ public ElapsedTimer(MessageFormat aMsgFmt) {
+ myMsgFormat = aMsgFmt;
+ }
+
+ public ElapsedTimer(NumberFormat aNumFmt) {
+ myDurationFormat = aNumFmt;
+ }
+
+ public ElapsedTimer(MessageFormat aMsgFmt, NumberFormat aNumFmt) {
+ myMsgFormat = aMsgFmt;
+ myDurationFormat = aNumFmt;
+ }
+
+ public ElapsedTimer(String pattern) {
+ myMsgFormat = new MessageFormat(pattern);
+ }
+
+ public ElapsedTimer(String pattern, NumberFormat aNumFmt) {
+ myMsgFormat = new MessageFormat(pattern);
+ myDurationFormat = aNumFmt;
+ }
+
+ /**
+ * @return elapsed time in seconds since object creation
+ */
+ public final String toString() {
+ long endTime = System.currentTimeMillis();
+ String duration = diffTime(myDurationFormat, startTime, endTime);
+ if(myMsgFormat == null) {
+ return duration;
+ } else {
+ return myMsgFormat.format(new Object[] {duration});
+ }
+ }
+
+ private static NumberFormat gFormat = null;
+
+ private static NumberFormat getFormat() {
+ if(gFormat == null) {
+ gFormat = new RuleBasedNumberFormat(Locale.US,
+ RuleBasedNumberFormat.DURATION);
+ }
+ return gFormat;
+ }
+
+ private static String diffTime(NumberFormat fmt, long start, long end) {
+ if(fmt==null) {
+ fmt = getFormat();
+ }
+ synchronized(fmt) {
+ long age = end - start;
+ long diff = age/1000; // millis per second. Workaround ticket:7936 by using whole number seconds.
+ return fmt.format(diff);
+ }
+ }
+}