Try server and buildbot scripts now using Chromium scripts.
- compatible with depot_tools try commands.
- old build master is converted to use Chromium scripts, according to
http://www.chromium.org/developers/testing/chromium-build-infrastructure/getting-the-buildbot-source/forking-your-buildbot
- slaves can now be run out of a plain checkout, no local configuration needed.

Also added files to make it possible to use tools as a separate checkout.

BUG=None
TEST=Runs on local machine with remote slaves. I've successfully submitted try jobs with both git try and gcl try commands.

Review URL: https://webrtc-codereview.appspot.com/449011

git-svn-id: http://webrtc.googlecode.com/svn/trunk@1945 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/tools/.gitignore b/tools/.gitignore
new file mode 100644
index 0000000..6aaedbe
--- /dev/null
+++ b/tools/.gitignore
@@ -0,0 +1,65 @@
+*.failed
+*.pyc
+*~
+.*.sw?
+.DS_Store
+.code_review_password
+.cproject
+.metadata
+.project
+.pydevproject
+.settings
+.status_password
+/continuous_build/depot_tools
+/third_party/gaeunit
+/third_party/oauth2
+
+# Buildbot creates these files:
+.manhole
+changes.pck
+changes.pck.old
+dropin.cache
+events_*
+http.log
+master.cfg.sample
+state.sqlite
+state.sqlite-shm
+state.sqlite-wal
+twistd.log*
+twistd.pid
+
+# Output by buildbot into public_html:
+bg_gradient.jpg
+default.css
+favicon.ico.new
+robots.txt
+
+# Chrome buildbot scripts
+/continuous_build/build
+
+# Buildbot slave log directories:
+/continuous_build/build_internal/masters/master.webrtc/android
+/continuous_build/build_internal/masters/master.webrtc/chromeos
+/continuous_build/build_internal/masters/master.webrtc/linux-chrome
+/continuous_build/build_internal/masters/master.webrtc/linux-clang
+/continuous_build/build_internal/masters/master.webrtc/linux-slave-1
+/continuous_build/build_internal/masters/master.webrtc/linux-slave-2
+/continuous_build/build_internal/masters/master.webrtc/linux-slave-4
+/continuous_build/build_internal/masters/master.webrtc/linux-slave-5
+/continuous_build/build_internal/masters/master.webrtc/linux-slave-gcc-4.6
+/continuous_build/build_internal/masters/master.webrtc/linux-valgrind
+/continuous_build/build_internal/masters/master.webrtc/mac-slave-2
+/continuous_build/build_internal/masters/master.webrtc/mac-slave-3
+/continuous_build/build_internal/masters/master.webrtc/win-32-dbg
+/continuous_build/build_internal/masters/master.webrtc/win-32-release
+/continuous_build/build_internal/masters/master.webrtc/video
+/continuous_build/build_internal/masters/master.tryserver.webrtc/linux-trybot-1
+/continuous_build/build_internal/masters/master.tryserver.webrtc/linux-trybot-2
+/continuous_build/build_internal/masters/master.tryserver.webrtc/mac-trybot-1
+/continuous_build/build_internal/masters/master.tryserver.webrtc/mac-trybot-2
+/continuous_build/build_internal/masters/master.tryserver.webrtc/win-trybot-1
+/continuous_build/build_internal/masters/master.tryserver.webrtc/win-trybot-2
+
+
+
+
diff --git a/tools/DEPS b/tools/DEPS
new file mode 100644
index 0000000..68dd43a
--- /dev/null
+++ b/tools/DEPS
@@ -0,0 +1,34 @@
+# Tools has its own dependencies, separate from the production code.
+# Use http rather than https; the latter can cause problems for users behind
+# proxies.
+
+vars = {
+  "chromium_trunk" : "http://src.chromium.org/svn/trunk",
+}
+
+deps = {
+  # Used by quality_tracking.
+  "tools/third_party/gaeunit":
+    "http://code.google.com/p/gaeunit.git@e16d5bd4",
+
+  # Used by quality_tracking.
+  "tools/third_party/oauth2":
+    "http://github.com/simplegeo/python-oauth2.git@a83f4a29",
+
+  # Chromium buildbot scripts needs to be at the same level as our scripts.
+  "tools/continuous_build/build":
+    Var("chromium_trunk") + "/tools/build",
+
+  # Chromium buildbot scripts needs their own depot_tools.
+  "tools/continuous_build/depot_tools":
+    Var("chromium_trunk") + "/tools/depot_tools",
+}
+
+hooks = [
+  {
+    # Update slave buildbot.tac to include WebRTC slave_utils import.
+    "pattern": ".",
+    "action": ["python", "tools/add_webrtc_slave_utils.py"],
+  },
+]
+
diff --git a/tools/OWNERS b/tools/OWNERS
new file mode 100644
index 0000000..965de1e
--- /dev/null
+++ b/tools/OWNERS
@@ -0,0 +1,4 @@
+kjellander@webrtc.org
+phoglund@webrtc.org
+niklas.enbom@webrtc.org
+andrew@webrtc.org
diff --git a/tools/PRESUBMIT.py b/tools/PRESUBMIT.py
new file mode 100644
index 0000000..5e2faaf
--- /dev/null
+++ b/tools/PRESUBMIT.py
@@ -0,0 +1,58 @@
+# Copyright (c) 2012 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.
+
+def _LicenseHeader(input_api):
+  """Returns the license header regexp."""
+  license_header = (
+      r'.*? Copyright \(c\) %(year)s The WebRTC project authors\. '
+        r'All Rights Reserved\.\n'
+      r'.*?\n'
+      r'.*? Use of this source code is governed by a BSD-style license\n'
+      r'.*? that can be found in the LICENSE file in the root of the source\n'
+      r'.*? tree\. An additional intellectual property rights grant can be '
+        r'found\n'
+      r'.*? in the file PATENTS\.  All contributing project authors may\n'
+      r'.*? be found in the AUTHORS file in the root of the source tree\.\n'
+  ) % {
+      'year': input_api.time.strftime('%Y'),
+  }
+  return license_header
+
+def _CommonChecks(input_api, output_api):
+  """Checks common to both upload and commit."""
+  results = []
+  results.extend(input_api.canned_checks.CheckLongLines(
+      input_api, output_api))
+  results.extend(input_api.canned_checks.CheckChangeHasNoTabs(
+      input_api, output_api))
+  results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
+      input_api, output_api))
+  results.extend(input_api.canned_checks.CheckChangeTodoHasOwner(
+      input_api, output_api))
+  results.extend(input_api.canned_checks.CheckLicense(
+      input_api, output_api, _LicenseHeader(input_api)))
+  return results
+
+def CheckChangeOnUpload(input_api, output_api):
+  results = []
+  results.extend(_CommonChecks(input_api, output_api))
+  return results
+
+def CheckChangeOnCommit(input_api, output_api):
+  results = []
+  results.extend(_CommonChecks(input_api, output_api))
+  results.extend(input_api.canned_checks.CheckOwners(input_api, output_api))
+  results.extend(input_api.canned_checks.CheckChangeWasUploaded(
+      input_api, output_api))
+  results.extend(input_api.canned_checks.CheckChangeHasDescription(
+      input_api, output_api))
+  results.extend(input_api.canned_checks.CheckChangeHasBugField(
+      input_api, output_api))
+  results.extend(input_api.canned_checks.CheckChangeHasTestField(
+      input_api, output_api))
+  return results
diff --git a/tools/add_webrtc_slave_utils.py b/tools/add_webrtc_slave_utils.py
new file mode 100755
index 0000000..4b28ac6
--- /dev/null
+++ b/tools/add_webrtc_slave_utils.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+#  Copyright (c) 2012 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.
+
+__author__ = 'kjellander@webrtc.org (Henrik Kjellander)'
+
+import os
+
+
+def main():
+  """
+  Simple script for adding an import of the WebRTC slave_utils module for the
+  buildbot slaves to the Chromium buildbot.tac file.
+  Using this script, we don't need to maintain our own version of the slave
+  scripts and can automatically stay up to date with their changes.
+  It will add a comment and the import at the end of the file, if it's not
+  already present.
+
+  This script should be invoked as a hooks step in the DEPS file, like this:
+  hooks = [
+   {
+      # Update slave buildbot.tac to include WebRTC slave_utils import.
+      "pattern": ".",
+      "action": ["python", "tools/add_webrtc_slave_utils.py"],
+    },
+  ]
+  """
+  SCRIPT_PATH = os.path.dirname(os.path.abspath(__file__))
+  TARGET_FILE = os.path.join(SCRIPT_PATH,
+                             'continuous_build/build/slave/buildbot.tac')
+  COMMENT_LINE = '# Load WebRTC custom slave script.\n'
+  IMPORT_LINE = 'from webrtc_buildbot import slave_utils\n'
+
+  file = open(TARGET_FILE, 'r')
+  if file.read().find(IMPORT_LINE) == -1:
+    print 'Patching %s with WebRTC imports.' % TARGET_FILE
+    file.close()
+    file = open(TARGET_FILE, 'a')
+    file.write(COMMENT_LINE)
+    file.write(IMPORT_LINE)
+  file.close()
+
+if __name__ == '__main__':
+  main()
diff --git a/tools/codereview.settings b/tools/codereview.settings
new file mode 100644
index 0000000..c7ae786
--- /dev/null
+++ b/tools/codereview.settings
@@ -0,0 +1,9 @@
+# This file is used by gcl to get repository specific information.
+CODE_REVIEW_SERVER: webrtc-codereview.appspot.com
+#CC_LIST:
+#VIEW_VC:
+#STATUS:
+TRY_ON_UPLOAD: False
+#TRYSERVER_SVN_URL:
+#GITCL_PREUPLOAD:
+#GITCL_PREDCOMMIT:
diff --git a/tools/continuous_build/OWNERS b/tools/continuous_build/OWNERS
index 60e166c..311c3c5 100644
--- a/tools/continuous_build/OWNERS
+++ b/tools/continuous_build/OWNERS
@@ -1,3 +1,3 @@
-ivinnichenko@webrtc.org
-phoglund@webrtc.org
 kjellander@webrtc.org
