diff --git a/cbuildbot/builders/simple_builders.py b/cbuildbot/builders/simple_builders.py
index 52f070d..9d035a5 100644
--- a/cbuildbot/builders/simple_builders.py
+++ b/cbuildbot/builders/simple_builders.py
@@ -111,8 +111,6 @@
         stage_class = None
         if suite_config.async:
           stage_class = test_stages.ASyncHWTestStage
-        elif suite_config.suite == constants.HWTEST_AU_SUITE:
-          stage_class = test_stages.AUTestStage
         else:
           stage_class = test_stages.HWTestStage
 
diff --git a/cbuildbot/commands.py b/cbuildbot/commands.py
index 714d9c3..5620c0f 100644
--- a/cbuildbot/commands.py
+++ b/cbuildbot/commands.py
@@ -2149,53 +2149,6 @@
 
   return matches
 
-def BuildAUTestTarball(buildroot, board, work_dir, version, archive_url):
-  """Tar up the au test artifacts into the tarball_dir.
-
-  Args:
-    buildroot: Root directory where build occurs.
-    board: Board type that was built on this machine.
-    work_dir: Location for doing work.
-    version: Basic version of the build i.e. 3289.23.0.
-    archive_url: GS directory where we uploaded payloads.
-  """
-  au_test_tarball = os.path.join(work_dir, 'au_control.tar.bz2')
-
-  cwd = os.path.join(buildroot, 'src', 'third_party', 'autotest', 'files')
-  control_files_subdir = os.path.join('autotest', 'au_control_files')
-
-  autotest_dir = os.path.join(work_dir, control_files_subdir)
-  os.makedirs(autotest_dir)
-
-  # Get basic version without R*.
-  basic_version = re.search(r'R[0-9]+-([0-9][\w.]+)', version).group(1)
-
-  # Pass in the python paths to the libs full release test needs.
-  env_dict = dict(
-      chromite_path=buildroot,
-      devserver_path=os.path.join(buildroot, 'src', 'platform', 'dev'))
-
-  python_path = '%(chromite_path)s:%(devserver_path)s' % env_dict
-  cmd = ['site_utils/autoupdate/full_release_test.py',
-         '--npo', '--nmo', '--dump',
-         '--dump_dir', autotest_dir, '--archive_url', archive_url,
-         basic_version, board, '--log=debug']
-
-  gs_context_dir = os.path.dirname(gs.GSContext.GetDefaultGSUtilBin())
-  run_env = None
-  if not gs_context_dir in os.environ['PATH']:
-    run_env = os.environ.copy()
-    run_env['PATH'] += ':%s' % gs_context_dir
-  else:
-    run_env = os.environ
-
-  run_env.setdefault('PYTHONPATH', '')
-  run_env['PYTHONPATH'] += ':%s' % python_path
-
-  cros_build_lib.RunCommand(cmd, env=run_env, cwd=cwd)
-  BuildTarball(buildroot, [control_files_subdir], au_test_tarball, cwd=work_dir)
-  return au_test_tarball
-
 
 def BuildAutotestControlFilesTarball(buildroot, cwd, tarball_dir):
   """Tar up the autotest control files.
diff --git a/cbuildbot/commands_unittest.py b/cbuildbot/commands_unittest.py
index 3e5fde8..53ad832 100644
--- a/cbuildbot/commands_unittest.py
+++ b/cbuildbot/commands_unittest.py
@@ -953,25 +953,6 @@
                      constants.AUTOTEST_BUILD_PATH, '..'))
     self._tarball_dir = self.tempdir
 
-  def testBuildAUTestTarball(self):
-    """Tests that our call to generate an au test tarball is correct."""
-    archive_url = 'gs://mytest/path/version'
-    with mock.patch.object(commands, 'BuildTarball') as m:
-      tarball_path = commands.BuildAUTestTarball(
-          self._buildroot, self._board, self._tarball_dir, 'R26-3928.0.0',
-          archive_url)
-      m.assert_called_once_with(self._buildroot, ['autotest/au_control_files'],
-                                os.path.join(self._tarball_dir,
-                                             'au_control.tar.bz2'),
-                                cwd=self._tarball_dir)
-
-      self.assertEquals(os.path.join(self._tarball_dir, 'au_control.tar.bz2'),
-                        tarball_path)
-
-    # Full release test with partial args defined.
-    self.assertCommandContains(['site_utils/autoupdate/full_release_test.py',
-                                '--archive_url', archive_url, '3928.0.0',
-                                self._board])
 
   def testBuildFullAutotestTarball(self):
     """Tests that our call to generate the full autotest tarball is correct."""
diff --git a/cbuildbot/stages/test_stages.py b/cbuildbot/stages/test_stages.py
index 292a5af..6f070ef 100644
--- a/cbuildbot/stages/test_stages.py
+++ b/cbuildbot/stages/test_stages.py
@@ -514,22 +514,6 @@
       raise cmd_result.to_raise
 
 
-class AUTestStage(HWTestStage):
-  """Stage for au hw test suites that requires special pre-processing."""
-
-  stage_name = "AUTest"
-
-  def PerformStage(self):
-    """Uploads its au control files."""
-    with osutils.TempDir() as tempdir:
-      tarball = commands.BuildAUTestTarball(
-          self._build_root, self._current_board, tempdir,
-          self.version, self.upload_url)
-      self.UploadArtifact(tarball)
-
-    super(AUTestStage, self).PerformStage()
-
-
 class ASyncHWTestStage(HWTestStage, generic_stages.ForgivingBuilderStage):
   """Stage that fires and forgets hw test suites to the Autotest lab."""
 
diff --git a/cbuildbot/stages/test_stages_unittest.py b/cbuildbot/stages/test_stages_unittest.py
index 7fc41cf..352b823 100644
--- a/cbuildbot/stages/test_stages_unittest.py
+++ b/cbuildbot/stages/test_stages_unittest.py
@@ -12,16 +12,12 @@
 
 from chromite.cbuildbot import cbuildbot_unittest
 from chromite.cbuildbot import commands
-from chromite.cbuildbot import swarming_lib
-from chromite.cbuildbot import topology
-from chromite.cbuildbot.stages import artifact_stages
 from chromite.cbuildbot.stages import generic_stages_unittest
 from chromite.cbuildbot.stages import test_stages
 from chromite.lib import cgroups
 from chromite.lib import config_lib
 from chromite.lib import constants
 from chromite.lib import cros_build_lib_unittest
-from chromite.lib import cros_test_lib
 from chromite.lib import cros_logging as logging
 from chromite.lib import failures_lib
 from chromite.lib import fake_cidb
@@ -458,94 +454,6 @@
     mock_report.assert_called_once_with(mock.ANY, mock.ANY, mock.ANY)
 
 
-class AUTestStageTest(generic_stages_unittest.AbstractStageTestCase,
-                      cros_build_lib_unittest.RunCommandTestCase,
-                      cbuildbot_unittest.SimpleBuilderTestCase,
-                      cros_test_lib.MockTempDirTestCase):
-  """Test only custom methods in AUTestStageTest."""
-
-  BOT_ID = 'x86-mario-release'
-  RELEASE_TAG = '0.0.1'
-
-  # pylint: disable=W0201
-  def setUp(self):
-    self.PatchObject(commands, 'ArchiveFile', autospec=True,
-                     return_value='foo.txt')
-
-    self.archive_stage = None
-    self.suite_config = None
-    self.suite = None
-
-    self._Prepare()
-
-  def _Prepare(self, bot_id=None, **kwargs):
-    super(AUTestStageTest, self)._Prepare(bot_id, **kwargs)
-
-    self._run.GetArchive().SetupArchivePath()
-    self.archive_stage = artifact_stages.ArchiveStage(self._run,
-                                                      self._current_board)
-    self.suite_config = self.GetHWTestSuite()
-    self.suite = self.suite_config.suite
-
-  def ConstructStage(self):
-    board_runattrs = self._run.GetBoardRunAttrs(self._current_board)
-    board_runattrs.SetParallelDefault('test_artifacts_uploaded', True)
-    return test_stages.AUTestStage(
-        self._run, self._current_board, self._current_board, self.suite_config)
-
-  def _PatchJson(self):
-    """Mock out the code that loads from swarming task summary."""
-    # pylint: disable=protected-access
-    temp_json_path = os.path.join(self.tempdir, 'temp_summary.json')
-    orig_func = commands._CreateSwarmingArgs
-
-    def replacement(*args, **kargs):
-      swarming_args = orig_func(*args, **kargs)
-      swarming_args['temp_json_path'] = temp_json_path
-      return swarming_args
-
-    self.PatchObject(commands, '_CreateSwarmingArgs', side_effect=replacement)
-
-    j = {'shards':[{'name': 'fake_name', 'bot_id': 'chromeos-server990',
-                    'created_ts': '2015-06-12 12:00:00',
-                    'internal_failure': False,
-                    'outputs': ['some fake output']}]}
-    self.PatchObject(swarming_lib.SwarmingCommandResult, 'LoadJsonSummary',
-                     return_value=j)
-
-  def testPerformStage(self):
-    """Tests that we correctly generate a tarball and archive it."""
-    # pylint: disable=protected-access
-
-    topology.FetchTopologyFromCIDB(None)
-    self._PatchJson()
-    stage = self.ConstructStage()
-    stage.PerformStage()
-    cmd = ['site_utils/autoupdate/full_release_test.py', '--npo', '--dump',
-           '--archive_url', self.archive_stage.upload_url,
-           self.archive_stage.release_tag, self._current_board]
-    self.assertCommandContains(cmd)
-    # pylint: disable=W0212
-    self.assertCommandContains([swarming_lib._SWARMING_PROXY_CLIENT,
-                                commands.RUN_SUITE_PATH, self.suite])
-
-  def testPayloadsNotGenerated(self):
-    """Test that we exit early if payloads are not generated."""
-    board_runattrs = self._run.GetBoardRunAttrs(self._current_board)
-    board_runattrs.SetParallel('test_artifacts_uploaded', False)
-    self.warning_mock = self.PatchObject(
-        logging, 'PrintBuildbotStepWarnings')
-    self.run_suite_mock = self.PatchObject(commands, 'RunHWTestSuite')
-
-    self.RunStage()
-
-    # Make sure we make the stage orange.
-    self.warning_mock.assert_called_once()
-    # We exit early, so commands.RunHWTestSuite should not have been
-    # called.
-    self.assertFalse(self.run_suite_mock.called)
-
-
 class ImageTestStageTest(generic_stages_unittest.AbstractStageTestCase,
                          cros_build_lib_unittest.RunCommandTestCase,
                          cbuildbot_unittest.SimpleBuilderTestCase):
