diff --git a/tools/Android.mk b/tools/Android.mk
index 274f2f7..10e2453 100644
--- a/tools/Android.mk
+++ b/tools/Android.mk
@@ -19,59 +19,6 @@
 ##################################
 include $(CLEAR_VARS)
 
-LOCAL_MODULE := jack-admin
-LOCAL_SRC_FILES := jack-admin
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_SUFFIX := $(HOST_EXECUTABLE_SUFFIX)
-LOCAL_BUILT_MODULE_STEM := jack-admin$(HOST_EXECUTABLE_SUFFIX)
-LOCAL_IS_HOST_MODULE := true
-
-include $(BUILD_PREBUILT)
-
-##################################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := jack-diagnose
-LOCAL_SRC_FILES := jack-diagnose
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_SUFFIX := $(HOST_EXECUTABLE_SUFFIX)
-LOCAL_BUILT_MODULE_STEM := jack-diagnose$(HOST_EXECUTABLE_SUFFIX)
-LOCAL_IS_HOST_MODULE := true
-
-include $(BUILD_PREBUILT)
-
-##################################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := jack
-LOCAL_SRC_FILES := jack
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_SUFFIX := $(HOST_EXECUTABLE_SUFFIX)
-LOCAL_BUILT_MODULE_STEM := jack$(HOST_EXECUTABLE_SUFFIX)
-LOCAL_IS_HOST_MODULE := true
-LOCAL_REQUIRED_MODULES := jack-admin jack-diagnose
-
-include $(BUILD_PREBUILT)
-
-##################################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := jack-coverage-plugin
-LOCAL_SRC_FILES := jack-coverage-plugin.jar
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-MOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
-LOCAL_BUILT_MODULE_STEM := jack-coverage-plugin$(COMMON_JAVA_PACKAGE_SUFFIX)
-LOCAL_IS_HOST_MODULE := true
-
-include $(BUILD_PREBUILT)
-
-##################################
-include $(CLEAR_VARS)
-
 LOCAL_MODULE := jack-jacoco-reporter
 LOCAL_SRC_FILES := jack-jacoco-reporter.jar
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
diff --git a/tools/OWNERS b/tools/OWNERS
index b4ab537..0207076 100644
--- a/tools/OWNERS
+++ b/tools/OWNERS
@@ -1,11 +1,5 @@
-per-file *jack* = benoitlamarche@google.com
-per-file *jack* = jplesot@google.com
-
-per-file *jill* = benoitlamarche@google.com
-per-file *jill* = jplesot@google.com
-
-benoitlamarche@google.com # jack/jill
-jplesot@google.com        # jack/jill
 klyubin@google.com        # signapk
 srhines@google.com        # LLVM
 yroussel@google.com       # MultiDex