+phoglund@webrtc.org
+ivinnichenko@webrtc.org
diff --git a/tools/continuous_build/README b/tools/continuous_build/README
new file mode 100644
index 0000000..9f48a7c
--- /dev/null
+++ b/tools/continuous_build/README
@@ -0,0 +1,76 @@
+WebRTC buildbots
+================
+These buildbot setups are based on how Chromium uses Buildbot scripts with their
+own customizations of startup and master-slave configurations.
+
+The directory layout and the files inside build_internal/masters are copied from
+Chromium's repository and modified for our needs according to the guidelines at
+http://goo.gl/kPSSv
+
+One nice advantage with using this, is that all slaves run out of the box by
+just syncing the WebRTC tools and the third-party dependencies. No additional
+dependencies are required except a Python install.
+
+
+Setup a tools workspace:
+========================
+mkdir webrtc-tools
+cd webrtc-tools
+gclient config http://webrtc.googlecode.com/svn/trunk/tools
+gclient sync
+cd tools/continuous_build
+svn co http://src.chromium.org/svn/trunk/tools/depot_tools
+echo pass > build/site_config/.bot_password
+
+
+To run the build master:
+========================
+cd tools/continuous_build/build_internal/masters/master.webrtc
+make restart
+
+
+To run the try master:
+======================
+cd tools/continuous_build/build_internal/masters/master.tryserver.webrtc
+make restart
+
+
+To run a slave:
+===============
+cd tools/continuous_build/build/slave
+
+There are some variables that can be set for flexible development testing:
+* TESTING_SLAVENAME         : Simulates the slave name. Since slave names are
+                              based on hostnames, they must be overridden using
+                              the this variable in order to run the slave on the
+                              local machine.
+* TESTING_MASTER            : The master to connect to. We usually use 'WebRTC'
+                              or 'TryServer'.
+* TESTING_MASTER_HOST       : The host the master is located at.
+                              Default: localhost
+* RUN_SLAVE_UPDATED_SCRIPTS : Set this to False to avoid checking for updates
+                              during startup.
+
+For Windows, make sure to add the --use_buildbot_8 flag to the run_slave.bat
+in order to make the tests execute properly.
+
+Examples:
+---------
+
+Connect to a running build master:
+* Linux and Mac:
+TESTING_SLAVENAME=webrtc-cb-linux-slave-1 TESTING_MASTER=WebRTC make restart
+
+* Windows:
+set TESTING_SLAVENAME=webrtc-cb-linux-slave-1
+set TESTING_MASTER=WebRTC
+run_slave.bat --use_buildbot_8
+
+Connect to a running try master:
+* Linux and Mac:
+TESTING_SLAVENAME=linux-trybot-1 TESTING_MASTER=TryServer make restart
+
+* Windows:
+set TESTING_SLAVENAME=linux-trybot-1
+set TESTING_MASTER=TryServer
+run_slave.bat --use_buildbot_8
diff --git a/tools/continuous_build/build_internal/masters/master-common.mk b/tools/continuous_build/build_internal/masters/master-common.mk
new file mode 100644
index 0000000..7a5288f
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master-common.mk
@@ -0,0 +1,123 @@
+# -*- makefile -*-
+
+# This file is a copy of the Chromium master-common.mk located at
+# /trunk/tools/build/masters of the Chromium tools. It is just modified to add
+# the PRIVATESCRIPTS_DIR property.
+
+# This should be included by a makefile which lives in a buildmaster/buildslave
+# directory (next to the buildbot.tac file). That including makefile *must*
+# define MASTERPATH.
+
+# The 'start' and 'stop' targets start and stop the buildbot master.
+# The 'reconfig' target will tell a buildmaster to reload its config file.
+
+# Note that a relative PYTHONPATH entry is relative to the current directory.
+
+# Confirm that MASTERPATH has been defined.
+ifeq ($(MASTERPATH),)
+  $(error MASTERPATH not defined.)
+endif
+
+# On the Mac, the buildbot is started via the launchd mechanism as a
+# LaunchAgent to give the slave a proper Mac UI environment for tests.  In
+# order for this to work, the plist must be present and loaded by launchd, and
+# the user must be logged in to the UI.  The plist is loaded by launchd at user
+# login (and the job may have been initially started at that time too).  Our
+# Mac build slaves are all set up this way, and have auto-login enabled, so
+# "make start" should just work and do the right thing.
+#
+# When using launchd to start the job, it also needs to be used to stop the
+# job.  Otherwise, launchd might try to restart the job when stopped manually
+# by SIGTERM.  Using SIGHUP for reconfig is safe with launchd.
+#
+# Because it's possible to have more than one slave on a machine (for testing),
+# this tests to make sure that the slave is in the known slave location,
+# /b/slave, which is what the LaunchAgent operates on.
+USE_LAUNCHD := \
+  $(shell [ -f ~/Library/LaunchAgents/org.chromium.buildbot.$(MASTERPATH).plist ] && \
+          [ "$$(pwd -P)" = "/b/build/masters/$(MASTERPATH)" ] && \
+          echo 1)
+
+# Elements used to construct PYTHONPATH. These may be overridden by the
+# including Makefile.
+#
+# For example: while we transition from buildbot 0.7.12 to buildbot 0.8.x ,
+# some masters will override BUILDBOT_PATH in their local Makefiles.
+TOPLEVEL_DIR ?= ../../../build
+THIRDPARTY_DIR ?= $(TOPLEVEL_DIR)/third_party
+SCRIPTS_DIR ?= $(TOPLEVEL_DIR)/scripts
+PUBLICCONFIG_DIR ?= $(TOPLEVEL_DIR)/site_config
+PRIVATECONFIG_DIR ?= $(TOPLEVEL_DIR)/../build_internal/site_config
+PRIVATESCRIPTS_DIR ?= $(TOPLEVEL_DIR)/../build_internal/scripts
+
+# Packages needed by buildbot7
+BUILDBOT7_PATH = $(THIRDPARTY_DIR)/buildbot_7_12:$(THIRDPARTY_DIR)/twisted_8_1
+
+# Packages needed by buildbot8
+BUILDBOT8_DEPS :=               \
+    buildbot_8_4p1              \
+    twisted_10_2                \
+    jinja2                      \
+    sqlalchemy_0_7_1            \
+    sqlalchemy_migrate_0_7_1    \
+    tempita_0_5                 \
+    decorator_3_3_1
+
+nullstring :=
+space := $(nullstring) #
+BUILDBOT8_PATH = $(subst $(space),:,$(BUILDBOT8_DEPS:%=$(THIRDPARTY_DIR)/%))
+
+# Default to buildbot7.  To override, put this in the master's Makefile:
+#   BUILDBOT_PATH = $(BUILDBOT8_PATH)
+BUILDBOT_PATH ?= $(BUILDBOT7_PATH)
+
+PYTHONPATH := $(BUILDBOT_PATH):$(SCRIPTS_DIR):$(THIRDPARTY_DIR):$(PUBLICCONFIG_DIR):$(PRIVATECONFIG_DIR):$(PRIVATESCRIPTS_DIR):.
+
+ifeq ($(BUILDBOT_PATH),$(BUILDBOT8_PATH))
+start: upgrade
+else
+start:
+endif
+ifneq ($(USE_LAUNCHD),1)
+	PYTHONPATH=$(PYTHONPATH) python $(SCRIPTS_DIR)/common/twistd --no_save -y buildbot.tac
+else
+	launchctl start org.chromium.buildbot.$(MASTERPATH)
+endif
+
+ifeq ($(BUILDBOT_PATH),$(BUILDBOT8_PATH))
+start-prof: upgrade
+else
+start-prof:
+endif
+ifneq ($(USE_LAUNCHD),1)
+	TWISTD_PROFILE=1 PYTHONPATH=$(PYTHONPATH) python $(SCRIPTS_DIR)/common/twistd --no_save -y buildbot.tac
+else
+	launchctl start org.chromium.buildbot.$(MASTERPATH)
+endif
+
+stop:
+ifneq ($(USE_LAUNCHD),1)
+	if `test -f twistd.pid`; then kill `cat twistd.pid`; fi;
+else
+	launchctl stop org.chromium.buildbot.$(MASTERPATH)
+endif
+
+reconfig:
+	kill -HUP `cat twistd.pid`
+
+log:
+	tail -F twistd.log
+
+wait:
+	while `test -f twistd.pid`; do sleep 1; done;
+
+restart: stop wait start log
+
+restart-prof: stop wait start-prof log
+
+# This target is only known to work on 0.8.x masters.
+upgrade:
+	@[ -e '.dbconfig' ] || [ -e 'state.sqlite' ] || PYTHONPATH=$(PYTHONPATH) python buildbot upgrade-master .
+
+setup:
+	@echo export PYTHONPATH=$(PYTHONPATH)
diff --git a/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/Makefile b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/Makefile
new file mode 100644
index 0000000..53c0400
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/Makefile
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+BUILDBOT_PATH = $(BUILDBOT8_PATH)
+MASTERPATH := master.tryserver.webrtc
+include ../master-common.mk
diff --git a/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/buildbot b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/buildbot
new file mode 100644
index 0000000..cf3628d
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/buildbot
@@ -0,0 +1,4 @@
+#!/usr/bin/python
+
+from buildbot.scripts import runner
+runner.run()
diff --git a/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/buildbot.tac b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/buildbot.tac
new file mode 100644
index 0000000..f4bca88
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/buildbot.tac
@@ -0,0 +1,11 @@
+import os
+
+from twisted.application import service
+from buildbot.master import BuildMaster
+
+basedir = os.path.dirname(os.path.abspath(__file__))
+configfile = r'master.cfg'
+
+application = service.Application('buildmaster')
+BuildMaster(basedir, configfile).setServiceParent(application)
+
diff --git a/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/master.cfg b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/master.cfg
new file mode 100755
index 0000000..f94b32c
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/master.cfg
@@ -0,0 +1,265 @@
+#!/usr/bin/env python
+#  Copyright (c) 2012 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.
+
+__author__ = 'kjellander@webrtc.org (Henrik Kjellander)'
+
+c = BuildmasterConfig = {}
+
+import os
+from buildbot.buildslave import BuildSlave
+from buildbot.changes.pb import PBChangeSource
+from buildbot.changes.svnpoller import SVNPoller
+from buildbot.process import factory
+from buildbot.scheduler import Scheduler
+from buildbot.status import html
+from buildbot.status import mail
+from buildbot.steps import shell
+
+# These modules come from scripts, which must be in the PYTHONPATH.
+from master import master_utils
+from master import slaves_list
+from master.builders_pools import BuildersPools
+from master.try_job_http import TryJobHTTP
+from master.try_job_svn import TryJobSubversion
+from master.try_mail_notifier import TryMailNotifier
+import config
+
+from webrtc_buildbot import utils
+
+ActiveMaster = config.Master.TryServer
+
+####### CHANGESOURCES
+c['change_source'] = []
+
+####### SCHEDULERS
+pools = BuildersPools('webrtc')
+pools['webrtc'].append('linux')
+pools['webrtc'].append('linux_rel')
+pools['webrtc'].append('mac')
+pools['webrtc'].append('mac_rel')
+pools['webrtc'].append('win')
+pools['webrtc'].append('win_rel')
+
+last_good_urls = {'webrtc': ActiveMaster.last_good_url}
+code_review_sites = {'webrtc': ActiveMaster.code_review_site}
+
+try_scheduler = TryJobHTTP(name='try_job_http',
+    port=ActiveMaster.try_job_port,
+    last_good_urls=last_good_urls,
+    code_review_sites=code_review_sites,
+    pools=pools)
+c['schedulers'] = [try_scheduler]
+
+####### TESTS
+
+# Tests to run on the trybots
+# Defines the supported tests followed by a tuple defining if the tests are
+# enabled on Linux, Mac and/or Windows (in that order; defined in utils.py).
+NORMAL_TESTS = {
+    # Test name                        Linux  Mac   Windows
+    'audio_coding_unittests':          (True, True, True),
+    'audio_conference_mixer_unittests':(True, True, True),
+    'audioproc_unittest':              (True, True, True),
+    'cng_unittests':                   (True, True, True),
+    'g711_unittests':                  (True, True, True),
+    'g722_unittests':                  (True, True, True),
+    'libyuv_unittests':                (True, True, True),
+    'jpeg_unittests':                  (True, True, True),
+    'media_file_unittests':            (True, True, True),
+    'metrics_unittests':               (True, True, True),
+    'neteq_unittests':                 (True, True, True),
+    'pcm16b_unittests':                (True, True, True),
+    'resampler_unittests':             (True, True, True),
+    'rtp_rtcp_unittests':              (True, True, True),
+    'signal_processing_unittests':     (True, True, True),
+    'system_wrappers_unittests':       (True, True, True),
+    'test_support_unittests':          (True, True, True),
+    'udp_transport_unittests':         (True, True, True),
+    'vad_unittests':                   (True, True, True),
+    'video_codecs_test_framework_unittests':        (True, True, True),
+    'video_coding_unittests':          (True, True, True),
+    'video_engine_core_unittests':     (True, True, True),
+    'video_processing_unittests':      (True, True, True),
+    'voice_engine_unittests':          (True, True, True),
+    'vp8_unittests':                   (True, False, True), # Issue 273.
+    'webrtc_utility_unittests':        (True, True, False),
+}
+linux_normal_tests = utils.GetEnabledTests(NORMAL_TESTS, 'Linux')
+mac_normal_tests = utils.GetEnabledTests(NORMAL_TESTS, 'Mac')
+windows_normal_tests = utils.GetEnabledTests(NORMAL_TESTS, 'Windows')
+
+####### FACTORIES
+# Linux
+linux_factory_dbg = utils.WebRTCLinuxFactory(
+    utils.BuildStatusOracle('linux_factory_dbg'), is_try_slave=True)
+linux_factory_dbg.EnableBuild()
+linux_factory_dbg.EnableTests(linux_normal_tests)
+
+linux_factory_release = utils.WebRTCLinuxFactory(
+    utils.BuildStatusOracle('linux_factory_release'), is_try_slave=True)
+linux_factory_release.EnableBuild()
+linux_factory_release.EnableTests(linux_normal_tests)
+
+# Mac
+mac_factory_dbg = utils.WebRTCMacFactory(
+    utils.BuildStatusOracle('mac_factory_dbg'), is_try_slave=True)
+mac_factory_dbg.EnableBuild(build_type='make')
+mac_factory_dbg.EnableTests(mac_normal_tests)
+
+mac_factory_release = utils.WebRTCMacFactory(
+    utils.BuildStatusOracle('mac_factory_release'), is_try_slave=True)
+mac_factory_release.EnableBuild(build_type='make')
+mac_factory_release.EnableTests(mac_normal_tests)
+
+# Windows
+win_factory_debug = utils.WebRTCWinFactory(
+    utils.BuildStatusOracle('win_factory_debug'), is_try_slave=True)
+win_factory_debug.EnableBuild(configuration='Debug')
+win_factory_debug.EnableTests(windows_normal_tests)
+
+win_factory_release = utils.WebRTCWinFactory(
+    utils.BuildStatusOracle('win_factory_release'), is_try_slave=True)
+win_factory_release.EnableBuild(configuration='Release')
+win_factory_release.EnableTests(windows_normal_tests)
+
+####### BUILDERS
+linux_builder_debug = {
+    'name': 'linux',
+    'slavename': 'webrtc-cb-linux-slave-11',
+    'builddir': 'linux-trybot-1',
+    'factory': linux_factory_dbg,
+    }
+linux_builder_release = {
+    'name': 'linux_rel',
+    'slavename': 'webrtc-cb-linux-slave-12',
+    'builddir': 'linux-trybot-2',
+    'factory': linux_factory_release,
+    }
+mac_builder_debug = {
+    'name': 'mac',
+    'slavename': 'dhcp-172-28-249-242',
+    'builddir': 'mac-trybot-1',
+    'factory': mac_factory_dbg,
+    }
+mac_builder_release = {
+    'name': 'mac_rel',
+    'slavename': 'dhcp-172-28-249-244',
+    'builddir': 'mac-trybot-2',
+    'factory': mac_factory_release,
+    }
+win_builder_debug = {
+    'name': 'win',
+    'slavename': 'webrtc-win-x64',
+    'builddir': 'win-trybot-1',
+    'factory': win_factory_debug,
+    }
+win_builder_release = {
+    'name': 'win_rel',
+    'slavename': 'webrtc-win-x86',
+    'builddir': 'win-trybot-2',
+    'factory': win_factory_release,
+    }
+
+c['builders'] = [
+    win_builder_debug,
+    win_builder_release,
+    mac_builder_debug,
+    mac_builder_release,
+    linux_builder_debug,
+    linux_builder_release,
+    ]
+
+
+def NextJob(builder, requests):
+  """Always prioritize commit queue jobs over try jobs."""
+  for req in requests:
+    if any(c.who == 'commit-bot@webrtc.org' for c in req.source.changes):
+      return req
+  return requests[0]
+
+
+# Slaves are loaded from slaves.cfg.
+slaves = slaves_list.SlavesList('slaves.cfg', 'TryServer')
+
+for builder in c['builders']:
+  # Associate the slaves to the builders. The configuration is in slaves.cfg.
+  builder['slavenames'] = slaves.GetSlavesName(builder=builder['name'])
+  # Don't enable auto_reboot for our bots (Chrome uses it since they don't trust
+  # their unit tests to clean up properly)
+  builder['auto_reboot'] = False
+  # Prioritize commit-queue jobs over try jobs.
+  # This is documented starting with 0.8.2
+  # http://buildbot.net/buildbot/docs/0.8.2/Prioritizing-Builds.html#Prioritizing-Builds
+  # but appears to be working on 0.7.12 already.
+  builder['nextBuild'] = NextJob
+
+
+####### BUILDSLAVES
+
+# The 'slaves' list defines the set of allowable buildslaves. List all the
+# slaves registered to a builder. Remove dupes.
+c['slaves'] = master_utils.AutoSetupSlaves(c['builders'],
+                                           config.Master.GetBotPassword())
+
+# Make sure everything works together.
+master_utils.VerifySetup(c, slaves)
+
+# Adds common status and tools to this master.
+# Use our own mail notifier.
+master_utils.AutoSetupMaster(c, ActiveMaster, False,
+                             public_html='../master.webrtc/public_html',
+                             templates=['./templates',
+                                        '../master.webrtc/templates'])
+
+####### STATUS TARGETS
+# Port 9010 is the same as Chromium's try server web interface:
+web_page = html.WebStatus(http_port=9010, allowForce=True)
+c['status'] = [web_page]
+
+# Use an environment variable to easily avoid enabling e-mail for development.
+if not os.getenv('BUILDBOT_DEVELOPMENT_MODE'):
+  email_status = mail.MailNotifier(
+      fromaddr='webrtc-cb-watchlist@google.com',
+      extraRecipients=['webrtc-cb-watchlist@google.com'],
+      sendToInterestedUsers=True,
+      mode='failing')
+  c['status'] += [email_status]
+
+# Try job result emails.
+c['status'].append(TryMailNotifier(
+    fromaddr='webrtc-cb-watchlist@google.com',
+    subject='try %(result)s for %(reason)s on %(builder)s @ r%(revision)s',
+    mode='all',
+    lookup=master_utils.UsersAreEmails()))
+
+####### DB URL
+
+# This specifies what database buildbot uses to store change and scheduler
+# state.  You can leave this at its default for all but the largest
+# installations.
+c['db_url'] = 'sqlite:///state.sqlite'
+
+####### DEBUGGING OPTIONS
+
+# if you set 'debugPassword', then you can connect to the buildmaster with
+# the diagnostic tool in contrib/debugclient.py . From this tool, you can
+# manually force builds and inject changes, which may be useful for testing
+# your buildmaster without actually committing changes to your repository (or
+# before you have a functioning 'sources' set up). The debug tool uses the
+# same port number as the slaves do: 'slavePortnum'.
+
+#c['debugPassword'] = 'debugpassword'
+
+# if you set 'manhole', you can ssh into the buildmaster and get an
+# interactive python shell, which may be useful for debugging buildbot
+# internals. It is probably only useful for buildbot developers. You can also
+# use an authorized_keys file, or plain telnet.
+#from buildbot import manhole
+#c['manhole'] = manhole.PasswordManhole('tcp:9999:interface=127.0.0.1',
+#                                       'admin', 'password')
diff --git a/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/public_html/buildbot.css b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/public_html/buildbot.css
new file mode 100644
index 0000000..1fb556d
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/public_html/buildbot.css
@@ -0,0 +1,457 @@
+body {
+  margin-bottom:50px;
+}
+
+body, td {
+  font-family: Verdana, Cursor;
+  font-size: 10px;
+  font-weight: bold;
+}
+
+a:link,a:visited,a:active {
+  color: #444;
+}
+
+a:hover {
+  color: #000000;
+}
+
+table {
+  border-spacing: 1px 1px;
+}
+
+table td {
+  padding: 3px 0px 3px 0px;
+  text-align: center;
+}
+
+.Project {
+  width: 100px;
+}
+
+.LastBuild, .Activity {
+  padding: 0 0 0 4px;
+}
+
+.LastBuild, .Activity, .Builder, .BuildStep {
+  width: 155px;
+  max-width: 155px;
+}
+
+/* Chromium Specific styles */
+div.BuildResultInfo {
+  color: #444;
+}
+
+div.Announcement {
+  margin-bottom: 1em;
+}
+
+div.Announcement > a:hover {
+  color: black;
+}
+
+div.Announcement > div.Notice {
+  background-color: #afdaff;
+  padding: 0.5em;
+  font-size: 16px;
+  text-align: center;
+}
+
+div.Announcement > div.Open {
+  border: 3px solid #8fdf5f;
+  padding: 0.5em;
+  font-size: 16px;
+  text-align: center;
+}
+
+div.Announcement > div.Closed {
+  border: 5px solid #e98080;
+  padding: 0.5em;
+  font-size: 24px;
+  font-weight: bold;
+  text-align: center;
+}
+
+td.Time {
+  color: #000;
+  border-bottom: 1px solid #aaa;
+  background-color: #eee;
+}
+
+td.Activity, td.Change, td.Builder {
+  color: #333333;
+  background-color: #CCCCCC;
+}
+
+td.Change {
+  border-radius: 5px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+}
+td.Event {
+  color: #777;
+  background-color: #ddd;
+  border-radius: 5px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+}
+
+td.Activity {
+  border-top-left-radius: 10px;
+  -webkit-border-top-left-radius: 10px;
+  -moz-border-radius-topleft: 10px;
+  min-height: 20px;
+  padding: 2px 0 2px 0;
+}
+
+td.idle, td.waiting, td.offline, td.building {
+  border-top-left-radius: 0px;
+  -webkit-border-top-left-radius: 0px;
+  -moz-border-radius-topleft: 0px;
+}
+
+.LastBuild {
+  border-top-left-radius: 5px;
+  -webkit-border-top-left-radius: 5px;
+  -moz-border-radius-topleft: 5px;
+  border-top-right-radius: 5px;
+  -webkit-border-top-right-radius: 5px;
+  -moz-border-radius-topright: 5px;
+}
+
+/* Console view styles */
+
+td.DevRev {
+  padding: 4px 8px 4px 8px;
+  color: #333333;
+  border-top-left-radius: 5px;
+  -webkit-border-top-left-radius: 5px;
+  -moz-border-radius-topleft: 5px;
+  background-color: #eee;
+  width: 1%;
+}
+
+td.DevRevCollapse {
+  border-bottom-left-radius: 5px;
+  -webkit-border-bottom-left-radius: 5px;
+  -moz-border-radius-bottomleft: 5px;
+}
+
+td.DevName {
+  padding: 4px 8px 4px 8px;
+  color: #333333;
+  background-color: #eee;
+  width: 1%;
+  text-align: left;
+}
+
+td.DevStatus {
+  padding: 4px 4px 4px 4px;
+  color: #333333;
+  background-color: #eee;
+}
+
+td.DevSlave {
+  padding: 4px 4px 4px 4px;
+  color: #333333;
+  background-color: #eee;
+}
+
+td.first {
+  border-top-left-radius: 5px;
+  -webkit-border-top-left-radius: 5px;
+  -moz-border-radius-topleft: 5px;
+}
+
+td.last {
+  border-top-right-radius: 5px;
+  -webkit-border-top-right-radius: 5px;
+  -moz-border-radius-topright: 5px;
+}
+
+td.DevStatusCategory {
+  border-radius: 5px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-width:1px;
+  border-style:solid;
+}
+
+td.DevStatusCollapse {
+  border-bottom-right-radius: 5px;
+  -webkit-border-bottom-right-radius: 5px;
+  -moz-border-radius-bottomright: 5px;
+}
+
+td.DevDetails {
+  font-weight: normal;
+  padding: 8px 8px 8px 8px;
+  color: #333333;
+  background-color: #eee;
+  text-align: left;
+}
+
+td.DevComment {
+  font-weight: normal;
+  padding: 8px 8px 8px 8px;
+  color: #333333;
+  border-bottom-right-radius: 5px;
+  -webkit-border-bottom-right-radius: 5px;
+  -moz-border-radius-bottomright: 5px;
+  border-bottom-left-radius: 5px;
+  -webkit-border-bottom-left-radius: 5px;
+  -moz-border-radius-bottomleft: 5px;
+  background-color: #eee;
+  text-align: left;
+}
+
+td.Alt {
+  background-color: #CCCCCC;
+}
+
+.legend {
+  border-radius: 5px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  width: 100px;
+  max-width: 100px;
+  text-align:center;
+  padding: 2px 2px 2px 2px;
+  height:14px;
+  white-space:nowrap;
+}
+
+.DevStatusBox {
+  text-align:center;
+  height:20px;
+  padding:0 2px;
+  line-height:0;
+  white-space:nowrap;
+}
+
+.DevStatusBox a {
+  opacity: 0.85;
+  border-width:1px;
+  border-style:solid;
+  border-radius: 4px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  display:block;
+  width:90%;
+  height:20px;
+  line-height:20px;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.DevSlaveBox {
+  text-align:center;
+  height:10px;
+  padding:0 2px;
+  line-height:0;
+  white-space:nowrap;
+}
+
+.DevSlaveBox a {
+  opacity: 0.85;
+  border-width:1px;
+  border-style:solid;
+  border-radius: 4px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  display:block;
+  width:90%;
+  height:10px;
+  line-height:20px;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+a.noround {
+  border-radius: 0px;
+  -webkit-border-radius: 0px;
+  -moz-border-radius: 0px;
+  position: relative;
+  margin-top: -8px;
+  margin-bottom: -8px;
+  height: 36px;
+  border-top-width: 0;
+  border-bottom-width: 0;
+}
+
+a.begin {
+  border-top-width:1px;
+  position: relative;
+  margin-top: 0px;
+  margin-bottom: -7px;
+  height: 27px;
+  border-top-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+  border-top-right-radius: 4px;
+  -webkit-border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+a.end {
+  border-bottom-width:1px;
+  position: relative;
+  margin-top: -7px;
+  margin-bottom: 0px;
+  height: 27px;
+  border-bottom-left-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  border-bottom-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.center_align {
+  text-align: center;
+}
+
+.right_align {
+  text-align: right;
+}
+
+.left_align {
+  text-align: left;
+}
+
+div.BuildWaterfall {
+  border-radius: 7px;
+  -webkit-border-radius: 7px;
+  -moz-border-radius: 7px;
+  position: absolute;
+  left: 0px;
+  top: 0px;
+  background-color: #FFFFFF;
+  padding: 4px 4px 4px 4px;
+  float: left;
+  display: none;
+  border-width: 1px;
+  border-style: solid;
+}
+
+/* LastBuild, BuildStep states */
+.success {
+  color: #FFFFFF;
+  background-color: #8fdf5f;
+  border-color: #4F8530;
+}
+
+.failure {
+  color: #FFFFFF;
+  background-color: #e98080;
+  border-color: #A77272;
+}
+
+.warnings {
+  color: #FFFFFF;
+  background-color: #ffc343;
+  border-color: #C29D46;
+}
+
+.exception, td.offline {
+  color: #FFFFFF;
+  background-color: #e0b0ff;
+  border-color: #ACA0B3;
+}
+
+.start,.running, td.building {
+  color: #666666;
+  background-color: #fffc6c;
+  border-color: #C5C56D;
+}
+
+.running_failure {
+  color: #FFFFFF;
+  background-color: #fffc6c;
+  border-color: #ff0000;
+}
+
+.start {
+  border-bottom-left-radius: 10px;
+  -webkit-border-bottom-left-radius: 10px;
+  -moz-border-radius-bottomleft: 10px;
+  border-bottom-right-radius: 10px;
+  -webkit-border-bottom-right-radius: 10px;
+  -moz-border-radius-bottomright: 10px;
+}
+
+.notstarted {
+  border-width:1px;
+  border-style:solid;
+  border-color:#aaa;
+}
+
+.closed {
+  background-color: #ff0000;
+}
+
+.closed .large {
+  font-size: 1.5em;
+  font-weight: bolder;
+}
+
+td.Project a:hover, td.start a:hover {
+  color: #000;
+}
+
+.mini-box {
+  text-align:center;
+  height:20px;
+  padding:0 2px;
+  line-height:0;
+  white-space:nowrap;
+}
+
+.mini-box a {
+  border-radius: 0;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  display:block;
+  width:100%;
+  height:20px;
+  line-height:20px;
+  margin-top:-30px;
+}
+
+.mini-closed {
+  -box-sizing:border-box;
+  -webkit-box-sizing:border-box;
+  border:4px solid red;
+}
+
+/* grid styles */
+
+table.Grid {
+  border-collapse: collapse;
+}
+
+table.Grid tr td {
+  padding: 0.2em;
+  margin: 0px;
+  text-align: center;
+}
+
+table.Grid tr td.title {
+  font-size: 90%;
+  border-right: 1px gray solid;
+  border-bottom: 1px gray solid;
+}
+
+table.Grid tr td.sourcestamp {
+  font-size: 90%;
+}
+
+table.Grid tr td.builder {
+  text-align: right;
+  font-size: 90%;
+}
+
+table.Grid tr td.build {
+  border: 1px gray solid;
+}
diff --git a/tools/continuous_build/public_html/favicon.ico b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/public_html/favicon.ico
similarity index 100%
copy from tools/continuous_build/public_html/favicon.ico
copy to tools/continuous_build/build_internal/masters/master.tryserver.webrtc/public_html/favicon.ico
Binary files differ
diff --git a/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/slaves.cfg b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/slaves.cfg
new file mode 100644
index 0000000..90622a9
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.tryserver.webrtc/slaves.cfg
@@ -0,0 +1,70 @@
+# -*- python -*-
+# ex: set syntax=python:
+# Copyright (c) 2012 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.
+
+# See master.experimental/slaves.cfg for documentation.
+
+
+def linux():
+  return [
+    {
+      'master': 'TryServer',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'linux',
+      'hostname': 'webrtc-cb-linux-slave-11',
+    },
+    {
+      'master': 'TryServer',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'linux_rel',
+      'hostname': 'webrtc-cb-linux-slave-12',
+    },
+  ]
+
+def mac():
+  return [
+    {
+      'master': 'TryServer',
+      'os': 'mac',
+      'version': '10.7',
+      'bits': '64',
+      'builder': 'mac',
+      'hostname': 'dhcp-172-28-249-242',
+    },
+    {
+      'master': 'TryServer',
+      'os': 'mac',
+      'version': '10.7',
+      'bits': '64',
+      'builder': 'mac_rel',
+      'hostname': 'dhcp-172-28-249-244',
+    },
+  ]
+
+def windows():
+  return [
+    {
+      'master': 'TryServer',
+      'os': 'win',
+      'version': 'server2008',
+      'bits': '64',
+      'builder': 'win',
+      'hostname': 'webrtc-win-x64',
+    },
+    {
+      'master': 'TryServer',
+      'os': 'win',
+      'version': 'server2008',
+      'bits': '64',
+      'builder': 'win_rel',
+      'hostname': 'webrtc-win-x86',
+    },
+  ]
+
+slaves = linux() + mac() + windows()
diff --git a/tools/continuous_build/build_internal/masters/master.webrtc/Makefile b/tools/continuous_build/build_internal/masters/master.webrtc/Makefile
new file mode 100644
index 0000000..36476d6
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.webrtc/Makefile
@@ -0,0 +1,5 @@
+# -*- makefile -*-
+
+BUILDBOT_PATH = $(BUILDBOT8_PATH)
+MASTERPATH := master.webrtc
+include ../master-common.mk
diff --git a/tools/continuous_build/build_internal/masters/master.webrtc/buildbot b/tools/continuous_build/build_internal/masters/master.webrtc/buildbot
new file mode 100644
index 0000000..cf3628d
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.webrtc/buildbot
@@ -0,0 +1,4 @@
+#!/usr/bin/python
+
+from buildbot.scripts import runner
+runner.run()
diff --git a/tools/continuous_build/build_internal/masters/master.webrtc/buildbot.tac b/tools/continuous_build/build_internal/masters/master.webrtc/buildbot.tac
new file mode 100644
index 0000000..f4bca88
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.webrtc/buildbot.tac
@@ -0,0 +1,11 @@
+import os
+
+from twisted.application import service
+from buildbot.master import BuildMaster
+
+basedir = os.path.dirname(os.path.abspath(__file__))
+configfile = r'master.cfg'
+
+application = service.Application('buildmaster')
+BuildMaster(basedir, configfile).setServiceParent(application)
+
diff --git a/tools/continuous_build/master.cfg b/tools/continuous_build/build_internal/masters/master.webrtc/master.cfg
similarity index 73%
rename from tools/continuous_build/master.cfg
rename to tools/continuous_build/build_internal/masters/master.webrtc/master.cfg
index 2eba7e2..9bd4572 100755
--- a/tools/continuous_build/master.cfg
+++ b/tools/continuous_build/build_internal/masters/master.webrtc/master.cfg
@@ -9,66 +9,33 @@
 
 __author__ = 'ivinnichenko@webrtc.org (Illya Vinnichenko)'
 
-# This is a buildmaster config file for WebRTC project. It must be installed as
-# 'master.cfg' in your buildmaster's base directory (although the filename
-# can be changed with the --basedir option to 'mktap buildbot master').
-
-# It has one job: define a dictionary named BuildmasterConfig. This
-# dictionary has a variety of keys to control different aspects of the
-# buildmaster. They are documented in docs/config.xhtml .
-
-# This is the dictionary that the buildmaster pays attention to. We also use
-# a shorter alias to save typing.
 c = BuildmasterConfig = {}
 
-####### BUILDSLAVES
-
-# the 'slaves' list defines the set of allowable buildslaves. Each element is
-# a BuildSlave object, which is created with bot-name, bot-password.  These
-# correspond to values given to the buildslave's mktap invocation.
-
+import os
 from buildbot.buildslave import BuildSlave
-
-c['slaves'] = [BuildSlave('android', 'pass', max_builds=1),
-               BuildSlave('android-ndk', 'pass', max_builds=1),
-               BuildSlave('chromeos', 'pass', max_builds=1),
-               BuildSlave('linux-chrome', 'pass', max_builds=1),
-               BuildSlave('linux-clang', 'pass', max_builds=1),
-               BuildSlave('linux-slave-1', 'pass', max_builds=1),
-               BuildSlave('linux-slave-2', 'pass', max_builds=1),
-               BuildSlave('linux-slave-4', 'pass', max_builds=1),
-               BuildSlave('linux-slave-5', 'pass', max_builds=1),
-               BuildSlave('linux-slave-gcc-4.6', 'pass', max_builds=1),
-               BuildSlave('linux-valgrind', 'pass', max_builds=1),
-               BuildSlave('linux_video', 'pass', max_builds=1),
-               BuildSlave('mac-slave-3', 'pass', max_builds=1),
-               BuildSlave('mac-slave-2', 'pass', max_builds=1),
-               BuildSlave('win-slave-1', 'pass', max_builds=1),
-               BuildSlave('win-slave-2', 'pass', max_builds=1)]
-
-# 'slavePortnum' defines the TCP port to listen on. This must match the value
-# configured into the buildslaves (with their --master option)
-
-c['slavePortnum'] = 9989
-
-####### CHANGESOURCES
-
-# the 'change_source' setting tells the buildmaster how it should find out
-# about source code changes. Any class which implements IChangeSource can be
-# put here: there are several in buildbot/changes/*.py to choose from.
-
 from buildbot.changes.pb import PBChangeSource
 from buildbot.changes.svnpoller import SVNPoller
+from buildbot.process import factory
+from buildbot.scheduler import Scheduler
+from buildbot.status import html
+from buildbot.status import mail
+from buildbot.steps import shell
 
+# These modules come from scripts, which must be in the PYTHONPATH.
+from master import master_utils
+from master import slaves_list
+import config
+from webrtc_buildbot import utils
+
+ActiveMaster = config.Master.WebRTC
+
+####### CHANGESOURCES
 source_code_svn_url = 'http://webrtc.googlecode.com/svn/trunk'
 svn_poller = SVNPoller(svnurl=source_code_svn_url, pollinterval=5*60,
                        histmax=10, svnbin='/usr/bin/svn')
 c['change_source'] = svn_poller
 
 ####### SCHEDULERS
-
-## configure the Schedulers
-
 from buildbot.scheduler import Scheduler
 webrtc_scheduler = Scheduler(name='all', branch=None, treeStableTimer=5*60,
                              builderNames=['Win32Debug',
@@ -161,13 +128,7 @@
                                                        'Windows')
 
 ####### FACTORIES
-# Factories defines how the build is run and can be used in multiple instances
-# on multiple machines, depending on how many builders are defined.
-
-from buildbot.process import factory
-from buildbot.steps import shell
-
-############# Linux factories #######################################
+# Linux
 linux_factory_64_dbg = utils.WebRTCLinuxFactory(
     utils.BuildStatusOracle('linux_factory_64_dbg'))
 linux_factory_64_dbg.EnableBuild()
@@ -227,7 +188,7 @@
    utils.BuildStatusOracle('android_ndk_factory'))
 android_ndk_factory.EnableBuild()
 
-############## Mac factories #######################################
+# Mac
 mac_factory_32_dbg = utils.WebRTCMacFactory(
     utils.BuildStatusOracle('mac_factory_32_dbg'))
 mac_factory_32_dbg.EnableBuild(build_type='both')
@@ -238,7 +199,7 @@
 mac_factory_32_release.EnableBuild(build_type='both', release=True)
 mac_factory_32_release.EnableTests(mac_normal_tests)
 
-############# Windows factories #######################################
+# Windows
 win_factory_32_Debug = utils.WebRTCWinFactory(
     utils.BuildStatusOracle('win_factory_32_debug'))
 win_factory_32_Debug.EnableBuild(configuration='Debug')
@@ -250,96 +211,87 @@
 win_factory_32_Release.EnableTests(windows_normal_tests)
 
 ####### BUILDERS
-
-# the 'builders' list defines the Builders. Each one is configured with a
-# dictionary, using the following keys:
-#  name (required): the name used to describe this builder
-#  slavename (required): which slave to use (must appear in c['bots'])
-#  builddir (required): which subdirectory to run the builder in
-#  factory (required): a BuildFactory to define how the build is run
-#  periodicBuildTime (optional): if set, force a build every N seconds
-
 linux_builder_64_debug = {
       'name': 'Linux64DBG',
-      'slavename': 'linux-slave-1',
+      'slavename': 'webrtc-cb-linux-slave-1',
       'builddir': 'linux-slave-1',
       'factory': linux_factory_64_dbg,
       }
 linux_builder_32_release = {
       'name': 'Linux32Release',
-      'slavename': 'linux-slave-2',
+      'slavename': 'webrtc-cb-linux-slave-2',
       'builddir': 'linux-slave-2',
       'factory': linux_factory_32_release,
       }
 linux_builder_64_release = {
       'name': 'Linux64Release',
-      'slavename': 'linux-slave-5',
+      'slavename': 'webrtc-cb-linux-slave-5',
       'builddir': 'linux-slave-5',
       'factory': linux_factory_64_release,
       }
 linux_builder_32_debug = {
       'name': 'Linux32DBG',
-      'slavename': 'linux-slave-4',
+      'slavename': 'webrtc-cb-linux-slave-4',
       'builddir': 'linux-slave-4',
       'factory': linux_factory_32_dbg,
       }
 mac_builder_32_debug = {
       'name': 'MacOS32DBG',
-      'slavename': 'mac-slave-3',
+      'slavename': 'dhcp-172-28-249-243',
       'builddir': 'mac-slave-3',
       'factory': mac_factory_32_dbg,
       }
 mac_builder_32_release = {
       'name': 'MacOS32Release',
-      'slavename': 'mac-slave-2',
+      'slavename': 'dhcp-172-28-249-241',
       'builddir': 'mac-slave-2',
       'factory': mac_factory_32_release,
       }
 chromeos_builder = {
       'name': 'ChromeOS',
-      'slavename': 'chromeos',
+      'slavename': 'webrtc-cb-linux-slave-3',
       'builddir': 'chromeos',
       'factory': chromeos_factory,
       }
 win_builder_32_debug = {
       'name': 'Win32Debug',
-      'slavename': 'win-slave-1',
+      'slavename': 'webrtc-win2k8-1',
       'builddir': 'win-32-dbg',
       'factory': win_factory_32_Debug,
       }
 win_builder_32_release = {
       'name': 'Win32Release',
-      'slavename': 'win-slave-2',
+      'slavename': 'webrtc-win2k8-2',
       'builddir': 'win-32-release',
       'factory': win_factory_32_Release,
       }
 linux_builder_video = {
       'name': 'LinuxVideoTest',
-      'slavename': 'linux_video',
+      'slavename': 'webrtc-build-bot-se',
       'builddir': 'video',
       'factory': linux_factory_video,
       }
 linux_builder_chrome = {
-      'name': "Chrome",
-      'slavename': "linux-chrome",
-      'builddir': "linux-chrome",
+      'name': 'Chrome',
+      'slavename': 'webrtc-chrome',
+      'builddir': 'linux-chrome',
       'factory': linux_chrome_factory,
       }
 linux_builder_clang = {
       'name': 'LinuxClang',
-      'slavename': 'linux-clang',
+      'slavename': 'webrtc-cb-linux-slave-8',
       'builddir': 'linux-clang',
       'factory': linux_clang,
       }
 linux_builder_valgrind = {
       'name': 'LinuxValgrind',
-      'slavename': 'linux-valgrind',
+      'slavename': 'webrtc-cb-linux-slave-6',
       'builddir': 'linux-valgrind',
       'factory': linux_valgrind,
       }
 android_builder_1 = {
       'name': 'Android',
-      'slavename': 'android',
+      'slavename': 'webrtc-cb-linux-slave-7',
       'builddir': 'android',
       'factory': android_factory,
       }
@@ -351,7 +303,7 @@
       }
 linux_builder_gcc_4_6 = {
       'name': 'Linux64DBG-GCC4.6',
-      'slavename': 'linux-slave-gcc-4.6',
+      'slavename': 'webrtc-cb-linux-slave-9',
       'builddir': 'linux-slave-gcc-4.6',
       'factory': linux_factory_64_dbg,
       }
@@ -374,16 +326,25 @@
       linux_builder_chrome,
       ]
 
+
+####### BUILDSLAVES
+
+# The 'slaves' list defines the set of allowable buildslaves. List all the
+# slaves registered to a builder. Remove dupes.
+c['slaves'] = master_utils.AutoSetupSlaves(c['builders'],
+                                           config.Master.GetBotPassword())
+
+# Slaves are loaded from slaves.cfg.
+slaves = slaves_list.SlavesList('slaves.cfg', 'WebRTC')
+
+# Make sure everything works together.
+master_utils.VerifySetup(c, slaves)
+
+# Adds common status and tools to this master.
+master_utils.AutoSetupMaster(c, ActiveMaster,
+    enable_http_status_push=ActiveMaster.is_production_host)
+
 ####### STATUS TARGETS
-
-# 'status' is a list of Status Targets. The results of each build will be
-# pushed to these targets. buildbot/status/*.py has a variety to choose from,
-# including web pages, email senders, and IRC bots.
-
-import os
-from buildbot.status import html
-from buildbot.status import mail
-
 web_page = html.WebStatus(http_port=8010, allowForce=True)
 c['status'] = [web_page]
 
@@ -396,6 +357,13 @@
       mode='failing')
   c['status'] += [email_status]
 
+####### DB URL
+
+# This specifies what database buildbot uses to store change and scheduler
+# state.  You can leave this at its default for all but the largest
+# installations.
+c['db_url'] = 'sqlite:///state.sqlite'
+
 ####### DEBUGGING OPTIONS
 
 # if you set 'debugPassword', then you can connect to the buildmaster with
@@ -414,22 +382,3 @@
 #from buildbot import manhole
 #c['manhole'] = manhole.PasswordManhole('tcp:9999:interface=127.0.0.1',
 #                                       'admin', 'password')
-
-
-####### PROJECT IDENTITY
-
-# the 'projectName' string will be used to describe the project that this
-# buildbot is working on. For example, it is used as the title of the
-# waterfall HTML page. The 'projectURL' string will be used to provide a link
-# from buildbot HTML pages to your project's home page.
-
-c['projectName'] = 'WebRTC'
-c['projectURL'] = 'http://www.webrtc.org'
-
-# the 'buildbotURL' string should point to the location where the buildbot's
-# internal web server (usually the html.Waterfall page) is visible. This
-# typically uses the port number set in the Waterfall 'status' entry, but
-# with an externally-visible host name which the buildbot cannot figure out
-# without some help.
-
-c['buildbotURL'] = 'http://webrtc-cb-linux-master.cbf.corp.google.com:8010/'
diff --git a/tools/continuous_build/build_internal/masters/master.webrtc/public_html/buildbot.css b/tools/continuous_build/build_internal/masters/master.webrtc/public_html/buildbot.css
new file mode 100644
index 0000000..3a136f9
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.webrtc/public_html/buildbot.css
@@ -0,0 +1,486 @@
+body {
+  margin-bottom:50px;
+}
+
+body, td {
+  font-family: Verdana, Cursor;
+  font-size: 10px;
+  font-weight: bold;
+}
+
+a:link,a:visited,a:active {
+  color: #444;
+}
+
+a:hover {
+  color: #000000;
+}
+
+table {
+  border-spacing: 1px 1px;
+}
+
+table td {
+  padding: 3px 0px 3px 0px;
+  text-align: center;
+}
+
+.closerbox {
+  border: 1px solid #aaa;
+  background-color: #eef;
+  border-radius: 8px;
+  -webkit-border-radius: 8px;
+  -moz-border-radius: 8px;
+}
+
+.closerbox table {
+  padding: 0 4px;
+}
+
+.closerbox .title {
+  background-color: #ccc;
+  border-top-left-radius: 8px;
+  -webkit-border-top-left-radius: 8px;
+  -moz-border-top-left-radius: 8px;
+  border-top-right-radius: 8px;
+  -webkit-border-top-right-radius: 8px;
+  -moz-border-top-right-radius: 8px;
+  padding: 0 0 2px;
+}
+
+.Project {
+  width: 100px;
+}
+
+.LastBuild, .Activity {
+  padding: 0 0 0 4px;
+}
+
+.LastBuild, .Activity, .Builder, .BuildStep {
+  width: 155px;
+  max-width: 155px;
+}
+
+/* Chromium Specific styles */
+div.BuildResultInfo {
+  color: #444;
+}
+
+div.Announcement {
+  margin-bottom: 1em;
+}
+
+div.Announcement > a:hover {
+  color: black;
+}
+
+div.Announcement > div.Notice {
+  background-color: #afdaff;
+  padding: 0.5em;
+  font-size: 16px;
+  text-align: center;
+}
+
+div.Announcement > div.Open {
+  border: 3px solid #8fdf5f;
+  padding: 0.5em;
+  font-size: 16px;
+  text-align: center;
+}
+
+div.Announcement > div.Closed {
+  border: 5px solid #e98080;
+  padding: 0.5em;
+  font-size: 24px;
+  font-weight: bold;
+  text-align: center;
+}
+
+td.Time {
+  color: #000;
+  border-bottom: 1px solid #aaa;
+  background-color: #eee;
+}
+
+td.Activity, td.Change, td.Builder {
+  color: #333333;
+  background-color: #CCCCCC;
+}
+
+td.Change {
+  border-radius: 5px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+}
+td.Event {
+  color: #777;
+  background-color: #ddd;
+  border-radius: 5px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+}
+
+td.Activity {
+  border-top-left-radius: 10px;
+  -webkit-border-top-left-radius: 10px;
+  -moz-border-radius-topleft: 10px;
+  min-height: 20px;
+  padding: 2px 0 2px 0;
+}
+
+td.idle, td.waiting, td.offline, td.building {
+  border-top-left-radius: 0px;
+  -webkit-border-top-left-radius: 0px;
+  -moz-border-radius-topleft: 0px;
+}
+
+.LastBuild {
+  border-top-left-radius: 5px;
+  -webkit-border-top-left-radius: 5px;
+  -moz-border-radius-topleft: 5px;
+  border-top-right-radius: 5px;
+  -webkit-border-top-right-radius: 5px;
+  -moz-border-radius-topright: 5px;
+}
+
+/* Console view styles */
+
+td.DevRev {
+  padding: 4px 8px 4px 8px;
+  color: #333333;
+  border-top-left-radius: 5px;
+  -webkit-border-top-left-radius: 5px;
+  -moz-border-radius-topleft: 5px;
+  background-color: #eee;
+  width: 1%;
+}
+
+td.DevRevCollapse {
+  border-bottom-left-radius: 5px;
+  -webkit-border-bottom-left-radius: 5px;
+  -moz-border-radius-bottomleft: 5px;
+}
+
+td.DevName {
+  padding: 4px 8px 4px 8px;
+  color: #333333;
+  background-color: #eee;
+  width: 1%;
+  text-align: left;
+}
+
+td.DevStatus {
+  padding: 4px 4px 4px 4px;
+  color: #333333;
+  background-color: #eee;
+}
+
+td.DevSlave {
+  padding: 4px 4px 4px 4px;
+  color: #333333;
+  background-color: #eee;
+}
+
+td.first {
+  border-top-left-radius: 5px;
+  -webkit-border-top-left-radius: 5px;
+  -moz-border-radius-topleft: 5px;
+}
+
+td.last {
+  border-top-right-radius: 5px;
+  -webkit-border-top-right-radius: 5px;
+  -moz-border-radius-topright: 5px;
+}
+
+td.DevStatusCategory {
+  border-radius: 5px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-width:1px;
+  border-style:solid;
+}
+
+td.DevStatusCollapse {
+  border-bottom-right-radius: 5px;
+  -webkit-border-bottom-right-radius: 5px;
+  -moz-border-radius-bottomright: 5px;
+}
+
+td.DevDetails {
+  font-weight: normal;
+  padding: 8px 8px 8px 8px;
+  color: #333333;
+  background-color: #eee;
+  text-align: left;
+}
+
+td.DevComment {
+  font-weight: normal;
+  padding: 8px 8px 8px 8px;
+  color: #333333;
+  border-bottom-right-radius: 5px;
+  -webkit-border-bottom-right-radius: 5px;
+  -moz-border-radius-bottomright: 5px;
+  border-bottom-left-radius: 5px;
+  -webkit-border-bottom-left-radius: 5px;
+  -moz-border-radius-bottomleft: 5px;
+  background-color: #eee;
+  text-align: left;
+}
+
+td.Alt {
+  background-color: #CCCCCC;
+}
+
+.legend {
+  border-radius: 5px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  width: 100px;
+  max-width: 100px;
+  text-align:center;
+  padding: 2px 2px 2px 2px;
+  height:14px;
+  white-space:nowrap;
+}
+
+.DevStatusBox {
+  text-align:center;
+  height:20px;
+  padding:0 2px;
+  line-height:0;
+  white-space:nowrap;
+}
+
+.DevStatusBox a {
+  opacity: 0.85;
+  border-width:1px;
+  border-style:solid;
+  border-radius: 4px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  display:block;
+  width:90%;
+  height:20px;
+  line-height:20px;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.DevSlaveBox {
+  text-align:center;
+  height:10px;
+  padding:0 2px;
+  line-height:0;
+  white-space:nowrap;
+}
+
+.DevSlaveBox a {
+  opacity: 0.85;
+  border-width:1px;
+  border-style:solid;
+  border-radius: 4px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  display:block;
+  width:90%;
+  height:10px;
+  line-height:20px;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+a.noround {
+  border-radius: 0px;
+  -webkit-border-radius: 0px;
+  -moz-border-radius: 0px;
+  position: relative;
+  margin-top: -8px;
+  margin-bottom: -8px;
+  height: 36px;
+  border-top-width: 0;
+  border-bottom-width: 0;
+}
+
+a.begin {
+  border-top-width:1px;
+  position: relative;
+  margin-top: 0px;
+  margin-bottom: -7px;
+  height: 27px;
+  border-top-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+  border-top-right-radius: 4px;
+  -webkit-border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+a.end {
+  border-bottom-width:1px;
+  position: relative;
+  margin-top: -7px;
+  margin-bottom: 0px;
+  height: 27px;
+  border-bottom-left-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  border-bottom-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.center_align {
+  text-align: center;
+}
+
+.right_align {
+  text-align: right;
+}
+
+.left_align {
+  text-align: left;
+}
+
+div.BuildWaterfall {
+  border-radius: 7px;
+  -webkit-border-radius: 7px;
+  -moz-border-radius: 7px;
+  position: absolute;
+  left: 0px;
+  top: 0px;
+  background-color: #FFFFFF;
+  padding: 4px 4px 4px 4px;
+  float: left;
+  display: none;
+  border-width: 1px;
+  border-style: solid;
+}
+
+/* LastBuild, BuildStep states */
+.success {
+  color: #FFFFFF;
+  background-color: #8fdf5f;
+  border-color: #4F8530;
+}
+
+.failure {
+  color: #FFFFFF;
+  background-color: #e98080;
+  border-color: #A77272;
+}
+
+.warnings {
+  color: #FFFFFF;
+  background-color: #ffc343;
+  border-color: #C29D46;
+}
+
+.never {
+  color: #FFFFFF;
+  background-color: #f0f0e0;
+  border-color: #A77272;
+}
+
+.exception, td.offline {
+  color: #FFFFFF;
+  background-color: #e0b0ff;
+  border-color: #ACA0B3;
+}
+
+.start,.running, td.building {
+  color: #666666;
+  background-color: #fffc6c;
+  border-color: #C5C56D;
+}
+
+.running_failure {
+  color: #FFFFFF;
+  background-color: #fffc6c;
+  border-color: #ff0000;
+}
+
+.start {
+  border-bottom-left-radius: 10px;
+  -webkit-border-bottom-left-radius: 10px;
+  -moz-border-radius-bottomleft: 10px;
+  border-bottom-right-radius: 10px;
+  -webkit-border-bottom-right-radius: 10px;
+  -moz-border-radius-bottomright: 10px;
+}
+
+.notstarted {
+  border-width:1px;
+  border-style:solid;
+  border-color:#aaa;
+}
+
+.closed {
+  background-color: #ff0000;
+}
+
+.closed .large {
+  font-size: 1.5em;
+  font-weight: bolder;
+}
+
+td.Project a:hover, td.start a:hover {
+  color: #000;
+}
+
+.mini-box {
+  text-align:center;
+  height:20px;
+  padding:0 2px;
+  line-height:0;
+  white-space:nowrap;
+}
+
+.mini-box a {
+  border-radius: 0;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  display:block;
+  width:100%;
+  height:20px;
+  line-height:20px;
+  margin-top:-30px;
+}
+
+.mini-closed {
+  -box-sizing:border-box;
+  -webkit-box-sizing:border-box;
+  border:4px solid red;
+}
+
+/* grid styles */
+
+table.Grid {
+  border-collapse: collapse;
+}
+
+table.Grid tr td {
+  padding: 0.2em;
+  margin: 0px;
+  text-align: center;
+}
+
+table.Grid tr td.title {
+  font-size: 90%;
+  border-right: 1px gray solid;
+  border-bottom: 1px gray solid;
+}
+
+table.Grid tr td.sourcestamp {
+  font-size: 90%;
+}
+
+table.Grid tr td.builder {
+  text-align: right;
+  font-size: 90%;
+}
+
+table.Grid tr td.build {
+  border: 1px gray solid;
+}
diff --git a/tools/continuous_build/public_html/favicon.ico b/tools/continuous_build/build_internal/masters/master.webrtc/public_html/favicon.ico
similarity index 100%
rename from tools/continuous_build/public_html/favicon.ico
rename to tools/continuous_build/build_internal/masters/master.webrtc/public_html/favicon.ico
Binary files differ
diff --git a/tools/continuous_build/build_internal/masters/master.webrtc/slaves.cfg b/tools/continuous_build/build_internal/masters/master.webrtc/slaves.cfg
new file mode 100644
index 0000000..d8bbefb
--- /dev/null
+++ b/tools/continuous_build/build_internal/masters/master.webrtc/slaves.cfg
@@ -0,0 +1,150 @@
+# -*- python -*-
+# ex: set syntax=python:
+# Copyright (c) 2012 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.
+
+# See master.experimental/slaves.cfg for documentation.
+
+
+def linux():
+  return [
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'Linux64DBG',
+      'hostname': 'webrtc-cb-linux-slave-1',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'Linux32Release',
+      'hostname': 'webrtc-cb-linux-slave-2',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'ChromeOS',
+      'hostname': 'webrtc-cb-linux-slave-3',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'Linux32DBG',
+      'hostname': 'webrtc-cb-linux-slave-4',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'Linux64Release',
+      'hostname': 'webrtc-cb-linux-slave-5',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'LinuxValgrind',
+      'hostname': 'webrtc-cb-linux-slave-6',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'Android',
+      'hostname': 'webrtc-cb-linux-slave-7',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'LinuxClang',
+      'hostname': 'webrtc-cb-linux-slave-8',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'Linux64DBG-GCC4.6',
+      'hostname': 'webrtc-cb-linux-slave-9',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'AndroidNDK',
+      'hostname': 'webrtc-cb-linux-slave-10',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'LinuxVideoTest',
+      'hostname': 'webrtc-build-bot-se',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'linux',
+      'version': 'lucid',
+      'bits': '64',
+      'builder': 'Chrome',
+      'hostname': 'webrtc-chrome',
+    },
+  ]
+
+def mac():
+  return [
+    {
+      'master': 'WebRTC',
+      'os': 'mac',
+      'version': '10.7',
+      'bits': '64',
+      'builder': 'MacOS32DBG',
+      'hostname': 'dhcp-172-28-249-243',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'mac',
+      'version': '10.7',
+      'bits': '64',
+      'builder': 'MacOS32Release',
+      'hostname': 'dhcp-172-28-249-241',
+    },
+  ]
+
+def windows():
+  return [
+    {
+      'master': 'WebRTC',
+      'os': 'win',
+      'version': 'server2008',
+      'bits': '64',
+      'builder': 'Win32Debug',
+      'hostname': 'webrtc-win2k8-1',
+    },
+    {
+      'master': 'WebRTC',
+      'os': 'win',
+      'version': 'server2008',
+      'bits': '64',
+      'builder': 'Win32Release',
+      'hostname': 'webrtc-win2k8-2',
+    },
+  ]
+
+slaves = linux() + mac() + windows()
diff --git a/tools/continuous_build/clean_old_files.py b/tools/continuous_build/build_internal/scripts/clean_old_files.py
similarity index 100%
rename from tools/continuous_build/clean_old_files.py
rename to tools/continuous_build/build_internal/scripts/clean_old_files.py
diff --git a/tools/continuous_build/clean_third_party_gcda.sh b/tools/continuous_build/build_internal/scripts/clean_third_party_gcda.sh
similarity index 100%
rename from tools/continuous_build/clean_third_party_gcda.sh
rename to tools/continuous_build/build_internal/scripts/clean_third_party_gcda.sh
diff --git a/tools/continuous_build/generate_coverage_html.sh b/tools/continuous_build/build_internal/scripts/generate_coverage_html.sh
similarity index 100%
rename from tools/continuous_build/generate_coverage_html.sh
rename to tools/continuous_build/build_internal/scripts/generate_coverage_html.sh
diff --git a/tools/continuous_build/build_internal/scripts/webrtc_buildbot/__init__.py b/tools/continuous_build/build_internal/scripts/webrtc_buildbot/__init__.py
new file mode 100755
index 0000000..e6f0468
--- /dev/null
+++ b/tools/continuous_build/build_internal/scripts/webrtc_buildbot/__init__.py
@@ -0,0 +1,8 @@
+#!/usr/bin/env python
+#  Copyright (c) 2012 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.
diff --git a/tools/continuous_build/webrtc_buildbot/utils.py b/tools/continuous_build/build_internal/scripts/webrtc_buildbot/utils.py
similarity index 87%
rename from tools/continuous_build/webrtc_buildbot/utils.py
rename to tools/continuous_build/build_internal/scripts/webrtc_buildbot/utils.py
index ab819f2..6bb423f 100755
--- a/tools/continuous_build/webrtc_buildbot/utils.py
+++ b/tools/continuous_build/build_internal/scripts/webrtc_buildbot/utils.py
@@ -18,6 +18,9 @@
 from buildbot.process.properties import WithProperties
 from buildbot.steps.shell import ShellCommand
 
+from master import chromium_step
+from master.factory import gclient_factory
+
 # Defines the order of the booleans of the supported platforms in the test
 # dictionaries in master.cfg.
 SUPPORTED_PLATFORMS = ('Linux', 'Mac', 'Windows')
@@ -71,16 +74,19 @@
      can be overridden to create customized build sequences.
   """
 
-  def __init__(self, build_status_oracle):
+  def __init__(self, build_status_oracle, is_try_slave=False):
     """Creates the abstract factory.
 
        Args:
          build_status_oracle: An instance of BuildStatusOracle which is used to
              keep track of our build state.
+         is_try_slave: If this bot is a try slave. Needed since we're handling
+             some things differently between normal slaves and try slaves.
     """
     factory.BuildFactory.__init__(self)
 
     self.build_status_oracle = build_status_oracle
+    self.is_try_slave = is_try_slave
     self.properties = properties.Properties()
     self.gyp_params = []
     self.release = False
@@ -106,8 +112,7 @@
       self.EnableTest(test)
 
   def AddCommonStep(self, cmd, descriptor='', workdir=WEBRTC_TRUNK_DIR,
-                    number_of_retries=0, halt_build_on_failure=True,
-                    warn_on_failure=False):
+                    halt_build_on_failure=True, warn_on_failure=False):
     """Adds a step which will run as a shell command on the slave.
 
        NOTE: you are recommended to use this method to add new shell commands
@@ -127,7 +132,6 @@
              responsible for making sure that the slashes are flipped the right
              way depending on platform, which means you can't use the default
              value if the step will run on a Windows machine.
-         number_of_retries: Number of times to retry the command, if it fails.
          halt_build_on_failure: Stops the build dead in its tracks if this step
              fails. Use for critical steps. This option does not make sense with
              warn_on_failure.
@@ -142,9 +146,8 @@
     # Add spaces to wrap long test names to make waterfall output more compact.
     wrapped_text = self._WrapLongLines(descriptor)
 
-    self.addStep(MonitoredRetryingShellCommand(
+    self.addStep(MonitoredShellCommand(
         build_status_oracle=self.build_status_oracle,
-        number_of_retries=number_of_retries,
         command=cmd,
         workdir=workdir,
         description=wrapped_text + ['running...'],
@@ -160,7 +163,7 @@
        Smart clean only cleans the whole repository if the build status oracle
        thinks the last build failed. Otherwise it cleans just the build output.
     """
-    self.addStep(SmartClean(self.build_status_oracle,
+    self.addStep(SmartClean(self.build_status_oracle, self.is_try_slave,
                             workdir=WEBRTC_BUILD_DIR))
 
   def AddCommonTestRunStep(self, test, descriptor='', cmd=None):
@@ -206,22 +209,27 @@
                        workdir=WEBRTC_BUILD_DIR,
                        descriptor='gclient_config')
 
-  def AddGclientSyncStep(self, force_sync):
-    """Helper method for invoking gclient sync.
+  def AddGclientSyncStep(self):
+    """Helper method for invoking gclient sync."""
+    gclient_spec = self._ConfigureWhatToBuild()
+    env = self._GetEnvironmentWithDisabledDepotToolsUpdate()
 
-       Will retry if the operation fails. Runs in the bot's build directory
-       (e.g. one step above trunk).
-
-       Args:
-           force_sync: If the sync should be forced, i.e. update even for
-           unchanged modules (known to be required for Windows sometimes).
-    """
-    cmd = ['gclient', 'sync']
-    if force_sync:
-      cmd.append('--force')
-    self.AddCommonStep(cmd, descriptor='Sync',
-                       workdir=WEBRTC_BUILD_DIR,
-                       number_of_retries=GCLIENT_RETRIES)
+    # Define how the GClient command shall be executed.
+    # Try 4+1=5 times, 10 seconds apart.
+    retry = (10, 4)
+    # Subversion timeout is by default 2 minutes; we allow 5 minutes.
+    timeout = 60*5
+    # Removal can take a long time. Allow 15 minutes.
+    rm_timeout = 60*15
+    self.addStep(chromium_step.GClient,
+                 gclient_spec=gclient_spec,
+                 svnurl=WEBRTC_SVN_LOCATION,
+                 workdir='build',
+                 mode='update',
+                 env=env,
+                 retry=retry,
+                 timeout=timeout,
+                 rm_timeout=rm_timeout)
 
   def AddCommonGYPStep(self, gyp_file, gyp_params=[], descriptor='gyp'):
     """Helper method for invoking GYP on WebRTC.
@@ -242,6 +250,18 @@
     cmd += gyp_params + self.gyp_params
     self.AddCommonStep(cmd=cmd, descriptor=descriptor)
 
+  def _ConfigureWhatToBuild(self):
+    """Returns a string with the contents of a .gclient file."""
+    solution = gclient_factory.GClientSolution(name='trunk',
+                                               svn_url=WEBRTC_SVN_LOCATION)
+    return 'solutions = [ %s ]' % solution.GetSpec()
+
+  def _GetEnvironmentWithDisabledDepotToolsUpdate(self):
+    """Returns a dictionary of environment variables to be used by GClient."""
+    env = {}
+    env['DEPOT_TOOLS_UPDATE'] = '0'
+    return env
+
   def _WrapLongLines(self, string_list, max_line_length=25, wrap_character='_'):
     """ Creates a list with wrapped strings for lines that are too long.
 
@@ -307,52 +327,45 @@
     return os.path.join(self.master_work_dir, self.builder_name + ".failed")
 
 
-class MonitoredRetryingShellCommand(ShellCommand):
-  """Wraps a shell command and notifies the oracle if the command fails.
-
-  If the command fails, there's an option to retry it a number of times.
-  Default behavior is to not retry."""
-
-  def __init__(self, build_status_oracle, number_of_retries=0, **kwargs):
+class MonitoredShellCommand(ShellCommand):
+  """Wraps a shell command and notifies the oracle if the command fails."""
+  def __init__(self, build_status_oracle, **kwargs):
     ShellCommand.__init__(self, **kwargs)
 
-    self.addFactoryArguments(build_status_oracle=build_status_oracle,
-                             number_of_retries=number_of_retries)
+    self.addFactoryArguments(build_status_oracle=build_status_oracle)
     self.build_status_oracle = build_status_oracle
-    self.number_of_retries = number_of_retries
 
   def finished(self, results):
     if (results == buildbot.status.builder.FAILURE or
         results == buildbot.status.builder.EXCEPTION):
-      if self.number_of_retries > 0:
-        self.number_of_retries -= 1
-        self.start()
-        return
-      else:
-        self.build_status_oracle.SetLastBuildAsFailed()
+      self.build_status_oracle.SetLastBuildAsFailed()
     ShellCommand.finished(self, results)
 
 
 class SmartClean(ShellCommand):
   """Cleans the repository fully or partially depending on the build state."""
-  def __init__(self, build_status_oracle, **kwargs):
+  def __init__(self, build_status_oracle, is_try_slave, **kwargs):
     ShellCommand.__init__(self, **kwargs)
 
-    self.addFactoryArguments(build_status_oracle=build_status_oracle)
+    self.addFactoryArguments(build_status_oracle=build_status_oracle,
+                             is_try_slave=is_try_slave)
     self.haltOnFailure = True
     self.build_status_oracle = build_status_oracle
+    self.is_try_slave = is_try_slave
 
   def start(self):
-    if self.build_status_oracle.LastBuildFailed():
-      self.build_status_oracle.ForgetLastBuild()
-      self.description = ['Nuke Repository', '(Previous Failed)']
-      self.setCommand(['rm', '-rf', 'trunk'])
-    else:
+    # Always do normal clean for try slaves, since nuking confuses the Chromium
+    # scripts' GClient sync step.
+    if self.is_try_slave or self.build_status_oracle.LastBuildFailed():
       self.description = ['Clean']
       self.setCommand('rm -rf trunk/out && '
                       'rm -rf trunk/xcodebuild &&'
                       'rm -rf trunk/build/Debug &&'
                       'rm -rf trunk/build/Release')
+    else:
+      self.build_status_oracle.ForgetLastBuild()
+      self.description = ['Nuke Repository', '(Previous Failed)']
+      self.setCommand(['rm', '-rf', 'trunk'])
     ShellCommand.start(self)
 
 
@@ -454,7 +467,7 @@
   def EnableBuild(self):
     self.AddCommonStep(['rm', '-rf', 'src'], workdir=WEBRTC_BUILD_DIR,
                        descriptor='Cleanup')
-    self.AddGclientSyncStep(force_sync=True)
+    self.AddGclientSyncStep()
     self.AddCommonMakeStep('chrome')
 
   def AddCommonMakeStep(self, target, make_extra=None):
@@ -472,8 +485,9 @@
      This factory is quite configurable and can run a variety of builds.
   """
 
-  def __init__(self, build_status_oracle, valgrind_enabled=False):
-    WebRTCFactory.__init__(self, build_status_oracle)
+  def __init__(self, build_status_oracle, is_try_slave=False,
+               valgrind_enabled=False):
+    WebRTCFactory.__init__(self, build_status_oracle, is_try_slave)
 
     self.build_enabled = False
     self.coverage_enabled = False
@@ -514,7 +528,7 @@
         self.gyp_params.append('-D' + gyp_define)
     else:
       self.AddGclientConfigStep()
-    self.AddGclientSyncStep(force_sync=False)
+    self.AddGclientSyncStep()
 
     if chrome_os:
       self.gyp_params.append('-Dchromeos=1')
@@ -666,8 +680,8 @@
 class WebRTCMacFactory(WebRTCFactory):
   """Sets up the Mac build, both for make and xcode."""
 
-  def __init__(self, build_status_oracle):
-    WebRTCFactory.__init__(self, build_status_oracle)
+  def __init__(self, build_status_oracle, is_try_slave=False):
+    WebRTCFactory.__init__(self, build_status_oracle, is_try_slave)
     self.build_type = 'both'
     self.allowed_build_types = ['both', 'xcode', 'make']
 
@@ -681,7 +695,7 @@
       self.build_type = build_type
     self.AddSmartCleanStep()
     self.AddGclientConfigStep()
-    self.AddGclientSyncStep(force_sync=True)
+    self.AddGclientSyncStep()
 
     if self.build_type == 'make' or self.build_type == 'both':
       self.AddCommonGYPStep('webrtc.gyp', gyp_params=['-f', 'make'],
@@ -725,20 +739,22 @@
      Allows building with Debug, Release or both in sequence.
   """
 
-  def __init__(self, build_status_oracle):
-    WebRTCFactory.__init__(self, build_status_oracle)
+  # Must provide full path to the command since we cannot add custom paths to
+  # the PATH environment variable when using Chromium buildbot startup scripts.
+  BUILD_CMD = r'C:\Windows\Microsoft.NET\Framework\v3.5\msbuild.exe'
+
+  def __init__(self, build_status_oracle, is_try_slave=False):
+    WebRTCFactory.__init__(self, build_status_oracle, is_try_slave)
     self.configuration = 'Debug'
     self.platform = 'x64'
     self.allowed_platforms = ['x64', 'Win32']
     self.allowed_configurations = ['Debug', 'Release', 'both']
 
   def AddCommonStep(self, cmd, descriptor='', workdir=WEBRTC_TRUNK_DIR,
-                    number_of_retries=0, halt_build_on_failure=True,
-                    warn_on_failure=False):
+                    halt_build_on_failure=True, warn_on_failure=False):
     workdir = workdir.replace('/', '\\')
     WebRTCFactory.AddCommonStep(self, cmd, descriptor, workdir,
-                                number_of_retries, halt_build_on_failure,
-                                warn_on_failure)
+                                halt_build_on_failure, warn_on_failure)
 
   def EnableBuild(self, platform='Win32', configuration='Debug'):
     if platform not in self.allowed_platforms:
@@ -761,23 +777,40 @@
     cmd = '%WINDIR%\\system32\\taskkill /f /im svn.exe || set ERRORLEVEL=0'
     self.AddCommonStep(cmd, 'svnkill')
 
+    # TODO(kjellander): Enable for normal slaves too when all are moved over to
+    # the new slave architecture.
+    if self.is_try_slave:
+      # Run the Chromium kill process script. It requires the handle.exe to be
+      # copied into third_party/psutils in order to not fail.
+      # Download from:
+      # http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx
+      # To avoid having to modify kill_processes.py, we set the working dir to
+      # the build dir (three levels up from the build dir that contains
+      # third_party/psutils).
+      cmd = 'python ..\\..\\..\\scripts\\slave\\kill_processes.py'
+      self.AddCommonStep(cmd, 'taskkill', workdir=WEBRTC_BUILD_DIR)
+
     # Now do the clean + build.
     self.AddSmartCleanStep()
     self.AddGclientConfigStep()
-    self.AddGclientSyncStep(force_sync=True)
+    self.AddGclientSyncStep()
 
     if self.configuration == 'Debug' or self.configuration == 'both':
-      cmd = ['msbuild', 'webrtc.sln', '/t:Clean', '/verbosity:diagnostic',
+      cmd = [WebRTCWinFactory.BUILD_CMD, 'webrtc.sln', '/t:Clean',
+             '/verbosity:diagnostic',
              '/p:Configuration=Debug;Platform=%s' % (self.platform)]
       self.AddCommonStep(cmd, descriptor='Build(Clean)')
-      cmd = ['msbuild', 'webrtc.sln', '/verbosity:diagnostic',
+      cmd = [WebRTCWinFactory.BUILD_CMD, 'webrtc.sln',
+             '/verbosity:diagnostic',
              '/p:Configuration=Debug;Platform=%s' % (self.platform)]
       self.AddCommonStep(cmd, descriptor='Build(Debug)')
     if self.configuration == 'Release' or self.configuration == 'both':
-      cmd = ['msbuild', 'webrtc.sln', '/t:Clean', '/verbosity:diagnostic',
+      cmd = [WebRTCWinFactory.BUILD_CMD, 'webrtc.sln', '/t:Clean',
+             '/verbosity:diagnostic',
              '/p:Configuration=Release;Platform=%s' % (self.platform)]
       self.AddCommonStep(cmd, descriptor='Build(Clean)')
-      cmd = ['msbuild', 'webrtc.sln', '/verbosity:diagnostic',
+      cmd = [WebRTCWinFactory.BUILD_CMD, 'webrtc.sln',
+             '/verbosity:diagnostic',
              '/p:Configuration=Release;Platform=%s' % (self.platform)]
       self.AddCommonStep(cmd, descriptor='Build(Release)')
 
diff --git a/tools/continuous_build/webrtc_buildbot/utils_test.py b/tools/continuous_build/build_internal/scripts/webrtc_buildbot/utils_test.py
similarity index 100%
rename from tools/continuous_build/webrtc_buildbot/utils_test.py
rename to tools/continuous_build/build_internal/scripts/webrtc_buildbot/utils_test.py
diff --git a/tools/continuous_build/build_internal/site_config/config_private.py b/tools/continuous_build/build_internal/site_config/config_private.py
new file mode 100644
index 0000000..c7d366e
--- /dev/null
+++ b/tools/continuous_build/build_internal/site_config/config_private.py
@@ -0,0 +1,153 @@
+#!/usr/bin/env python
+#  Copyright (c) 2012 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.
+
+# This file is based on the Chromium config.py located at
+# /trunk/tools/build/site_config/config_default.py of the Chromium tools.
+
+import socket
+
+class Master(object):
+  # Repository URLs used by the SVNPoller and 'gclient config'.
+  server_url = 'http://webrtc.googlecode.com'
+  git_server_url =  'http://webrtc.googlecode.com/git'
+  repo_root = '/svn'
+
+  # External repos.
+  googlecode_url = 'http://%s.googlecode.com/svn'
+  sourceforge_url = 'https://%(repo)s.svn.sourceforge.net/svnroot/%(repo)s'
+
+  # Directly fetches from anonymous webkit svn server.
+  webkit_root_url = 'http://svn.webkit.org/repository/webkit'
+
+  llvm_url = 'http://llvm.org/svn/llvm-project'
+
+  # Other non-redistributable repositories.
+  repo_root_internal = None
+  trunk_internal_url = None
+  trunk_internal_url_src = None
+  gears_url_internal = None
+  o3d_url_internal = None
+  nacl_trunk_url_internal = None
+  nacl_url_internal = None
+
+  syzygy_internal_url = None
+
+  # Other non-redistributable repositories.
+  repo_root_internal = None
+  trunk_internal_url = None
+  trunk_internal_url_src = None
+
+  # Please change this accordingly.
+  master_domain = 'webrtc.org'
+  permitted_domains = ('webrtc.org',)
+
+  # Your smtp server to enable mail notifications.
+  smtp = 'smtp'
+
+  # By default, bot_password will be filled in by config.GetBotPassword();
+  # if the private config wants to override this, it can do so.
+  bot_password = None
+
+  class _Base(object):
+    # Master address. You should probably copy this file in another svn repo
+    # so you can override this value on both the slaves and the master.
+    master_host = 'webrtc-cb-linux-master.cbf.corp.google.com'
+    # If set to True, the master will do nasty stuff like closing the tree,
+    # sending emails or other similar behaviors. Don't change this value unless
+    # you modified the other settings extensively.
+    is_production_host = socket.getfqdn() == master_host
+    # Additional email addresses to send gatekeeper (automatic tree closage)
+    # notifications. Unnecessary for experimental masters and try servers.
+    tree_closing_notification_recipients = []
+    # 'from:' field for emails sent from the server.
+    from_address = 'webrtc-cb-watchlist@google.com'
+    # Code review site to upload results. You should setup your own Rietveld
+    # instance with the code at
+    # http://code.google.com/p/rietveld/source/browse/#svn/branches/chromium
+    # You can host your own private rietveld instance on Django, see
+    # http://code.google.com/p/google-app-engine-django and
+    # http://code.google.com/appengine/articles/pure_django.html
+    code_review_site = 'https://webrtc-codereview.appspot.com/status_listener'
+
+    # For the following values, they are used only if non-0. Do not set them
+    # here, set them in the actual master configuration class.
+
+    # Used for the waterfall URL and the waterfall's WebStatus object.
+    master_port = 0
+    # Which port slaves use to connect to the master.
+    slave_port = 0
+    # The alternate read-only page. Optional.
+    master_port_alt = 0
+    # HTTP port for try jobs.
+    try_job_port = 0
+
+  ## Chrome related
+
+  class _ChromiumBase(_Base):
+    # Tree status urls. You should fork the code from tools/chromium-status/ and
+    # setup your own AppEngine instance (or use directly Django to create a
+    # local instance).
+    # Defaulting urls that are used to POST data to 'localhost' so a local dev
+    # server can be used for testing and to make sure nobody updates the tree
+    # status by error!
+    #
+    # This url is used for HttpStatusPush:
+    base_app_url = 'http://localhost:8080'
+    # HTTP url that should return 0 or 1, depending if the tree is open or
+    # closed. It is also used as POST to update the tree status.
+    tree_status_url = base_app_url + '/status'
+    # Used by LKGR to POST data.
+    store_revisions_url = base_app_url + '/revisions'
+    # Used by the try server to sync to the last known good revision:
+    last_good_url = 'http://webrtc-dashboard.appspot.com/lkgr'
+
+  class WebRTC(_ChromiumBase):
+    # Used by the waterfall display.
+    project_name = 'WebRTC'
+    master_port = 9010
+    slave_port = 9112
+    master_port_alt = 9014
+
+  class WebRTCMemory(_ChromiumBase):
+    project_name = 'WebRTC Memory'
+    master_port = 9014
+    slave_port = 9119
+    master_port_alt = 9047
+
+  class WebRTCPerf(_ChromiumBase):
+    project_name = 'WebRTC Perf'
+    master_port = 9050
+    slave_port = 9151
+    master_port_alt = 9052
+
+  class TryServer(_ChromiumBase):
+    project_name = 'WebRTC Try Server'
+    master_port = 9011
+    slave_port = 9113
+    master_port_alt = 9015
+    try_job_port = 9018
+    # The svn repository to poll to grab try patches. For chrome, we use a
+    # separate repo to put all the diff files to be tried.
+    svn_url = None
+
+class Archive(object):
+  archive_host = 'localhost'
+  # Skip any filenames (exes, symbols, etc.) starting with these strings
+  # entirely, typically because they're not built for this distribution.
+  exes_to_skip_entirely = []
+  # Web server base path.
+  www_dir_base = "\\\\" + archive_host + "\\www\\"
+
+  @staticmethod
+  def Internal():
+    pass
+
+
+class Distributed(object):
+  """Not much to describe."""
diff --git a/tools/continuous_build/build_internal/symsrc/webrtc_buildbot/__init__.py b/tools/continuous_build/build_internal/symsrc/webrtc_buildbot/__init__.py
new file mode 100755
index 0000000..e6f0468
--- /dev/null
+++ b/tools/continuous_build/build_internal/symsrc/webrtc_buildbot/__init__.py
@@ -0,0 +1,8 @@
+#!/usr/bin/env python
+#  Copyright (c) 2012 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.
diff --git a/tools/continuous_build/build_internal/symsrc/webrtc_buildbot/slave_utils.py b/tools/continuous_build/build_internal/symsrc/webrtc_buildbot/slave_utils.py
new file mode 100644
index 0000000..e16117c
--- /dev/null
+++ b/tools/continuous_build/build_internal/symsrc/webrtc_buildbot/slave_utils.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+#  Copyright (c) 2012 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.
+
+__author__ = 'kjellander@webrtc.org (Henrik Kjellander)'
+
+"""Contains a customized GClient class for WebRTC use.
+
+It is essential that this class is imported after the chromium_commands so it
+can overwrite its registration of the 'gclient' command.
+This should by done by adding:
+
+from webrtc_buildbot import slave_utils
+
+into the buildbot.tac file of the try slave.
+"""
+
+from slave import chromium_commands
+
+try:
+  # Buildbot 0.8.x
+  # Unable to import 'XX'
+  # pylint: disable=F0401
+  from buildslave.commands.registry import commandRegistry
+except ImportError:
+  # Buildbot 0.7.12
+  # Unable to import 'XX'
+  # pylint: disable=E0611,E1101,F0401
+  from buildbot.slave.registry import registerSlaveCommand
+
+class GClient(chromium_commands.GClient):
+  def doPatch(self, res):
+    # For some unknown reason, the patch tuple recieved only have two items:
+    # the patch level and the actual diff contents. The third optional root
+    # argument that tells which base directory to use for the patch is not
+    # included. Since we need this to be able to patch properly in WebRTC, we'll
+    # just create a new tuple with this added.
+    self.patch = (self.patch[0], self.patch[1], 'trunk')
+    return chromium_commands.GClient.doPatch(self, res)
+
+
+def RegisterGclient():
+  try:
+    # This version should work on BB 8.3
+
+    # We run this code in a try because it fails with an assertion if
+    # the module is loaded twice.
+    commandRegistry['gclient'] = 'webrtc_buildbot.slave_utils.GClient'
+    return
+  except (AssertionError, NameError):
+    pass
+
+  try:
+    # This version should work on BB 7.12
+    # We run this code in a try because it fails with an assertion if
+    # the module is loaded twice.
+    registerSlaveCommand('gclient', GClient, commands.command_version)
+  except (AssertionError, NameError):
+    pass
+
+RegisterGclient()
diff --git a/tools/continuous_build/public_html/README b/tools/continuous_build/public_html/README
deleted file mode 100644
index 5f59005..0000000
--- a/tools/continuous_build/public_html/README
+++ /dev/null
@@ -1,18 +0,0 @@
-Modify the look of the buildbot master's waterfall page
--------------------------------------------------------
-
-To deploy these changes, follow these instructions:
-
-* Copy the favicon.ico file to master/public_html/ on the buildbot master
-  machine.
-
-* Edit the master/public_html/index.html and add the following to the <head>
-  element:
-  <link rel="shortcut icon" href="/favicon.ico" type="image/png" />
-  <link rel="icon" href="/favicon.ico" type="image/png" />
-
-* Edit the master/public_html/buildbot.css and change the section with
-  .LastBuild, .Activity {
-	  width: 230px;
-
-  to be 160px instead. Save the file and exit.
diff --git a/tools/continuous_build/webrtc_buildbot/__init__.py b/tools/continuous_build/webrtc_buildbot/__init__.py
deleted file mode 100755
index 869bd84..0000000
--- a/tools/continuous_build/webrtc_buildbot/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-# -*- python -*-
-# ex: set syntax=python: