diff --git a/au_test_harness/au_worker.py b/au_test_harness/au_worker.py
index c1067d4..981cde5 100644
--- a/au_test_harness/au_worker.py
+++ b/au_test_harness/au_worker.py
@@ -13,8 +13,8 @@
 import os
 
 from chromite.lib import cros_build_lib
+from chromite.lib import dev_server_wrapper
 from crostestutils.au_test_harness import update_exception
-from crostestutils.lib import dev_server_wrapper
 
 
 class AUWorker(object):
diff --git a/au_test_harness/cros_au_test_harness.py b/au_test_harness/cros_au_test_harness.py
index 0745267..014884b 100755
--- a/au_test_harness/cros_au_test_harness.py
+++ b/au_test_harness/cros_au_test_harness.py
@@ -26,12 +26,12 @@
 sys.path.append(constants.SOURCE_ROOT)
 
 from chromite.lib import cros_build_lib
+from chromite.lib import dev_server_wrapper
 from chromite.lib import parallel
 from chromite.lib import sudo
 from chromite.lib import timeout_util
 from crostestutils.au_test_harness import au_test
 from crostestutils.au_test_harness import au_worker
-from crostestutils.lib import dev_server_wrapper
 from crostestutils.lib import test_helper
 
 # File location for update cache in given folder.
diff --git a/devmode-test/devinstall_test.py b/devmode-test/devinstall_test.py
index 82d32f8..d27707c 100755
--- a/devmode-test/devinstall_test.py
+++ b/devmode-test/devinstall_test.py
@@ -27,8 +27,8 @@
 sys.path.append(constants.CROS_PLATFORM_ROOT)
 
 from chromite.lib import cros_build_lib
+from chromite.lib import dev_server_wrapper
 from chromite.lib import remote_access
-from crostestutils.lib import dev_server_wrapper
 from crostestutils.lib import mount_helper
 from crostestutils.lib import test_helper
 
diff --git a/generate_test_payloads/cros_generate_test_payloads.py b/generate_test_payloads/cros_generate_test_payloads.py
index 538d76f..c46062a 100755
--- a/generate_test_payloads/cros_generate_test_payloads.py
+++ b/generate_test_payloads/cros_generate_test_payloads.py
@@ -33,6 +33,7 @@
 sys.path.append(constants.SOURCE_ROOT)
 
 from chromite.lib import cros_build_lib
+from chromite.lib import dev_server_wrapper
 from chromite.lib import git
 from chromite.lib import locking
 from chromite.lib import osutils
@@ -41,7 +42,6 @@
 from chromite.lib import timeout_util
 from crostestutils.au_test_harness import cros_au_test_harness
 from crostestutils.generate_test_payloads import payload_generation_exception
-from crostestutils.lib import dev_server_wrapper
 from crostestutils.lib import image_extractor
 from crostestutils.lib import public_key_manager
 from crostestutils.lib import test_helper
