diff --git a/DEPS b/DEPS
index c09d481..518b220 100644
--- a/DEPS
+++ b/DEPS
@@ -40,7 +40,13 @@
   {
     "pattern": ".",
     "action" : ["python",
-                "webrtc.DEPS/download_appengine_sdk.py",
+                "webrtc.DEPS/download_appengine_and_mercurial.py",
+                "webrtc.DEPS"],
+  },
+  {
+    "pattern": ".",
+    "action" : ["python",
+                "webrtc.DEPS/download_golang.py",
                 "webrtc.DEPS"],
   },
   {
@@ -51,6 +57,18 @@
                 "webrtc.DEPS/copy_apprtc.py"],
   },
   {
+    # Build Mercurial which is needed by the golang toolchain.
+    "pattern": ".",
+    "action" : ["python",
+                "webrtc.DEPS/build_mercurial_local.py"],
+  },
+  {
+    # Build AppRTC Collider using the golang toolchain.
+    "pattern": ".",
+    "action" : ["python",
+                "webrtc.DEPS/build_apprtc_collider.py"],
+  },
+  {
     # Download test resources, i.e. video and audio files from Google Storage.
     # These resources are used by the Android bots.
     "pattern": "\\.sha1",
diff --git a/build_apprtc_collider.py b/build_apprtc_collider.py
new file mode 100755
index 0000000..4b0f86b
--- /dev/null
+++ b/build_apprtc_collider.py
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Builds the AppRTC collider using the golang toolchain.
+
+The golang toolchain is downloaded by download_golang.py. We use that here
+to build the AppRTC collider server.
+"""
+
+import os
+import shutil
+import subprocess
+import sys
+
+import utils
+
+
+def main():
+  web_samples_dir = os.path.join('webrtc-samples', 'samples', 'web')
+  golang_workspace = os.path.join('src', 'out', 'go-workspace')
+  shutil.rmtree(golang_workspace, ignore_errors=True)
+  golang_workspace_src = os.path.join(golang_workspace, 'src')
+
+  collider_dir = os.path.join(web_samples_dir, 'content', 'apprtc', 'collider')
+  shutil.copytree(collider_dir, golang_workspace_src,
+                  ignore=shutil.ignore_patterns('.svn', '.git'))
+
+  golang_binary = 'go%s' % ('.exe' if utils.GetPlatform() == 'win' else '')
+  golang_path = os.path.join('go', 'bin', golang_binary)
+
+  golang_env = os.environ.copy()
+  golang_env['GOROOT'] = os.path.abspath('go')
+  golang_env['GOPATH'] = os.path.abspath(golang_workspace)
+  golang_env['PATH'] += os.pathsep + os.path.abspath('mercurial')
+  subprocess.check_call([golang_path, 'get', 'collidermain'],
+                        env=golang_env)
+  subprocess.check_call([golang_path, 'build', 'collidermain'],
+                        env=golang_env)
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/build_mercurial_local.py b/build_mercurial_local.py
new file mode 100755
index 0000000..3170641
--- /dev/null
+++ b/build_mercurial_local.py
@@ -0,0 +1,40 @@
+#!/usr/bin/python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Builds a local mercurial (hg) copy.
+
+This is used by the go toolchain.
+"""
+
+import os
+import shutil
+import subprocess
+import sys
+
+import utils
+
+
+def main():
+  if not os.path.exists('mercurial'):
+    return 'Expected mercurial at %s.' % os.path.abspath('mercurial')
+
+  os.chdir('mercurial')
+
+  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())
diff --git a/download_appengine_and_mercurial.py b/download_appengine_and_mercurial.py
new file mode 100755
index 0000000..e2b3139
--- /dev/null
+++ b/download_appengine_and_mercurial.py
@@ -0,0 +1,59 @@
+#!/usr/bin/python
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Downloads the appengine SDK from WebRTC storage and unpacks it.
+
+Requires that depot_tools is installed and in the PATH. This script expects
+to run with Chrome's base dir as the working directory, e.g. where the .gclient
+file is. This is what should happen if this script is invoked as a hook action.
+"""
+
+import glob
+import os
+import sys
+import subprocess
+
+import utils
+
+def _DownloadResources(webrtc_deps_path):
+  print 'Downloading files in %s...' % webrtc_deps_path
+
+  extension = 'bat' if 'win32' in sys.platform else 'py'
+  cmd = ['download_from_google_storage.%s' % extension,
+         '--bucket=chromium-webrtc-resources',
+         '--directory', webrtc_deps_path]
+  subprocess.check_call(cmd)
+
+
+def _StripVersionNumberFromMercurialFolder():
+  unpacked_name = glob.glob('mercurial*')
+  assert len(unpacked_name) == 1, 'Should have precisely one mercurial!'
+  os.rename(unpacked_name[0], 'mercurial')
+
+
+def main(argv):
+  if len(argv) == 1:
+    return 'Usage: %s <path to webrtc.DEPS>' % argv[0]
+
+  webrtc_deps_path = argv[1]
+  appengine_zip_path = os.path.join(webrtc_deps_path, 'google-appengine.zip')
+  old_appengine_sha1 = utils.ComputeSHA1(appengine_zip_path)
+
+  mercurial_tar_path = os.path.join(webrtc_deps_path, 'mercurial-src.tar.gz')
+  old_mercurial_sha1 = utils.ComputeSHA1(mercurial_tar_path)
+
+  _DownloadResources(webrtc_deps_path)
+
+  if old_appengine_sha1 != utils.ComputeSHA1(appengine_zip_path):
+    utils.DeleteDirNextToGclient('google_appengine')
+    utils.UnpackToWorkingDir(appengine_zip_path)
+
+  if old_mercurial_sha1 != utils.ComputeSHA1(mercurial_tar_path):
+    utils.DeleteDirNextToGclient('mercurial')
+    utils.UnpackToWorkingDir(mercurial_tar_path)
+    _StripVersionNumberFromMercurialFolder()
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/download_appengine_sdk.py b/download_appengine_sdk.py
deleted file mode 100755
index d4e3b78..0000000
--- a/download_appengine_sdk.py
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/usr/bin/python
-# Copyright 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Downloads the appengine SDK from WebRTC storage and unpacks it.
-
-Requires that depot_tools is installed and in the PATH. This script expects
-to run with Chrome's base dir as the working directory, e.g. where the .gclient
-file is. This is what should happen if this script is invoked as a hook action.
-"""
-
-import hashlib
-import os
-import shutil
-import sys
-import subprocess
-import zipfile
-
-
-def _DownloadAppEngineZipFile(webrtc_deps_path):
-  print 'Downloading files in %s...' % webrtc_deps_path
-
-  extension = 'bat' if 'win32' in sys.platform else 'py'
-  cmd = ['download_from_google_storage.%s' % extension,
-         '--bucket=chromium-webrtc-resources',
-         '--directory', webrtc_deps_path]
-  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()
-
-
-# This is necessary since Windows won't allow us to unzip onto an existing dir.
-def _DeleteOldAppEngineDir():
-  app_engine_dir = 'google_appengine'
-  print 'Deleting %s in %s...' % (app_engine_dir, os.getcwd())
-  shutil.rmtree(app_engine_dir, ignore_errors=True)
-
-
-def _Unzip(path):
-  print 'Unzipping %s in %s...' % (path, os.getcwd())
-  zip_file = zipfile.ZipFile(path)
-  try:
-    zip_file.extractall()
-  finally:
-    zip_file.close()
-
-
-def main(argv):
-  if len(argv) == 1:
-    return 'Usage: %s <path to webrtc.DEPS>' % argv[0]
-
-  webrtc_deps_path = argv[1]
-  zip_path = os.path.join(webrtc_deps_path, 'google-appengine.zip')
-  old_zip_sha1 = _ComputeSHA1(zip_path)
-
-  _DownloadAppEngineZipFile(webrtc_deps_path)
-
-  if old_zip_sha1 != _ComputeSHA1(zip_path):
-    _DeleteOldAppEngineDir()
-    _Unzip(zip_path)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/download_golang.py b/download_golang.py
new file mode 100755
index 0000000..c61ba00
--- /dev/null
+++ b/download_golang.py
@@ -0,0 +1,58 @@
+#!/usr/bin/python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Downloads the golang SDK from WebRTC storage and unpacks it.
+
+Requires that depot_tools is installed and in the PATH. This script expects
+to run with Chrome's base dir as the working directory, e.g. where the .gclient
+file is. This is what should happen if this script is invoked as a hook action.
+"""
+
+import os
+import subprocess
+import sys
+import tarfile
+import zipfile
+
+import utils
+
+
+def _DownloadFilesFromGoogleStorage(webrtc_deps_path):
+  print 'Downloading files in %s...' % webrtc_deps_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', webrtc_deps_path]
+  subprocess.check_call(cmd)
+
+
+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 <path to webrtc.DEPS>' % argv[0]
+  if not os.path.exists('.gclient'):
+    return 'Invoked from wrong dir; invoke from dir with .gclient'
+
+  webrtc_deps_path = argv[1]
+  golang_path = os.path.join(webrtc_deps_path, 'golang')
+  archive_path = os.path.join(golang_path, _GetGoArchivePathForPlatform())
+  old_archive_sha1 = utils.ComputeSHA1(archive_path)
+
+  _DownloadFilesFromGoogleStorage(golang_path)
+
+  if old_archive_sha1 != utils.ComputeSHA1(archive_path):
+    utils.DeleteDirNextToGclient('go')
+    utils.UnpackToWorkingDir(archive_path)
+
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/golang/linux/go.tar.gz.sha1 b/golang/linux/go.tar.gz.sha1
new file mode 100644
index 0000000..f655489
--- /dev/null
+++ b/golang/linux/go.tar.gz.sha1
@@ -0,0 +1 @@
+14068fbe349db34b838853a7878621bbd2b24646
diff --git a/golang/mac/go.tar.gz.sha1 b/golang/mac/go.tar.gz.sha1
new file mode 100644
index 0000000..c76e704
--- /dev/null
+++ b/golang/mac/go.tar.gz.sha1
@@ -0,0 +1 @@
+be686ec7ba68d588735cc2094ccab8bdd651de9e
diff --git a/golang/win/go.zip.sha1 b/golang/win/go.zip.sha1
new file mode 100644
index 0000000..a6bcbab
--- /dev/null
+++ b/golang/win/go.zip.sha1
@@ -0,0 +1 @@
+ba99083b22e0b22b560bb2d28b9b99b405d01b6b
diff --git a/mercurial-src.tar.gz.sha1 b/mercurial-src.tar.gz.sha1
new file mode 100644
index 0000000..5ef3e9d
--- /dev/null
+++ b/mercurial-src.tar.gz.sha1
@@ -0,0 +1 @@
+a8a51aa412abd5155c7de29fd39c9774decb4d3f
\ No newline at end of file
diff --git a/utils.py b/utils.py
new file mode 100755
index 0000000..1cf998d
--- /dev/null
+++ b/utils.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Utilities for all our deps-management stuff."""
+
+import hashlib
+import os
+import shutil
+import sys
+import tarfile
+import zipfile
+
+
+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()
+
+
+def DeleteDirNextToGclient(directory):
+  # Sanity check to avoid nuking the wrong dirs.
+  if not os.path.exists('.gclient'):
+    raise Exception('Invoked from wrong dir; invoke from dir with .gclient')
+  print 'Deleting %s in %s...' % (directory, os.getcwd())
+  shutil.rmtree(directory, ignore_errors=True)
+
+
+def UnpackToWorkingDir(archive_path):
+  extension = os.path.splitext(archive_path)[1]
+  if extension == '.zip':
+    _Unzip(archive_path)
+  else:
+    _Untar(archive_path)
+
+
+def _Unzip(path):
+  print 'Unzipping %s in %s...' % (path, os.getcwd())
+  zip_file = zipfile.ZipFile(path)
+  try:
+    zip_file.extractall()
+  finally:
+    zip_file.close()
+
+
+def _Untar(path):
+  print 'Untarring %s in %s...' % (path, os.getcwd())
+  tar_file = tarfile.open(path, 'r:gz')
+  try:
+    tar_file.extractall()
+  finally:
+    tar_file.close()
+
+
+def GetPlatform():
+  if sys.platform.startswith('win'):
+    return 'win'
+  if sys.platform.startswith('linux'):
+    return 'linux'
+  if sys.platform.startswith('darwin'):
+    return 'mac'
+  raise Exception("Can't run on platform %s." % sys.platform)
+