+dwillemsen@google.com     # Build tools
+ccross@google.com         # Build tools
diff --git a/tools/README-jack-code-coverage.md b/tools/README-jack-code-coverage.md
deleted file mode 100644
index d1be035..0000000
--- a/tools/README-jack-code-coverage.md
+++ /dev/null
@@ -1,123 +0,0 @@
-# Code coverage with Jack
-
-Jack supports code coverage with `JaCoCo` (http://eclemma.org/jacoco). During the compilation,
-it will instrument code using JaCoCo API. Therefore, it requires a dependency to a jacoco-agent.jar
-that can be imported in the DEX output. Jack supports Jacoco v0.7.5 (see directory external/jacoco
-in the Android source tree).
-
-Besides, Jack will also produce a coverage metadata file (or description file) in a JSON format.
-It will be used to generate the report so we can match coverage execution file with source code.
-
-Starting with the Jack Douarn release (4.x), the code coverage is provided with the Jack plugin
-`jack-coverage-plugin.jar`.
-
-## Enabling code coverage with Jack
-
-### Using the Android build system
-
-You can enable code coverage by setting `EMMA_INSTRUMENT_STATIC=true` in your make command. The build
-system will compile it with Jack by enabling code coverage and importing the `jacoco-agent.jar`
-defined in external/jacoco. It will produce the metadata file in the 'intermediates' directory of
-the app.
-
-For instance, to instrument the Settings app:
-
-    EMMA_INSTRUMENT_STATIC=true mmma -j32 packages/apps/Settings
-
-The medatafile is located in `$ANDROID_BUILD_TOP/out/target/common/obj/APPS/Settings_intermediates/coverage.em`
-
-Once the application is instrumented, you can install it and execute it to produce code coverage
-execution file.
-
-You can define class name filters to select which classes will be instrumented (all classes are
-instrumented by default) by defining the following build variables:
-* `LOCAL_JACK_COVERAGE_INCLUDE_FILTER`: a comma-separated list of class names to include
-* `LOCAL_JACK_COVERAGE_EXCLUDE_FILTER`: a comma-separated list of class names to exclude
-These filters will be passed on the Jack command-line (see below) only when code coverage is
-enabled.
-
-### Using Jack command-line
-
-To enable code coverage with Jack command-line, pass the following command-line options:
-
-```
---pluginpath <code_coverage_plugin_jar>
---plugin com.android.jack.coverage.CodeCoverage
--D jack.coverage=true
--D jack.coverage.metadata.file=<coverage_metadata_file_path>
--D jack.coverage.jacoco.package=<jacoco_internal_package_name>
-```
-
-where
-* `<code_coverage_plugin_jar>` is the path to the plugin jar file. In the Android tree, it is
-  located in the `prebuilts/sdk/tools` directory.
-* `<coverage_metadata_file_path>` is a *mandatory* property that indicates the path of the file that
-  will contain coverage information. This file must be passed to reporting tool to generate the
-  report (see section Generating the report below)
-* `<jacoco_internal_package_name>` is an *optional* property that indicates the fully qualified name
-  of the internal package name containing the class 'Offline' in the associated jacoco-agent.jar
-  file. This package name is different for each release of JaCoCo library. If this property is not
-  provided, Jack will automatically look for a Jacoco package which starts with
-  `org.jacoco.agent.rt.internal`.
-
-Note: because Jack's code coverage support is based on Jacoco, it is mandatory that Jacoco classes
-are available at compilation time. They can be either on the classpath (--classpath) or imported
-as a static library in the output (--import).
-
-Jack also supports optional include and exclude class filtering based on class name:
-
-```
--D jack.coverage.jacoco.include=<includes>
--D jack.coverage.jacoco.exclude=<excludes>
-```
-
-where
-* `<includes>` is a comma-separated list of fully-qualified class names to include
-* `<excludes>` is a comma-separated list of fully-qualified class names to exclude
-
-Wildcards characters '?' and '*' are accepted to replace respectively one character or multiple
-characters.
-
-You can find the full command-line usage with
-
-    java -jar <jack_jar> --help
-
-You can also find the description of all properties (including those for code coverage) with
-
-    java -jar <jack_jar> --pluginpath <code_coverage_plugin_jar> --plugin com.android.jack.coverage.CodeCoverage --help-properties
-
-## Collecting code coverage
-
-To produce coverage execution data, instrumented classes must be executed and coverage data be
-dumped in a coverage execution file. For Android instrumentation tests, the frameworks can do
-so automatically:
-
-    adb shell am instrument -w -e coverage true <package_name>/<instrumentation_class_name>
-
-For the case of the Settings app tests:
-
-    adb shell am instrument -w -e coverage true com.android.settings.tests/android.test.InstrumentationTestRunner
-
-Once the tests are finished, the location of the coverage execution file should be printed in the
-console.
-
-## Generating the report
-
-A coverage report can be generated using the `jack-jacoco-reporter.jar` file. This is a command-line
-tool taking at least three inputs:
-
-* the coverage metadata file(s) produced by Jack
-* the coverage execution file(s) produced during execution
-* an existing directory where the report is generated
-
-It is also recommended to indicate the directories containing the source code of classes being
-analyzed to link coverage information with the source code.
-
-The command then looks like:
-
-    java -jar jack-jacoco-reporter.jar --metadata-file <metadata_file> --coverage-file <execution_file> --report-dir <report_directory> --source-dir <source_dir_1> ... --source-dir <source_dir_N>
-
-You can find the full command-line usage with
-
-    java -jar jack-jacoco-reporter.jar --help
-
diff --git a/tools/README-jack-server.md b/tools/README-jack-server.md
deleted file mode 100644
index 1f8ad35..0000000
--- a/tools/README-jack-server.md
+++ /dev/null
@@ -1,238 +0,0 @@
-This documentation describes usage of Jack server 1.3-a11.
-
-# Jack server
-
-The Jack server's goal is to handle a pool of Jack compiler instances in order to limit memory usage
-and benefit from already warm instances.
-
-
-
-## Setup for Mac OS
-
-Jack server requires initial setup on Mac OS:
-
-  - Install MacPorts from [macports.org](http://www.macports.org/install.php)  
-    Make sure that `/opt/local/bin appears` in your path before `/usr/bin`. If not, please
-    add the following to your `~/.bash_profile` file (If you do not have a `.bash_profile`
-    file in your home directory, create one):
-```
-    $ export PATH=/opt/local/bin:$PATH`
-```
-
-  - Get curl package from MacPorts:
-```
-    $ POSIXLY_CORRECT=1 sudo port install curl +ssl
-```
-
-## Installing the server
-
-Jack server is automatically installed and started by Android build. If you need to do the
-installation manually use:
-```
-    $ jack-admin install-server <launcher.jar> <server.jar>
-```
-
-
-## Starting the server
-
-You may need to start the Jack server manually.  
-Use `jack-admin start-server`.
-
-
-
-## Client info
-
-The client is a bash script simply named `jack`.  
-It can be configured in `$HOME/.jack-settings`
-
-
-
-### `.jack-settings` file
-
-This file contains script shell variables:  
-`SERVER_HOST`: IP address of the server  
-by default: `SERVER_HOST=localhost`.
-
-`SERVER_PORT_SERVICE`: Server service TCP port number. Needs to match the service port
-number defined in `$HOME/.jack-server/config.properties` on the server host
-(See **Server info** below)  
-by default: `SERVER_PORT_SERVICE=8076`.
-
-`SERVER_PORT_ADMIN`: Server admin TCP port number. Needs to match the admin port number
-defined in `$HOME/.jack-server/config.properties` on the server host (See **Server info** below)  
-by default: `SERVER_PORT_ADMIN=8077`.
-
-`SETTING_VERSION`: Internal, do not modify.
-
-
-
-## Server info
-
-The server is composed of 2 jars named `jack-server.jar` and `jack-launcher.jar`.
-
-Check `Admin` section to know how to install and administrate the Jack server.
-
-The server can also be configured in `$HOME/.jack-server/config.properties`.
-
-
-
-### `config.properties` file
-
-It contains Jack server configuration properties.  
-Modifications to those settings are taken into account after restarting the server.  
-Description with default values follows:
-
-`jack.server.max-service=<number>`  
-  Maximum number of simultaneous Jack tasks. Default is 4.
-
-`jack.server.max-jars-size=<size-in-bytes>`  
-  Maximum size for Jars, in bytes. `-1` means no limit. Default is 100 MiB.
-
-`jack.server.time-out=<time-in-seconds>`  
-  Time out delay before Jack gets to sleep. When Jack sleeps, its memory usage is reduced, but it is
-  slower to wake up. `-1` means "do not sleep". Default is 2 weeks.
-
-`jack.server.service.port=<port-number>`  
-  Server service TCP port number. Default is 8076. Needs to match the service port defined in
-  `$HOME/.jack-settings` on the client host (See Client section).
-
-`jack.server.admin.port=<port-number>`  
-   Server admin TCP port number. Default is 8077. Needs to match the service port defined in
-   `$HOME/.jack-settings` on the client host (See Client section).
-
-`jack.server.config.version=<version>`  
-  Internal, do not modify.
-
-
-
-### Server logs
-
-Server logs can be found by running `jack-admin server-log`. Default location is
-`$HOME/.jack-server/logs/`.
-
-
-
-## Admin
-
-The `jack-admin` bash script allows to install and administrate the Jack server.
-Here are some commands:
-
-`$ jack-admin help`  
-Print help.
-
-`$ jack-admin install-server jack-launcher.jar jack-server.jar`  
-Install the Jack server.
-
-`$ jack-admin uninstall-server`  
-Uninstall the Jack server and all components. You should ensure that the Jack server
-is not running before uninstalling.
-
-`$ jack-admin list jack`  
-List installed versions for Jack.
-
-`$ jack-admin update jack jack.jar`  
-Install or update a Jack jar.
-
-`$ jack-admin start-server`  
-Start the server.
-
-`$ jack-admin stop-server`  
-Stop the server after the last compilation is complete.
-
-`$ jack-admin kill-server`  
-Kill the server process immediately, interrupting abruptly ongoing compilations.
-
-`$ jack-admin list-server`  
-List Jack server processes.
-
-`$ jack-admin server-stat`  
-Print various info about the server and the host.
-
-`$ jack-admin server-log`  
-Print log pattern.
-
-`$ jack-admin dump-report`  
-Produce a report file that can be used to file a bug.
-
-
-## Transitioning from server 1.1 (e.g. Marshmallow) to server 1.3 (e.g. N)
-
-The old Jack server used a `$HOME/.jack` configuration file. It has now replaced by a
-`$HOME/.jack-settings` and a `$HOME/.jack-server/config.properties`.
-If those new files do not exist, run `jack-admin start-server` and they will be created.
-If you had custom settings in your `$HOME/.jack`, here's how to adapt those.
-
-`SERVER_PORT_SERVICE=XXXX`  
-Replace with `SERVER_PORT_SERVICE=XXXX` in `$HOME/.jack-settings` and
-`jack.server.service.port=XXXX` in `$HOME/.jack-server/config.properties`.
-
-`SERVER_PORT_ADMIN=YYYY`  
-Replace with `SERVER_PORT_ADMIN=YYYY` in `$HOME/.jack-settings` and
-`jack.server.admin.port=YYYY` in `$HOME/.jack-server/config.properties`.
-
-`SERVER_NB_COMPILE=N`  
-Replace with `jack.server.max-service=N` in `$HOME/.jack-server/config.properties`.
-
-`SERVER_TIMEOUT=ZZ`  
-You can replace with `jack.server.time-out=ZZ`, but it is recommended to keep the default setting of
-"7200" (2 hours).
-
-Other settings in the `$HOME/.jack` configuration file do not need to be copied.
-You should still keep your `$HOME/.jack` configuration file for the old Jack server because both
-server versions can run simultaneously.
-
-
-## Troubleshooting
-
-Below you'll find some ways to solve some troubleshooting. If you don't find a solution, file a
-bug and attach the file produced by `jack-admin dump-report`.
-
-
-### If compilation fails on `No Jack server running`
-
-See [Starting the server](#starting-the-server) above.
-
-
-### If your computer becomes unresponsive during compilation:
-
-You can improve the situation by reducing the number of jack simultaneous compilations by editing
-your `$HOME/.jack-server/config.properties` and changing jack.server.max-service to a lower value
-and then restarting the server.  
-
-### If you experience Jack compilations failing on `Out of memory error.`:
-
-You can improve the situation by reducing the number of jack simultaneous compilations by editing
-your `$HOME/.jack-server/config.properties` and changing jack.server.max-service to a lower value
-and then restarting the server.  
-If this is not enough, you may change the arguments used to start the server jvm and force a
-greater maximum Java heap size ("-Xmx"):  
-- Stop the server using `jack-admin stop-server`, then:  
-- If you start the server manually:  
-`JACK_SERVER_VM_ARGUMENTS="-Xmx2g -Dfile.encoding=UTF-8 -XX:+TieredCompilation" jack-admin start-server`  
-- If you use the jack server in the android tree then  
-`export ANDROID_JACK_VM_ARGS="-Xmx2g -Dfile.encoding=UTF-8 -XX:+TieredCompilation"`  
-and restart your build command.
-
-
-### If you have trouble starting the server
-
-This may mean that TCP ports are already in use on your computer. You can try modifying the ports
-both in your client and server configurations. See the `Server info` and `Client info` sections.
-If it doesn't solve the problem, please report and give us additional information by:  
-  - Attaching your compilation log.  
-  - Attaching the file produced by `jack-admin dump-report`
-
-
-### If your commands fails on
-`Failed to contact Jack server: Problem reading<your home>/.jack-server/client.pem`
-
-This may mean that your server never managed to start, see
-[If you have trouble starting the server](#if-you-have-trouble-starting-the-server) above.
-
-
-### If your compilation gets stuck without any progress
-
-Please report and give us additional information by attaching the file produced by
-`jack-admin dump-report`.  
-Then restart the server by issuing commands `jack-admin kill-server; jack-admin start-server`
-
diff --git a/tools/jack b/tools/jack
deleted file mode 100755
index 6705df6..0000000
--- a/tools/jack
+++ /dev/null
@@ -1,209 +0,0 @@
-#!/bin/bash
-#
-# 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.
-#
-# Version: 1.3-eng
-#
-set -o nounset
-umask 077
-
-#
-# Settings
-#
-JACK_VERSION=${JACK_VERSION:=4.32.CANDIDATE}
-JACK_HOME="${JACK_HOME:=$HOME/.jack-server}"
-JACK_CLIENT_SETTING="${JACK_CLIENT_SETTING:=$HOME/.jack-settings}"
-TMPDIR=${TMPDIR:=/tmp}
-# This is half the timeout since the script will make a second attempt collecting debugs when
-# the first attempt fails on connection timeout
-JACK_CONNECTION_TIMEOUT=150
-JACK_EXTRA_CURL_OPTIONS=${JACK_EXTRA_CURL_OPTIONS:=}
-JACK_ASSERTION_ENABLED="${JACK_ASSERTION_ENABLED:=false}"
-
-
-abort () { exit 255; }
-
-
-#
-# Load client settings
-#
-if [ -f "$JACK_CLIENT_SETTING" ]; then
-  source "$JACK_CLIENT_SETTING"
-else
-  echo "Cannot find settings at '$JACK_CLIENT_SETTING'" >&2
-  abort
-fi
-
-
-JACK_SERVER=${JACK_SERVER:=true}
-JACK_MAIN_COMMAND=${JACK_MAIN_COMMAND:="java -Djava.io.tmpdir=$TMPDIR -Dfile.encoding=UTF-8 -XX:+TieredCompilation"}
-JACK_REPOSITORY=${JACK_REPOSITORY:=}
-
-
-#
-# If not in server mode, exec jack
-#
-if [ "$JACK_SERVER" != "true" ]; then
-  if [ -z "$JACK_REPOSITORY" ]; then
-    echo "Running Jack without Jack server requires definition of JACK_REPOSITORY" >&2
-    abort
-  fi
-  JACK_JAR=$JACK_REPOSITORY/jack-$JACK_VERSION.jar
-  if [ ! -r "$JACK_JAR" ]; then
-    echo "Jack jar \"$JACK_JAR\" is not readable" >&2
-    abort
-  fi
-
-
-  exec $JACK_MAIN_COMMAND -jar $JACK_JAR "$@"
-  echo "Cannot succeed to launch Jack without Jack server" >&2
-  abort
-fi
-
-
-#
-# Prepare compilation
-#
-JACK_PWD="$PWD"
-JACK_EXIT="$TMPDIR/jack-task-$USER-$$-exit"
-
-# Cleanup
-trap 'rm -f "$JACK_EXIT" 2>/dev/null;' EXIT
-
-set -o errexit
-
-# Check that we can create temp file for exit status
-rm -rf "$JACK_EXIT"
-echo "" > "$JACK_EXIT"
-
-#
-# Launch the compilation
-#
-
-set +o errexit
-trap ERR
-
-# put arguments in a non array variable
-ARGS=""
-for i in "$@"; do
-  ARGS="$ARGS $i"
-done
-
-
-CURRENT_CHARSET=$(locale charmap)
-if [ -z "$CURRENT_CHARSET" ]; then
-  CHARSET_ARGUMENT=
-else
-  CHARSET_ARGUMENT=";charset=$CURRENT_CHARSET"
-fi
-
-# Check base64 availability
-BASE64_CHECK=$((echo amFjaw==;echo LXNlcnZlcg==) | base64 --decode 2>&1)
-
-sendRequest() {
-RETRY_OPTION=$1
-shift
-
-# Launch compilation
-exec 3>&1
-exec 4>&2
-if [ "$BASE64_CHECK" = jack-server ]; then
-  HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS $RETRY_OPTION \
-       --cert "${JACK_HOME}/client.pem" \
-       --cacert "${JACK_HOME}/server.pem" \
-       --output >(tee >(sed -n -e 's/^E|\(.*\)$/\1/p' | base64 --decode >&4 ) | tee >(sed -n -e 's/^X|\(.*\)$/\1/p' >>$JACK_EXIT) | sed -n -e 's/^O|\(.*\)$/\1/p' | base64 --decode >&3) \
-       --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-       -X POST \
-       -H "Accept: application/vnd.jack.command-out-base64;version=1$CHARSET_ARGUMENT" \
-       -F "cli=$ARGS;type=text/plain$CHARSET_ARGUMENT" \
-       -F "version=$JACK_VERSION;type=application/vnd.jack.select-exact;version=1" \
-       -F "pwd=$JACK_PWD;type=text/plain$CHARSET_ARGUMENT" \
-       -F "assert=$JACK_ASSERTION_ENABLED;type=text/plain$CHARSET_ARGUMENT" \
-       --noproxy ${SERVER_HOST} \
-       https://${SERVER_HOST}:$SERVER_PORT_SERVICE/jack \
-       )
-else
-  HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS $RETRY_OPTION \
-       --cert "${JACK_HOME}/client.pem" \
-       --cacert "${JACK_HOME}/server.pem" \
-       --output >(tee >(sed -n -e 's/^E|\(.*\)$/\1/p' >&4 ) | tee >(sed -n -e 's/^X|\(.*\)$/\1/p' >>$JACK_EXIT) | sed -n -e 's/^O|\(.*\)$/\1/p' >&3) \
-       --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-       -X POST \
-       -H "Accept: application/vnd.jack.command-out;version=1$CHARSET_ARGUMENT" \
-       -F "cli=$ARGS;type=text/plain$CHARSET_ARGUMENT" \
-       -F "version=$JACK_VERSION;type=application/vnd.jack.select-exact;version=1" \
-       -F "pwd=$JACK_PWD;type=text/plain$CHARSET_ARGUMENT" \
-       -F "assert=$JACK_ASSERTION_ENABLED;type=text/plain$CHARSET_ARGUMENT" \
-       --noproxy ${SERVER_HOST} \
-       https://${SERVER_HOST}:$SERVER_PORT_SERVICE/jack \
-       )
-fi
-CURL_CODE=$?
-exec 3>&-
-exec 4>&-
-
-set -o errexit
-
-if [ $CURL_CODE -eq 0 ]; then
-  # No problem, let's go
-  JACK_CODE=$(cat "$JACK_EXIT")
-  exit $JACK_CODE
-elif [ $CURL_CODE -eq 7 ]; then
-  # Failed to connect
-  echo "No Jack server running. Try 'jack-admin start-server'" >&2
-  abort
-elif [ $CURL_CODE -eq 28 ]; then
-  if [ "$RETRY_OPTION" == "" ]; then
-    echo "Connection to the Jack server timeout, retrying with debug"
-    sendRequest -v $@
-  else
-    echo "Connection to the Jack server timeout" >&2
-    abort
-  fi
-elif [ $CURL_CODE -eq 35 ]; then
-  if [ "$RETRY_OPTION" == "" ]; then
-    echo "SSL error when connecting to the Jack server, retrying with debug"
-    sendRequest -v $@
-  else
-    echo "SSL error when connecting to the Jack server. Try 'jack-diagnose'" >&2
-    abort
-  fi
-elif [ $CURL_CODE -eq 58 ]; then
-  echo "Failed to contact Jack server: Problem reading ${JACK_HOME}/client.pem. Try 'jack-diagnose'" >&2
-  abort
-elif [ $CURL_CODE -eq 60 ]; then
-  echo "Failed to authenticate Jack server certificate. Try 'jack-diagnose'" >&2
-  abort
- elif [ $CURL_CODE -eq 77 ]; then
-  echo "Failed to contact Jack server: Problem reading ${JACK_HOME}/server.pem. Try 'jack-diagnose'" >&2
-  abort
-elif  [ $CURL_CODE -eq 22 ]; then
-  # Http code not OK, let's decode and abort
-  if [ $HTTP_CODE -eq 400 ]; then
-    # 400: Bad request
-    echo "Bad request, see server log" >&2
-    abort
-  else
-    # Other
-    echo "Internal unknown error ($HTTP_CODE), try 'jack-diagnose' or see Jack server log" >&2
-    abort
-  fi
-else
-  echo "Communication error with Jack server ($CURL_CODE). Try 'jack-diagnose'" >&2
-  abort
-fi
-}
-
-sendRequest "" $@
diff --git a/tools/jack-admin b/tools/jack-admin
deleted file mode 100755
index f028d27..0000000
--- a/tools/jack-admin
+++ /dev/null
@@ -1,661 +0,0 @@
-#!/bin/bash
-#
-# 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.
-#
-# Version: 1.3-a11
-#
-set -o nounset
-BASE_UMASK=$(umask)
-umask 077
-
-#
-# Settings
-#
-JACK_HOME="${JACK_HOME:=$HOME/.jack-server}"
-JACK_CLIENT_SETTING="${JACK_CLIENT_SETTING:=$HOME/.jack-settings}"
-TMPDIR=${TMPDIR:=/tmp}
-JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8}"
-JACK_EXTRA_CURL_OPTIONS=${JACK_EXTRA_CURL_OPTIONS:=}
-
-LAUNCHER_JAR="$JACK_HOME/launcher.jar"
-LAUNCHER_NAME=com.android.jack.launcher.ServerLauncher
-CURRENT_CHARSET=$(locale charmap)
-if [ -z "$CURRENT_CHARSET" ]; then
-  CHARSET_ARGUMENT=
-else
-  CHARSET_ARGUMENT=";charset=$CURRENT_CHARSET"
-fi
-
-JACK_LOGS_DIR="$JACK_HOME"/logs
-JACK_OUT_ERR="$JACK_LOGS_DIR"/outputs.txt
-JACK_CONNECTION_TIMEOUT=300
-
-#
-# Load client settings
-#
-if [ -f "$JACK_CLIENT_SETTING" ]; then
-  source "$JACK_CLIENT_SETTING"
-fi
-
-#
-# Create or update client settings if needed
-#
-if [[ ! -f "$JACK_CLIENT_SETTING" || $SETTING_VERSION -lt 4 ]]; then
-  echo "Writing client settings in" $JACK_CLIENT_SETTING
-  cat >"$JACK_CLIENT_SETTING.$$" <<-EOT
-	# Server settings
-	SERVER_HOST=${SERVER_HOST:=localhost}
-	SERVER_PORT_SERVICE=${SERVER_PORT_SERVICE:=8076}
-	SERVER_PORT_ADMIN=${SERVER_PORT_ADMIN:=8077}
-
-	# Internal, do not touch
-	SETTING_VERSION=4
-EOT
-  ln -f "$JACK_CLIENT_SETTING.$$" "$JACK_CLIENT_SETTING"
-  rm "$JACK_CLIENT_SETTING.$$"
-  source "$JACK_CLIENT_SETTING"
-fi
-
-usage () {
-  echo "Usage : $0 [ install-server <launcher.jar> <server.jar> | uninstall-server | list <program> | update <program> <program.jar> | start-server | stop-server | kill-server | list-server | server-stat | server-stat-reset | server-log | server-gc | cleanup-server | dump-report]"
-}
-
-abort () { exit 255; }
-
-#
-# $1: curl command status
-# $2: HTTP status
-#
-handleHttpErrors() {
-  if [ $1 -eq 0 ]; then
-    # No problem, let's go
-    return 0;
-  elif [ $1 -eq 7 ]; then
-    echo "No Jack server running. Try 'jack-admin start-server'" >&2
-    abort
-  elif [ $1 -eq 35 ]; then
-    echo "SSL error when connecting to the Jack server. Try 'jack-diagnose'" >&2
-    abort
-  elif [ $1 -eq 58 ]; then
-    echo "Failed to contact Jack server: Problem reading ${JACK_HOME}/client.pem. Try 'jack-diagnose'" >&2
-    abort
-  elif [ $1 -eq 60 ]; then
-    echo "Failed to authenticate Jack server certificate. Try 'jack-diagnose'" >&2
-    abort
-   elif [ $1 -eq 77 ]; then
-    echo "Failed to contact Jack server: Problem reading ${JACK_HOME}/server.pem. Try 'jack-diagnose'" >&2
-    abort
-  elif  [ $1 -eq 22 ]; then
-    # Http code not OK, let's decode and abort
-    if [ $2 -eq 400 ]; then
-      # 400: Bad request
-      echo "Bad request, see Jack server log" >&2
-      abort
-    else
-      # Other
-      echo "Internal unknown error ($2), try 'jack-diagnose' or see Jack server log" >&2
-      abort
-    fi
-  else
-    echo "Communication error with Jack server $1. Try 'jack-diagnose'" >&2
-    abort
-  fi
-}
-
-checkCurlVersion () {
-  curl --version | grep -q "SecureTransport"
-  if [ "$?" -eq 0 ]; then
-    echo "Unsupported curl, please use a curl not based on SecureTransport" >&2
-    abort
-  fi
-}
-
-#
-# $1: program name
-# $2: jar of the program
-#
-updateProgram () {
-  HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
-       --cert "${JACK_HOME}/client.pem" \
-       --cacert "${JACK_HOME}/server.pem" \
-       --output /dev/null \
-       --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-       -X PUT \
-       -F "jar=@$2;type=application/octet-stream" \
-       -F "force=$FORCE_INSTALLATION;type=text/plain$CHARSET_ARGUMENT" \
-       --noproxy ${SERVER_HOST} \
-       https://${SERVER_HOST}:$SERVER_PORT_ADMIN/$1 \
-       )
-  handleHttpErrors $? $HTTP_CODE
-
-  if [ "$1" == server ]; then
-    echo "Server updated, waiting for restart"
-    waitServerStarted
-  fi
-}
-
-isServerRunning () {
-  RETRY_SESSION=3
-  DONE=1
-  let DATE_TIMEOUT=$(date +%s)+$JACK_CONNECTION_TIMEOUT
-  while [ "$DONE" -ne 0 ]; do
-    HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
-         --cert "${JACK_HOME}/client.pem" \
-         --cacert "${JACK_HOME}/server.pem" \
-         --output /dev/null \
-         --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-         -X GET \
-         -H "Accept: text/plain$CHARSET_ARGUMENT" \
-         --noproxy ${SERVER_HOST} \
-         https://${SERVER_HOST}:$SERVER_PORT_ADMIN/server \
-         )
-    CURL_CODE=$?
-    if [ $CURL_CODE -eq 0 ]; then
-      # No problem, let's go
-      return 0;
-    elif [ $CURL_CODE -eq 7 ]; then
-      return 1
-    else
-      # In case of partial, timeout, empty response, network error, let's retry
-      if [ $RETRY_SESSION -eq 0 ]; then
-        echo "Communication error with Jack server ($CURL_CODE), try 'jack-diagnose' or see Jack server log"  >&2
-        abort
-      else
-        if [ $(date +%s) -lt $DATE_TIMEOUT ]; then
-          let RETRY_SESSION=RETRY_SESSION-1
-        else
-          echo "Communication error with Jack server ($CURL_CODE), try 'jack-diagnose' or see Jack server log"  >&2
-          abort
-        fi
-      fi
-    fi
-  done
-}
-
-waitServerStarted () {
-  DONE=1
-  let DATE_TIMEOUT=$(date +%s)+$JACK_CONNECTION_TIMEOUT
-  while [ "$DONE" -ne 0 ]; do
-    HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
-         --cert "${JACK_HOME}/client.pem" \
-         --cacert "${JACK_HOME}/server.pem" \
-         --output /dev/null \
-         --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-         -X GET \
-         -H "Accept: text/plain$CHARSET_ARGUMENT" \
-         --noproxy ${SERVER_HOST} \
-         https://${SERVER_HOST}:$SERVER_PORT_ADMIN/server \
-         )
-    CURL_CODE=$?
-    if [ $CURL_CODE -eq 7 ] || [ $CURL_CODE -eq 35 ] || [ $CURL_CODE -eq 58 ] || [ $CURL_CODE -eq 60 ] || [ $CURL_CODE -eq 77 ]; then
-      if [ $(date +%s) -ge $DATE_TIMEOUT ]; then
-        echo "Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log" >&2
-        abort
-      else
-        sleep 1
-      fi
-    else
-      # A connection was opened, no need to know if it went well
-      DONE=0;
-    fi
-  done
-}
-
-#
-# $1: program name
-#
-listProgramVersion () {
-  exec 3>&1
-  HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
-       --cert "${JACK_HOME}/client.pem" \
-       --cacert "${JACK_HOME}/server.pem" \
-       --output >(tr -d '\015' >&3) \
-       --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-       -X GET \
-       -H "Accept: text/plain$CHARSET_ARGUMENT" \
-       --noproxy ${SERVER_HOST} \
-       https://${SERVER_HOST}:$SERVER_PORT_ADMIN/$1 \
-       )
-  handleHttpErrors $? $HTTP_CODE
-  exec 3>&-
-}
-
-#
-# Decoding argument
-#
-if [ $# -eq 0 ]
-then
-  usage
-  abort
-fi
-
-set +o errexit
-
-FORCE_INSTALLATION=false
-case $1 in
-  force-update)
-    FORCE_INSTALLATION=true
-    COMMAND=update;;
-  *)
-    COMMAND=$1;;
-esac
-
-case $COMMAND in
-  install-server)
-    if [ $# -ne 3 ]; then
-      usage
-      abort
-    fi
-    if [ ! -r "$2" ]; then
-      echo "Jack server launcher jar \"$2\" is not readable" >&2
-      abort
-    fi
-     if [ ! -r "$3" ]; then
-      echo "Jack server jar \"$3\" is not readable" >&2
-      abort
-    fi
-
-    checkCurlVersion
-
-    if [ ! -d "$JACK_HOME" ]; then
-      echo Installing jack server in \"$JACK_HOME\"
-      mkdir -p "$JACK_HOME"
-      cp $2 "$LAUNCHER_JAR"
-      cp $3 "$JACK_HOME/server-1.jar"
-      mkdir "$JACK_LOGS_DIR"
-      keytool -genkeypair -validity 3650 -alias server -keyalg RSA -keysize 2048 -keypass Jack-Server -storepass Jack-Server -dname "CN=$SERVER_HOST" -keystore "$JACK_HOME/server.jks"
-      keytool -genkeypair -validity 3650 -alias client -keyalg RSA -keysize 2048 -keypass Jack-Server -storepass Jack-Server -dname "CN=$(id -un)@$(uname -n)" -keystore "$JACK_HOME/client.jks"
-    else
-      echo "Jack server already installed in \"$JACK_HOME\"" >&2
-      abort
-    fi
-    exit 0 ;;
-
-
-  uninstall-server)
-    SERVERS_PID=$(ps -o "pid args" -u `id -u -n` | grep $LAUNCHER_NAME | grep -v grep | awk '{print $1}')
-    if [ -n "$SERVERS_PID" ]; then
-      echo "Jack server is running, please stop it before uninstall" >&2
-      echo "If you want to proceeed anyway, use '$0 force-uninstall-server'" >&2
-      exit 2
-    fi
-
-    if [ ! -d "$JACK_HOME" ]; then
-      echo "Jack server in \"$JACK_HOME\" not found" >&2
-      abort
-    fi
-
-    echo "Removing jack server from \"$JACK_HOME\""
-    rm -rf "$JACK_HOME"
-    exit 0 ;;
-
-
-  force-uninstall-server)
-    if [ ! -d "$JACK_HOME" ]; then
-      echo "Jack server in \"$JACK_HOME\" not found" >&2
-      abort
-    fi
-
-    echo "Removing jack server from \"$JACK_HOME\""
-    rm -rf "$JACK_HOME"
-    exit 0 ;;
-
-
-  list)
-    if [ $# -ne 2 ]
-    then
-      usage
-      abort
-    fi
-
-    listProgramVersion $2 ;;
-
-
-  update)
-    if [ $# -lt 3 ]; then
-      usage
-      abort
-    fi
-
-    if [ $# -gt 4 ]; then
-      usage
-      abort
-    fi
-
-    if [ ! -r "$3" ]; then
-      echo "Failed to update $2 of Jack server: \"$3\" is not readable" >&2
-      abort
-    fi
-
-    checkCurlVersion
-
-    if [ $FORCE_INSTALLATION = true ]; then
-      updateProgram $2 $3
-    else
-      if [ $# -eq 4 ]; then
-        HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
-             --cert "${JACK_HOME}/client.pem" \
-             --cacert "${JACK_HOME}/server.pem" \
-             --output /dev/null \
-             --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-             -X HEAD \
-             --data "$4" \
-             -H "Content-Type:application/vnd.jack.select-exact;version=1" \
-             --noproxy ${SERVER_HOST} \
-             https://${SERVER_HOST}:$SERVER_PORT_ADMIN/$2 \
-             )
-        CURL_CODE=$?
-        if [ $CURL_CODE -eq 22 ]; then
-          if [ $HTTP_CODE -eq 404 ]; then
-            # version not found, proceed to installation
-            updateProgram $2 $3
-            exit 0
-          fi
-        fi
-        handleHttpErrors $CURL_CODE $HTTP_CODE
-      else
-        # No version provided, proceed directly without testing
-        updateProgram $2 $3
-      fi
-    fi
-    exit 0;;
-
-
-  stop-server)
-    echo "Stopping background server"
-
-    HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
-         --cert "${JACK_HOME}/client.pem" \
-         --cacert "${JACK_HOME}/server.pem" \
-         --output /dev/null \
-         --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-         -X POST \
-         --noproxy ${SERVER_HOST} \
-         https://${SERVER_HOST}:$SERVER_PORT_ADMIN/server/stop \
-         )
-    handleHttpErrors $? $HTTP_CODE ;;
-
-
-  server-stat)
-    echo "Getting statistic from background server"
-
-    exec 3>&1
-    HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
-         --cert "${JACK_HOME}/client.pem" \
-         --cacert "${JACK_HOME}/server.pem" \
-         --output >(tr -d '\015' >&3) \
-         --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-         -X GET \
-         -H "Accept: text/plain$CHARSET_ARGUMENT" \
-         --noproxy ${SERVER_HOST} \
-         https://${SERVER_HOST}:$SERVER_PORT_ADMIN/stat \
-         )
-    handleHttpErrors $? $HTTP_CODE
-    exec 3>&- ;;
-
-
-  server-stat-reset)
-    echo "Reseting peak statistics from the background server"
-
-    HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
-         --cert "${JACK_HOME}/client.pem" \
-         --cacert "${JACK_HOME}/server.pem" \
-         --output /dev/null \
-         --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-         -X DELETE \
-         --noproxy ${SERVER_HOST} \
-         https://${SERVER_HOST}:$SERVER_PORT_ADMIN/stat \
-         )
-    handleHttpErrors $? $HTTP_CODE ;;
-
-
-  server-log)
-    exec 3>&1
-    HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
-         --cert "${JACK_HOME}/client.pem" \
-         --cacert "${JACK_HOME}/server.pem" \
-         --output >(tr -d '\015' >&3) \
-         --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-         -X GET \
-         -H "Accept: text/plain$CHARSET_ARGUMENT" \
-        --noproxy ${SERVER_HOST} \
-         https://${SERVER_HOST}:$SERVER_PORT_ADMIN/launcher/log \
-         )
-    handleHttpErrors $? $HTTP_CODE
-    exec 3>&- ;;
-
-
-  kill-server)
-    echo "Killing background server"
-    SERVERS_PID=$(ps -o "pid args" -u `id -u -n` | grep $LAUNCHER_NAME | grep -v grep | awk '{print $1}')
-    if [ -z "$SERVERS_PID" ]; then
-      echo "No Jack server to kill" >&2
-      exit 2
-    fi
-
-    for PID in $SERVERS_PID; do
-      kill $PID 2>/dev/null
-      TIMEOUT=30
-      while [ "$TIMEOUT" -ne 0 ]; do
-        kill -0 $PID 2>/dev/null
-        if [ $? -ne 0 ]; then
-          continue 2
-        fi
-        sleep 1
-        let TIMEOUT=TIMEOUT-1
-      done
-      kill -KILL $PID 2>/dev/null
-      DONE=$?
-      while [ $DONE -eq 0 ]; do
-        kill -0 $PID 2>/dev/null
-        DONE=$?
-        sleep 1
-      done
-    done
-
-    exit 0 ;;
-
-
-  list-server)
-    ps -A -o "user pid args" | grep $LAUNCHER_NAME | grep -v grep
-    exit $? ;;
-
-
-  start-server)
-    if [ ! -d "$JACK_HOME" ]; then
-      echo "Jack server installation not found" >&2
-      abort
-    fi
-
-    isServerRunning
-    RUNNING=$?
-    if [ "$RUNNING" = 0 ]; then
-      echo "Server is already running"
-    else
-      JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
-      echo "Launching Jack server" $JACK_SERVER_COMMAND
-      (
-        trap "" SIGHUP
-        for i in $(seq 3 255); do
-          eval exec "$i"'>&-'
-        done
-        cd "$JACK_HOME"
-        umask $BASE_UMASK
-        exec $JACK_SERVER_COMMAND
-        abort
-      ) >"$JACK_OUT_ERR" 2>&1 &
-    fi
-
-    waitServerStarted
-    exit 0 ;;
-
-
-  server-log-level)
-    if [ $# -eq 4 ]
-    then
-      LIMIT=$3
-      COUNT=$4
-    elif [ $# -eq 2 ]
-    then
-      COUNT=5
-      if [ \( "$2" = "ERROR" \) -o \( "$2" = "WARNING" \) ]
-      then
-        LIMIT=1048576
-      else
-        LIMIT=10485760
-      fi
-    else
-      usage
-      abort
-    fi
-
-    echo "Setting logging parameters of background server"
-
-    HTTP_CODE=$(curl --fail $JACK_EXTRA_CURL_OPTIONS \
-         --cert "${JACK_HOME}/client.pem" \
-         --cacert "${JACK_HOME}/server.pem" \
-         --output /dev/null \
-         --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-         --request PUT \
-         --form "level=$2;type=text/plain$CHARSET_ARGUMENT" \
-         --form "limit=$LIMIT;type=text/plain$CHARSET_ARGUMENT" \
-         --form "count=$COUNT;type=text/plain$CHARSET_ARGUMENT" \
-         --noproxy ${SERVER_HOST} \
-         https://${SERVER_HOST}:$SERVER_PORT_ADMIN/launcher/log/level \
-         )
-    handleHttpErrors $? $HTTP_CODE ;;
-
-
-  server-gc)
-    echo "Requesting a garbage collection to the background server"
-
-    HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
-         --cert "${JACK_HOME}/client.pem" \
-         --cacert "${JACK_HOME}/server.pem" \
-         --output /dev/null \
-         --no-buffer --write-out '%{http_code}' --silent --connect-timeout $JACK_CONNECTION_TIMEOUT \
-         -X POST \
-         --noproxy ${SERVER_HOST} \
-         https://${SERVER_HOST}:$SERVER_PORT_ADMIN/gc \
-         )
-    handleHttpErrors $? $HTTP_CODE ;;
-
-
-#
-# Should be run when server is off. Allows to clean files that could be forgotten on disk in case of
-# server VM crash after an update.
-#
-  cleanup-server)
-    shopt -s nullglob
-    for file in $JACK_HOME/jack/*.deleted; do
-      rm "${file%.deleted}"
-      rm "$file"
-    done
-    exit 0 ;;
-
-
-  dump-report)
-    if [ ! -d "$JACK_HOME" ]; then
-      echo "Failed to locate Jack server installation" >&2
-      abort
-    fi
-
-    echo "Creating report..."
-    REPORT="jack-report.$$.zip"
-    REPORT_PATH="$(pwd)/$REPORT"
-    REPORT_INFO="$JACK_HOME/report.$$.txt"
-
-    if [ -e "$REPORT" ]; then
-      echo "Failed to create Jack server report '$REPORT', file already exists" >&2
-      abort
-    fi
-
-    trap 'rm -f "$REPORT_INFO" 2>/dev/null;' EXIT
-
-    date >>"$REPORT_INFO" 2>&1
-
-    echo "Dumping Jack server stacks..."
-    echo >>"$REPORT_INFO"
-    echo "\$ ps -o \"pid args\" | grep $LAUNCHER_NAME | grep -v grep | awk '{print $1}' |  xargs kill -3" >>"$REPORT_INFO"
-            (ps -o  "pid args"  | grep $LAUNCHER_NAME | grep -v grep | awk '{print $1}' |  xargs kill -3) >>"$REPORT_INFO" 2>&1
-
-    echo "Getting current user id..."
-    echo >>"$REPORT_INFO"
-    echo "\$ id -u" >>"$REPORT_INFO"
-             id -u  >>"$REPORT_INFO"
-
-    echo "Listing Jack server process..."
-    echo >>"$REPORT_INFO"
-    echo "\$ ps -A -o \"uid pid args\" | grep $LAUNCHER_NAME | grep -v grep" >>"$REPORT_INFO"
-            (ps -A -o  "uid pid args"  | grep $LAUNCHER_NAME | grep -v grep) >>"$REPORT_INFO" 2>&1
-
-    echo "Listing process using Jack server service port $SERVER_PORT_SERVICE..."
-    echo >>"$REPORT_INFO"
-    echo "\$ lsof -i TCP:$SERVER_PORT_SERVICE -l" >>"$REPORT_INFO"
-             lsof -i TCP:$SERVER_PORT_SERVICE -l  >>"$REPORT_INFO" 2>&1
-
-    echo "Listing process using Jack server admin port $SERVER_PORT_ADMIN..."
-    echo >>"$REPORT_INFO"
-    echo "\$ lsof -i TCP:$SERVER_PORT_ADMIN -l" >>"$REPORT_INFO"
-             lsof -i TCP:$SERVER_PORT_ADMIN -l  >>"$REPORT_INFO" 2>&1
-
-    echo "Collecting Jack client configuration..."
-    echo >>"$REPORT_INFO"
-    echo "\$ cat \"\$JACK_CLIENT_SETTING\"" >>"$REPORT_INFO"
-             cat   "$JACK_CLIENT_SETTING"   >>"$REPORT_INFO" 2>&1
-
-    echo "Listing Jack server installation dir..."
-    echo >>"$REPORT_INFO"
-    echo "\$ cd \"\$JACK_HOME\"; ls -l -R -n ." >>"$REPORT_INFO"
-            (cd   "$JACK_HOME" ; ls -l -R -n .  >>"$REPORT_INFO" 2>&1)
-
-    echo "Collecting curl version..."
-    echo >>"$REPORT_INFO"
-    echo "\$ curl --version" >>"$REPORT_INFO"
-             curl --version  >>"$REPORT_INFO" 2>&1
-
-    echo "Collecting curl connection info..."
-    echo >>"$REPORT_INFO"
-    echo "\$ JACK_EXTRA_CURL_OPTIONS=-v jack-admin list server" >>"$REPORT_INFO"
-             JACK_EXTRA_CURL_OPTIONS=-v "$0"       list server  >>"$REPORT_INFO" 2>&1
-
-    echo "Collecting Jack server stats..."
-    echo >>"$REPORT_INFO"
-    echo "\$ jack-admin server-stat" >>"$REPORT_INFO"
-             "$0"       server-stat  >>"$REPORT_INFO" 2>&1
-
-    echo "Collecting base64 info..."
-    echo >>"$REPORT_INFO"
-    echo "\$ base64 --version" >>"$REPORT_INFO"
-             base64 --version  >>"$REPORT_INFO" 2>&1
-    echo >>"$REPORT_INFO"
-    echo "\$ (echo amFjaw==;echo LXNlcnZlcg==) | base64 --decode" >>"$REPORT_INFO"
-             (echo amFjaw==;echo LXNlcnZlcg==) | base64 --decode >>"$REPORT_INFO" 2>&1
-
-    echo "Zipping Jack server installation dir except keys and certificates..."
-    (cd "$JACK_HOME"; zip --exclude \*.pem \*.jks --recurse-paths "$REPORT_PATH" .) >/dev/null
-    echo "Jack server report saved in '$REPORT'. Consider reviewing content before publishing."
-    exit 0 ;;
-
-
-  *)
-    usage
-    abort ;;
-esac
-
-
-# Exit
-
-exit 0
diff --git a/tools/jack-annotations.jar b/tools/jack-annotations.jar
deleted file mode 100644
index fa79119..0000000
--- a/tools/jack-annotations.jar
+++ /dev/null
Binary files differ
diff --git a/tools/jack-coverage-plugin.jar b/tools/jack-coverage-plugin.jar
deleted file mode 100644
index ac363d7..0000000
--- a/tools/jack-coverage-plugin.jar
+++ /dev/null
Binary files differ
diff --git a/tools/jack-diagnose b/tools/jack-diagnose
deleted file mode 100755
index dc7f3e9..0000000
--- a/tools/jack-diagnose
+++ /dev/null
@@ -1,195 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2016 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.
-#
-# Version: 1.3-a11
-#
-set -o nounset
-
-#
-# Settings
-#
-JACK_HOME="${JACK_HOME:=$HOME/.jack-server}"
-JACK_CLIENT_SETTING="${JACK_CLIENT_SETTING:=$HOME/.jack-settings}"
-TMPDIR=${TMPDIR:=/tmp}
-
-LAUNCHER_JAR="$JACK_HOME/launcher.jar"
-LAUNCHER_NAME=com.android.jack.launcher.ServerLauncher
-CURRENT_CHARSET=$(locale charmap)
-if [ -z "$CURRENT_CHARSET" ]; then
-  CHARSET_ARGUMENT=
-else
-  CHARSET_ARGUMENT=";charset=$CURRENT_CHARSET"
-fi
-
-JACK_LOGS_DIR="$JACK_HOME"/logs
-JACK_OUT_ERR="$JACK_LOGS_DIR"/outputs.txt
-JACK_CONNECTION_TIMEOUT=300
-
-#
-# Load client settings
-#
-if [ -f "$JACK_CLIENT_SETTING" ]; then
-  source "$JACK_CLIENT_SETTING"
-fi
-
-
-usage () {
-  echo "Usage : $0"
-}
-
-checkCurl() {
-  CURL_COMMAND=$(which curl)
-
-  if [ $? -ne 0 ] ; then
-    echo "curl not found in PATH"
-    return 255
-  fi
-
-  if ! "$CURL_COMMAND" --version >/dev/null 2>&1 ; then
-    echo "Failed to execute '$CURL_COMMAND'"
-    return 255
-  fi
-
-  if "$CURL_COMMAND" --version | grep -q "SecureTransport" ; then
-    echo "'$CURL_COMMAND' unsupported, please use a curl not based on SecureTransport"
-  fi
-
-  if "$CURL_COMMAND" --version | grep -q "OpenSSL/1.0.0" ; then
-    echo "'$CURL_COMMAND' is using a too old SSL library, please update curl and its dependencies"
-  elif curl --version | grep -q "OpenSSL/0." ; then
-    echo "'$CURL_COMMAND' is using a too old SSL library, please update curl and its dependencies"
-  fi
-}
-
-
-checkJava() {
-  JAVA_COMMAND=$(which java)
-
-  if [ $? -ne 0 ] ; then
-    echo "java not found in PATH"
-    return 255
-  fi
-
-  if ! "$JAVA_COMMAND" -version >/dev/null 2>&1 ; then
-    echo "Failed to execute '$JAVA_COMMAND'"
-    return 255
-  fi
-
-
-  JAVA_VERSION=$("$JAVA_COMMAND" -version 2>&1 | head -1 | grep --only-matching -e \"1\\.[0-9]* | cut -c 4-)
-  if [ -z "$JAVA_VERSION" ] ; then
-    echo "'$JAVA_COMMAND': Failed to parse version, please ensure you're running a supported java"
-    return 255
-  fi
-
-  if [ "$JAVA_VERSION" -lt 7 ] ; then
-    echo "'$JAVA_COMMAND' is too old, please update to 1.7 or newer"
-  fi
-}
-
-
-checkKeytool() {
-  KEYTOOL_COMMAND=$(which keytool)
-
-  if [ $? -ne 0 ] ; then
-    echo "keytool not found in PATH"
-    return 255
-  fi
-
-  if ! $KEYTOOL_COMMAND -help >/dev/null 2>&1 ; then
-    echo "failed to execute '$KEYTOOL_COMMAND'"
-    return 255
-  fi
-
-
-  if ! $KEYTOOL_COMMAND -help 2>&1 | grep -q -e "-genkeypair" ; then
-    echo "'$KEYTOOL_COMMAND' unsupported, please ensure PATH allows finding keytool from a supported Java Runtime Environment ie 1.7 or newer"
-  fi
-}
-
-
-#
-# $1: port number
-#
-checkport() {
-  PID_USING_PORT=$(lsof -F p -i TCP:$1 -sTCP:LISTEN | cut -c 2-)
-  if [ -z "$PID_USING_PORT" ] ; then
-    # port is free nothing to check
-    return 0
-  fi
-
-  PS_OUT=$(ps -p $PID_USING_PORT -o  "pid uid args" | tail -1)
-  if [ $? -ne 0 ] ; then
-    # process exited before we could get any info, weird but means the port is now available
-    return 0
-  fi
-
-  if ! echo $PS_OUT | grep -q $LAUNCHER_NAME  ; then
-    echo "Port $1 is used by another process (pid=$(echo $PS_OUT | awk '{print $1}')), please ensure to free the port or change port configuration in '$JACK_CLIENT_SETTING' and '$JACK_HOME/config.properties'"
-    return 255
-  fi
-
-  if [ "$(echo $PS_OUT | awk '{print $2}')" -ne "$(id -u)" ] ; then
-    echo "Port $1 is used b a Jack server from another user uid=$(echo $PS_OUT | awk '{print $2}'), please change port configuration in '$JACK_CLIENT_SETTING' and '$JACK_HOME/config.properties'"
-    return 255
-  fi
-}
-
-
-checkBase64() {
-  BASE64_COMMAND=$(which base64)
-
-  if [ $? -ne 0 ] ; then
-    echo "base64 not found in PATH"
-    return 255
-  fi
-
-  BASE64_CHECK=$((echo amFjaw==;echo LXNlcnZlcg==) | "$BASE64_COMMAND" --decode 2>&1)
-  if [ "$BASE64_CHECK" != jack-server ]; then
-    echo "'$BASE64_COMMAND' is not a supported version"
-    return 255
-  fi
-}
-
-STATUS=0
-
-if ! checkCurl ; then
-  STATUS=1
-fi
-
-if ! checkJava ; then
-  STATUS=1
-fi
-if ! checkKeytool ; then
-  STATUS=1
-fi
-
-if ! checkport $SERVER_PORT_ADMIN ; then
-  STATUS=1
-fi
-if ! checkport $SERVER_PORT_SERVICE ; then
-  STATUS=1
-fi
-
-if ! checkBase64 ; then
-  echo "base64 is not mandatory but installing a supported version can help with standard output and standard error problems"
-fi
-
-if [ $STATUS -eq 0 ] ; then
-  echo "Diagnostic completed without error."
-fi
-# Exit
-exit $STATUS
diff --git a/tools/jack-ea b/tools/jack-ea
deleted file mode 100755
index 94c2a17..0000000
--- a/tools/jack-ea
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-#
-# 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.
-#
-# Version: 1.3-a9
-#
-set -o nounset
-export JACK_ASSERTION_ENABLED=true
-if [ -e "$(dirname $0)/jack" ]; then
-  "$(dirname $0)/jack" $@
-else
-  jack $@
-fi
diff --git a/tools/jack-jar-tools.jar b/tools/jack-jar-tools.jar
deleted file mode 100644
index 9570195..0000000
--- a/tools/jack-jar-tools.jar
+++ /dev/null
Binary files differ
diff --git a/tools/jack-launcher.jar b/tools/jack-launcher.jar
deleted file mode 100644
index 2ca0332..0000000
--- a/tools/jack-launcher.jar
+++ /dev/null
Binary files differ
diff --git a/tools/jack-server-4.11.ALPHA.jar b/tools/jack-server-4.11.ALPHA.jar
deleted file mode 100644
index bc43dde..0000000
--- a/tools/jack-server-4.11.ALPHA.jar
+++ /dev/null
Binary files differ
diff --git a/tools/jack_for_module.mk b/tools/jack_for_module.mk
deleted file mode 100644
index 6623a48..0000000
--- a/tools/jack_for_module.mk
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# 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.
-#
-
-#
-# Define version of Jack used to compile one module by defining the var <module name>.JACK_VERSION
-# with value, the Jack version code. See possible values in prebuilts/sdk/tools/jack_versions.mk.
diff --git a/tools/jack_server_setup.mk b/tools/jack_server_setup.mk
deleted file mode 100644
index 780f890..0000000
--- a/tools/jack_server_setup.mk
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# 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.
-#
-LOCAL_PATH:= $(call my-dir)
-
-jack_server_version := 4.11.ALPHA
-jack_server_jar := $(LOCAL_PATH)/jack-server-$(jack_server_version).jar
-
-
-ifneq ($(ANDROID_JACK_VM_ARGS),)
-jack_vm_args := $(ANDROID_JACK_VM_ARGS)
-else
-jack_vm_args := -Dfile.encoding=UTF-8 -XX:+TieredCompilation
-endif
-available_jack_jars := $(wildcard $(LOCAL_PATH)/jacks/jack-*.jar)
-
-ifdef JACK_SERVER
-ifneq ($(JACK_SERVER),true)
-jack_server_disabled=true
-endif
-endif
-
-.PHONY: setup-jack-server
-setup-jack-server : PRIVATE_JACK_ADMIN := $(LOCAL_PATH)/jack-admin
-setup-jack-server : PRIVATE_PATH := $(LOCAL_PATH)
-setup-jack-server : PRIVATE_SERVER_VERSION := $(jack_server_version)
-setup-jack-server : PRIVATE_SERVER_JAR := $(jack_server_jar)
-setup-jack-server: $(JACK) $(LOCAL_PATH)/jack-launcher.jar $(jack_server_jar) $(available_jack_jars)
-ifndef jack_server_disabled
-	@echo Ensuring Jack server is installed and started
-ifneq ($(dist_goal),)
-	$(hide) $(PRIVATE_JACK_ADMIN) stop-server 2>&1 || (exit 0)
-	$(hide) $(PRIVATE_JACK_ADMIN) kill-server 2>&1 || (exit 0)
-	$(hide) $(PRIVATE_JACK_ADMIN) uninstall-server 2>&1 || (exit 0)
-endif
-	$(hide) $(PRIVATE_JACK_ADMIN) install-server $(PRIVATE_PATH)/jack-launcher.jar $(PRIVATE_SERVER_JAR)  2>&1 || (exit 0)
-ifneq ($(dist_goal),)
-	$(hide) mkdir -p "$(DIST_DIR)/logs/jack/"
-	$(hide) JACK_SERVER_VM_ARGUMENTS="$(jack_vm_args) -Dcom.android.jack.server.log.file=$(abspath $(DIST_DIR))/logs/jack/jack-server-%u-%g.log" $(PRIVATE_JACK_ADMIN) start-server 2>&1 || exit 0
-else
-	$(hide) JACK_SERVER_VM_ARGUMENTS="$(jack_vm_args)" $(PRIVATE_JACK_ADMIN) start-server 2>&1 || exit 0
-endif
-	$(hide) $(PRIVATE_JACK_ADMIN) update server $(PRIVATE_SERVER_JAR) $(PRIVATE_SERVER_VERSION) 2>&1 || exit 0
-	$(hide) $(foreach jack_jar,$(available_jack_jars),$(PRIVATE_JACK_ADMIN) update jack $(jack_jar) $(patsubst $(PRIVATE_PATH)/jacks/jack-%.jar,%,$(jack_jar)) || exit 47;)
-ifdef JACK_ENGINEERING_VERSION
-	$(hide) $(PRIVATE_JACK_ADMIN) update jack $(jack_eng_jar)
-endif
-endif
diff --git a/tools/jack_versions.mk b/tools/jack_versions.mk
deleted file mode 100644
index a62cb9f..0000000
--- a/tools/jack_versions.mk
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# 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.
-#
-LOCAL_PATH:= $(call my-dir)
-
-jack_jar_tools := $(LOCAL_PATH)/jack-jar-tools.jar
-jack_eng_jar := $(LOCAL_PATH)/jacks/jack.jar
-
-JACK_STABLE_VERSION := 4.32.CANDIDATE
-JACK_DOGFOOD_VERSION := 4.32.CANDIDATE
-JACK_SDKTOOL_VERSION := 4.32.CANDIDATE
-JACK_LANG_DEV_VERSION := 4.32.CANDIDATE
-ifneq ("$(wildcard $(jack_eng_jar))","")
-JACK_ENGINEERING_VERSION := $(shell $(JAVA) -jar $(jack_jar_tools) --version-code jack $(jack_eng_jar))
-endif
-
-ifneq ($(ANDROID_JACK_DEFAULT_VERSION),)
-JACK_DEFAULT_VERSION := $(JACK_$(ANDROID_JACK_DEFAULT_VERSION)_VERSION)
-ifeq ($(JACK_DEFAULT_VERSION),)
-$(error "$(ANDROID_JACK_DEFAULT_VERSION)" is an invalid value for ANDROID_JACK_DEFAULT_VERSION)
-endif
-JACK_APPS_VERSION := $(ANDROID_JACK_DEFAULT_VERSION)
-else
-ifneq (,$(TARGET_BUILD_APPS))
-# Unbundled branches
-JACK_DEFAULT_VERSION := $(JACK_STABLE_VERSION)
-else
-# Complete android tree
-JACK_DEFAULT_VERSION := $(JACK_STABLE_VERSION)
-endif
-JACK_APPS_VERSION := STABLE
-endif
diff --git a/tools/jacks/jack-4.32.CANDIDATE.jar b/tools/jacks/jack-4.32.CANDIDATE.jar
deleted file mode 100644
index 9767682..0000000
--- a/tools/jacks/jack-4.32.CANDIDATE.jar
+++ /dev/null
Binary files differ
diff --git a/tools/jills/jill-4.32.CANDIDATE.jar b/tools/jills/jill-4.32.CANDIDATE.jar
deleted file mode 100644
index 970ec3c..0000000
--- a/tools/jills/jill-4.32.CANDIDATE.jar
+++ /dev/null
Binary files differ
