diff --git a/tools/r8.py b/tools/r8.py
index 31abcf6..6789787 100755
--- a/tools/r8.py
+++ b/tools/r8.py
@@ -3,8 +3,83 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+import optparse
 import sys
+
 import toolhelper
+import utils
+
+def ParseOptions(argv):
+  parser = optparse.OptionParser(usage='%prog [options] -- [R8 options]')
+  parser.add_option(
+      '-c',
+      '--commit-hash',
+      '--commit_hash',
+      help='Commit hash of R8 to use.',
+      default=None)
+  parser.add_argument(
+      '--debug-agent',
+      help='Enable Java debug agent and suspend compilation (default disabled)',
+      default=False,
+      action='store_true')
+  parser.add_option(
+    '--ea',
+    help='Enable Java assertions when running the compiler (default disabled)',
+    default=False,
+    action='store_true')
+  parser.add_option(
+    '--lib-android',
+    help='Add the android.jar for the given API level',
+    default=None,
+    type=int)
+  parser.add_option(
+    '--lib-rt',
+    help='Add rt.jar from openjdk-1.8',
+    default=False,
+    action='store_true')
+  parser.add_option(
+    '--no-build', '--no_build',
+    help='Do not build R8',
+    default=False,
+    action='store_true')
+  parser.add_option(
+    '--print-runtimeraw', '--print_runtimeraw',
+    metavar='BENCHMARKNAME',
+    help='Print the line \'<BENCHMARKNAME>(RunTimeRaw):' +
+         ' <elapsed> ms\' at the end where <elapsed> is' +
+         ' the elapsed time in milliseconds.')
+  parser.add_option(
+      '--tag',
+      help='Tag of R8 to use.',
+      default=None)
+  parser.add_option(
+      '--version',
+      help='Version of R8 to use.',
+      default=None)
+  return parser.parse_args(argv)
+
+def main(argv):
+  (options, args) = ParseOptions(sys.argv)
+  r8_args = args[1:]
+  if options.lib_android:
+    r8_args.extend(['--lib', utils.get_android_jar(options.lib_android)])
+  if options.lib_rt:
+    r8_args.extend(['--lib', utils.RT_JAR])
+  time_consumer = lambda duration : print_duration(duration, options)
+  return toolhelper.run(
+      'r8',
+      r8_args,
+      build=not options.no_build,
+      debug=options.ea,
+      debug_agent=options.debug_agent,
+      jar=utils.find_r8_jar_from_options(options),
+      main='com.android.tools.r8.R8',
+      time_consumer=time_consumer)
+
+def print_duration(duration, options):
+  benchmark_name = options.print_runtimeraw
+  if benchmark_name:
+    print('%s-Total(RunTimeRaw): %s ms' % (benchmark_name, duration))
 
 if __name__ == '__main__':
-  sys.exit(toolhelper.run('r8', sys.argv[1:]))
+  sys.exit(main(sys.argv[1:]))
