diff --git a/tools/create_maven_release.py b/tools/create_maven_release.py
new file mode 100755
index 0000000..9eb4174
--- /dev/null
+++ b/tools/create_maven_release.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+# Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+# 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 hashlib
+import argparse
+from os import makedirs
+from os.path import join
+from shutil import copyfile, make_archive, rmtree
+import subprocess
+import sys
+from string import Template
+import tempfile
+
+LICENSETEMPLATE = Template(
+"""
+    <license>
+      <name>$name</name>
+      <url>$url</url>
+      <distribution>repo</distribution>
+    </license>""")
+
+POMTEMPLATE = Template(
+"""<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.android.tools</groupId>
+  <artifactId>r8</artifactId>
+  <version>$version</version>
+  <name>D8 dexer and R8 shrinker</name>
+  <description>
+  D8 dexer and R8 shrinker.
+  </description>
+  <url>http://r8.googlesource.com/r8</url>
+  <inceptionYear>2016</inceptionYear>
+  <licenses>
+    <license>
+      <name>BSD-3-Clause</name>
+      <url>https://opensource.org/licenses/BSD-3-Clause</url>
+      <distribution>repo</distribution>
+    </license>$library_licenses
+  <developers>
+    <developer>
+      <name>The Android Open Source Project</name>
+    </developer>
+  </developers>
+  <scm>
+    <connection>
+      https://r8.googlesource.com/r8.git
+    </connection>
+    <url>
+      https://r8.googlesource.com/r8
+    </url>
+  </scm>
+</project>
+""")
+
+def parse_options(argv):
+  result = argparse.ArgumentParser()
+  result.add_argument('--jar', help='jar file to package')
+  result.add_argument('--out', help='directory in which to put the output zip file')
+  return result.parse_args(argv)
+
+def determine_version(jar):
+  cmd = []
+  cmd.append('java')
+  cmd.extend(['-jar', jar]);
+  cmd.append('--version')
+  output = subprocess.check_output(cmd)
+  version_string = output.split()[1]
+  assert version_string.startswith("v")
+  return version_string[1:]
+
+def generate_library_licenses():
+  license_prefix = 'license: '
+  licenses = []
+  license_url_prefix = 'licenseUrl: '
+  license_urls = []
+  with open('LIBRARY-LICENSE', 'r') as file:
+    for line in file:
+      trimmed = line.strip()
+      if trimmed.startswith(license_prefix):
+        // Assert checking that licenses come in name/url pairs.
+        assert len(licenses) == len(license_urls)
+        name = trimmed[len(license_prefix):]
+        if not name in licenses:
+          licenses.append(name)
+      if trimmed.startswith(license_url_prefix):
+        url = trimmed[len(license_url_prefix):]
+        if not url in license_urls:
+          license_urls.append(url)
+        // Assert checking that licenses come in name/url pairs.
+        assert len(licenses) == len(license_urls)
+  result = ''
+  for i in range(len(licenses)):
+    name = licenses[i]
+    url = license_urls[i]
+    result += LICENSETEMPLATE.substitute(name=name, url=url)
+  return result
+
+def write_pom_file(version, pom_file):
+  library_licenses = generate_library_licenses()
+  version_pom = POMTEMPLATE.substitute(version=version, library_licenses=library_licenses)
+  with open(pom_file, 'w') as file:
+    file.write(version_pom)
+
+def hash_for(file, hash):
+  with open(file, 'rb') as f:
+    while True:
+      # Read chunks of 1MB
+      chunk = f.read(2 ** 20)
+      if not chunk:
+        break
+      hash.update(chunk)
+  return hash.hexdigest()
+
+def write_md5_for(file):
+  hexdigest = hash_for(file, hashlib.md5())
+  with (open(file + '.md5', 'w')) as file:
+    file.write(hexdigest)
+
+def write_sha1_for(file):
+  hexdigest = hash_for(file, hashlib.sha1())
+  with (open(file + '.sha1', 'w')) as file:
+    file.write(hexdigest)
+
+def main(argv):
+  options = parse_options(argv)
+  jar = options.jar
+  outdir = options.out
+  if jar == None or outdir == None:
+    print 'Need to supply --jar and --out.'
+    exit(1)
+  # Create directory structure for this version.
+  version = determine_version(jar)
+  tmp_dir = tempfile.mkdtemp()
+  version_dir = join(
+      tmp_dir, 'com', 'google', 'android', 'tools', 'r8', version, 'r8')
+  makedirs(version_dir)
+  # Write the pom file.
+  pom_file = join(version_dir, 'r8-' + version + '.pom')
+  write_pom_file(version, pom_file)
+  # Copy the jar to the output.
+  target_jar = join(version_dir, 'r8-' + version + '.jar')
+  copyfile(jar, target_jar)
+  # Create check sums.
+  write_md5_for(target_jar)
+  write_md5_for(pom_file)
+  write_sha1_for(target_jar)
+  write_sha1_for(pom_file)
+  # Zip it up.
+  make_archive(join(outdir, 'r8'), 'zip', tmp_dir)
+  # Cleanup.
+  rmtree(tmp_dir)
+
+if __name__ == "__main__":
+  exit(main(sys.argv[1:]))
