diff --git a/webrtc/examples/androidtests/video_quality_loopback_test.py b/webrtc/examples/androidtests/video_quality_loopback_test.py
index 2500057..e8c4381 100755
--- a/webrtc/examples/androidtests/video_quality_loopback_test.py
+++ b/webrtc/examples/androidtests/video_quality_loopback_test.py
@@ -19,7 +19,6 @@
 """
 
 import argparse
-import atexit
 import logging
 import os
 import shutil
@@ -32,13 +31,6 @@
 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
 SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir,
                                         os.pardir))
-WEBRTC_DEPS_INSTRUCTIONS = """Please add a solution to your .gclient file like
-this and run gclient sync:
-{
-  "name": "webrtc.DEPS",
-  "url": "https://chromium.googlesource.com/chromium/deps/webrtc/webrtc.DEPS",
-},
-"""
 
 
 class Error(Exception):
@@ -62,7 +54,6 @@
 def _RunBackgroundCommand(argv, cwd=SRC_DIR):
   logging.info('Running %r', argv)
   process = subprocess.Popen(argv, cwd=cwd)
-  atexit.register(process.terminate)
   time.sleep(0.5)
   status = process.poll()
   if status:  # is not None or 0
@@ -108,8 +99,14 @@
   toolchain_dir = os.path.join(tools_dir, 'video_quality_toolchain')
 
   # Download ffmpeg and zxing.
-  download_script = os.path.join(tools_dir, 'download_tools.py')
-  _RunCommand([sys.executable, download_script, toolchain_dir])
+  download_tools_script = os.path.join(tools_dir, 'download_tools.py')
+  _RunCommand([sys.executable, download_tools_script, toolchain_dir])
+
+  testing_tools_dir = os.path.join(SRC_DIR, 'webrtc', 'tools', 'testing')
+
+  # Download, extract and build AppRTC.
+  setup_apprtc_script = os.path.join(testing_tools_dir, 'setup_apprtc.py')
+  _RunCommand([sys.executable, setup_apprtc_script, temp_dir])
 
   # Select an Android device in case multiple are connected
   for line in _RunCommandWithOutput([adb_path, 'devices']).splitlines():
@@ -119,82 +116,88 @@
   else:
     raise VideoQualityTestError('Cannot find any connected Android device.')
 
-  # Start AppRTC Server
-  dev_appserver = os.path.join(SRC_DIR, 'out', 'apprtc', 'google_appengine',
-                               'dev_appserver.py')
-  if not os.path.isfile(dev_appserver):
-    raise VideoQualityTestError('Cannot find %s.\n%s' %
-                                (dev_appserver, WEBRTC_DEPS_INSTRUCTIONS))
-  appengine_dir = os.path.join(SRC_DIR, 'out', 'apprtc', 'out', 'app_engine')
-  _RunBackgroundCommand(['python', dev_appserver, appengine_dir,
-                         '--port=9999', '--admin_port=9998',
-                         '--skip_sdk_update_check', '--clear_datastore=yes'])
+  processes = []
+  try:
+    # Start AppRTC Server
+    dev_appserver = os.path.join(temp_dir, 'apprtc', 'temp', 'google-cloud-sdk',
+                                'bin', 'dev_appserver.py')
+    appengine_dir = os.path.join(temp_dir, 'apprtc', 'out', 'app_engine')
+    processes.append(_RunBackgroundCommand([
+        'python', dev_appserver, appengine_dir,
+        '--port=9999', '--admin_port=9998',
+        '--skip_sdk_update_check', '--clear_datastore=yes']))
 
-  # Start Collider
-  collider_path = os.path.join(SRC_DIR, 'out', 'go-workspace', 'bin',
-      'collidermain')
-  if not os.path.isfile(collider_path):
-    raise VideoQualityTestError('Cannot find %s.\n%s' %
-                                (collider_path, WEBRTC_DEPS_INSTRUCTIONS))
-  _RunBackgroundCommand([collider_path, '-tls=false',
-                         '-port=8089', '-room-server=http://localhost:9999'])
+    # Start Collider
+    collider_path = os.path.join(temp_dir, 'collider', 'collidermain')
+    processes.append(_RunBackgroundCommand([
+        collider_path, '-tls=false', '-port=8089',
+        '-room-server=http://localhost:9999']))
 
-  # Start adb reverse forwarder
-  reverseforwarder_path = os.path.join(
-      SRC_DIR, 'build', 'android', 'adb_reverse_forwarder.py')
-  _RunBackgroundCommand([reverseforwarder_path, '--device', android_device,
-                         '9999', '9999', '8089', '8089'])
+    # Start adb reverse forwarder
+    reverseforwarder_path = os.path.join(
+        SRC_DIR, 'build', 'android', 'adb_reverse_forwarder.py')
+    processes.append(_RunBackgroundCommand([
+        reverseforwarder_path, '--device', android_device,
+        '9999', '9999', '8089', '8089']))
 
-  # Run the Espresso code.
-  test_script = os.path.join(build_dir_android,
-      'bin', 'run_AppRTCMobileTestStubbedVideoIO')
-  _RunCommand([test_script, '--device', android_device])
+    # Run the Espresso code.
+    test_script = os.path.join(build_dir_android,
+        'bin', 'run_AppRTCMobileTestStubbedVideoIO')
+    _RunCommand([test_script, '--device', android_device])
 
-  # Pull the output video.
-  test_video = os.path.join(temp_dir, 'test_video.y4m')
-  _RunCommand([adb_path, '-s', android_device,
-               'pull', '/sdcard/output.y4m', test_video])
+    # Pull the output video.
+    test_video = os.path.join(temp_dir, 'test_video.y4m')
+    _RunCommand([adb_path, '-s', android_device,
+                'pull', '/sdcard/output.y4m', test_video])
 
-  test_video_yuv = os.path.join(temp_dir, 'test_video.yuv')
+    test_video_yuv = os.path.join(temp_dir, 'test_video.yuv')
 
-  ffmpeg_path = os.path.join(toolchain_dir, 'linux', 'ffmpeg')
+    ffmpeg_path = os.path.join(toolchain_dir, 'linux', 'ffmpeg')
 
-  def ConvertVideo(input_video, output_video):
-    _RunCommand([ffmpeg_path, '-y', '-i', input_video, output_video])
+    def ConvertVideo(input_video, output_video):
+      _RunCommand([ffmpeg_path, '-y', '-i', input_video, output_video])
 
-  ConvertVideo(test_video, test_video_yuv)
+    ConvertVideo(test_video, test_video_yuv)
 
-  reference_video = os.path.join(SRC_DIR,
-      'resources', 'reference_video_640x360_30fps.y4m')
+    reference_video = os.path.join(SRC_DIR,
+        'resources', 'reference_video_640x360_30fps.y4m')
 
-  reference_video_yuv = os.path.join(temp_dir,
-      'reference_video_640x360_30fps.yuv')
+    reference_video_yuv = os.path.join(temp_dir,
+        'reference_video_640x360_30fps.yuv')
 
-  ConvertVideo(reference_video, reference_video_yuv)
+    ConvertVideo(reference_video, reference_video_yuv)
 
-  # Run compare script.
-  compare_script = os.path.join(SRC_DIR, 'webrtc', 'tools', 'compare_videos.py')
-  zxing_path = os.path.join(toolchain_dir, 'linux', 'zxing')
+    # Run compare script.
+    compare_script = os.path.join(SRC_DIR, 'webrtc', 'tools',
+                                  'compare_videos.py')
+    zxing_path = os.path.join(toolchain_dir, 'linux', 'zxing')
 
-  # The frame_analyzer binary should be built for local computer and not for
-  # Android
-  frame_analyzer = os.path.join(build_dir_x86, 'frame_analyzer')
+    # The frame_analyzer binary should be built for local computer and not for
+    # Android
+    frame_analyzer = os.path.join(build_dir_x86, 'frame_analyzer')
 
-  frame_width = 640
-  frame_height = 360
+    frame_width = 640
+    frame_height = 360
 
-  stats_file_ref = os.path.join(temp_dir, 'stats_ref.txt')
-  stats_file_test = os.path.join(temp_dir, 'stats_test.txt')
+    stats_file_ref = os.path.join(temp_dir, 'stats_ref.txt')
+    stats_file_test = os.path.join(temp_dir, 'stats_test.txt')
 
-  _RunCommand([
-      sys.executable, compare_script, '--ref_video', reference_video_yuv,
-      '--test_video', test_video_yuv, '--yuv_frame_width', str(frame_width),
-      '--yuv_frame_height', str(frame_height),
-      '--stats_file_ref', stats_file_ref,
-      '--stats_file_test', stats_file_test, '--frame_analyzer', frame_analyzer,
-      '--ffmpeg_path', ffmpeg_path, '--zxing_path', zxing_path])
+    _RunCommand([
+        sys.executable, compare_script, '--ref_video', reference_video_yuv,
+        '--test_video', test_video_yuv, '--yuv_frame_width', str(frame_width),
+        '--yuv_frame_height', str(frame_height),
+        '--stats_file_ref', stats_file_ref,
+        '--stats_file_test', stats_file_test,
+        '--frame_analyzer', frame_analyzer,
+        '--ffmpeg_path', ffmpeg_path, '--zxing_path', zxing_path])
 
-  shutil.rmtree(temp_dir)
+  finally:
+    for process in processes:
+      if process:
+        process.terminate()
+        process.wait()
+
+    shutil.rmtree(temp_dir)
 
 
 if __name__ == '__main__':
diff --git a/webrtc/tools/testing/README.md b/webrtc/tools/testing/README.md
new file mode 100644
index 0000000..9068b5b
--- /dev/null
+++ b/webrtc/tools/testing/README.md
@@ -0,0 +1,38 @@
+This directory contains prebuilt tools used during end-to-end tests.
+They will be downloaded by their SHA1 hash, and are not meant to be checked in.
+
+Updating prebuilt_apprtc.zip:
+
+- Follow AppRTC instructions:
+    - `git clone https://github.com/webrtc/apprtc`
+    - Install NodeJS:
+        - Download <https://nodejs.org/> and extract it
+        - `export PATH="$(pwd)/node-v6.10.3-linux-x64/bin:$PATH"`
+    - `cd apprtc`
+    - `npm install`
+    - `export PATH="$(pwd)/node_modules/.bin:$PATH"`
+    - `pip install --user --upgrade pip setuptools` - needed only on old systems
+    - `grunt`
+- Vendor collider's dependencies:
+    - `ln -s "$(pwd)/src/collider" src/src`
+    - `GOPATH="$(pwd)/src" go get -d collidermain`
+    - `rm src/src`
+- Remove unneeded files:
+    - `rm -rf .git node_modules browsers`
+- `zip -r prebuilt_apprtc.zip apprtc/`
+- `mv prebuilt_apprtc.zip webrtc/src/webrtc/tools/testing/prebuilt_apprtc.zip`
+
+Updating golang/*:
+
+- Go to <https://golang.org/dl/>
+- Download these files:
+    - go*.linux-amd64.tar.gz -> golang/linux/go.tar.gz
+    - go*.darwin-amd64.tar.gz -> golang/mac/go.tar.gz
+    - go*.windows-amd64.zip -> golang/windows/go.zip
+
+After updating the archives:
+
+- `cd webrtc/src/webrtc/tools/testing`
+- For each updated archive:
+    - `upload_to_google_storage.py file.zip --bucket=chromium-webrtc-resources`
+- `git commit -a && git cl upload`
diff --git a/webrtc/tools/testing/build_apprtc_collider.py b/webrtc/tools/testing/build_apprtc.py
similarity index 66%
rename from webrtc/tools/testing/build_apprtc_collider.py
rename to webrtc/tools/testing/build_apprtc.py
index 5ff09bb..a390c94 100755
--- a/webrtc/tools/testing/build_apprtc_collider.py
+++ b/webrtc/tools/testing/build_apprtc.py
@@ -9,11 +9,11 @@
 
 """Builds the AppRTC collider using the golang toolchain.
 
-The golang toolchain is downloaded by download_golang.py. We use that here
+The golang toolchain is downloaded by download_apprtc.py. We use that here
 to build the AppRTC collider server.
 
 This script needs to know the path to the 'src' directory in apprtc, the
-root directory of 'go', the root directory of 'hg' and the output_dir.
+root directory of 'go' and the output_dir.
 """
 
 import os
@@ -24,35 +24,30 @@
 import utils
 
 
-USAGE_STR = "Usage: {} <apprtc_src_dir> <go_dir> <hg_dir> <output_dir>"
+USAGE_STR = "Usage: {} <apprtc_src_dir> <go_dir> <output_dir>"
 
 
 def main(argv):
-  if len(argv) != 5:
+  if len(argv) != 4:
     return USAGE_STR.format(argv[0])
 
-  apprtc_dir = argv[1]
-  go_root_dir = argv[2]
-  mercurial_dir = argv[3]
-  golang_workspace = argv[4]
+  apprtc_dir = os.path.abspath(argv[1])
+  go_root_dir = os.path.abspath(argv[2])
+  golang_workspace = os.path.abspath(argv[3])
 
   utils.RemoveDirectory(golang_workspace)
 
   golang_workspace_src = os.path.join(golang_workspace, 'src')
 
   collider_dir = os.path.join(apprtc_dir, 'collider')
-  shutil.copytree(collider_dir, golang_workspace_src,
-                  ignore=shutil.ignore_patterns('.svn', '.git'))
+  shutil.copytree(collider_dir, golang_workspace_src)
 
   golang_binary = 'go%s' % ('.exe' if utils.GetPlatform() == 'win' else '')
   golang_path = os.path.join(go_root_dir, 'bin', golang_binary)
 
   golang_env = os.environ.copy()
   golang_env['GOROOT'] = go_root_dir
-  golang_env['GOPATH'] = os.path.abspath(golang_workspace)
-  golang_env['PATH'] += os.pathsep + mercurial_dir
-  subprocess.check_call([golang_path, 'get', 'collidermain'],
-                        env=golang_env)
+  golang_env['GOPATH'] = golang_workspace
   collider_exec = os.path.join(golang_workspace, 'collidermain')
   subprocess.check_call([golang_path, 'build', '-o', collider_exec,
                          'collidermain'], env=golang_env)
diff --git a/webrtc/tools/testing/build_mercurial_local.py b/webrtc/tools/testing/build_mercurial_local.py
deleted file mode 100755
index 512ca78..0000000
--- a/webrtc/tools/testing/build_mercurial_local.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS.  All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-"""Builds a local mercurial (hg) copy.
-
-This is used by the go toolchain.
-"""
-
-import os
-import subprocess
-import sys
-
-import utils
-
-
-def main(argv):
-  if len(argv) != 2:
-    return 'Usage: %s <mercurial_dir>' % argv[0]
-
-  mercurial_dir = argv[1]
-  if not os.path.exists(mercurial_dir):
-    return 'Expected mercurial at {}.'.format(mercurial_dir)
-
-  os.chdir(mercurial_dir)
-
-  if utils.GetPlatform() == 'win':
-    subprocess.check_call(['python', 'setup.py', '--pure', 'build_py', '-c',
-                           '-d', '.', 'build_ext',
-                           '-i', 'build_mo', '--force'])
-    with open('hg.bat', 'w') as put_hg_in_path:
-      # Write a hg.bat since the go toolchain expects to find something called
-      # 'hg' in the path, but Windows only recognizes executables ending with
-      # an extension in PATHEXT. Writing hg.bat effectively makes 'hg' callable
-      # if the mercurial folder is in PATH.
-      mercurial_path = os.path.abspath('hg')
-      put_hg_in_path.write('python %s %%*' % mercurial_path)
-  else:
-    subprocess.check_call(['make', 'local'])
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/webrtc/tools/testing/download_apprtc.py b/webrtc/tools/testing/download_apprtc.py
new file mode 100755
index 0000000..f6db785
--- /dev/null
+++ b/webrtc/tools/testing/download_apprtc.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+#
+# Use of this source code is governed by a BSD-style license
+# that can be found in the LICENSE file in the root of the source
+# tree. An additional intellectual property rights grant can be found
+# in the file PATENTS.  All contributing project authors may
+# be found in the AUTHORS file in the root of the source tree.
+
+"""Downloads prebuilt AppRTC and Go from WebRTC storage and unpacks it.
+
+Requires that depot_tools is installed and in the PATH.
+
+It downloads compressed files in the directory where the script lives.
+This is because the precondition is that the script lives in the same
+directory of the .sha1 files.
+"""
+
+import os
+import sys
+
+import utils
+
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+
+
+def _GetGoArchivePathForPlatform():
+  archive_extension = 'zip' if utils.GetPlatform() == 'win' else 'tar.gz'
+  return os.path.join(utils.GetPlatform(), 'go.%s' % archive_extension)
+
+
+def main(argv):
+  if len(argv) > 2:
+    return 'Usage: %s [output_dir]' % argv[0]
+
+  output_dir = os.path.abspath(argv[1]) if len(argv) > 1 else None
+
+  apprtc_zip_path = os.path.join(SCRIPT_DIR, 'prebuilt_apprtc.zip')
+  if os.path.isfile(apprtc_zip_path + '.sha1'):
+    utils.DownloadFilesFromGoogleStorage(SCRIPT_DIR, auto_platform=False)
+
+  if output_dir is not None:
+    utils.RemoveDirectory(os.path.join(output_dir, 'apprtc'))
+    utils.UnpackArchiveTo(apprtc_zip_path, output_dir)
+
+  golang_path = os.path.join(SCRIPT_DIR, 'golang')
+  golang_zip_path = os.path.join(golang_path, _GetGoArchivePathForPlatform())
+  if os.path.isfile(golang_zip_path + '.sha1'):
+    utils.DownloadFilesFromGoogleStorage(golang_path)
+
+  if output_dir is not None:
+    utils.RemoveDirectory(os.path.join(output_dir, 'go'))
+    utils.UnpackArchiveTo(golang_zip_path, output_dir)
+
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/webrtc/tools/testing/download_apprtc_appengine_and_mercurial.py b/webrtc/tools/testing/download_apprtc_appengine_and_mercurial.py
deleted file mode 100755
index 2d5b620..0000000
--- a/webrtc/tools/testing/download_apprtc_appengine_and_mercurial.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS.  All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-"""Downloads the appengine SDK from WebRTC storage and unpacks it.
-
-Requires that depot_tools is installed and in the PATH.
-
-It downloads compressed files in the directory where the script lives.
-This is because the precondition is that the script lives in the same
-directory of the .sha1 files.
-"""
-
-import glob
-import os
-import sys
-import subprocess
-
-import utils
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-
-def _DownloadResources(dir_to_scan_for_sha1):
-  print 'Downloading files in %s...' % dir_to_scan_for_sha1
-
-  extension = 'bat' if 'win32' in sys.platform else 'py'
-  cmd = ['download_from_google_storage.%s' % extension,
-         '--bucket=chromium-webrtc-resources',
-         '--directory', dir_to_scan_for_sha1]
-  subprocess.check_call(cmd)
-
-
-def _StripVersionNumberFromMercurialFolder(output_dir):
-  unpacked_name = glob.glob(os.path.join(output_dir, 'mercurial*'))
-  assert len(unpacked_name) == 1, 'Should have precisely one mercurial!'
-  os.rename(unpacked_name[0], os.path.join(output_dir, 'mercurial'))
-
-
-def main(argv):
-  if len(argv) == 1:
-    return 'Usage: %s <output_dir>' % argv[0]
-
-  output_dir = argv[1]
-  appengine_zip_path = os.path.join(SCRIPT_DIR, 'google-appengine.zip')
-  old_appengine_sha1 = utils.ComputeSHA1(appengine_zip_path)
-
-  mercurial_tar_path = os.path.join(SCRIPT_DIR, 'mercurial-src.tar.gz')
-  old_mercurial_sha1 = utils.ComputeSHA1(mercurial_tar_path)
-
-  apprtc_zip_path = os.path.join(SCRIPT_DIR, 'prebuilt_apprtc.zip')
-  old_apprtc_sha1 = utils.ComputeSHA1(apprtc_zip_path)
-
-  _DownloadResources(SCRIPT_DIR)
-
-  if old_appengine_sha1 != utils.ComputeSHA1(appengine_zip_path):
-    utils.RemoveDirectory(os.path.join(output_dir, 'google_appengine'))
-    utils.UnpackArchiveTo(appengine_zip_path, output_dir)
-
-  if old_mercurial_sha1 != utils.ComputeSHA1(mercurial_tar_path):
-    utils.RemoveDirectory(os.path.join(output_dir, 'mercurial'))
-    utils.UnpackArchiveTo(mercurial_tar_path, output_dir)
-    _StripVersionNumberFromMercurialFolder(output_dir)
-
-  if old_apprtc_sha1 != utils.ComputeSHA1(apprtc_zip_path):
-    utils.RemoveDirectory(os.path.join(output_dir, 'apprtc'))
-    utils.UnpackArchiveTo(apprtc_zip_path, output_dir)
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/webrtc/tools/testing/download_golang.py b/webrtc/tools/testing/download_golang.py
deleted file mode 100755
index a6665bb..0000000
--- a/webrtc/tools/testing/download_golang.py
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
-#
-# Use of this source code is governed by a BSD-style license
-# that can be found in the LICENSE file in the root of the source
-# tree. An additional intellectual property rights grant can be found
-# in the file PATENTS.  All contributing project authors may
-# be found in the AUTHORS file in the root of the source tree.
-
-"""Downloads the golang SDK from WebRTC storage and unpacks it.
-
-Requires that depot_tools is installed and in the PATH.
-
-The precondition is that a directory 'golang' lives in the same directory
-as the script.
-This 'golang' directory has the following structure:
-
-/golang
- |
- |-----/linux/go.tar.gz.sha1
- |-----/win/go.zip.sha1
- |-----/mac/go.tar.gz.sha1
-"""
-
-import os
-import sys
-
-import utils
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-
-
-def _GetGoArchivePathForPlatform():
-  archive_extension = 'zip' if utils.GetPlatform() == 'win' else 'tar.gz'
-  return os.path.join(utils.GetPlatform(), 'go.%s' % archive_extension)
-
-
-def main(argv):
-  if len(argv) == 1:
-    return 'Usage: %s <output_dir>' % argv[0]
-
-  output_dir = os.path.join(argv[1])
-  golang_path = os.path.join(SCRIPT_DIR, 'golang')
-  archive_path = os.path.join(golang_path, _GetGoArchivePathForPlatform())
-  old_archive_sha1 = utils.ComputeSHA1(archive_path)
-
-  utils.DownloadFilesFromGoogleStorage(golang_path)
-
-  if (old_archive_sha1 != utils.ComputeSHA1(archive_path)
-      or not os.path.exists('go')):
-    utils.RemoveDirectory(os.path.join(output_dir, 'go'))
-    utils.UnpackArchiveTo(archive_path, output_dir)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/webrtc/tools/testing/golang/linux/go.tar.gz.sha1 b/webrtc/tools/testing/golang/linux/go.tar.gz.sha1
index f655489..aa25095 100644
--- a/webrtc/tools/testing/golang/linux/go.tar.gz.sha1
+++ b/webrtc/tools/testing/golang/linux/go.tar.gz.sha1
@@ -1 +1 @@
-14068fbe349db34b838853a7878621bbd2b24646
+a433f76c569055ff8536d796995518dd91a9fa5b
\ No newline at end of file
diff --git a/webrtc/tools/testing/golang/mac/go.tar.gz.sha1 b/webrtc/tools/testing/golang/mac/go.tar.gz.sha1
index c76e704..6dbaaf3 100644
--- a/webrtc/tools/testing/golang/mac/go.tar.gz.sha1
+++ b/webrtc/tools/testing/golang/mac/go.tar.gz.sha1
@@ -1 +1 @@
-be686ec7ba68d588735cc2094ccab8bdd651de9e
+aecf5ec9360a004fdbff181269554892743f4bf6
\ No newline at end of file
diff --git a/webrtc/tools/testing/golang/win/go.zip.sha1 b/webrtc/tools/testing/golang/win/go.zip.sha1
index a6bcbab..00fae8d 100644
--- a/webrtc/tools/testing/golang/win/go.zip.sha1
+++ b/webrtc/tools/testing/golang/win/go.zip.sha1
@@ -1 +1 @@
-ba99083b22e0b22b560bb2d28b9b99b405d01b6b
+26bf854fb81f12e9c80a146d8f0081cd22ae9d02
\ No newline at end of file
diff --git a/webrtc/tools/testing/google-appengine.zip.sha1 b/webrtc/tools/testing/google-appengine.zip.sha1
deleted file mode 100644
index cf13e4c..0000000
--- a/webrtc/tools/testing/google-appengine.zip.sha1
+++ /dev/null
@@ -1 +0,0 @@
-827468f89c78f292c28ceac50e6109c8d649fa61
diff --git a/webrtc/tools/testing/mercurial-src.tar.gz.sha1 b/webrtc/tools/testing/mercurial-src.tar.gz.sha1
deleted file mode 100644
index 5ef3e9d..0000000
--- a/webrtc/tools/testing/mercurial-src.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a8a51aa412abd5155c7de29fd39c9774decb4d3f
\ No newline at end of file
diff --git a/webrtc/tools/testing/prebuilt_apprtc.zip.sha1 b/webrtc/tools/testing/prebuilt_apprtc.zip.sha1
index 7e2833e..95b41c7 100644
--- a/webrtc/tools/testing/prebuilt_apprtc.zip.sha1
+++ b/webrtc/tools/testing/prebuilt_apprtc.zip.sha1
@@ -1 +1 @@
-6a96fc234cfa92ffaa79b0aeb5f4bdc1f31c6340
\ No newline at end of file
+d8d95f55129e0c1a4e0f5d0d3acbf7163395354c
\ No newline at end of file
diff --git a/webrtc/tools/testing/setup_apprtc.py b/webrtc/tools/testing/setup_apprtc.py
old mode 100644
new mode 100755
index 801da73..697d503
--- a/webrtc/tools/testing/setup_apprtc.py
+++ b/webrtc/tools/testing/setup_apprtc.py
@@ -22,30 +22,22 @@
 
 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
 
+
 def main(argv):
   if len(argv) == 1:
     return 'Usage %s <output_dir>' % argv[0]
 
-  output_dir = argv[1]
-  apprtc_appengine_mercurial_path = os.path.join(
-      SCRIPT_DIR, 'download_apprtc_appengine_and_mercurial.py')
-  utils.RunSubprocessWithRetry([apprtc_appengine_mercurial_path,
-                                output_dir])
+  output_dir = os.path.abspath(argv[1])
 
-  download_golang_path = os.path.join(SCRIPT_DIR, 'download_golang.py')
-  utils.RunSubprocessWithRetry([download_golang_path, output_dir])
+  download_apprtc_path = os.path.join(SCRIPT_DIR, 'download_apprtc.py')
+  utils.RunSubprocessWithRetry([download_apprtc_path, output_dir])
 
-  build_mercurial_path = os.path.join(SCRIPT_DIR, 'build_mercurial_local.py')
-  hg_dir = os.path.join(output_dir, 'mercurial')
-  utils.RunSubprocessWithRetry([build_mercurial_path, hg_dir])
-
-  build_apprtc_collider_path = os.path.join(SCRIPT_DIR,
-                                            'build_apprtc_collider.py')
+  build_apprtc_path = os.path.join(SCRIPT_DIR, 'build_apprtc.py')
   apprtc_src_dir = os.path.join(output_dir, 'apprtc', 'src')
   go_dir = os.path.join(output_dir, 'go')
   collider_dir = os.path.join(output_dir, 'collider')
-  utils.RunSubprocessWithRetry([build_apprtc_collider_path, apprtc_src_dir,
-                                go_dir, hg_dir, collider_dir])
+  utils.RunSubprocessWithRetry([build_apprtc_path, apprtc_src_dir,
+                                go_dir, collider_dir])
 
 
 if __name__ == '__main__':
diff --git a/webrtc/tools/testing/utils.py b/webrtc/tools/testing/utils.py
index 7e38b42..3b82fc8 100755
--- a/webrtc/tools/testing/utils.py
+++ b/webrtc/tools/testing/utils.py
@@ -9,7 +9,6 @@
 
 """Utilities for all our deps-management stuff."""
 
-import hashlib
 import os
 import shutil
 import sys
@@ -34,32 +33,18 @@
   raise exception
 
 
-def DownloadFilesFromGoogleStorage(path):
+def DownloadFilesFromGoogleStorage(path, auto_platform=True):
   print 'Downloading files in %s...' % path
 
   extension = 'bat' if 'win32' in sys.platform else 'py'
   cmd = ['download_from_google_storage.%s' % extension,
          '--bucket=chromium-webrtc-resources',
-         '--auto_platform',
-         '--recursive',
          '--directory', path]
+  if auto_platform:
+    cmd += ['--auto_platform', '--recursive']
   subprocess.check_call(cmd)
 
 
-def ComputeSHA1(path):
-  if not os.path.exists(path):
-    return 0
-
-  sha1 = hashlib.sha1()
-  file_to_hash = open(path, 'rb')
-  try:
-    sha1.update(file_to_hash.read())
-  finally:
-    file_to_hash.close()
-
-  return sha1.hexdigest()
-
-
 # Code partially copied from
 # https://cs.chromium.org#chromium/build/scripts/common/chromium_utils.py
 def RemoveDirectory(*path):
