diff --git a/Makefile b/Makefile
index e584dcc..fe2f97c 100644
--- a/Makefile
+++ b/Makefile
@@ -14,7 +14,6 @@
 	install -m 0755 host/start_devserver "${DESTDIR}/usr/bin"
 	install -m 0755 devserver.py strip_package.py "${DESTDIR}/usr/lib/devserver"
 	install -m 0644  \
-		autoupdate.py \
 		builder.py \
 		cherrypy_ext.py \
 		health_checker.py \
diff --git a/autoupdate.py b/autoupdate.py
deleted file mode 100644
index 88def64..0000000
--- a/autoupdate.py
+++ /dev/null
@@ -1,207 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Devserver module for handling update client requests."""
-
-from __future__ import print_function
-
-import os
-
-from six.moves import urllib
-
-import cherrypy  # pylint: disable=import-error
-
-# TODO(crbug.com/872441): We try to import nebraska from different places
-# because when we install the devserver, we copy the nebraska.py into the main
-# directory. Once this bug is resolved, we can always import from nebraska
-# directory.
-try:
-  from nebraska import nebraska
-except ImportError:
-  import nebraska
-
-import setup_chromite  # pylint: disable=unused-import
-from chromite.lib.xbuddy import cherrypy_log_util
-from chromite.lib.xbuddy import devserver_constants as constants
-
-
-# Module-local log function.
-def _Log(message, *args):
-  return cherrypy_log_util.LogWithTag('UPDATE', message, *args)
-
-class AutoupdateError(Exception):
-  """Exception classes used by this module."""
-  pass
-
-
-def _ChangeUrlPort(url, new_port):
-  """Return the URL passed in with a different port"""
-  scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url)
-  host_port = netloc.split(':')
-
-  if len(host_port) == 1:
-    host_port.append(new_port)
-  else:
-    host_port[1] = new_port
-
-  print(host_port)
-  netloc = '%s:%s' % tuple(host_port)
-
-  # pylint: disable=too-many-function-args
-  return urllib.parse.urlunsplit((scheme, netloc, path, query, fragment))
-
-def _NonePathJoin(*args):
-  """os.path.join that filters None's from the argument list."""
-  return os.path.join(*[x for x in args if x is not None])
-
-
-class Autoupdate(object):
-  """Class that contains functionality that handles Chrome OS update pings."""
-
-  def __init__(self, xbuddy, static_dir=None):
-    """Initializes the class.
-
-    Args:
-      xbuddy: The xbuddy path.
-      static_dir: The path to the devserver static directory.
-    """
-    self.xbuddy = xbuddy
-    self.static_dir = static_dir
-
-  def GetUpdateForLabel(self, label):
-    """Given a label, get an update from the directory.
-
-    Args:
-      label: the relative directory inside the static dir
-
-    Returns:
-      A relative path to the directory with the update payload.
-      This is the label if an update did not need to be generated, but can
-      be label/cache/hashed_dir_for_update.
-
-    Raises:
-      AutoupdateError: If client version is higher than available update found
-        at the directory given by the label.
-    """
-    _Log('Update label: %s', label)
-    static_update_path = _NonePathJoin(self.static_dir, label,
-                                       constants.UPDATE_FILE)
-
-    if label and os.path.exists(static_update_path):
-      # An update payload was found for the given label, return it.
-      return label
-
-    # The label didn't resolve.
-    _Log('Did not found any update payload for label %s.', label)
-    return None
-
-  def GetDevserverUrl(self):
-    """Returns the devserver url base."""
-    x_forwarded_host = cherrypy.request.headers.get('X-Forwarded-Host')
-    if x_forwarded_host:
-      # Select the left most <ip>:<port> value so that the request is
-      # forwarded correctly.
-      x_forwarded_host = [x.strip() for x in x_forwarded_host.split(',')][0]
-      hostname = 'http://' + x_forwarded_host
-    else:
-      hostname = cherrypy.request.base
-
-    return hostname
-
-  def GetStaticUrl(self):
-    """Returns the static url base that should prefix all payload responses."""
-    hostname = self.GetDevserverUrl()
-    _Log('Handling update ping as %s', hostname)
-
-    static_urlbase = '%s/static' % hostname
-    _Log('Using static url base %s', static_urlbase)
-    return static_urlbase
-
-  def GetPathToPayload(self, label, board):
-    """Find a payload locally.
-
-    See devserver's update rpc for documentation.
-
-    Args:
-      label: from update request
-      board: from update request
-
-    Returns:
-      The relative path to an update from the static_dir
-
-    Raises:
-      AutoupdateError: If the update could not be found.
-    """
-    label = label or ''
-    label_list = label.split('/')
-    # Suppose that the path follows old protocol of indexing straight
-    # into static_dir with board/version label.
-    # Attempt to get the update in that directory, generating if necc.
-    path_to_payload = self.GetUpdateForLabel(label)
-    if path_to_payload is None:
-      # There was no update found in the directory. Let XBuddy find the
-      # payloads.
-      if label_list[0] == 'xbuddy':
-        # If path explicitly calls xbuddy, pop off the tag.
-        label_list.pop()
-      x_label, _ = self.xbuddy.Translate(label_list, board=board)
-      # Path has been resolved, try to get the payload.
-      path_to_payload = self.GetUpdateForLabel(x_label)
-      if path_to_payload is None:
-        # No update payload found after translation. Try to get an update to
-        # a test image from GS using the label.
-        path_to_payload, _image_name = self.xbuddy.Get(
-            ['remote', label, 'full_payload'])
-
-    # One of the above options should have gotten us a relative path.
-    if path_to_payload is None:
-      raise AutoupdateError('Failed to get an update for: %s' % label)
-
-    return path_to_payload
-
-  def HandleUpdatePing(self, data, label='', **kwargs):
-    """Handles an update ping from an update client.
-
-    Args:
-      data: XML blob from client.
-      label: optional label for the update.
-      kwargs: The map of query strings passed to the /update API.
-
-    Returns:
-      Update payload message for client.
-    """
-    # Get the static url base that will form that base of our update url e.g.
-    # http://hostname:8080/static/update.gz.
-    static_urlbase = self.GetStaticUrl()
-    # Change the URL's string query dictionary provided by cherrypy to a valid
-    # dictionary that has proper values for its keys. e.g. True instead of
-    # 'True'.
-    kwargs = nebraska.QueryDictToDict(kwargs)
-
-    # Process attributes of the update check.
-    request = nebraska.Request(data)
-    if request.request_type == nebraska.Request.RequestType.EVENT:
-      _Log('A non-update event notification received. Returning an ack.')
-      return nebraska.Nebraska().GetResponseToRequest(
-          request, response_props=nebraska.ResponseProperties(**kwargs))
-
-    _Log('Update Check Received.')
-
-    try:
-      path_to_payload = self.GetPathToPayload(label, request.board)
-      base_url = _NonePathJoin(static_urlbase, path_to_payload)
-      local_payload_dir = _NonePathJoin(self.static_dir, path_to_payload)
-    except AutoupdateError as e:
-      # Raised if we fail to generate an update payload.
-      _Log('Failed to process an update request, but we will defer to '
-           'nebraska to respond with no-update. The error was %s', e)
-
-    _Log('Responding to client to use url %s to get image', base_url)
-    nebraska_props = nebraska.NebraskaProperties(
-        update_payloads_address=base_url,
-        update_metadata_dir=local_payload_dir)
-    nebraska_obj = nebraska.Nebraska(nebraska_props=nebraska_props)
-    return nebraska_obj.GetResponseToRequest(
-        request, response_props=nebraska.ResponseProperties(**kwargs))
diff --git a/autoupdate_unittest.py b/autoupdate_unittest.py
deleted file mode 100755
index 648ef7c..0000000
--- a/autoupdate_unittest.py
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/usr/bin/env python2
-# -*- coding: utf-8 -*-
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Unit tests for autoupdate.py."""
-
-from __future__ import print_function
-
-import json
-import shutil
-import socket
-import tempfile
-import unittest
-
-import mock
-import cherrypy  # pylint: disable=import-error
-
-import autoupdate
-
-import setup_chromite  # pylint: disable=unused-import
-from chromite.lib.xbuddy import common_util
-from chromite.lib.xbuddy import xbuddy
-
-
-_TEST_REQUEST = """<?xml version="1.0" encoding="UTF-8"?>
-<request protocol="3.0" updater="ChromeOSUpdateEngine" updaterversion="0.1.0.0">
-  <app appid="test-appid" version="%(version)s" track="%(track)s"
-       board="%(board)s" hardware_class="%(hwclass)s">
-    <updatecheck />
-  </app>
-</request>"""
-
-class AutoupdateTest(unittest.TestCase):
-  """Tests for the autoupdate.Autoupdate class."""
-
-  def setUp(self):
-    self.port = 8080
-    self.test_board = 'test-board'
-    self.build_root = tempfile.mkdtemp('autoupdate_build_root')
-    self.tempdir = tempfile.mkdtemp('tempdir')
-    self.latest_dir = '12345_af_12-a1'
-    self.latest_verision = '12345_af_12'
-    self.static_image_dir = tempfile.mkdtemp('autoupdate_static_dir')
-    self.hostname = '%s:%s' % (socket.gethostname(), self.port)
-    self.test_dict = {
-        'version': 'ForcedUpdate',
-        'track': 'test-channel',
-        'board': self.test_board,
-        'hwclass': 'test-hardware-class',
-    }
-    self.test_data = _TEST_REQUEST % self.test_dict
-    self.payload = 'My payload'
-    cherrypy.request.base = 'http://%s' % self.hostname
-    common_util.MkDirP(self.static_image_dir)
-    self._xbuddy = xbuddy.XBuddy(False,
-                                 static_dir=self.static_image_dir)
-    mock.patch.object(xbuddy.XBuddy, '_GetArtifact')
-
-  def tearDown(self):
-    shutil.rmtree(self.build_root)
-    shutil.rmtree(self.tempdir)
-    shutil.rmtree(self.static_image_dir)
-
-  def _DummyAutoupdateConstructor(self, **kwargs):
-    """Creates a dummy autoupdater.  Used to avoid using constructor."""
-    dummy = autoupdate.Autoupdate(self._xbuddy,
-                                  static_dir=self.static_image_dir,
-                                  **kwargs)
-    return dummy
-
-  def testChangeUrlPort(self):
-    # pylint: disable=protected-access
-    r = autoupdate._ChangeUrlPort('http://fuzzy:8080/static', 8085)
-    self.assertEqual(r, 'http://fuzzy:8085/static')
-
-    r = autoupdate._ChangeUrlPort('http://fuzzy/static', 8085)
-    self.assertEqual(r, 'http://fuzzy:8085/static')
-
-    r = autoupdate._ChangeUrlPort('ftp://fuzzy/static', 8085)
-    self.assertEqual(r, 'ftp://fuzzy:8085/static')
-
-    r = autoupdate._ChangeUrlPort('ftp://fuzzy', 8085)
-    self.assertEqual(r, 'ftp://fuzzy:8085')
-
-  def testHandleHostInfoPing(self):
-    au_mock = self._DummyAutoupdateConstructor()
-    self.assertRaises(AssertionError, au_mock.HandleHostInfoPing, None)
-
-    # Setup fake host_infos entry and ensure it comes back to us in one piece.
-    test_ip = '1.2.3.4'
-    au_mock.host_infos.GetInitHostInfo(test_ip).attrs = self.test_dict
-    self.assertEqual(
-        json.loads(au_mock.HandleHostInfoPing(test_ip)), self.test_dict)
-
-  @mock.patch.object(autoupdate.Autoupdate, 'GetPathToPayload')
-  def testHandleUpdatePing(self, path_to_payload_mock):
-    """Tests HandleUpdatePing"""
-    au_mock = self._DummyAutoupdateConstructor()
-    path_to_payload_mock.return_value = self.tempdir
-    request = """<?xml version="1.0" encoding="UTF-8"?>
-<request protocol="3.0">
-  <os version="Indy" platform="Chrome OS" sp="10323.52.0_x86_64"></os>
-  <app appid="platform" version="1.0.0" delta_okay="true"
-       track="stable-channel" board="eve">
-    <ping active="1" a="1" r="1"></ping>
-    <updatecheck targetversionprefix=""></updatecheck>
-  </app>
-</request>"""
-
-    self.assertIn('error-unknownApplication', au_mock.HandleUpdatePing(request))
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/devserver.py b/devserver.py
index c25191c..f7d6707 100755
--- a/devserver.py
+++ b/devserver.py
@@ -4,22 +4,14 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-"""Chromium OS development server that can be used for all forms of update.
+"""Chromium OS development server that can be used for caching files.
 
-This devserver can be used to perform system-wide autoupdate and update
-of specific portage packages on devices running Chromium OS derived operating
-systems.
-
-The devserver is configured to stage and
-serve artifacts from Google Storage using the credentials provided to it before
-it is run. The easiest way to understand this is that the devserver is
-functioning as a local cache for artifacts produced and uploaded by build
-servers. Users of this form of devserver can either download the artifacts
-from the devservers static directory OR use the update RPC to perform a
-system-wide autoupdate. Archive mode is always active.
-
-For autoupdates, there are many more advanced options that can help specify
-how to update and which payload to give to a requester.
+The devserver is configured to stage and serve artifacts from Google Storage
+using the credentials provided to it before it is run. The easiest way to
+understand this is that the devserver is functioning as a local cache for
+artifacts produced and uploaded by build servers. Users of this form of
+devserver can download the artifacts from the devservers static directory.
+Archive mode is always active.
 """
 
 from __future__ import print_function
@@ -45,7 +37,6 @@
 from cherrypy.process import plugins
 # pylint: enable=no-name-in-module, import-error
 
-import autoupdate
 import cherrypy_ext
 import health_checker
 
@@ -74,9 +65,6 @@
                   'dep-chrome_test.tar.bz2',
                   'dep-perf_data_dep.tar.bz2']
 
-# Sets up global to share between classes.
-updater = None
-
 # Log rotation parameters.  These settings correspond to twice a day once
 # devserver is started, with about two weeks (28 backup files) of old logs
 # kept for backup.
@@ -139,19 +127,23 @@
     raise DevServerError('Must specify an archive_url in the request')
 
 
-def _canonicalize_local_path(local_path):
+def _canonicalize_local_path(local_path, static_dir):
   """Canonicalizes |local_path| strings.
 
+  Args:
+    local_path: The input path.
+    static_dir: Devserver's static cache directory.
+
   Raises:
     DevserverError: if |local_path| is not set.
   """
   # Restrict staging of local content to only files within the static
   # directory.
   local_path = os.path.abspath(local_path)
-  if not local_path.startswith(updater.static_dir):
+  if not local_path.startswith(static_dir):
     raise DevServerError(
         'Local path %s must be a subdirectory of the static'
-        ' directory: %s' % (local_path, updater.static_dir))
+        ' directory: %s' % (local_path, static_dir))
 
   return local_path.rstrip('/')
 
@@ -190,20 +182,21 @@
   return os_type == 'android'
 
 
-def _get_downloader(kwargs):
+def _get_downloader(static_dir, kwargs):
   """Returns the downloader based on passed in arguments.
 
   Args:
+    static_dir: Devserver's static cache directory.
     kwargs: Keyword arguments for the request.
   """
   local_path = kwargs.get('local_path')
   if local_path:
-    local_path = _canonicalize_local_path(local_path)
+    local_path = _canonicalize_local_path(local_path, static_dir)
 
   dl = None
   if local_path:
     delete_source = _parse_boolean_arg(kwargs, 'delete_source')
-    dl = downloader.LocalDownloader(updater.static_dir, local_path,
+    dl = downloader.LocalDownloader(static_dir, local_path,
                                     delete_source=delete_source)
 
   if not _is_android_build_request(kwargs):
@@ -217,7 +210,7 @@
     if not dl:
       archive_url = _canonicalize_archive_url(archive_url)
       dl = downloader.GoogleStorageDownloader(
-          updater.static_dir, archive_url,
+          static_dir, archive_url,
           downloader.GoogleStorageDownloader.GetBuildIdFromArchiveURL(
               archive_url))
   elif not dl:
@@ -227,20 +220,21 @@
     if not target or not branch or not build_id:
       raise DevServerError('target, branch, build ID must all be specified for '
                            'downloading Android build.')
-    dl = downloader.AndroidBuildDownloader(updater.static_dir, branch, build_id,
+    dl = downloader.AndroidBuildDownloader(static_dir, branch, build_id,
                                            target)
 
   return dl
 
 
-def _get_downloader_and_factory(kwargs):
+def _get_downloader_and_factory(static_dir, kwargs):
   """Returns the downloader and artifact factory based on passed in arguments.
 
   Args:
+    static_dir: Devserver's static cache directory.
     kwargs: Keyword arguments for the request.
   """
   artifacts, files = _get_artifacts(kwargs)
-  dl = _get_downloader(kwargs)
+  dl = _get_downloader(static_dir, kwargs)
 
   if (isinstance(dl, (downloader.GoogleStorageDownloader,
                       downloader.LocalDownloader))):
@@ -344,11 +338,6 @@
       '/build': {
           'response.timeout': 100000,
       },
-      '/update': {
-          # Gets rid of cherrypy parsing post file for args.
-          'request.process_request_body': False,
-          'response.timeout': 10000,
-      },
       # Sets up the static dir for file hosting.
       '/static': {
           'tools.staticdir.dir': options.static_dir,
@@ -519,10 +508,11 @@
   # Lock used to lock increasing/decreasing count.
   _staging_thread_count_lock = threading.Lock()
 
-  def __init__(self, _xbuddy):
+  def __init__(self, _xbuddy, static_dir):
     self._builder = None
     self._telemetry_lock_dict = common_util.LockDict()
     self._xbuddy = _xbuddy
+    self._static_dir = static_dir
 
   @property
   def staging_thread_count(self):
@@ -561,7 +551,7 @@
     Returns:
       True of all artifacts are staged.
     """
-    dl, factory = _get_downloader_and_factory(kwargs)
+    dl, factory = _get_downloader_and_factory(self._static_dir, kwargs)
     response = str(dl.IsStaged(factory))
     _Log('Responding to is_staged %s request with %r', kwargs, response)
     return response
@@ -581,7 +571,7 @@
     Returns:
       A string with information about the contents of the image directory.
     """
-    dl = _get_downloader(kwargs)
+    dl = _get_downloader(self._static_dir, kwargs)
     try:
       image_dir_contents = dl.ListBuildDir()
     except build_artifact.ArtifactDownloadError as e:
@@ -643,7 +633,7 @@
         custom post-processing.
       clean: True to remove any previously staged artifacts first.
     """
-    dl, factory = _get_downloader_and_factory(kwargs)
+    dl, factory = _get_downloader_and_factory(self._static_dir, kwargs)
 
     with DevServerRoot._staging_thread_count_lock:
       DevServerRoot._staging_thread_count += 1
@@ -680,7 +670,7 @@
     if is_deprecated_server():
       raise DeprecatedRPCError('locate_file')
 
-    dl, _ = _get_downloader_and_factory(kwargs)
+    dl, _ = _get_downloader_and_factory(self._static_dir, kwargs)
     try:
       file_name = kwargs['file_name']
       artifacts = kwargs['artifacts']
@@ -714,7 +704,7 @@
     Returns:
       Path to the source folder for the telemetry codebase once it is staged.
     """
-    dl = _get_downloader(kwargs)
+    dl = _get_downloader(self._static_dir, kwargs)
 
     build_path = dl.GetBuildDir()
     deps_path = os.path.join(build_path, 'autotest/packages')
@@ -774,7 +764,7 @@
     # Try debug.tar.xz first, then debug.tgz
     for artifact in (artifact_info.SYMBOLS_ONLY, artifact_info.SYMBOLS):
       kwargs['artifacts'] = artifact
-      dl = _get_downloader(kwargs)
+      dl = _get_downloader(self._static_dir, kwargs)
 
       try:
         if self.stage(**kwargs) == 'Success':
@@ -845,7 +835,7 @@
 
     try:
       return common_util.GetLatestBuildVersion(
-          updater.static_dir, kwargs['target'],
+          self._static_dir, kwargs['target'],
           milestone=kwargs.get('milestone'))
     except common_util.CommonUtilError as errmsg:
       raise DevServerHTTPError(http_client.INTERNAL_SERVER_ERROR,
@@ -883,13 +873,13 @@
 
     control_file_list = [
         line.rstrip() for line in common_util.GetControlFileListForSuite(
-            updater.static_dir, kwargs['build'],
+            self._static_dir, kwargs['build'],
             kwargs['suite_name']).splitlines()]
 
     control_file_content_dict = {}
     for control_path in control_file_list:
       control_file_content_dict[control_path] = (common_util.GetControlFile(
-          updater.static_dir, kwargs['build'], control_path))
+          self._static_dir, kwargs['build'], control_path))
 
     return json.dumps(control_file_content_dict)
 
@@ -932,13 +922,13 @@
     if 'control_path' not in kwargs:
       if 'suite_name' in kwargs and kwargs['suite_name']:
         return common_util.GetControlFileListForSuite(
-            updater.static_dir, kwargs['build'], kwargs['suite_name'])
+            self._static_dir, kwargs['build'], kwargs['suite_name'])
       else:
         return common_util.GetControlFileList(
-            updater.static_dir, kwargs['build'])
+            self._static_dir, kwargs['build'])
     else:
       return common_util.GetControlFile(
-          updater.static_dir, kwargs['build'], kwargs['control_path'])
+          self._static_dir, kwargs['build'], kwargs['control_path'])
 
   @cherrypy.expose
   def xbuddy_translate(self, *args, **kwargs):
@@ -1073,7 +1063,7 @@
     """Shows the documentation for available methods / URLs.
 
     Examples:
-      http://myhost/doc/update
+      http://myhost/doc/xbuddy
     """
     if is_deprecated_server():
       raise DeprecatedRPCError('doc')
@@ -1086,51 +1076,6 @@
       raise DevServerError("No documentation for exposed method `%s'" % name)
     return '<pre>\n%s</pre>' % method.__doc__
 
-  @cherrypy.expose
-  def update(self, *args, **kwargs):
-    """Handles an update check from a Chrome OS client.
-
-    The HTTP request should contain the standard Omaha-style XML blob. The URL
-    line may contain an additional intermediate path to the update payload.
-
-    This request can be handled in one of 4 ways, depending on the devsever
-    settings and intermediate path.
-
-    1. No intermediate path. DEPRECATED
-
-    2. Path explicitly invokes XBuddy
-    If there is a path given, it can explicitly invoke xbuddy by prefixing it
-    with 'xbuddy'. This path is then used to acquire an image binary for the
-    devserver to generate an update payload from. Devserver then serves this
-    payload.
-
-    3. Path is left for the devserver to interpret.
-    If the path given doesn't explicitly invoke xbuddy, devserver will attempt
-    to generate a payload from the test image in that directory and serve it.
-
-    Examples:
-      2. Explicitly invoke xbuddy
-      update_engine_client --omaha_url=
-      http://myhost/update/xbuddy/remote/board/version/dev
-      This would go to GS to download the dev image for the board, from which
-      the devserver would generate a payload to serve.
-
-      3. Give a path for devserver to interpret
-      update_engine_client --omaha_url=http://myhost/update/some/random/path
-      This would attempt, in order to:
-        a) Generate an update from a test image binary if found in
-           static_dir/some/random/path.
-        b) Serve an update payload found in static_dir/some/random/path.
-        c) Hope that some/random/path takes the form "board/version" and
-           and attempt to download an update payload for that board/version
-           from GS.
-    """
-    label = '/'.join(args)
-    body_length = int(cherrypy.request.headers.get('Content-Length', 0))
-    data = cherrypy.request.rfile.read(body_length)
-
-    return updater.HandleUpdatePing(data, label, **kwargs)
-
 
 def _CleanCache(cache_dir, wipe):
   """Wipes any excess cached items in the cache_dir.
@@ -1278,15 +1223,10 @@
   if options.clear_cache and options.xbuddy_manage_builds:
     _xbuddy.CleanCache()
 
-  # We allow global use here to share with cherrypy classes.
-  # pylint: disable=W0603
-  global updater
-  updater = autoupdate.Autoupdate(_xbuddy, static_dir=options.static_dir)
-
   if options.exit:
     return
 
-  dev_server = DevServerRoot(_xbuddy)
+  dev_server = DevServerRoot(_xbuddy, options.static_dir)
   health_checker_app = health_checker.Root(dev_server, options.static_dir)
 
   if options.pidfile:
diff --git a/devserver_integration_test.py b/devserver_integration_test.py
index 64a492f..89c5d19 100755
--- a/devserver_integration_test.py
+++ b/devserver_integration_test.py
@@ -26,12 +26,8 @@
 
 from string import Template
 
-from xml.dom import minidom
-
 import requests
 
-from six.moves import urllib
-
 import psutil  # pylint: disable=import-error
 
 import setup_chromite  # pylint: disable=unused-import
@@ -215,64 +211,6 @@
     self.pid = None
     self.devserver = None
 
-
-  def VerifyHandleUpdate(self, label, use_test_payload=True,
-                         appid='{DEV-BUILD}'):
-    """Verifies that we can send an update request to the devserver.
-
-    This method verifies (using a fake update_request blob) that the devserver
-    can interpret the payload and give us back the right payload.
-
-    Args:
-      label: Label that update is served from e.g. <board>-release/<version>
-      use_test_payload: If set to true, expects to serve payload under
-        testdata/ and does extra checks i.e. compares hash and content of
-        payload.
-      appid: The APP ID of the board.
-
-    Returns:
-      url of the update payload if we verified the update.
-    """
-    update_label = '/'.join([UPDATE, label])
-    response = self._MakeRPC(
-        update_label, data=UPDATE_REQUEST.substitute({'appid': appid}),
-        critical_update=True)
-    self.assertNotEqual('', response)
-    self.assertIn('deadline="now"', response)
-
-    # Parse the response and check if it contains the right result.
-    dom = minidom.parseString(response)
-    update = dom.getElementsByTagName('updatecheck')[0]
-    expected_static_url = '/'.join([self.devserver_url, STATIC, label])
-    url = self.VerifyV3Response(update, expected_static_url)
-
-    # Verify the image we download is correct since we already know what it is.
-    if use_test_payload:
-      connection = urllib.request.urlopen(url)
-      contents = connection.read().decode('utf-8')
-      connection.close()
-      self.assertEqual('Developers, developers, developers!\n', contents)
-
-    return url
-
-  def VerifyV3Response(self, update, expected_static_url):
-    """Verifies the update DOM from a v3 response and returns the url."""
-    # Parse the response and check if it contains the right result.
-    urls = update.getElementsByTagName('urls')[0]
-    url = urls.getElementsByTagName('url')[0]
-
-    static_url = url.getAttribute('codebase')
-    # Static url's end in /.
-    self.assertEqual(expected_static_url + '/', static_url)
-
-    manifest = update.getElementsByTagName('manifest')[0]
-    packages = manifest.getElementsByTagName('packages')[0]
-    package = packages.getElementsByTagName('package')[0]
-    filename = package.getAttribute('name')
-    self.assertEqual(TEST_UPDATE_PAYLOAD_NAME, filename)
-
-    return os.path.join(static_url, filename)
-
   def _MakeRPC(self, rpc, data=None, timeout=None, **kwargs):
     """Makes an RPC call to the devserver.
 
@@ -338,9 +276,6 @@
   they are lumped with the remote tests here.
   """
 
-  def testHandleUpdateV3(self):
-    self.VerifyHandleUpdate(label=LABEL)
-
   def testXBuddyLocalAlias(self):
     """Extensive local image xbuddy unittest.
 
@@ -375,7 +310,7 @@
 
       xbuddy_path = '/'.join([build_id, item])
       logging.info('Testing xbuddy path %s', xbuddy_path)
-      response = self._MakeRPC('/'.join([XBUDDY, xbuddy_path]))
+      response = self._MakeRPC('/'.join([XBUDDY, xbuddy_path]), timeout=3)
       self.assertEqual(response, data)
 
       expected_dir = '/'.join([self.devserver_url, STATIC, build_id])
@@ -386,14 +321,6 @@
                                relative_path=True)
       self.assertEqual(response, build_id)
 
-    logging.info('Verifying the actual payload data')
-    url = self.VerifyHandleUpdate(build_id, use_test_payload=False)
-    logging.info('Verify the actual content of the update payload')
-    connection = urllib.request.urlopen(url)
-    contents = connection.read().decode('utf-8')
-    connection.close()
-    self.assertEqual(update_data, contents)
-
   def testPidFile(self):
     """Test that using a pidfile works correctly."""
     with open(self.pidfile, 'r') as f:
