diff --git a/lib/auto_update_util.py b/lib/auto_update_util.py
index 67ccd9e..35acca9 100644
--- a/lib/auto_update_util.py
+++ b/lib/auto_update_util.py
@@ -12,9 +12,6 @@
 from chromite.lib import cros_logging as logging
 
 
-LSB_RELEASE = '/etc/lsb-release'
-
-
 def GetChromeosBuildInfo(lsb_release_content=None, regex=None):
   """Get chromeos build info in device under test as string. None on fail.
 
diff --git a/lib/auto_updater_transfer.py b/lib/auto_updater_transfer.py
index 375c89f..f0d08a3 100644
--- a/lib/auto_updater_transfer.py
+++ b/lib/auto_updater_transfer.py
@@ -20,7 +20,7 @@
   * Transfer rootfs update files if rootfs update is required.
   * Transfer stateful update files if stateful update is required.
 
-LabTransfer includes:
+LabEndToEndPayloadTransfer includes:
 
   ----Precheck---
   * Pre-check payload's existence on the staging server before auto-update.
@@ -189,23 +189,6 @@
       Dict in the format: {'image_version': 12345.0.0, 'size': 123456789}.
     """
 
-  def _GetPayloadFormat(self):
-    """Gets the payload format that should be evaluated.
-
-    Returns:
-      The payload name as a string.
-    """
-    return self._payload_name
-
-  def _GetPayloadPattern(self):
-    """The regex pattern that the payload format must match.
-
-    Returns:
-      Regular expression.
-    """
-    return _PAYLOAD_PATTERN
-
-
 class LocalTransfer(Transfer):
   """Abstracts logic that handles transferring local files to the DUT."""
 
@@ -304,22 +287,20 @@
         'size': os.path.getsize(payload_filepath)
     }
     if self._payload_name != ROOTFS_FILENAME:
-      payload_format = self._GetPayloadFormat()
-      payload_pattern = self._GetPayloadPattern()
-      m = re.match(payload_pattern, payload_format)
+      m = re.match(_PAYLOAD_PATTERN, self._payload_name)
       if not m:
         raise ValueError(
             'Regular expression %r did not match the expected payload format '
-            '%s' % (payload_pattern, payload_format))
+            '%s' % (_PAYLOAD_PATTERN, self._payload_name))
       values.update(m.groupdict())
     return values
 
 
-class LabTransfer(Transfer):
+class LabEndToEndPayloadTransfer(Transfer):
   """Abstracts logic that transfers files from staging server to the DUT."""
 
   def __init__(self, staging_server, *args, **kwargs):
-    """Initialize LabTransfer to transfer files from staging server to DUT.
+    """Initialize to transfer files from staging server to DUT.
 
     Args:
       staging_server: Url of the server that's staging the payload files.
@@ -329,23 +310,7 @@
           complete list of accepted keyword arguments.
     """
     self._staging_server = staging_server
-    super(LabTransfer, self).__init__(*args, **kwargs)
-
-  def _GetPayloadFormat(self):
-    """Gets the payload format that should be evaluated.
-
-    Returns:
-      The payload dir as a string.
-    """
-    return self._payload_dir
-
-  def _GetPayloadPattern(self):
-    """The regex pattern that the payload format must match.
-
-    Returns:
-      Regular expression.
-    """
-    return r'.*/(R[0-9]+-)(?P<image_version>.+)'
+    super(LabEndToEndPayloadTransfer, self).__init__(*args, **kwargs)
 
   def _RemoteDevserverCall(self, cmd, stdout=False):
     """Runs a command on a remote devserver by sshing into it.
@@ -414,17 +379,27 @@
       payload_dir: Path to the payload directory on the device.
       payload_filename: Name of the file by which the downloaded payload should
         be saved. This is assumed to be the same as the name of the payload.
+        If the payload_name must is in this format:
+        payloads/whatever_file_name, the 'payloads/' at the start will be
+        removed while saving the file as the files need to be saved in specific
+        directories for their subsequent installation. Keeping the 'payloads/'
+        at the beginning of the payload_filename, adds a new directory that
+        messes up its installation.
       build_id: This is the path at which the needed payload can be found. It
         is usually of the format <board_name>-release/R79-12345.6.0. By default,
         the path is set to None.
 
     Returns:
       A fully formed curl command in the format:
-        ['curl', '-o', '<path where payload should be saved>',
-         '<payload download URL>']
+      ['curl', '-o', '<path where payload should be saved>',
+      '<payload download URL>']
     """
-    return ['curl', '-o', os.path.join(payload_dir, payload_filename),
-            self._GetStagedUrl(payload_filename, build_id)]
+    saved_filename = payload_filename
+    if saved_filename.startswith('payloads/'):
+      saved_filename = '/'.join(saved_filename.split('/')[1:])
+    cmd = ['curl', '-o', os.path.join(payload_dir, saved_filename),
+           self._GetStagedUrl(payload_filename, build_id)]
+    return cmd
 
   def _TransferUpdateUtilsPackage(self):
     """Transfer update-utils package to work directory of the remote device.
@@ -550,70 +525,10 @@
       Dict - See parent class's function for full details.
     """
     values = {'size': self._GetPayloadSize()}
-    payload_format = self._GetPayloadFormat()
-    payload_pattern = self._GetPayloadPattern()
-    m = re.match(payload_pattern, payload_format)
+    m = re.match(_PAYLOAD_PATTERN, self._payload_name)
     if not m:
       raise ValueError('Regular expression %r did not match the expected '
-                       'payload format %s' % (payload_pattern, payload_format))
+                       'payload format %s' % (_PAYLOAD_PATTERN,
+                                              self._payload_name))
     values.update(m.groupdict())
     return values
-
-
-class LabEndToEndPayloadTransfer(LabTransfer):
-  """Abstracts logic that transfers files from staging server to the DUT.
-
-  TODO(crbug.com/1061570): AutoUpdate_endToEnd tests stage their payloads in a
-  different location on the devserver in comparison to the provision_AutoUpdate
-  test. Since we are removing the use of the cros_au RPC (see crbug.com/1049708
-  and go/devserver-deprecation) from the EndToEnd tests, it is necessary to
-  extend LabTransfer class to support this new payload staging location.
-  Ideally, the URL at which the payload is staged should be abstracted from the
-  actual transfer of payloads.
-  """
-
-  def _GetPayloadFormat(self):
-    """Gets the payload format that should be evaluated.
-
-    Returns:
-      The payload name as a string.
-    """
-    return self._payload_name
-
-  def _GetPayloadPattern(self):
-    """The regex pattern that the payload format must match.
-
-    Returns:
-      Regular expression.
-    """
-    return _PAYLOAD_PATTERN
-
-  def _GetCurlCmdForPayloadDownload(self, payload_dir, payload_filename,
-                                    build_id=None):
-    """Returns a valid curl command to download payloads into device tmp dir.
-
-    Args:
-      payload_dir: Path to the payload directory on the device.
-      payload_filename: Name of the file by which the downloaded payload should
-        be saved. This is assumed to be the same as the name of the payload.
-        If the payload_name must is in this format:
-        payloads/whatever_file_name, the 'payloads/' at the start will be
-        removed while saving the file as the files need to be saved in specific
-        directories for their subsequent installation. Keeping the 'payloads/'
-        at the beginning of the payload_filename, adds a new directory that
-        messes up its installation.
-      build_id: This is the path at which the needed payload can be found. It
-        is usually of the format <board_name>-release/R79-12345.6.0. By default,
-        the path is set to None.
-
-    Returns:
-      A fully formed curl command in the format:
-      ['curl', '-o', '<path where payload should be saved>',
-      '<payload download URL>']
-    """
-    saved_filename = payload_filename
-    if saved_filename.startswith('payloads/'):
-      saved_filename = '/'.join(saved_filename.split('/')[1:])
-    cmd = ['curl', '-o', os.path.join(payload_dir, saved_filename),
-           self._GetStagedUrl(payload_filename, build_id)]
-    return cmd
diff --git a/lib/auto_updater_transfer_unittest.py b/lib/auto_updater_transfer_unittest.py
index 8000f16..e647b2c 100644
--- a/lib/auto_updater_transfer_unittest.py
+++ b/lib/auto_updater_transfer_unittest.py
@@ -231,31 +231,33 @@
       expected = {'image_version': '99999.0.0', 'size': 101}
       self.assertDictEqual(transfer.GetPayloadProps(), expected)
 
-class CrosLabTransferTest(cros_test_lib.MockTempDirTestCase):
-  """Test all methods in auto_updater_transfer.LabTransfer."""
+class CrosLabEndToEndPayloadTransferTest(cros_test_lib.MockTempDirTestCase):
+  """Test all methods in auto_updater_transfer.LabEndToEndPayloadTransfer."""
 
   def CreateInstance(self, device, **kwargs):
-    """Create auto_updater_transfer.LabTransfer instance.
+    """Create auto_updater_transfer.LabEndToEndPayloadTransfer instance.
 
     Args:
       device: a remote_access.ChromiumOSDeviceHandler object.
       kwargs: contains parameter name and value pairs for any argument accepted
-        by auto_updater_transfer.LabTransfer. The values provided through
-        kwargs will supersede the defaults set within this function.
+        by auto_updater_transfer.LabEndToEndPayloadTransfer. The values provided
+        through kwargs will supersede the defaults set within this function.
 
     Returns:
-      An instance of auto_updater_transfer.LabTransfer.
+      An instance of auto_updater_transfer.LabEndToEndPayloadTransfer.
     """
     default_args = copy.deepcopy(_DEFAULT_ARGS)
     default_args['staging_server'] = 'http://0.0.0.0:8000'
 
     default_args.update(kwargs)
-    return auto_updater_transfer.LabTransfer(device=device, **default_args)
+    return auto_updater_transfer.LabEndToEndPayloadTransfer(device=device,
+                                                            **default_args)
+
 
   def setUp(self):
     """Mock remote_access.RemoteDevice/ChromiumOSDevice functions for update."""
     self.PatchObject(remote_access.RemoteDevice, 'work_dir', '/test/work/dir')
-    self._transfer_class = auto_updater_transfer.LabTransfer
+    self._transfer_class = auto_updater_transfer.LabEndToEndPayloadTransfer
 
   def testTransferUpdateUtilsCurlCalls(self):
     """Test methods calls of _TransferUpdateUtilsPackage().
@@ -285,7 +287,7 @@
     """
     with remote_access.ChromiumOSDeviceHandler(remote_access.TEST_IP) as device:
       transfer = self.CreateInstance(device)
-      self._transfer_class = auto_updater_transfer.LabTransfer
+      self._transfer_class = auto_updater_transfer.LabEndToEndPayloadTransfer
       expected = [['curl', '-o', '/test/work/dir/src/nebraska.py',
                    'http://0.0.0.0:8000/static/nebraska.py']]
 
@@ -552,12 +554,12 @@
       transfer = self.CreateInstance(device)
       expected_cmd = ['curl', '-o',
                       '/tmp/test_payload_dir/payload_filename.ext',
-                      'http://0.0.0.0:8000/static/board-release/12345.0.0/'
-                      'payload_filename.ext']
+                      'http://0.0.0.0:8000/static/stable-channel/board/'
+                      '12345.0.0/payloads/payload_filename.ext']
       cmd = transfer._GetCurlCmdForPayloadDownload(
           payload_dir='/tmp/test_payload_dir',
-          payload_filename='payload_filename.ext',
-          build_id='board-release/12345.0.0/')
+          payload_filename='payloads/payload_filename.ext',
+          build_id='stable-channel/board/12345.0.0')
       self.assertEqual(cmd, expected_cmd)
 
   def testGetCurlCmdNoImageName(self):
@@ -848,28 +850,6 @@
       self.assertRaises(auto_updater_transfer.ChromiumOSTransferError,
                         transfer._GetPayloadSize)
 
-  def testGetPayloadPropsLab(self):
-    """Test GetPayloadProps()."""
-    with remote_access.ChromiumOSDeviceHandler(remote_access.TEST_IP) as device:
-      transfer = self.CreateInstance(
-          device, payload_dir='test-board-name/R77-12345.0.0')
-      self.PatchObject(self._transfer_class, '_GetPayloadSize',
-                       return_value=123)
-      expected = {'image_version': '12345.0.0', 'size': 123}
-      self.assertDictEqual(transfer.GetPayloadProps(), expected)
-
-  def testGetPayloadPropsLabError(self):
-    """Test error thrown by GetPayloadProps().
-
-    Test error thrown when payload_dir is not in the expected format of
-    <board-name>/Rxx-12345.6.7.
-    """
-    with remote_access.ChromiumOSDeviceHandler(remote_access.TEST_IP) as device:
-      transfer = self.CreateInstance(
-          device, payload_dir='/wrong/format/will/fail')
-      self.PatchObject(self._transfer_class, '_GetPayloadSize')
-      self.assertRaises(ValueError, transfer.GetPayloadProps)
-
   def test_RemoteDevserverCall(self):
     """Test _RemoteDevserverCall()."""
     with remote_access.ChromiumOSDeviceHandler(remote_access.TEST_IP) as device:
@@ -910,96 +890,3 @@
       self.assertRaises(cros_build_lib.RunCommandError,
                         transfer._RemoteDevserverCall,
                         cmd=['test', 'command'])