diff --git a/lib/dev_server_wrapper.py b/lib/dev_server_wrapper.py
deleted file mode 100644
index 5242e72..0000000
--- a/lib/dev_server_wrapper.py
+++ /dev/null
@@ -1,185 +0,0 @@
-# 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.
-
-"""Module containing methods and classes to interact with a devserver instance.
-"""
-
-import logging
-import multiprocessing
-import os
-import re
-import sys
-import tempfile
-import time
-import urllib2
-
-import constants
-from chromite.lib import cros_build_lib
-
-# Wait up to 15 minutes for the dev server to start. It can take a while to
-# start when generating payloads in parallel.
-DEV_SERVER_TIMEOUT = 900
-CHECK_HEALTH_URL = 'http://127.0.0.1:8080/check_health'
-KILL_TIMEOUT = 10
-
-
-def GetIPAddress(device='eth0'):
-  """Returns the IP Address for a given device using ifconfig.
-
-  socket.gethostname() is insufficient for machines where the host files are
-  not set up "correctly."  Since some of our builders may have this issue,
-  this method gives you a generic way to get the address so you are reachable
-  either via a VM or remote machine on the same network.
-  """
-  result = cros_build_lib.RunCommandCaptureOutput(
-      ['/sbin/ifconfig', device], print_cmd=False)
-  match = re.search('.*inet addr:(\d+\.\d+\.\d+\.\d+).*', result.output)
-  if match:
-    return match.group(1)
-  cros_build_lib.Warning('Failed to find ip address in %r', result.output)
-  return None
-
-
-def GenerateUpdateId(target, src, key, for_vm):
-  """Returns a simple representation id of target and src paths."""
-  update_id = target
-  if src: update_id = '->'.join([src, update_id])
-  if key: update_id = '+'.join([update_id, key])
-  if not for_vm: update_id = '+'.join([update_id, 'patched_kernel'])
-  return update_id
-
-
-class DevServerException(Exception):
-  """Thrown when the devserver fails to start up correctly."""
-
-
-class DevServerWrapper(multiprocessing.Process):
-  """A Simple wrapper around a dev server instance."""
-
-  def __init__(self, test_root=None):
-    super(DevServerWrapper, self).__init__()
-    self.test_root = test_root or DevServerWrapper.MkChrootTemp(is_dir=True)
-    self._log_filename = os.path.join(self.test_root, 'dev_server.log')
-    self._pid_file = DevServerWrapper.MkChrootTemp(is_dir=False)
-    self._pid = None
-
-  # Chroot helper methods. Since we call a script into the chroot with paths
-  # created outside the chroot, translation back and forth is needed. These
-  # methods all assume the default chroot dir.
-
-  @staticmethod
-  def MkChrootTemp(is_dir):
-    """Returns a temp(dir if is_dir, file otherwise) in the chroot."""
-    chroot_tmp = os.path.join(constants.SOURCE_ROOT, 'chroot', 'tmp')
-    if is_dir:
-      return tempfile.mkdtemp(prefix='devserver_wrapper', dir=chroot_tmp)
-    else:
-      return tempfile.NamedTemporaryFile(prefix='devserver_wrapper',
-                                         dir=chroot_tmp, delete=False).name
-
-  @staticmethod
-  def ToChrootPath(path):
-    """Converts the path outside the chroot to one that can be used inside."""
-    path = os.path.abspath(path)
-    if '/chroot/' not in path:
-      raise ValueError('Path %s is not a path that points inside the chroot' %
-                       path)
-
-    return '/' + path.partition('/chroot/')[2]
-
-  def _WaitUntilStarted(self):
-    """Wait until the devserver has started."""
-    current_time = time.time()
-    deadline = current_time + DEV_SERVER_TIMEOUT
-    while current_time <= deadline:
-      try:
-        if not self.is_alive():
-          raise DevServerException('Devserver crashed while starting')
-
-        urllib2.urlopen(CHECK_HEALTH_URL, timeout=0.05)
-        return
-      except IOError:
-        # urlopen errors will throw a subclass of IOError if we can't connect.
-        pass
-      finally:
-        # Let's not churn needlessly in this loop as the devserver starts up.
-        time.sleep(1)
-
-      current_time = time.time()
-    else:
-      self.terminate()
-      raise DevServerException('Devserver did not start')
-
-  def run(self):
-    """Kicks off devserver in a separate process and waits for it to finish."""
-    cmd = ['start_devserver',
-           '--pidfile', DevServerWrapper.ToChrootPath(self._pid_file),
-           '--logfile', DevServerWrapper.ToChrootPath(self._log_filename)]
-    return_obj = cros_build_lib.SudoRunCommand(
-        cmd, enter_chroot=True, debug_level=logging.DEBUG,
-        cwd=constants.SOURCE_ROOT, error_code_ok=True,
-        redirect_stdout=True, combine_stdout_stderr=True)
-    if return_obj.returncode != 0:
-      logging.error('Devserver terminated unexpectedly!')
-      logging.error(return_obj.output)
-
-  def Start(self):
-    """Starts a background devserver and waits for it to start.
-
-    Starts a background devserver and waits for it to start. Will only return
-    once devserver has started and running pid has been read.
-    """
-    self.start()
-    self._WaitUntilStarted()
-    # Pid file was passed into the chroot.
-    with open(self._pid_file, 'r') as f:
-      self._pid = f.read()
-
-  def Stop(self):
-    """Kills the devserver instance with SIGTERM and SIGKILL if SIGTERM fails"""
-    if not self._pid:
-      logging.error('No devserver running.')
-      return
-
-    logging.debug('Stopping devserver instance with pid %s', self._pid)
-    if self.is_alive():
-      cros_build_lib.SudoRunCommand(['kill', self._pid],
-                                    debug_level=logging.DEBUG)
-    else:
-      logging.error('Devserver not running!')
-      return
-
-    self.join(KILL_TIMEOUT)
-    if self.is_alive():
-      logging.warning('Devserver is unstoppable. Killing with SIGKILL')
-      cros_build_lib.SudoRunCommand(['kill', '-9', self._pid],
-                                    debug_level=logging.DEBUG)
-
-  def PrintLog(self):
-    """Print devserver output to stdout."""
-    print '--- Start output from %s ---' % self._log_filename
-    # Open in update mode in case the child process hasn't opened the file yet.
-    with open(self._log_filename) as log:
-      sys.stdout.writelines(log)
-
-    print '--- End output from %s ---' % self._log_filename
-
-  @classmethod
-  def GetDevServerURL(cls, port=None, sub_dir=None):
-    """Returns the dev server url for a given port and sub directory."""
-    if not port: port = 8080
-    url = 'http://%(ip)s:%(port)s' % {'ip': GetIPAddress(), 'port': str(port)}
-    if sub_dir:
-      url += '/' + sub_dir
-
-    return url
-
-  @classmethod
-  def WipePayloadCache(cls):
-    """Cleans up devserver cache of payloads."""
-    cros_build_lib.Info('Cleaning up previously generated payloads.')
-    cmd = ['start_devserver', '--clear_cache', '--exit']
-    cros_build_lib.SudoRunCommand(
-        cmd, enter_chroot=True, print_cmd=False, combine_stdout_stderr=True,
-        redirect_stdout=True, redirect_stderr=True, cwd=constants.SOURCE_ROOT)
diff --git a/lib/dev_server_wrapper_stress_test.py b/lib/dev_server_wrapper_stress_test.py
deleted file mode 100755
index b10b907..0000000
--- a/lib/dev_server_wrapper_stress_test.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 2013 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.
-
-"""Stress test for dev_server_wrapper.
-
-Test script runs a long time stressing the ability to start and stop the
-dev_server_wrapper. Even very rare hangs will cause significant build flake.
-"""
-
-import logging
-import sys
-
-import constants
-sys.path.append(constants.CROS_PLATFORM_ROOT)
-sys.path.append(constants.SOURCE_ROOT)
-
-from crostestutils.lib import dev_server_wrapper
-
-
-_ITERATIONS = 10000
-
-
-def main():
-  logging.getLogger().setLevel(logging.DEBUG)
-  for i in range(_ITERATIONS):
-    print 'Iteration {}'.format(i)
-    wrapper = dev_server_wrapper.DevServerWrapper()
-    print 'Starting'
-    wrapper.Start()
-    print 'Stopping'
-    wrapper.Stop()
-
-
-if __name__ == '__main__':
-  main()