@@ -412,37 +339,6 @@
   2) time. These tests actually download the artifacts needed.
   """
 
-  def testStageAndUpdate(self):
-    """Tests core stage/update autotest workflow where with a test payload."""
-    build_id = 'eve-release/R78-12499.0.0'
-    archive_url = 'gs://chromeos-image-archive/%s' % build_id
-
-    response = self._MakeRPC(IS_STAGED, archive_url=archive_url,
-                             artifacts='full_payload,stateful')
-    self.assertEqual(response, 'False')
-
-    logging.info('Staging update artifacts')
-    self._MakeRPC(STAGE, archive_url=archive_url,
-                  artifacts='full_payload,stateful')
-    logging.info('Staging complete. '
-                 'Verifying files exist and are staged in the staging '
-                 'directory.')
-    response = self._MakeRPC(IS_STAGED, archive_url=archive_url,
-                             artifacts='full_payload,stateful')
-    self.assertEqual(response, 'True')
-    staged_dir = os.path.join(self.test_data_path, build_id)
-    self.assertTrue(os.path.isdir(staged_dir))
-    self.assertTrue(os.path.exists(
-        os.path.join(staged_dir, devserver_constants.UPDATE_FILE)))
-    self.assertTrue(os.path.exists(
-        os.path.join(staged_dir, devserver_constants.UPDATE_METADATA_FILE)))
-    self.assertTrue(os.path.exists(
-        os.path.join(staged_dir, devserver_constants.STATEFUL_FILE)))
-
-    logging.info('Verifying we can update using the stage update artifacts.')
-    self.VerifyHandleUpdate(build_id, use_test_payload=False,
-                            appid='{01906EA2-3EB2-41F1-8F62-F0B7120EFD2E}')
-
   @unittest.skip('crbug.com/640063 Broken test.')
   def testStageAutotestAndGetPackages(self):
     """Another stage/update autotest workflow test with a test payload."""