-
-
-class CrosLabEndToEndPayloadTransferTest(cros_test_lib.MockTempDirTestCase):
-  """Test all methods in LabEndToEndPayloadTransfer()."""
-
-  def CreateInstance(self, device, **kwargs):
-    """Create auto_updater_transfer.LabEndToEndPayloadTransfer instance.
-
-    Args:
-      device: a remote_access.ChromiumOSDeviceHandler object.
-      kwargs: contains parameter name and value pairs for any argument accepted
-        by auto_updater_transfer.LabEndToEndPayloadTransfer. The values provided
-        through kwargs will supersede the defaults set within this function.
-
-    Returns:
-      An instance of auto_updater_transfer.LabEndToEndPayloadTransfer.
-    """
-    default_args = copy.deepcopy(_DEFAULT_ARGS)
-    default_args['staging_server'] = 'http://0.0.0.0:8000'
-
-    default_args.update(kwargs)
-    return auto_updater_transfer.LabEndToEndPayloadTransfer(device=device,
-                                                            **default_args)
-
-  def setUp(self):
-    """Mock remote_access.RemoteDevice/ChromiumOSDevice functions for update."""
-    self.PatchObject(remote_access.RemoteDevice, 'work_dir', '/test/work/dir')
-    self._transfer_class = auto_updater_transfer.LabEndToEndPayloadTransfer
-
-  def testGetPayloadProps(self):
-    """Test GetPayloadProps()."""
-    with remote_access.ChromiumOSDeviceHandler(remote_access.TEST_IP) as device:
-      payload_name = 'payloads/chromeos_12345.0.0_board_channel_test.bin-blah'
-      transfer = self.CreateInstance(
-          device, payload_name=payload_name)
-      self.PatchObject(self._transfer_class, '_GetPayloadSize',
-                       return_value=123)
-      expected = {'image_version': '12345.0.0', 'size': 123}
-      self.assertDictEqual(transfer.GetPayloadProps(), expected)
-
-  def testGetPayloadPropsEndError(self):
-    """Test error thrown by GetPayloadProps().
-
-    Test error thrown when payload_name is not in the expected format of
-    payloads/chromeos_12345.0.0_board_channel_full_test.bin-blah.
-    """
-    with remote_access.ChromiumOSDeviceHandler(remote_access.TEST_IP) as device:
-      transfer = self.CreateInstance(
-          device, payload_name='/wrong/format/will/fail')
-      self.PatchObject(self._transfer_class, '_GetPayloadSize')
-      self.assertRaises(ValueError, transfer.GetPayloadProps)
-
-  def testLabGetCurlCmdStandard(self):
-    """Test _GetCurlCmdForPayloadDownload().
-
-    Tests the typical usage of the _GetCurlCmdForPayloadDownload() method.
-    """
-    with remote_access.ChromiumOSDeviceHandler(remote_access.TEST_IP) as device:
-      transfer = self.CreateInstance(device)
-      expected_cmd = ['curl', '-o',
-                      '/tmp/test_payload_dir/payload_filename.ext',
-                      'http://0.0.0.0:8000/static/stable-channel/board/'
-                      '12345.0.0/payloads/payload_filename.ext']
-      cmd = transfer._GetCurlCmdForPayloadDownload(
-          payload_dir='/tmp/test_payload_dir',
-          payload_filename='payloads/payload_filename.ext',
-          build_id='stable-channel/board/12345.0.0')
-      self.assertEqual(cmd, expected_cmd)
-
-  def testGetPayloadPropsFile(self):
-    """Test GetPayloadPropsFile()."""
-    with remote_access.ChromiumOSDeviceHandler(remote_access.TEST_IP) as device:
-      payload_name = 'payloads/test_update.gz'
-      payload_props_path = os.path.join(self.tempdir, payload_name + '.json')
-      output = ('{"appid": "{0BB3F9E1-A066-9352-50B8-5C1356D09AEB}", '
-                '"is_delta": false, "metadata_signature": null, '
-                '"metadata_size": 57053, '
-                '"sha256_hex": "aspPgQRWLu5wPM5NucqAYVmVCvL5lxQJ/n9ckhZS83Y=", '
-                '"size": 998103540, '
-                '"target_version": "99999.0.0", "version": 2}')
-      bin_op = six.ensure_binary(output)
-
-      transfer = self.CreateInstance(
-          device, tempdir=self.tempdir, payload_name=payload_name)
-
-      self.PatchObject(self._transfer_class, '_RemoteDevserverCall',
-                       return_value=cros_build_lib.CommandResult(stdout=bin_op))
-      transfer.GetPayloadPropsFile()
-      props = osutils.ReadFile(payload_props_path)
-
-      self.assertEqual(props, output)
-      self.assertEqual(transfer._local_payload_props_path,
-                       payload_props_path)
diff --git a/lib/auto_updater_unittest.py b/lib/auto_updater_unittest.py
index c5f6be9..4bdf1ab 100644
--- a/lib/auto_updater_unittest.py
+++ b/lib/auto_updater_unittest.py
@@ -263,40 +263,6 @@
     }
     self.assertEqual(props, expected_props)
 
