diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py
index f866564..295e006 100755
--- a/tools/archive_desugar_jdk_libs.py
+++ b/tools/archive_desugar_jdk_libs.py
@@ -48,16 +48,16 @@
   return (options, args)
 
 
-def GetVersion():
-  with open(VERSION_FILE, 'r') as version_file:
+def GetVersion(version_file_name):
+  with open(version_file_name, 'r') as version_file:
     lines = [line.strip() for line in version_file.readlines()]
     lines = [line for line in lines if not line.startswith('#')]
     if len(lines) != 1:
       raise Exception('Version file '
-          + VERSION_FILE + ' is expected to have exactly one line')
+          + version_file + ' is expected to have exactly one line')
     version = lines[0].strip()
     utils.check_basic_semver_version(
-        version, 'in version file ' + VERSION_FILE)
+        version, 'in version file ' + version_file_name)
     return version
 
 
@@ -106,7 +106,7 @@
       'https://github.com/'
           + options.github_account + '/' + LIBRARY_NAME, checkout_dir)
     with utils.ChangedWorkingDirectory(checkout_dir):
-      version = GetVersion()
+      version = GetVersion(VERSION_FILE)
 
       destination = archive.GetVersionDestination(
           'gs://', LIBRARY_NAME + '/' + version, is_master)
diff --git a/tools/r8_release.py b/tools/r8_release.py
index 366b908..b576168 100755
--- a/tools/r8_release.py
+++ b/tools/r8_release.py
@@ -15,6 +15,7 @@
 import xml.etree.ElementTree as et
 import zipfile
 
+import archive_desugar_jdk_libs
 import update_prebuilds_in_android
 import utils
 
@@ -28,6 +29,7 @@
 DESUGAR_JDK_LIBS_CONFIGURATION = DESUGAR_JDK_LIBS + '_configuration'
 ANDROID_TOOLS_PACKAGE = 'com.android.tools'
 
+GITHUB_DESUGAR_JDK_LIBS = 'https://github.com/google/desugar_jdk_libs'
 
 def prepare_release(args):
   if args.version:
@@ -297,9 +299,7 @@
   assert args.version
   # Check if an existing client exists.
   if not args.use_existing_work_branch:
-    if ':update-r8:' in subprocess.check_output('g4 myclients', shell=True):
-      print "Remove the existing 'update-r8' client before continuing."
-      sys.exit(1)
+    check_no_google3_client(args, 'update-r8')
 
   def release_google3(options):
     print "Releasing for Google 3"
@@ -417,6 +417,41 @@
   return make_release
 
 
+def prepare_push_desugar_library(args):
+  client_name = 'push-desugar-library'
+  # Check if an existing client exists.
+  check_no_google3_client(args, client_name)
+
+  def push_desugar_library(options):
+    print 'Pushing to %s' % GITHUB_DESUGAR_JDK_LIBS
+
+    google3_base = subprocess.check_output(
+        ['p4', 'g4d', '-f', client_name]).rstrip()
+    third_party_desugar_jdk_libs = \
+        os.path.join(google3_base, 'third_party', 'java_src', 'desugar_jdk_libs')
+    version = archive_desugar_jdk_libs.GetVersion(
+        os.path.join(third_party_desugar_jdk_libs, 'oss', 'VERSION.txt'))
+    if args.push_desugar_library != version:
+      print ("Failed, version of desugared library is %s, but version %s was expected." %
+        (version, args.push_desugar_library))
+      sys.exit(1)
+    with utils.ChangedWorkingDirectory(google3_base):
+      cmd = [
+          'copybara',
+           os.path.join(
+              'third_party',
+              'java_src',
+              'desugar_jdk_libs',
+              'copy.bara.sky'),
+           'push-to-github']
+      if options.dry_run:
+        print "Dry-run, not running '%s'" % ' '.join(cmd)
+      else:
+        subprocess.check_call(cmd)
+
+  return push_desugar_library
+
+
 def download_configuration(hash, archive):
   print
   print 'Downloading %s from GCS' % archive
@@ -445,6 +480,16 @@
   return '%s:%s:%s' % \
       (ANDROID_TOOLS_PACKAGE, DESUGAR_JDK_LIBS_CONFIGURATION, version)
 
+
+def check_no_google3_client(args, client_name):
+  if not args.use_existing_work_branch:
+    clients = subprocess.check_output('g4 myclients', shell=True)
+    if ':%s:' % client_name in clients:
+      print ("Remove the existing '%s' client before continuing, " +
+          "or use option --use-existing-work-branch.") % client_name
+      sys.exit(1)
+
+
 def extract_version_from_pom(pom_file):
     ns = "http://maven.apache.org/POM/4.0.0"
     xml.etree.ElementTree.register_namespace('', ns)
@@ -509,7 +554,7 @@
   cmd = [ADMRT, '--archives']
   cmd.extend(archives)
   cmd.extend(['--action', action])
-  subprocess.check_call()
+  subprocess.check_call(cmd)
 
 
 def branch_change_diff(diff, old_version, new_version):
@@ -639,6 +684,10 @@
   group.add_argument('--version',
                       metavar=('<version>'),
                       help='The new version of R8 (e.g., 1.4.51) to release to selected channels')
+  group.add_argument('--push-desugar-library',
+                      metavar=('<version>'),
+                      help='The expected version of '
+                          + 'com.android.tools:desugar_jdk_libs to push to GitHub')
   group.add_argument('--desugar-library',
                       nargs=2,
                       metavar=('<version>', '<configuration hash>'),
@@ -720,7 +769,8 @@
 
   if (args.google3
       or (args.studio and not args.no_sync)
-      or (args.desugar_library and not args.dry_run)):
+      or (args.desugar_library and not args.dry_run)
+      or (args.push_desugar_library and not args.dry_run)):
     utils.check_prodacces()
 
   if args.google3:
@@ -733,6 +783,9 @@
   if args.desugar_library:
     targets_to_run.append(prepare_desugar_library(args))
 
+  if args.push_desugar_library:
+    targets_to_run.append(prepare_push_desugar_library(args))
+
   final_results = []
   for target_closure in targets_to_run:
     final_results.append(target_closure(args))