-  def test_FixPayloadPropertiesFileLab(self):
-    """Tests _FixPayloadPropertiesFile() correctly fixes the properties file.
-
-    Tests if the payload properties file gets filled with correct data when
-    LabTransfer methods are invoked internally.
-    """
-    payload_dir = 'nyan_kitty-release/R76-12345.17.0'
-    payload_path = os.path.join(self.tempdir, 'test_update.gz')
-    payload_properties_path = payload_path + '.json'
-    osutils.WriteFile(payload_path, 'dummy-payload', makedirs=True)
-    # Empty properties file.
-    osutils.WriteFile(payload_properties_path, '{}')
-    with remote_access.ChromiumOSDeviceHandler(remote_access.TEST_IP) as device:
-      CrOS_AU = auto_updater.ChromiumOSUpdater(
-          device, None, payload_dir=payload_dir,
-          transfer_class=auto_updater_transfer.LabTransfer,
-          staging_server='http://0.0.0.0:8082')
-
-      self.PatchObject(auto_updater_transfer.LabTransfer, 'GetPayloadPropsFile',
-                       return_value=payload_properties_path)
-      self.PatchObject(auto_updater_transfer.LabTransfer, '_GetPayloadSize',
-                       return_value=os.path.getsize(payload_path))
-      CrOS_AU._FixPayloadPropertiesFile() # pylint: disable=protected-access
-
-    # The payload properties file should be updated with new fields.
-    props = json.loads(osutils.ReadFile(payload_properties_path))
-    expected_props = {
-        'appid': '',
-        'is_delta': False,
-        'size': os.path.getsize(payload_path),
-        'target_version': '12345.17.0',
-    }
-    self.assertEqual(props, expected_props)
-
   def testRunRootfs(self):
     """Test the update functions are called correctly.
 
@@ -403,33 +369,32 @@
       self.assertTrue(
           auto_updater_transfer.LocalTransfer.GetPayloadProps.called)
 
-  def test_FixPayloadLabTransfer(self):
-    """Tests if correct LabTransfer methods are called."""
+  def test_FixPayloadLabEndToEndPayloadTransfer(self):
+    """Tests if correct LabEndToEndPayloadTransfer methods are called."""
     payload_dir = 'nyan_kitty-release/R76-12345.17.0'
     payload_path = os.path.join(self.tempdir, 'test_update.gz')
     payload_properties_path = payload_path + '.json'
     osutils.WriteFile(payload_path, 'dummy-payload', makedirs=True)
     # Empty properties file.
     osutils.WriteFile(payload_properties_path, '{}')
+    transfer_class = auto_updater_transfer.LabEndToEndPayloadTransfer
 
     with remote_access.ChromiumOSDeviceHandler(remote_access.TEST_IP) as device:
       CrOS_AU = auto_updater.ChromiumOSUpdater(
           device, None, payload_dir=payload_dir,
-          transfer_class=auto_updater_transfer.LabTransfer,
+          transfer_class=transfer_class,
           staging_server='http://0.0.0.0:8082')
 
+      self.PatchObject(transfer_class,
+                       'GetPayloadPropsFile',
+                       return_value=payload_properties_path)
       self.PatchObject(
-          auto_updater_transfer.LabTransfer, 'GetPayloadPropsFile',
-          return_value=payload_properties_path)
-      self.PatchObject(
-          auto_updater_transfer.LabTransfer, 'GetPayloadProps',
+          transfer_class, 'GetPayloadProps',
           return_value={'size': '123', 'image_version': '99999.9.9'})
 
       CrOS_AU._FixPayloadPropertiesFile() # pylint: disable=protected-access
-      self.assertTrue(
-          auto_updater_transfer.LabTransfer.GetPayloadPropsFile.called)
-      self.assertTrue(
-          auto_updater_transfer.LabTransfer.GetPayloadProps.called)
+      self.assertTrue(transfer_class.GetPayloadPropsFile.called)
+      self.assertTrue(transfer_class.GetPayloadProps.called)
 
 
 class ChromiumOSUpdaterVerifyTest(ChromiumOSUpdaterBaseTest):
